TheZTHEZ / UNDERSTANDING FIRST
机器学习入门18 分钟阅读

梯度下降:让一个模型真正学起来

推导均方误差梯度,用 NumPy 训练一个可验证的模型。

一个可理解的模型

输入 xix_i、目标 yiy_i,模型预测 y^i=wxi+b\hat y_i=wx_i+b。选择均方误差

L(w,b)=1n∑i=1n(wxi+b−yi)2.L(w,b)=\frac1n\sum_{i=1}^n(wx_i+b-y_i)^2.

训练寻找让损失较小的参数。损失表达预测误差,梯度表达参数变化对损失的局部影响。

推导梯度

记残差 ri=wxi+b−yir_i=wx_i+b-y_i。由链式法则与逐项求导,

∂L∂w=2n∑irixi,∂L∂b=2n∑iri.\frac{\partial L}{\partial w}=\frac2n\sum_i r_ix_i,\qquad \frac{\partial L}{\partial b}=\frac2n\sum_i r_i.

更新 w←w−η∂L/∂ww\leftarrow w-\eta\partial L/\partial w、b←b−η∂L/∂bb\leftarrow b-\eta\partial L/\partial b。两个梯度都应基于同一轮旧参数计算,再一起更新。

可运行训练

import numpy as np

x = np.array([-2., -1., 0., 1., 2.])
y = 2 * x + 1
w, b = 0.0, 0.0
learning_rate = 0.1
for step in range(100):
    residual = w * x + b - y
    grad_w = 2 * np.mean(residual * x)
    grad_b = 2 * np.mean(residual)
    w -= learning_rate * grad_w
    b -= learning_rate * grad_b
loss = np.mean((w * x + b - y) ** 2)
assert abs(w - 2) < 1e-6
assert abs(b - 1) < 1e-6
assert loss < 1e-12
print(f"w={w:.6f}, b={b:.6f}, loss={loss:.3e}")

人工数据严格符合线性关系,所以可恢复生成参数。真实数据通常含噪声,不能期待训练损失总能变成零。

负梯度为何有用

对小增量 Δθ\Delta\theta,L(θ+Δθ)≈L(θ)+∇L(θ)TΔθL(\theta+\Delta\theta)\approx L(\theta)+\nabla L(\theta)^T\Delta\theta。取 Δθ=−η∇L(θ)\Delta\theta=-\eta\nabla L(\theta),线性项为 −η∥∇L(θ)∥2-\eta\|\nabla L(\theta)\|^2,非正。但高阶项被忽略,步长太大仍可能增加真实损失。

本例均值 mean⁡(x)=0\operatorname{mean}(x)=0,mean⁡(x2)=2\operatorname{mean}(x^2)=2,Hessian 为 diag⁡(4,2)\operatorname{diag}(4,2)。二次问题中,0<η<0.50<\eta<0.5 保证参数误差各方向收缩;0.1 满足条件。这个界限不能直接照搬到其他数据。

练习与边界

尝试学习率 0.6,权重误差会怎样?再给目标加入噪声,观察损失。用训练集和测试集分别评价,训练损失小不代表泛化好。

继续学习线性层,可以把标量模型推广到多个特征与非线性网络。

这一节,你理解到哪里了?

这是你的自我反馈,与练习估计、课程进度分别记录。

本文为TheZ原创教学内容。正文采用 CC BY-NC-SA 4.0,代码采用 MIT 许可。请尊重署名与授权范围。