![TensorFlow神经网络到深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/747/38209747/b_38209747.jpg)
3.7 优化函数
模型的优化对于传统机器学习和深度学习都是很重要的,尤其是深度学习,在训练过程中很可能需要解决一些更加困难的挑战。目前来说,流行且使用较广泛的优化算法有随机梯度下降优化算法、基于冲量优化算法、Adadelta优化算法和Adam优化算法等,下面对这几个优化算法进行介绍。
3.7.1 随机梯度下降优化算法
普通的随机梯度下降优化算法存在以下不足。
·很难选择一个适当的学习率。选择的学习率太小,收敛速度慢;选择的学习率太大,参数波动太大,无法进入效果相对最优的优化点。
·可以采用满足某些条件时调整学习率的方法,如迭代n次将学习率减半,或在训练集准确率到某值时调整学习率。这些人工的调整必须事先定义好,虽然有所改进但是依然无法适应数据集的特征。
·有相同的学习率适用于所有参数更新。如果数据稀疏而且特征又区别很大,可能训练到某个阶段时,部分参数需要采用较小的学习率来调整,另外一部分参数需要较大的学习率来调整。如果都采用相同的学习率,可能最终无法收敛比较好的结果。
·除了局部最小值,普通的随机梯度下降优化容易陷入“鞍点”,即梯度在所有方向上是零,但是这并不是一个最小点,甚至也不是一个局部最小点。“鞍点”示意图如图3-14所示,中间的亮点在两个方向上的梯度都是零,但却在一个“高坡”上。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_72_1.jpg?sign=1739413745-vHEOfqlSeuurNAAwVdxQ5FhIHjjBTnmn-0-e635720cfac619394dd79545cdd72cec)
图3-14 “鞍点”示意图
那么,怎么避免上述不足呢?可参照各种优化算法。
3.7.2 基于冲量优化算法
基于冲量优化算法(Monentum优化算法),其思想很简单,相当于在原来更新参数的基础上增加了“加速度”的概念。用山坡上的球作为例子,小球在往山谷的最低点滚动时,当前时间点的下降距离会积累前面时间点下降的距离,并在路上越来越快。参数的更新亦是如此:冲量在梯度连续指向同一个方向上时会增加,而在梯度方向变化时会减小。这样,就可以更快收敛,并可以减小震荡。
用公式表示为(γ为冲量更新值,一般取0.9)
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_72_2.jpg?sign=1739413745-4TZx6q4g2Qh4of6rH0QFmlMcuMKzKton-0-061054c36513b575f7f98028d7eefa89)
从公式中可以看出,每次参数的更新会累积上一个时间点的冲量,所以在连续同一个方向更新梯度时,会加速收敛。
普通的随机梯度下降优化算法在最小区域周围的下降图如图3-15所示,基于冲量优化算法在最小区域周围的下降图如图3-16所示。从图3-15和图3-16中可以看出,普通的随机梯度下降优化算法始终是一个速度收敛,而基于冲量优化算法则会更加快速地收敛,并且在遇到一些局部最小点时,基于冲量优化算法会“冲”过这些比较小的“坑”,在某些程度上减少陷入局部最小优化点的概率。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_73_1.jpg?sign=1739413745-o5B0ElFIkMAHRsIVOgGR5vFUPRhfpQjB-0-0f4b59f58ac540dc8b4d2deffdfa579e)
图3-15 普通的随机梯度下降优化算法在最小区域周围的下降图
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_73_2.jpg?sign=1739413745-gZTuzm9x7yfXn1mT85mHNMwuYR1qrNj2-0-ef632024c15437e488dba5c56a2f74b4)
图3-16 基于冲量优化算法在最小区域周围的下降图
3.7.3 Adadelta优化算法
Adagrad算法存在三个问题:
·其学习率是单调递减的,训练后期学习率非常小;
·其需要手工设置一个全局的初始学习率;
·更新xt时,左右两边的单位不同。
Adadelta优化算法针对上述三个问题提出了更优的解决方案。
针对第一个问题,我们可以只使用Adagrad分母中的累计离当前时间点比较近的项,如下式:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_73_3.jpg?sign=1739413745-4RjxZDOXVpBSWsBu1ZSKdvMyn5JfTXzP-0-ef0e1c6e9ee5d185ae6345d2ea0e3d7b)
式中,ρ为衰减系数,通过这个衰减系数,令每一个时刻的gt随时间按照ρ指数衰减,这样就相当于仅使用离当前时刻比较近的gt信息,从而使得还有很长时间时,参数仍然可以得到更新。
针对第三个问题,其实momentum系列的方法也有单位不统一的问题。momentum系列方法中:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_73_4.jpg?sign=1739413745-gSvRlgZA1vVnlclMA7nVkxx6NcawCDRp-0-3983e1b9bcb3bc520fb081749d42c71d)
类似的,在Adagrad中,用于更新Δx的单位也不是x的单位,而是1。
对于牛顿迭代法:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_73_5.jpg?sign=1739413745-eSGJaYsdDSA0ezg2lXKN8mAVrLUTaPv9-0-4eef41d5606ba17f01ce9ae1c7414481)
式中,H为Hessian矩阵,由于其计算量巨大,因而在实际中不常被使用。其单位为
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_74_1.jpg?sign=1739413745-JgPN87H5yDV8KFikSvo9tpAmlm2SjgMz-0-aa88f2d1862b2426c8f0eb8a5608c6e2)
注意,此处f 无单位。因而,牛顿迭代法的单位是正确的。
所以,可以模拟牛顿迭代法来得到正确的单位。注意到:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_74_2.jpg?sign=1739413745-46Kstayto3lM24kEJSNv0MyUNxk1hPAh-0-675df721d8321bee99b6d0d286d8f3e4)
这里,在解决学习率单调递减问题的方案中,分母已经是的一个近似了。这里我们可以构造Δx的近似,来模拟得到H-1的近似,从而得到近似的牛顿迭代法。具体做法如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_74_4.jpg?sign=1739413745-WlsdxcnFpyv1tZmKwNLXXhGGuWJcvqOr-0-d7b2f69a5d374cb4b8efa5850409ab1c)
可以看到,如此一来Adagrad中分子部分需要人工设置的初始学习率也消失了,从而顺带解决了上述的第二个问题。
3.7.4 Adam优化算法
自适应矩估计(Adaptive Moment Estimation,Adam)是另一个计算各个参数的自适应学习率的方法。除了像 Adadelta 优化算法那样存储过去梯度平方vt的指数移动平均值,Adam优化算法还保留了过去梯度mt的指数平均值(这个点类似冲量):
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_74_5.jpg?sign=1739413745-WzNwMWBGacHvG2mziFn0D149enVSlaYm-0-1446ebc98037ba704e4c30e3de03d9f8)
mt和vt是对应梯度的一阶方矩(平均)和二阶力矩(偏方差),它们通过计算偏差来修正一阶方矩和二阶力矩,并减小这些偏差:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_74_6.jpg?sign=1739413745-OWuRcPJKmi0gSaLSvij2vZltAamN2Ysv-0-241ae35be28abb541b976b219f7921ac)
式中,β1的默认值为0.9,β2的默认值为0.999。接着,就像Adadelta优化算法那样,它们使用这些值来更新参数,由此得到Adam优化算法的更新规则:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_74_7.jpg?sign=1739413745-yvB2kWLXb5NeL77ixk1cMSVDl2YDOczv-0-62823c30e048875feca6f260e3dd51b1)
式中,ε的默认值为10-8,η为自适应学习率。
前面介绍了几种优化算法,下面直接通过一个例子比较几种算法的效果。
【例3-14】下面使用TensorFlow来比较一下这些算法的效果。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_74_8.jpg?sign=1739413745-Nl3eE8zq8SBoozm26sIBLKiJdnH2pQsy-0-dd7e81dad2a139ff4838b428decaeb84)
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_75_1.jpg?sign=1739413745-Lz5AqzlLhPX3tvO2jhB2hzlVkUOnDuuE-0-1c74b75eacc1f3d6bae6b24a0012d715)
运行程序,输出原始带噪声散点图,如图3-17所示,得到几种优化算法的比较效果如图3-18所示。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_76_1.jpg?sign=1739413745-LRn9FJYvaNmdkCifOxIhO6h535qGwCgb-0-ea2200289bc0c71e8f6fdddf002e9711)
图3-17 带噪声散点图
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_76_2.jpg?sign=1739413745-iXUG6XvYMP7qV0TY42hrO4F631s8x68X-0-1c0645eb1fd6e6771d12481de3b54462)
图3-18 几种优化算法的比较效果
当设置batch_size=30时,得到如图3-19所示的效果图。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_76_3.jpg?sign=1739413745-XH7tgBlEObL3JK7aYLH8pyiCbK2FLNSM-0-1c190d58ec6b58143bdaf2302ae9d029)
图3-19 batch_size=30时的几种优化算法比较效果
由图3-18和图3-19可以看出,Adam优化算法收敛速度最快,并且波动最小。