![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=1738858410-HtqPaXRfZ115JIrvEB507k5WzfqPXXz4-0-9a5abcaf80f3fa756b1a4cb750ccdd36)
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_1.jpg?sign=1738858410-xKfWZnJ3rVZGLUQqqPtgFrtYqG9vI9z0-0-83e49ce633b3c015d8b1fc69ed9513fd)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_2.jpg?sign=1738858410-DebwvqsDgOeehU7BuE4hYnZl6WGHN9PC-0-20ecb4974bf387dc36d52010371f0476)
3.6.2 退化学习率
优化器中的learning_rate就是学习率,在运筹学中常常成为步长因子。设置学习率的大小,是在精度和速度之间寻找一个平衡:
·学习率比较大,训练的速度虽然会提升,但是会造成精度不够。
·学习率比较小,精度虽然提升了,但是训练会耗费非常多的时间。
退化学习率(衰减学习率),在训练的初期可以使用较大的学习率以提高学习速度,当训练到一定程度后,把学习率调小来提高训练精度。它的定义如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_3.jpg?sign=1738858410-Z7KaS7ErAOlmueOW8x3q3rR9EQ5wNVe4-0-884e4f283ec937d71d617aaf92eaf8c2)
学习率的衰减速度是由global_step和decay_steps来决定的。具体的计算公式如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_4.jpg?sign=1738858410-Rc5fPS7v9c712HbB7r7gm4MIx6Y2JzSp-0-543d816892543d044cdc0e1ca80e34ea)
staircase值默认为False。当为True时,将没有衰减功能,只是使用上面的公式初始化一个学习率的值而已。
例如,下面的代码:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_5.jpg?sign=1738858410-Tk0LgL7YsudA3TqLlAjv8VskEGoLU6nt-0-ecd409031b8f0e00985953af46712a2f)
这种方式定义的学习率就是退化学习率,它的意思是当前迭代到global_step,学习率每一步都按照每10万步缩小到0.96%的速度衰退。有时还需要对已经训练好的模型进行微调,可以指定不同层使用不同的学习率。
【例3-13】定义一个学习率变量,将其衰减系数设置好,并设置好迭代循环的次数。将每次迭代运算的次数与学习率打印出来,观察学习率按照次数退化的现象。
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_70_6.jpg?sign=1738858410-tRpOu1F5Dui0apowUDocLnDo34TjZ8IC-0-1cc863bbda0dcae7a0a3828119ed826d)
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_71_1.jpg?sign=1738858410-GzOb2QtEUVHLY1T5KF84jnOmRvV9UKXe-0-cfc66dc93a357dc3ba6da0284d123153)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CDA2CB/20118172708702706/epubprivate/OEBPS/Images/40919_71_2.jpg?sign=1738858410-IPwdIPysryOfEiSWl59C2GwSyJDLVL96-0-579d4b974fc3c8bcd476506de9a06f3e)
由以上结果可以看出,学习率在逐渐变小,在第10次由原来的0.1变成了0.09。
注意:这是一种常用的训练策略,在训练神经网络时,通常在训练刚开始时使用较大的learning_rate,随着训练的进行,会慢慢减小learning_rate。在使用时,一定要把当前迭代次数global_step传进去,否则不会有退化的功能。