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