梯度下降法的主要思想是沿着损失函数的曲线下降,直到到达局部或全局的最小值点。
从数学上来看,梯度是指某点的切线斜率,即导数或偏导数(多元函数),在顶点斜率为0,所以找到斜率为0的点就是极值点。
梯度是函数值相对于自变量的变化率,变化率正负表示梯度方向,变化率为正,自变量变大函数值也变大,变化率为负,自变量变大函数值变小。为了找到函数极小值,自变量应该朝函数值变小的方向迈进,即梯度的反方向。
在每次迭代中,权重更新的步长与梯度方向相反,步长大小由学习率的值决定。
用梯度下降法求取损失函数最小值的步骤
使用梯度下降算法更新权重,在梯度的反方向上迈出一步。
w := w + \Delta w
权重更新的步长Δw被定义为学习率η乘以负梯度(反向)。
\Delta w = -η \nabla J(w)
计算损失函数的梯度,等价于计算损失函数对每个权重w_j的偏导数。
\frac{\partial{J}}{\partial{w_j}} = – \sum _i(y^{(i)} – φ(z^{(i)}))x_j^{(i)}
所以每个权重的更新步长可以写成:
\Delta w_j = -η \frac{\partial{J}}{\partial{w_j}} = η \sum _i(y^{(i)} – φ(z^{(i)}))x_j^{(i)}
由于所有权重同时更新,Adaline规则的权重更新:
[w_0, w_1, w_2, …, w_n] := [w0, w_1, w_2, …, w_n] + [\Delta w_0, \Delta w_1, \Delta w_2, …, \Delta w_n]
损失函数的偏导数计算
在上面的内容中,我们直接给出了计算偏导数的公式,下面是该公式的推导过程。如不敢兴趣可跳过。
从上一章中,我们得知损失函数可以表示为:
\begin{aligned} J(w)=\frac{1}{2}\sum _i (y^{(i)} – φ(z^{(i)}))^2\\ \end{aligned}
求取该函数的偏导数:
\begin{aligned} \frac{\partial{J}}{\partial{w_j}} &= \frac{\partial}{\partial{w_j}} \frac{1}{2} \sum _i (y^{(i)} – φ(z^{(i)}))^2\\ &= \frac{1}{2} \frac{\partial}{\partial{w_j}} \sum _i (y^{(i)} – φ(z^{(i)}))^2\\ &= \frac{1}{2} \sum _i 2 (y^{(i)} – φ(z^{(i)})) \frac{\partial}{\partial{w_j}} (y^{(i)} – φ(z^{(i)}))\\ &= \sum _i (y^{(i)} – φ(z^{(i)})) \frac{\partial}{\partial{w_j}} (y^{(i)} – \sum _i (w_jx_j^{(i)}) )\\ &= \sum _i (y^{(i)} – φ(z^{(i)})) ( – x_j^{(i)} )\\ &= -\sum _i (y^{(i)} – φ(z^{(i)})) x_j^{(i)} \\ \end{aligned}
梯度下降法的分类
批量梯度下降(Batch gradient descent)
上面使用的梯度下降法,每次都使用全量的训练集样本来更新模型参数,被称为批量梯度下降法。
批量梯度下降每次学习都使用整个训练集,因此其优点在于每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点),但是其缺点在于每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且批量梯度下降不能进行在线模型参数更新。
随机梯度下降(Stochastic gradient descent)
随机梯度下降算法每次从训练集中随机选择一个样本来进行学习。
批量梯度下降算法每次都会使用全部训练样本,因此这些计算是冗余的,因为每次都使用完全相同的样本集。而随机梯度下降算法每次只随机选择一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新。
随机梯度下降最大的缺点在于每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动)。
不过从另一个方面来看,随机梯度下降所带来的波动有个好处就是,对于类似盆地区域(即很多局部极小值点)那么这个波动的特点可能会使得优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样便可能对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。
由于波动,因此会使得迭代次数(学习次数)增多,即收敛速度变慢。不过最终其会和全量梯度下降算法一样,具有相同的收敛性,即凸函数收敛于全局极值点,非凸损失函数收敛于局部极值点。
小批量梯度下降(Mini-batch gradient descent)
Mini-batch 梯度下降综合了 batch 梯度下降与 stochastic 梯度下降,在每次更新速度与更新次数中间取得一个平衡,其每次更新从训练集中随机选择 m, m < n 个样本进行学习。
相对于随机梯度下降,Mini-batch梯度下降降低了收敛波动性,即降低了参数更新的方差,使得更新更加稳定。相对于批量梯度下降,其提高了每次学习的速度。并且其不用担心内存瓶颈从而可以利用矩阵运算进行高效计算。一般而言每次更新随机选择[50,256]个样本进行学习,但是也要根据具体问题而选择,实践中可以进行多次试验,选择一个更新速度与更次次数都较适合的样本数。