理解梯度下降的理论是一回事;亲眼看它运作能更直观地理解它如何在损失曲面上找到最佳参数。在本实践部分,我们将使用简单的可视化方式来演示梯度下降算法的行为。
首先从一个非常简单的一维凸函数 f(x)=x2 开始。这个函数可以视为一个简化的损失函数,其中只有一个参数 x 需要优化。目标是找到使 f(x) 最小的 x 值。根据微积分原理,最小值位于 x=0 处,而梯度下降方法能够系统地找到这样的最优参数。
f(x)=x2 的梯度(在这种一维情况下是导数)是 f′(x)=2x。梯度下降更新规则是:
xnew=xold−α⋅f′(xold)
xnew=xold−α⋅(2xold)
其中 α 是学习率。
我们来模拟这个过程。我们将从一个任意点开始,比如 x0=4,并选择一个学习率,比如 α=0.1。
- 步骤 0: x0=4.0。f(x0)=16.0。梯度 f′(x0)=2×4.0=8.0。
- 步骤 1: x1=x0−α⋅f′(x0)=4.0−0.1×8.0=4.0−0.8=3.2。f(x1)=10.24。梯度 f′(x1)=2×3.2=6.4。
- 步骤 2: x2=x1−α⋅f′(x1)=3.2−0.1×6.4=3.2−0.64=2.56。f(x2)=6.55。梯度 f′(x2)=2×2.56=5.12。
- 步骤 3: x3=x2−α⋅f′(x2)=2.56−0.1×5.12=2.56−0.512=2.048。f(x3)=4.19。
- ……依此类推。请注意,x 的值如何逐渐接近 0,并且随着我们接近最小值,步长(由梯度决定)也随之减小。
我们来将这条路径可视化。
梯度下降从 x=4 开始,以学习率 α=0.1 迭代地向二次函数 f(x)=x2 的最小值移动。
学习率的影响
学习率 α 是一个重要的超参数。我们来看看不同值的情况,仍然从 x0=4 开始。
- 小学习率 (α=0.01): 步长会非常小,导致向最小值移动的速度非常慢。
- 大学习率 (α=0.95): 步长可能过大,导致算法越过最小值并来回振荡。它可能仍然收敛,但效率可能不高。
- 过大学习率 (α=1.05): 步长如此之大,以至于每次更新都比上一个点离最小值更远。算法发散。
在 f(x)=x2 上不同学习率 (α) 的梯度下降路径比较。小值收敛缓慢,合适的值有效收敛,较大的值可能越过甚至发散。
这表明了选择合适的学习率对成功训练的重要性。
二维可视化
神经网络损失函数通常依赖于数百万个参数,这使得它们的曲面无法直接可视化。然而,通过可视化二变量函数(例如 f(x,y)=x2+y2)上的梯度下降,我们可以获得更好的直观理解。最小值显然在 (0,0)。
梯度现在是一个向量:
∇f(x,y)=[∂x∂f,∂y∂f]=[2x,2y]
更新规则变为:
xnew=xold−α⋅(2xold)
ynew=yold−α⋅(2yold)
我们从 (x0,y0)=(3,4) 开始,学习率 α=0.1。
- 步骤 0: (x0,y0)=(3.0,4.0)。f(x0,y0)=9+16=25。梯度 ∇f(3,4)=[6,8]。
- 步骤 1:
- x1=3.0−0.1×6=3.0−0.6=2.4。
- y1=4.0−0.1×8=4.0−0.8=3.2。
- (x1,y1)=(2.4,3.2)。f(x1,y1)=5.76+10.24=16.0。梯度 ∇f(2.4,3.2)=[4.8,6.4]。
- 步骤 2:
- x2=2.4−0.1×4.8=2.4−0.48=1.92。
- y2=3.2−0.1×6.4=3.2−0.64=2.56。
- (x2,y2)=(1.92,2.56)。f(x2,y2)=3.6864+6.5536=10.24。
我们可以将其可视化为函数 f(x,y) 等高线图上的一条路径。任何一点的梯度都垂直于穿过该点的等高线,并指向最陡峭的上升方向。梯度下降则向相反的方向(最陡峭的下降方向)迈进。
梯度下降在 f(x,y)=x2+y2 的等高线图上的路径。从 (3, 4) 开始,算法沿着垂直于等高线的方向向最小值 (0, 0) 移动。
这些可视化虽然简单,但演示了梯度下降的核心机制。在深度学习中,损失曲面要复杂得多,并且是高维的,可能存在许多局部最小值和鞍点(如 gradient-descent-challenges 中所述)。然而,基本思想保持不变:沿着负梯度方向迭代地减小损失。理解这种视觉直觉有助于诊断训练问题或调整学习率等超参数。