前言
在机器学习中,所有的问题都被转换为目标函数的优化问题,也就是求解目标函数的最小值(比如损失函数最小化)。通过优化目标函数来学习参数。为了更快更好的实现这个过程,出现了梯度下降。
1. 主要原理
对于相同一批样本,不同的参数使得目标函数的值不同,梯度下降要做的就是不断改变参数,使得目标函数朝着目标函数值减少的方向变化。我们可以把参数当作变量,样本的特征当作常量,变量的变化导致目标函数的变化,怎么找到最佳的参数能使目标函数最小就是梯度下降要做的事。
想象一个很大的曲面,相当于目标函数所有能取的值,上面有一个小球,相当于目标函数,现在要让小球滚向曲面的最凹的点,如下图,当然,实际上参数比2个要多的多,每一次只向前走一步,每一步的步长都不相同。
那么具体怎么用这个原理实现目标函数的最小化呢?看下面~
2. 梯度下降过程
现在我们知道要通过一点点改变参数值来使目标函数不断靠近最小值,这里用线性回归来举例子~:
f(x)为函数表达式,x为一个d维的特征向量。然后我们可以写出目标函数,均方误差,它是求每个样本的平均误差:
梯度下降就是要改变w的值,使得E最小。我们可以把E看出关于w的函数,而不是x的函数。一般来说,我们用f(x)的时候,w是固定的,x是变量,但是在这里,所有样本都是固定的,变化的其实是参数w。
现在我们改变参数wi,让它变化一个很微小的值,同时E相对于wi的变化速度就是对E求wi的偏导
。那么损失E在wi方向变化的量就为
。我们把E在所有参数方向上的变化加起来,就是E在参数w变化下的总变化量:
上述式子将E的变化量表示为E的梯度和变量变化量
的乘积。这个帮我们联系了w的变化量和E的变化量。现在只要找合适的w变化量,使得E每次都会减少,即
为负值。显然
为:
将上式代入到ΔE中,可以使得ΔE为负值,其中η是学习率,为正数。接下来我们可以利用Δw来修改w的值:
现在我们找到了如和改变w能使得E朝着最小值的方向减少,w减去学习率η乘E的梯度(E对每个变量的偏导)。在计算最开始,我们随机化所有的参数,然后在这个基础上不断迭代更新参数,使得E达到最小值。
知道了梯度下降的原理和过程后,就可以把它用在线性回归上了,先随机选m个样本求E的梯度:
可以看到第j个变量的梯度是在所有样本上计算的一个平均梯度,这样保证了梯度的有效性。
然后把梯度带入w的迭代公式中,完成w的一次更新:
其中"="号左边的w是第t次迭代的参数,右边的w是第t-1次迭代的参数。完成一次更新后,再用样本重复这个操作,直到参数w不再发生变化或者损失E降低到一个比较低的值。
3. 随机梯度下降
要实现完整的梯度下降,我们一般不会在完整的数据集上求梯度的平均值,因为如果这样的话,每一次迭代都要遍历所有的样本,虽然很准确但是非常耗时。所以我们采用随机梯度下降来加速迭代过程。假设我们现在有N个样本,对于每一次迭代,随机选取m个样本计算平均梯度,直到这N个样本全部都计算了一次梯度,这里这m个样本叫做一个batch,这N个样本总共可以进行N/m次参数更新,当N个样本全部用过一次后,就叫一个epoch(迭代周期)。之后我们还会进行多个epoch的训练,知道损失函数降低到指定值,如上图所示,10个迭代周期损失值就降到最低。
随机梯度下降是最简单的一种优化目标函数的方法,有个明显的缺点:学习率固定导致它在某些情况下会卡在鞍点,之后会介绍其他一些优化算法会自动调节学习率。