在网络层次较浅时,问题可能还不是很大,网络层次一深,就容易梯度爆炸或者梯度消失。
江寒在研制OCR软件的时候,就发现了这个问题,所以这一次,他准备引入ReLU,作为卷积层的激活函数。
ReLU(RectifiedLinearUnit),一般称作“线性整流函数”,也可以翻译成“修正线性单元”。
这个函数其实很简单,表达式为F(x)=max(0,x)。
当自变量大于0时,它就是一个线性函数,相当于一次函数y=x;
当自变量≤0时,y≡0。
这个函数其实不是什么新鲜东西,只是在机器学习中,以前没人用过罢了。
所以这也算是一点小小的创举……
要说ReLU的好处嘛,那自然是不少的了。
一方面,可以有效缓解梯度消失、梯度爆炸。
并且,还能让梯度下降得更快,有效地提高训练效率。
另一方面,也比较符合仿生学原理。
生物神经细胞的工作模式,就和这个函数差不多……
江寒思考了一下,又在网络的最后几个全连接层中,使用了Dropout方法。
所谓Dropout,就是在前向传导时,以某个概率P,随机忽略部分神经元。
这样做,可以有效地避免过拟合。
在编写池化层时,江寒考虑了一下,使用了重叠的最大池化方法,而没有使用他此前在论文中提到的平均池化。
因为后者有个副作用,容易导致模糊化。
同时,这样做还有另外一些好处。
比如,由于有部分重叠和覆盖,提取出来的特征,往往也会更加丰富……
在编写标准化层的时候,江寒考虑再三,运用了LRN机制,也就是局部响应归一化。
这样做的目的,是让局部神经元的活动,产生某种竞争机制,使得强者愈强、弱者愈弱。
归根结底,是为了提高模型的泛化能力。
为了尽可能加快训练速度,江寒甚至考虑过使用GPU编程。
虽然这个世界的GPU厂商,还没有发明CUDA技术,但硬件条件已经完全具备了。
毕竟从理论上来说,能挖矿的显卡,就能用于大数据计算。
只要编写出合适的驱动和代码,就能利用GPU,来进行大规模并行运算,显著地提高神经网络的训练速度。
可惜的是,单个显卡的显存比较有限,也就是说,可能承载不了太大的人工神经网络。
而这个深度网络……
即使最保守的估计,也需要4~5GB的显存。
这样一来,就必须用两块显卡,交下火才行了……
江寒在虚拟空间中忙碌了几十个小时,终于把这个空前巨大的人工神经网络搭建了起来。
当然,今天是没法开始训练了,只能等到明天再说……
江寒想了想,又买了很多空白图纸,以及一些中性笔,开始草拟论文的初稿。
在这次的比赛中,没啥意外的话,自己这个“深度卷积神经网络”,应该能拿到不错的成绩。
到时候,万一有需要的话,现写论文就显得有点不够从容了。
所以江寒决定,今晚就把这个网络的框架,写成论文,保存起来。
等到训练完成,收集到足够的数据,再稍微修改下,就可以找个合适的时机,投出去了……