梯度下降是一种最小化可微函数的算法,它通过反复朝着使函数值在局部下降最快的方向前进来实现优化。如果你在搜索“什么是梯度下降”,核心思想其实很简单:先算斜率,沿着下坡方向走一小步,然后重复这个过程。
它广泛用于基于微积分的优化问题和机器学习中。当你能够计算导数或梯度,并且能选出一个既足够小以保持稳定、又足够大以推动进展的学习率时,这种方法效果最好。
在单变量情况下,更新公式是
在多变量情况下则变为
其中 是学习率。学习率决定每一步走多远,因此它会直接影响算法是收敛、停滞,还是越过最优点。
梯度下降的直观理解
梯度指向上升最快的方向。如果你的目标是最小化,那么自然的局部移动方式就是朝相反方向走。
不过,这个局部规则并不能保证在所有问题中都得到最优解。对于凸函数,梯度下降可以到达全局最小值;对于非凸函数,它可能停在局部最小值、平坦区域,或其他驻点上。
梯度下降算法如何工作
每一次迭代都会利用当前位置的斜率信息,更新点的位置,并检查是否还要继续。
- 从一个初始猜测 或 开始。
- 计算当前位置的导数或梯度。
- 用当前位置减去 倍的导数或梯度来更新。
- 当梯度足够小、更新量变得很小,或达到预设的迭代次数上限时停止。
标准更新公式默认目标函数在应用该公式的点上是可微的。有些优化方法会在非光滑问题中使用次梯度,但那是另一种设定。
为什么学习率在梯度下降中很重要
学习率 就是步长。
如果 太小,梯度下降通常会朝正确方向前进,但速度可能慢得令人难受。如果 太大,更新可能会越过最小值、来回震荡,甚至发散。
在二次函数中,这种权衡尤其明显,因为离最小值越远,斜率通常越陡。在某个位置看起来安全的步长,换到另一个位置可能就过于激进了。
例题:在二次函数上应用梯度下降
考虑
这个函数在 处取得最小值。它的导数是
使用学习率 和起点 进行梯度下降。
那么更新公式为
从 开始:
接着
以及
每一步都更接近 ,而且函数值每次都在减小。这正是这里要观察的主要规律:梯度下降不会一下子跳到答案上,而是通过反复进行局部修正来逐步改进估计值。
常见的梯度下降变体
批量梯度下降
批量梯度下降在每次更新时都使用整个数据集。对于固定目标函数,这会得到一个确定性的更新步,但当数据集很大时,计算代价可能很高。
随机梯度下降
随机梯度下降每次只用一个样本来更新。这样每一步更便宜,但噪声也更大。这种噪声有时能帮助方法继续前进,但也会让优化路径不那么平滑。
小批量梯度下降
小批量梯度下降每一步使用一小组样本。这通常是一个很实用的折中方案,因为它比纯随机更新噪声更小,同时又比完整批量更新便宜得多。
这些变体在机器学习中尤其重要,因为此时目标函数往往是许多训练样本上平均损失的形式。
梯度下降中的常见错误
把学习率当成无关紧要的参数
改变 会改变算法本身的行为。一个在某个学习率下能收敛的方法,换一个学习率后可能就会失败。
认为梯度下降总能找到全局最小值
这个结论需要额外条件。例如,凸性所提供的保证要比一般的非凸情形强得多。
在实际问题中忽略特征尺度
在变量尺度差异很大的优化问题中,一个方向上的变化可能比另一个方向快得多。这样一来,梯度下降可能会呈锯齿状前进并且收敛缓慢,除非你重新表述问题或更仔细地做尺度调整。
仅仅因为梯度不等于零就不停下来
数值算法很少会等到“完全为零”才停止。实际中的停止规则通常会检查梯度范数、参数变化量,或目标函数变化量是否已经足够小。
梯度下降在什么时候使用
梯度下降用于数值优化、统计学和机器学习中。尤其是在无法得到精确闭式解,或者直接计算闭式解代价过高时,它非常常见。
对于规模较小且公式简单的问题,微积分可能可以直接给出精确最小值。当参数空间很大、目标函数包含很多变量,或者损失函数来自大规模数据集时,梯度下降就更有用了。
试试类似的问题
你可以自己试一个版本:取 ,起点设为 。分别运行 和 两种情况。亲眼看到一次稳定运行和一次不稳定运行,会比只看公式更清楚地理解学习率的作用。