假设你站在一座山上,四周大雾,看不清山谷在哪里。
你的目标是:尽可能走到更低的位置。
虽然看不到整座山,但你可以感受脚下的坡度:
哪边上坡最陡? ↓ 朝它的反方向走一小步 ↓ 重新判断坡度 ↓ 继续往下走这就是梯度下降法(Gradient Descent)的直观思想。
根据当前位置的梯度,反复调整参数,让损失函数尽可能减小。
不过,“蒙眼”只是比喻:算法并非乱走,它能够计算当前位置的局部变化信息。
一、AI 训练为什么需要“下山”?
假设我们想让 AI 学习:
输入房屋面积 → 预测房价先用一个简单模型:
haty=wx+bhat y = wx+bhaty=wx+b
其中:
- (x):房屋面积;
- y^\hat yy^:预测房价;
- (w):面积对价格的影响;
- (b):基础偏移。
一开始,(w) 和 (b) 可能不合理,预测自然不准。
我们需要一个指标,衡量“预测错得有多离谱”,例如均方误差:
L(w,b)=1N∑i=1N(wxi+b−yi)2L(w,b)=\frac{1}{N}\sum_{i=1}^{N}(wx_i+b-y_i)^2L(w,b)=N1∑i=1N(wxi+b−yi)2
这里:
-yiy_iyi是真实价格;
- (L) 是损失函数;
- 损失越小,说明模型在这批数据上的预测越接近真实值。
训练的目标就是:
minw,bL(w,b)\min_{w,b}L(w,b)minw,bL(w,b)
对应到下山:
| 下山比喻 | AI 训练 |
|---|---|
| 在山上的位置 | 当前参数 (w,b) |
| 所处高度 | 当前损失 |
| 脚下坡度 | 损失对参数的梯度 |
| 下山步幅 | 学习率配合梯度决定的更新量 |
| 寻找低处 | 寻找损失较小的参数 |
AI 不是在物理空间下山,而是在参数空间中寻找更好的位置。
二、梯度到底是什么?
1. 只有一个参数时:导数
考虑:
L(w)=(w−3)2L(w)=(w-3)^2L(w)=(w−3)2
它是一条开口向上的抛物线,最低点在:
w=3
导数是:
dLdw=2(w−3)\frac{dL}{dw}=2(w-3)dwdL=2(w−3)
它告诉我们,当前位置沿着 (w) 增大的方向,损失如何变化。
例如:
当 (w=0)
dLdw=−6\frac{dL}{dw}=-6dwdL=−6
意味着局部来看:
增大 w → 损失下降所以应该向右走。
当 (w=5)
dLdw=4\frac{dL}{dw}=4dwdL=4
意味着局部来看:
增大 w → 损失上升所以应该向左走。
2. 有多个参数时:梯度
如果模型有多个参数:
θ=(θ1,θ2,…,θn)\theta=(\theta_1,\theta_2,\ldots,\theta_n)θ=(θ1,θ2,…,θn)
梯度就是所有偏导数组成的向量:
∇L(θ)=[∂L∂θ1∂L∂θ2⋮∂L∂θn]\nabla L(\theta)= \begin{bmatrix} \frac{\partial L}{\partial\theta_1}\\ \frac{\partial L}{\partial\theta_2}\\ \vdots\\ \frac{\partial L}{\partial\theta_n} \end{bmatrix}∇L(θ)=∂θ1∂L∂θ2∂L⋮∂θn∂L
在通常的欧氏距离度量下,它指向:
当前位置,损失局部上升最快的方向。
因此,要下降,就沿着负梯度:
−∇L(θ)-\nabla L(\theta)−∇L(θ)
注意关键词:当前位置、局部。
梯度不是一张指向全局最低点的地图。
三、核心公式:当前位置减去学习率乘梯度
梯度下降的更新公式:
θt+1=θt−η∇L(θt)\boxed{\theta_{t+1}=\theta_t-\eta\nabla L(\theta_t)}θt+1=θt−η∇L(θt)
拆开理解:
新参数 = 旧参数 - 学习率 × 当前梯度其中:
- θt\theta_tθt:第 (t) 次更新时的参数;
- η\etaη:学习率;
- ∇L(θt)\nabla L(\theta_t)∇L(θt):当前梯度。
为什么这样通常能下降?
在足够小的邻域内,可以近似写成:
L(θ−η∇L)≈L(θ)−η∥∇L∥2L(\theta-\eta\nabla L) \approx L(\theta)-\eta\|\nabla L\|^2L(θ−η∇L)≈L(θ)−η∥∇L∥2
当学习率为正、梯度非零时,右边的变化项为负。
但这只是局部近似:
步子过大时,实际损失仍然可能上升。
四、亲手算一次“下山”
继续使用:
L(w)=(w−3)2L(w)=(w-3)^2L(w)=(w−3)2
设定:
初始参数:w = 0 学习率:η = 0.1更新公式:
wnew=w−0.1×2(w−3)w_{\text{new}}=w-0.1\times2(w-3)wnew=w−0.1×2(w−3)
第一步
当前:
w=0,L=9w=0,\quad L=9w=0,L=9
梯度:
2(0−3)=−62(0-3)=-62(0−3)=−6
更新:
w=0−0.1(−6)=0.6w=0-0.1(-6)=0.6w=0−0.1(−6)=0.6
新的损失:
L=(0.6−3)2=5.76L=(0.6-3)^2=5.76L=(0.6−3)2=5.76
损失从 (9) 降到了 (5.76)。
继续更新
| 更新次数 | 参数 (w) | 损失 (L(w)) |
|---|---|---|
| 0 | 0 | 9 |
| 1 | 0.6 | 5.76 |
| 2 | 1.08 | 3.6864 |
| 3 | 1.464 | 2.3593 |
| 4 | 1.7712 | 1.5099 |
参数逐渐接近:
w=3
算法不需要事先知道答案,只需要反复计算当前位置的梯度。
五、学习率:步子不是越大越好
学习率太小
方向正确 但每次只挪一点结果:
- 收敛缓慢;
- 需要更多次更新。
学习率太大
一步跨过谷底 下一步又跨回来 甚至越跳越远仍用上面的函数,如果:
η=1\eta=1η=1
就会出现:
w:0 → 6 → 0 → 6 → …一直在两侧来回跳,无法接近最低点。
学习率合适
通常能够兼顾下降速度与稳定性。
还可以使用学习率调度:
前期较大:快速探索 后期较小:细致调整但没有一个适用于所有模型的万能学习率。
另外,学习率并不等于实际移动距离。普通梯度下降中:
∥Δθ∥=η∥∇L∥\|\Delta\theta\|=\eta\|\nabla L\|∥Δθ∥=η∥∇L∥
相同学习率下,梯度越大,参数更新幅度也越大。
六、三种常见方式:一次看多少数据?
模型训练时,梯度通常来自训练样本。
1. 批量梯度下降
每次使用全部训练数据计算梯度。
全部样本 → 计算梯度 → 更新一次特点:
- 得到当前完整训练目标的梯度;
- 数据量大时,单次更新成本高。
2. 随机梯度下降
严格来说,每次使用一个样本估计梯度。
一个样本 → 估计梯度 → 更新一次特点:
- 更新频繁;
- 噪声较大;
- 损失可能上下波动。
3. 小批量梯度下降
每次使用一小批样本,例如 32、128 或 256 个。
一批样本 → 估计梯度 → 更新一次它兼顾计算效率和梯度质量,是深度学习中的常见选择。
实际工程里,“SGD”也经常泛指小批量随机梯度方法。
小批量训练中,某一步损失上升不一定代表训练出错,因为每一批数据给出的方向可能不同。
七、反向传播和梯度下降是什么关系?
它们不是同一件事。
前向传播: 用当前参数进行预测。 损失计算: 衡量预测与目标的差距。 反向传播: 利用链式法则计算梯度。 优化器更新: 根据梯度修改参数。可以记成:
反向传播负责“算坡度”,梯度下降负责“迈步子”。
神经网络可能有数百万甚至数十亿个参数,反向传播让这些梯度能够被高效计算出来。
八、用 Python 写一个最小版本
w=0.0learning_rate=0.1forstepinrange(50):gradient=2*(w-3)w=w-learning_rate*gradient loss=(w-3)**2ifstep%10==0:print(f"step={step+1}, "f"w={w:.6f}, "f"loss={loss:.6f}")print("最终参数:",w)它只做三件事:
计算梯度 ↓ 更新参数 ↓ 重复真实神经网络也是这个基本循环,只是损失函数更复杂,梯度通常由自动微分系统计算。
九、“蒙眼下山”并不保证找到最低谷
1. 可能遇到局部最低点
复杂损失曲面可能有多个低谷。
走进一个低谷,不代表找到了全局最低点。
2. 梯度为零,不一定是最低点
也可能是:
- 局部最高点;
- 鞍点。
鞍点可以理解为:
沿一个方向看是谷底 沿另一个方向看却是山顶3. 平坦区域可能让训练变慢
梯度很小,更新量也可能很小。
深层网络中还可能遇到梯度消失或梯度爆炸等问题,需要结合网络结构、初始化、归一化和梯度裁剪等方法处理。
4. 训练损失低,不等于实际表现好
模型可能记住了训练数据,却不能处理新数据。
这叫过拟合。
因此还需要关注:
验证集表现 正则化 数据质量 泛化能力优化器负责降低你定义的目标,不负责判断这个目标是否完整代表你的真实需求。
十、Momentum 和 Adam:更聪明的走法
普通梯度下降主要依据当前梯度。
常见改进包括:
| 方法 | 直观理解 |
|---|---|
| Momentum | 积累过去的方向,利用“惯性”减少来回摇摆 |
| Adam | 结合梯度的一阶、二阶矩估计,为不同参数调整有效更新尺度 |
它们通常能改善训练效率,但不是:
用了 Adam → 一定收敛 用了 Momentum → 一定找到全局最优学习率、数据和模型设计依然重要。
总结
梯度下降的核心只有一句话:
计算损失对参数的梯度,然后沿负梯度方向更新参数,反复寻找更低的损失。
完整循环是:
做出预测 ↓ 计算损失 ↓ 计算梯度 ↓ 更新参数 ↓ 再次预测“蒙眼下山”的智慧,不在于提前看到了终点,而在于:
利用眼前可靠的局部信息,小步修正,并不断重新判断方向。