基于梯度下降法的最优化方法
梯度下降法的基本思想
如果要找到某函数的最小值,最好的方法是沿着负梯度方向探寻。假设有一个参数向量x及其梯度dx,更新公式是:x+=-lr*dx 其中lr称为学习率,是超参数,是正的常量,其值一般较小。在整个数据集上计算梯度进行参数更新时,只要学习率足够小,每次更新参数时总能使损失函数的值减小。
随机梯度下降法SGD
参数更新中的梯度是通过对训练集中所有样本的平均损失求梯度得到的。当训练集规模较小时,计算梯度不成问题。然而对于大规模数据集,当训练样本达到百万量级时,需要计算整个训练集的梯度,才能更新一次参数。这样更新效率太低,浪费计算资源。一个常用的代替方法是从训练集中随机抽取小批量样本,计算它们平均损失的梯度,来实现一次参数更新。用小批量样本的平均损失代替全体样本的平均损失进行参数更新,可以加快参数更新频率,加速收敛。小批量样本的平均损失是全体样本平均损失的无偏估计。这是因为训练集中的同类样本是相关的,同类样本中不同个体的损失是相似的,所以随机抽取的一个样本损失可以作为该类所有样本损失的估计。 如果小批量样本中只有一个样本,那么称为随机梯度下降法(Stochastic Gradient Descent,SGD)。SGD指每次使用一个样本来更新参数,但我们经常使用SGD来指代小批量梯度下降法。小批量样本的数量是一个超参数,它受存储器的存储容量限制,一般设置为32、64、128等2的指数,运算效率会更高。SGD算法中,每次都要随机抽取batch个样本,实现时可以采用先整体打乱训练集,然后每次按顺序取batch个样本的方式。 深度学习中最常用的优化算法之一就是利用SGD及其改进算法进行训练,下面将介绍这些算法。
基本动量法
把梯度下降想象成小球从山坡滚向山谷的过程,损失值是小球当前的高度,最小化损失值就是希望小球滚动到高度最小的山谷。设小球的空间位置是x,每次移动的路径矢量是dx,位置x处的山的高度就是损失值。那么基本梯度下降法的小球是“这样”滚动的:在出发点A处,计算点A在各个方向的梯度,沿着坡度最陡的方向,沿着这个方向走一段路,再停下。注意每到一个新位置,小球都必须停下来。准确地说,小球并没有滚动下山,而是盲人下山的方式,走一步停一步,用拐杖探明坡度最陡的方向,沿此方向上的坡度都为0,盲人无法移动了。然而一个真正的小球要比盲人高效得多,从起始点A静止滚动到B的时候,小球获得一定速度,继续滚动,小球会越滚越快,快速滚向谷底。 动量法就是通过模拟小球的滚动过程来加速神经网络的收敛。这时就需要一个速度变量,根据速度变量来更新参数。速度变量积累了历史梯度信息,使之具有惯性,当梯度方向一致时,加速收敛;当梯度方向不一致时,减小路径曲折程度。
mu = 0.9 v = mu *v #[1] v += -lr *dx #[2] x += v
变量v就是速度,初始化为0(相当于小球从静止开始滚动),语句[1]表明v积累了历史梯度,mu是小于1的正超参数,物理意义类似于摩擦系数,该变量有效地抑制了速度,降低了小球的动能,不然小球在山谷永远不会停下来(如果没有摩擦,滚动的小球会一直运动下去,不会停在山谷)。通过交叉验证,这个参数通常设为0.5、0.9或0.99.但需注意的是:mu越大,摩擦越小;mu=1,没有摩擦;mu=0,摩擦无穷大,变为基本的梯度下降法。语句[2]表明速度v受当前速度dx调节。 假设每个时刻的梯度dx相等,由语句[1]和[2]可得:v = -lr/(1-mu)xdx,此时相当于学习率为lr/(1-mu),mu=0.9表示10倍于SGD算法的收敛速度。把1/(1-mu)看作放大率更容易理解,mu越大,放大率越大,收敛可能越快。
假设每个时刻的梯度dx总是0(相当于小球滚动到平地),由语句[1]可得:v = mun* v0,其中n是参数更新次数。可见,v是指衰减,小球只要滚动到平地时的初速度v0足够大,就有机会冲出当前平地,到达一个更低的山谷。速度v被称为动量,所以该方法被称为动量法。