![TensorFlow神经网络到深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/747/38209747/b_38209747.jpg)
3.6 梯度下降法
梯度下降法是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对于梯度(近似梯度)的反方向的规定步长距离点进行迭代搜索。所以梯度下降法可以帮助我们求解某个函数的极小值或者最小值。对于n维问题求最优解,梯度下降法是最常用的方法之一。
3.6.1 梯度下降法的作用与分类
在训练过程中,每次的正向传播后都会得到输出值与真实值的损失值,这个损失值越小,代表模型越好,于是梯度下降法就用在这里,帮助寻找最小的那个损失值,从而可以反推出对应的学习参数b和w,达到优化模型的效果。
常用的梯度下降法可以分为批量梯度下降、随机梯度下降和小批量梯度下降。
·批量梯度下降:遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度和更新梯度。这种方法每更新一次参数,都要把数据集里的所有样本看一遍,计算量大,计算速度慢,不支持在线学习。
·随机梯度下降:每看一个数据就算一个损失函数,然后求梯度更新参数。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,命中不到最优点。两次参数的更新也有可能互相抵消,造成目标函数震荡比较剧烈。
·小批量梯度下降:为了克服上面两种方法的缺点,一般采用一种折中手段——小批量梯度下降。这种方法一方面因为把数据分为若干个批,按批来更新参数,这样一批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性;另一方面因为批的样本数与数据集相比小了很多,计算量也不是很大。
【例3-12】使用tf.gradients实现梯度下降。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_69_1.jpg?sign=1739046415-C0BtVMhtxi2izPQG0kWdfuOnSoMjTDtv-0-87a91cfac96ff10c74c18cb3f04c6bec)
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_1.jpg?sign=1739046415-xdI2atksfHNq7Bo7J855L1W5OGuJEHxQ-0-383b3506dbe02e1c571b0caa9ef4ca9b)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_2.jpg?sign=1739046415-FIqYXBZEOmBkA9mRfDJpyUs0fmCH4mzB-0-9a7df2aae5270a24a8479eebda2d6ac9)
3.6.2 退化学习率
优化器中的learning_rate就是学习率,在运筹学中常常成为步长因子。设置学习率的大小,是在精度和速度之间寻找一个平衡:
·学习率比较大,训练的速度虽然会提升,但是会造成精度不够。
·学习率比较小,精度虽然提升了,但是训练会耗费非常多的时间。
退化学习率(衰减学习率),在训练的初期可以使用较大的学习率以提高学习速度,当训练到一定程度后,把学习率调小来提高训练精度。它的定义如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_3.jpg?sign=1739046415-SeH0BjCVymTPMtNioaHTGtAeNDIo9aJL-0-1df9ab9b88d4c0d216ea1e6b89226db5)
学习率的衰减速度是由global_step和decay_steps来决定的。具体的计算公式如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_4.jpg?sign=1739046415-FmWM3cNTGwcC2R52GZZ6odDD1jI6vh4f-0-1996bf7e012cec3dbf3f2e70fecae14d)
staircase值默认为False。当为True时,将没有衰减功能,只是使用上面的公式初始化一个学习率的值而已。
例如,下面的代码:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_5.jpg?sign=1739046415-2f476jLExrVrVrWr9ZdYmaCH35olXAe2-0-c694d7364a8a37481326b0fdb23d2378)
这种方式定义的学习率就是退化学习率,它的意思是当前迭代到global_step,学习率每一步都按照每10万步缩小到0.96%的速度衰退。有时还需要对已经训练好的模型进行微调,可以指定不同层使用不同的学习率。
【例3-13】定义一个学习率变量,将其衰减系数设置好,并设置好迭代循环的次数。将每次迭代运算的次数与学习率打印出来,观察学习率按照次数退化的现象。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_6.jpg?sign=1739046415-5ilSoVChVp5Lh8rwqhYQvmheiz7wAUWg-0-1e822694065adc0953a6bfb8e3c5e917)
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_71_1.jpg?sign=1739046415-p0b0zmvCWPbCAyylXArqTtjAtcP2A58r-0-4a3355075b66ae140e154d0e29a206de)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_71_2.jpg?sign=1739046415-ZnbCp65L4gg9cEyWurd7jaeH7JHvmX1m-0-49eb04c60a4f08d7e81b1abc670487af)
由以上结果可以看出,学习率在逐渐变小,在第10次由原来的0.1变成了0.09。
注意:这是一种常用的训练策略,在训练神经网络时,通常在训练刚开始时使用较大的learning_rate,随着训练的进行,会慢慢减小learning_rate。在使用时,一定要把当前迭代次数global_step传进去,否则不会有退化的功能。