深度学习中,典型的参数更新方法首先是SGD
它的更新方法如下$$\eta,\alpha都是超参数$$
但该方法面对非匀向的损失函数(如呈现延伸状),是收敛不到最小值的,以
\[F1(x1,x0)=x1^{2}+x0^{2} 和 F2(x1, x0)=x1^{2}×0.05+x0^{2}为例 \]绘制两函数的梯度图如下
F1的梯度图
F2的梯度图
在梯度图上随机取一点,F1通过SGD总能达到最小值0,但F2则很难,这就好比一个球在两个曲度不一样的圆盘上滚动,F1可以滚到中心但F2则很难,这是因为F2横轴方向的梯度太小了,难以达到中心
这时,就引入了Momentum,该方法具有同方向更新的累加效应,公式如下
很容易证明,此方法朝同一方向更新的话,步子会越来越大,就能解决上述横轴梯度过小的问题,随之而来的是竖轴方向的步子变小了,但比起之前总体的震荡次数变小
前两种都是针对参数,而AdaGrad原理是随着学习的进行,会使学习率逐渐减小,公式如下,h代表学习率
从公式可以看出,该方法会记录过去所有梯度的平方和,所以若无止境地学习,更新量会变为0——RMSProp方法会逐渐的遗忘过去,可以避免0的情况
最后一种Adam则组合前面Momentum与AdaGrad的优点
四种算法的比较如下所示,都是基于mnist数据集的比较
接着说一下权重的初始值,一般都是使用标准差为0.01的高斯分布生成的。因为若将权重的初始值设成一样的值,在反向传播中,所有的权重值可能都会进行相同的更新(如乘法节点的反向传播),这样的话,神经网络拥有许多不同的权重的意义都丧失了,为了防止权重均一化,瓦解权重的对称结构,必须随机生成初始值。
上图使用标准差为1的高斯分布作为权重初始值的各层激活值的分布,可以看出激活值偏向0和1,这里使用的是sigmoid激活函数,由该函数特性可知,激活值若偏向0或1,那反向传播时,容易发生梯度消失,即传播的导数为0,学习不能进行下去
上图则使用0.01的高斯分布,但出现了激活值集中在0.5附近,不会发生梯度消失,但这时就出现了表现力受限的问题,因为多个神经元都输出几乎相同的值,那何不用一个神经元表达基本相同的事情,所以也要求各层激活值的分布要有适当的广度(这有点像神经网络必须要有激活层,若没有,多层的变换其实可以用一层代替,因为神经网络的传播就是线性变换,加入激活函数,就是加入非线性特性)
怎样解决这个问题呢?
这里提出了Xavier初始值,该方法考虑了前一层的神经元数量,即若前一层的节点数是n,那该层的初始值使用标准差为
该方法的结果如下,可知分布比之前更广,但后面图像却很歪斜,但用tanh函数代替sigmoid,就能得到改善。
激活函数是sigmoid时
激活函数是tanh时
但该方法面对激活函数是relu时就显的力不从心,从下图可以看出,随着层的加深,偏向逐渐变大,因为Xavier初始值是以激活函数是线性函数为前提推导出来,而sigmoid和tanh左右对称,*附近可以视作线性函数,而relu则不一样。
激活函数是relu时
这时针对relu有一种专门的方法-He初始值,因为relu的负值区域的值为0,为使它更有广度,需2倍的系数,即
relu函数,使用He初始值
下图是激活函数是relu,不同权重初始化时在mnist数据集的比较