梯度下降是一种最小化可微函数的算法,它通过反复朝着使函数值在局部下降最快的方向前进来实现优化。如果你在搜索“什么是梯度下降”,核心思想其实很简单:先算斜率,沿着下坡方向走一小步,然后重复这个过程。

它广泛用于基于微积分的优化问题和机器学习中。当你能够计算导数或梯度,并且能选出一个既足够小以保持稳定、又足够大以推动进展的学习率时,这种方法效果最好。

在单变量情况下,更新公式是

xk+1=xkηf(xk),x_{k+1} = x_k - \eta f'(x_k),

在多变量情况下则变为

xk+1=xkηf(xk),\mathbf{x}_{k+1} = \mathbf{x}_k - \eta \nabla f(\mathbf{x}_k),

其中 η>0\eta > 0 是学习率。学习率决定每一步走多远,因此它会直接影响算法是收敛、停滞,还是越过最优点。

梯度下降的直观理解

梯度指向上升最快的方向。如果你的目标是最小化,那么自然的局部移动方式就是朝相反方向走。

不过,这个局部规则并不能保证在所有问题中都得到最优解。对于凸函数,梯度下降可以到达全局最小值;对于非凸函数,它可能停在局部最小值、平坦区域,或其他驻点上。

梯度下降算法如何工作

每一次迭代都会利用当前位置的斜率信息,更新点的位置,并检查是否还要继续。

  1. 从一个初始猜测 x0x_0x0\mathbf{x}_0 开始。
  2. 计算当前位置的导数或梯度。
  3. 用当前位置减去 η\eta 倍的导数或梯度来更新。
  4. 当梯度足够小、更新量变得很小,或达到预设的迭代次数上限时停止。

标准更新公式默认目标函数在应用该公式的点上是可微的。有些优化方法会在非光滑问题中使用次梯度,但那是另一种设定。

为什么学习率在梯度下降中很重要

学习率 η\eta 就是步长。

如果 η\eta 太小,梯度下降通常会朝正确方向前进,但速度可能慢得令人难受。如果 η\eta 太大,更新可能会越过最小值、来回震荡,甚至发散。

在二次函数中,这种权衡尤其明显,因为离最小值越远,斜率通常越陡。在某个位置看起来安全的步长,换到另一个位置可能就过于激进了。

例题:在二次函数上应用梯度下降

考虑

f(x)=(x3)2.f(x) = (x-3)^2.

这个函数在 x=3x=3 处取得最小值。它的导数是

f(x)=2(x3).f'(x) = 2(x-3).

使用学习率 η=0.1\eta = 0.1 和起点 x0=0x_0 = 0 进行梯度下降。

那么更新公式为

xk+1=xk0.12(xk3)=xk0.2(xk3).x_{k+1} = x_k - 0.1 \cdot 2(x_k-3) = x_k - 0.2(x_k-3).

x0=0x_0 = 0 开始:

x1=00.2(03)=0.6.x_1 = 0 - 0.2(0-3) = 0.6.

接着

x2=0.60.2(0.63)=1.08.x_2 = 0.6 - 0.2(0.6-3) = 1.08.

以及

x3=1.080.2(1.083)=1.464.x_3 = 1.08 - 0.2(1.08-3) = 1.464.

每一步都更接近 33,而且函数值每次都在减小。这正是这里要观察的主要规律:梯度下降不会一下子跳到答案上,而是通过反复进行局部修正来逐步改进估计值。

常见的梯度下降变体

批量梯度下降

批量梯度下降在每次更新时都使用整个数据集。对于固定目标函数,这会得到一个确定性的更新步,但当数据集很大时,计算代价可能很高。

随机梯度下降

随机梯度下降每次只用一个样本来更新。这样每一步更便宜,但噪声也更大。这种噪声有时能帮助方法继续前进,但也会让优化路径不那么平滑。

小批量梯度下降

小批量梯度下降每一步使用一小组样本。这通常是一个很实用的折中方案,因为它比纯随机更新噪声更小,同时又比完整批量更新便宜得多。

这些变体在机器学习中尤其重要,因为此时目标函数往往是许多训练样本上平均损失的形式。

梯度下降中的常见错误

把学习率当成无关紧要的参数

改变 η\eta 会改变算法本身的行为。一个在某个学习率下能收敛的方法,换一个学习率后可能就会失败。

认为梯度下降总能找到全局最小值

这个结论需要额外条件。例如,凸性所提供的保证要比一般的非凸情形强得多。

在实际问题中忽略特征尺度

在变量尺度差异很大的优化问题中,一个方向上的变化可能比另一个方向快得多。这样一来,梯度下降可能会呈锯齿状前进并且收敛缓慢,除非你重新表述问题或更仔细地做尺度调整。

仅仅因为梯度不等于零就不停下来

数值算法很少会等到“完全为零”才停止。实际中的停止规则通常会检查梯度范数、参数变化量,或目标函数变化量是否已经足够小。

梯度下降在什么时候使用

梯度下降用于数值优化、统计学和机器学习中。尤其是在无法得到精确闭式解,或者直接计算闭式解代价过高时,它非常常见。

对于规模较小且公式简单的问题,微积分可能可以直接给出精确最小值。当参数空间很大、目标函数包含很多变量,或者损失函数来自大规模数据集时,梯度下降就更有用了。

试试类似的问题

你可以自己试一个版本:取 f(x)=(x5)2f(x) = (x-5)^2,起点设为 x0=12x_0 = 12。分别运行 η=0.1\eta = 0.1η=1.2\eta = 1.2 两种情况。亲眼看到一次稳定运行和一次不稳定运行,会比只看公式更清楚地理解学习率的作用。

需要解题帮助?

上传你的问题,几秒钟内获得经过验证的分步解答。

打开 GPAI Solver →