一个可理解的模型
输入 、目标 ,模型预测 。选择均方误差
训练寻找让损失较小的参数。损失表达预测误差,梯度表达参数变化对损失的局部影响。
推导梯度
记残差 。由链式法则与逐项求导,
更新 、。两个梯度都应基于同一轮旧参数计算,再一起更新。
可运行训练
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}")
人工数据严格符合线性关系,所以可恢复生成参数。真实数据通常含噪声,不能期待训练损失总能变成零。
负梯度为何有用
对小增量 ,。取 ,线性项为 ,非正。但高阶项被忽略,步长太大仍可能增加真实损失。
本例均值 ,,Hessian 为 。二次问题中, 保证参数误差各方向收缩;0.1 满足条件。这个界限不能直接照搬到其他数据。
练习与边界
尝试学习率 0.6,权重误差会怎样?再给目标加入噪声,观察损失。用训练集和测试集分别评价,训练损失小不代表泛化好。
继续学习线性层,可以把标量模型推广到多个特征与非线性网络。
这一节,你理解到哪里了?
这是你的自我反馈,与练习估计、课程进度分别记录。
本文为TheZ原创教学内容。正文采用 CC BY-NC-SA 4.0,代码采用 MIT 许可。请尊重署名与授权范围。