前言
什么是梯度?方向导数是一个值而梯度是一个向量。方向导数是函数在各个方向的斜率,而梯度是斜率最大的方向,梯度的值是方向导数最大的值。
当 Θ = 0 时,e 与梯度方向相同时,方向导数最大,函数增加最快
当 Θ = pi 时,e 与梯度方向相反时,方向导数最小,函数减少最快
当 Θ = pi/2 时,e 与梯度方向垂直时,方向导数为0, 函数变化率为零
反向传播通过梯度下降的方式来更新参数,以使得loss最小。公式如下:
代表学习率,作为参数控制梯度下降的步长。
1.SGD
随机梯度下降(Stochastic Gradient Descent, SGD)每次从训练样本中随机抽取一个样本计算loss和梯度并对参数进行更新;但这种优化算法比较弱,容易走偏,有时可用于在线学习(Online Learning)系统,可使系统快速学到新变化。
批量梯度下降(Batch Gradient Descent,BGD)算法每次使用整个训练集合计算梯度,这样计算的梯度比较稳定,相比随机梯度下降不那么容易震荡;单非常慢且无法放到内存中计算,更无法应用于在线学习系统。
介于随机梯度下降和批量梯度下降之间的是小批量梯度下降(Mini-Batch Gradient Descent),即每次随机抽取m个样本,以它们的梯度均值作为梯度的近似估计。它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
在深度学习中常说的随机梯度下降通常是指小批量梯度下降。所以本博客中的SGD没有特别指出,都为小批量梯度下降。随机梯度下降的具体训练步骤如下所示,其中表示第i个样本的预测值,表示第i个样本的损失函数, 为m条数据的平均损失。
参数:学习率
初始化:
while 停止条件未满足do
从训练数据中抽取m条数据{ }及对应的标签{ }
计算梯度:
更新参数:
end while
为了使随机梯度下降获得较好的性能,学习率需要取值合理并根据训练过程动态调整。如果学习率过大,模型就会收敛过快,最终离最优值较远;如果学习率过小,迭代次数就会很多,导致模型长时间不能收敛。
2.Momentum
动量(Momentum)是来自物理力学中的一个概念,是力的时间积累效应的度量。动量的方法在随机梯度下降的基础上,加上了上一步的梯度:
其中是动量参数且。动量的优化方法也可以写为如下形式:
区别在于学习率的位置。如果对公式进行展开,不难发现两者是完全等价的。
相比随机梯度下降,动量会使相同方向的梯度不断累加,而不同方向的梯度则相互抵消,因而可以在一定程度上克服Z字形的震荡,更快到达最优点。具体算法细节如下所示:
参数:学习率,动量
初始化:
while 停止条件未满足do
从训练数据中抽取m条数据{ }及对应的标签{ }
计算梯度:
更新参数:
end while
3.NAG
Nesterov加速梯度(Nesterov Accelerated Gradient, NAG)与动量类似,也是考虑最近的梯度情况,但是NAG相对超前一点,它先使用动量计算参数下一个位置的近似值,然后再近似位置上计算梯度: