Week 2
Week 2 — Linear Regression:从Prediction 到Gradient Descent
Key question模型怎样根据错误学习 parameters?
Learning objectives
- 理解并应用 Week 2 — Linear Regression:从 Prediction 到 Gradient Descent
75 min estimated reading time
Week 1 的参数由人指定。本周让程序根据答案调整参数。我们先学习 x=[1,2,3,4]、y=[3,5,7,9] 这四个点;它们恰好满足 y=2x+1,但训练程序只读取数据,不直接抄这条答案。
本周沿四个问题学习:预测错多少 → 轻轻改一个参数会怎样 → 怎样选方向和步长 → 怎样合并四个样本的建议。中间为方便手算,暂时只看 x=2、y=5 这一项,并把初值设为 w=1、b=0;回到四样本时会明确重置 w=b=0。
Scroll horizontally to view all columns.
| 分次安排 | 离开教材能完成什么 |
|---|---|
| 一:预测与损失 | 计算误差,解释为何平方、为何平均。 |
| 二:微调与导数 | 算 L(1) 和 L(1.001),解释 −12 的含义。 |
| 三:偏导与更新 | 区分只改 w 和同时改 w/b;全部梯度用旧参数。 |
| 四:重复学习与诊断 | 运行 course_examples/week02_loss_gradient.py,对照三个学习率。 |
前置只需会加减乘除和平方。二阶导数、正规方程是选读,不是写训练循环的前提。本周输出是一条真正改参数的训练循环;Week 3 保留这个学习原则,只让预测函数变得更灵活。
1. Linear Regression 解决什么问题?
Scroll horizontally to view all columns.
| 阅读范围 | 固定数据与起点 | 为什么这样安排 |
|---|---|---|
| 第 1–10 节 | 单点示意:只看模型、误差与坡度 | 先分清三个对象 |
| 第 11 节 | x=2,y=5,w=1;暂时固定 b=0 | 只更新一个旋钮 |
| 第 13–14 节 | 同一单点,加入可学习 b | 多参数偏导;本例重新开始 |
| 第 17 节代码 | x=[1,2,3,4],y=[3,5,7,9];w=b=0 | 四个样本的平均损失;不是接着第 14 节跑 |
本周 y=2x+1 是我们人为生成的教学规律。训练程序只能看到配对数据,不能直接读取“答案参数”。你将观察它如何靠误差逐步靠近这条规律。
Linear Regression(线性回归)用来预测连续数值,例如房价、销量、温度、距离等。
假设历史数据:
Scroll horizontally to view all columns.
| x(面积) | y(房价) |
|---|---|
| 1 | 3 |
| 2 | 5 |
| 3 | 7 |
| 4 | 9 |
规律是:
如果x = 5,则预测y = 11。
线性回归的核心就是:根据已有数据,找到最合适的一条直线,再用它预测新的数据。
2. Model、Feature、Parameter
模型:
其中:
- x:Feature,输入特征
- y:真实值/ Target
- ŷ:Prediction,预测值
- w:Weight,权重
- b:Bias,偏置
- w、b:Parameters,模型需要通过训练找到的参数
程序员视角:
def predict(x, w, b):
return w * x + b
训练的本质,就是找到最合适的w 和b。
3. Prediction 是怎么产生的?
假设:
w = 1
b = 0
x = 2
那么:
但真实答案可能是:
于是:
Prediction = 2
Actual
= 5
模型预测错了。
4. Error 与Loss 的区别
最简单的Error:
例如:
2 - 5 = -3
说明预测低了3。
但直接把多个Error 相加会有正负抵消的问题,所以训练时通常用Loss Function。
最常见的一种:
例如:
(2 - 5)² = 9
平方有两个作用:
- 消除正负号;
- 更严重地惩罚大误差。
Scroll horizontally to view all columns.
| 预测 / 真值 | error=预测−真值 | 平方误差 |
|---|---|---|
| 3 / 5 | −2:预测偏低 | 4 |
| 7 / 5 | +2:预测偏高 | 4 |
误差的正负告诉你偏高还是偏低;平方损失表示本次偏差有多大。相反方向的误差不会在平方后抵消。若原目标单位是元,平方误差单位就是元²;要回到原单位可以取均方根 RMSE,但训练本周仍用 MSE。
5. MSE:先逐项平方,再明确平均哪些项
如果一项误差是 +2,另一项是 −2,直接相加等于 0,却不表示预测全对。平方误差把它们变成 4 和 4。我们再取平均,得到每项通常错到什么程度。这个选择适合本周的数值回归示例,不是所有任务的唯一计分方式。
i 是样本编号,n 是参与平均的样本数。Σ 表示把每项相加;1/n 表示除以项数。n=1 时 MSE 就是这一项平方误差,不需要换一种公式。选择平方误差取决于你要优化什么;mean/sum 则决定怎样汇总。
Scroll horizontally to view all columns.
| x | 目标 y | w=b=0 时预测 | 平方误差 |
|---|---|---|---|
| 1 | 3 | 0 | 9 |
| 2 | 5 | 0 | 25 |
| 3 | 7 | 0 | 49 |
| 4 | 9 | 0 | 81 |
总和是 164,平均 L=164/4=41。若报告 sum loss 应写 164;若报告 mean loss 应写 41。梯度也必须对应同一种汇总,不能报告平均损失却不小心按总和梯度更新。
MSE 的单位是目标单位的平方;异常的大误差会受到更强惩罚。下一节的问题是:41 只告诉我们当前结果不好,还没告诉我们 w 应该增加还是减少。
Knowledge check
EX02-A:只有一个样本,预测为 2、目标为 5,MSE 是多少?若同一个样本复制四次,mean loss 与 sum loss 各是多少?
6. 为什么还需要Gradient?
现在模型知道Loss 很大,但它还不知道:
w 和b 应该往哪个方向改?改多少?
Gradient 就是用来回答这个问题的。
7. 导数:把 w 微调一点,Loss 会怎样改变?
先固定 x=2、y=5、b=0,只允许改 w。预测是 2w,因此损失函数是 L(w)=(2w−5)²。这里横轴是参数 w,不是输入 x;我们研究的是改规则,而不是换题目。
def loss(w):
return (w * 2 + 0 - 5) ** 2
print(loss(1.0)) # 9
print(loss(1.001)) # 8.988004
print((loss(1.001) - loss(1.0)) / 0.001) # 约 -11.996这是可独立运行的微调实验。w 增加 0.001,Loss 改变 8.988004−9=−0.011996。除以参数改变量,得到每单位参数变化对应的局部损失变化率,约 −11.996。负号说明在这里向右挪一点会下降。
Δ 读作“变化量”;dL/dw 是把试探步长不断缩小时得到的局部变化率,也叫导数。它不是 Loss 的值:此时 Loss 是 9,导数是 −12。它也不是保证移动一整步就减少 12;局部近似只适用于足够小的变化。
为什么解析结果是 −12?把计算拆成两段。w 增加 δ,预测 wx+b 增加 xδ=2δ;当前误差 e=2−5=−3,平方 e² 对误差的局部变化率是 2e=−6。两段倍率相乘:−6×2=−12。Week 4 会把这种“沿依赖路径相乘”推广到整个网络。
若 x=0,改 w 不改变预测,这一项对 w 的梯度便是 0;此时偏置 b 仍可能影响预测。这不是模型一定学好了,只是这条路径没有提供 w 的学习信号。下一节把多个参数各自的导数装成一组梯度。
Knowledge check
EX02-B:本例只把 w 改为 1.002。先用 −12×0.002 预测 Loss 的变化,再算真实变化。两者为什么不完全相等?
8. Gradient 是什么?
对一个参数w 来说:
它告诉我们:如果稍微改变w,Loss 会怎么变化。
最重要的是符号:
- gradient > 0
- w 增加会让Loss 增加
- 应该减少w
- gradient < 0
- w 增加会让Loss 减少
- 应该增加w
因此参数更新公式是:
为什么是减号?因为Gradient 指向Loss 增长最快的方向,我们要向它的反方向走。
Scroll horizontally to view all columns.
| 记号 | 读法 | 本课意义 |
|---|---|---|
| dL/dw | L 对 w 的导数 | 单变量情况下的局部斜率 |
| ∂L/∂w | L 对 w 的偏导 | 还有别的参数时,暂时固定它们 |
| ∇θL | L 对参数组 θ 的梯度 | 把各参数偏导排在一起 |
| η | eta,学习率 | 本次更新的步长,由我们选 |
9. Gradient Descent
Gradient Descent(梯度下降)可以想象成:
你站在山上,看不到整座山,只能感觉脚下坡度。
目标是走到最低点。
calculate gradient
↓
move downhill
↓
calculate gradient again
↓
move downhill again
↓
repeat
在机器学习里,最低点代表Loss 尽可能小。
Scroll horizontally to view all columns.
| 旧参数 w=1,步长 η=0.1 | 更新 | 方向 |
|---|---|---|
| gradient=3 | 1−0.1×3=0.7 | 减小 w |
| gradient=−3 | 1−0.1×(-3)=1.3 | 增大 w |
| gradient=0 | 1−0=1 | 该步没有一阶方向信号 |
减去梯度,是沿当前局部下降方向尝试一步。步子太大可能跨过谷底;多参数复杂损失也不保证每次都下降,更不保证找到全局最低点。梯度为零只表示一阶变化为零,可能是最低点、最高点或其他驻点。
Knowledge check
w=2,gradient=-4,η=0.05,下一步 w 是多少?
10. Learning Rate
参数更新:
Learning Rate 控制每一步走多大。
- 太大:可能跨过最低点,震荡甚至发散
- 太小:训练很慢
Learning Rate 是Hyperparameter。
注意区别:
- Parameter:模型自己学出来,如w、b
- Hyperparameter:人设置,如learning_rate、batch_size、epochs
11. 完整手算一次w 更新
只用一个训练样本:
x = 2
y = 5
模型先简化为:
初始:
w = 1
learning_rate = 0.01
Step 1 — Prediction
Step 2 — Loss
Step 3 — Gradient
Loss:
Prediction:
使用Chain Rule:
第一部分:
代入:
2(2 - 5) = -6
第二部分:
dŷ/dw = x = 2
所以:
Gradient = -12。
负数说明增加w 可以让Loss 下降。
Step 4 — Update
所以:
新的Prediction:
新的Loss:
(2.24 - 5)² = 7.6176
之前Loss = 9,现在约等于7.62。
模型真的变好了。
12. Chain Rule 为什么重要?
依赖关系是:
w
↓
prediction ŷ
↓
Loss
所以要知道w 如何影响Loss,需要沿dependency chain 往回算。
这就是未来Backpropagation 的核心思想。
13. Bias b 与Partial Derivative
偏导的“偏”表示暂时只动一个参数:求 ∂L/∂w 时,把 b 和数据固定;求 ∂L/∂b 时,把 w 和数据固定。梯度把这些局部斜率排成与参数对应的一组数。求导阶段还不更新任何参数。
完整模型:
现在Loss 同时依赖w 和b:
我们分别计算:
和:
Partial Derivative(偏导数)可以理解为:多个变量时,一次只研究其中一个变量变化对结果的影响。对于单个样本:
多个参数的这些偏导数组合起来,就是Gradient。
14. 同时更新w 和b
假设:
w = 1
b = 0
gradient_w = -12
gradient_b = -6
learning_rate = 0.01
更新:
w = 1 - 0.01 × (-12) = 1.12
b = 0 - 0.01 × (-6) = 0.06
新模型:
这就是模型“学习了一小步”。
先用同一组旧 w、旧 b 算出 dw 和 db,再同时写回新值。不能先改 w,再拿新的 w 和旧的 b 重算 db,却还称作这次标准梯度下降;那是另一种更新顺序。保存中间值,是 Week 4 反向传播能够一致计算的原因。
15. Second Derivative 二阶导数
一阶导数描述:
变化率/ slope
二阶导数描述:
变化率本身变化得有多快。
一个直观类比:
Position
↓derivative
Velocity
↓derivative
Acceleration
在优化里,二阶导数还能帮助描述Loss 曲面的弯曲程度。
Week 2 只需建立这个直觉,不需要深入Hessian。
16. Least Squares 与Gradient Descent
这两个概念不要混淆。
Least Squares 回答:
我们想优化什么?
也就是让squared errors 总和尽可能小。
Gradient Descent 回答:
我们怎么一步步找到较小的Loss?
因此:
Least Squares = Objective
Gradient Descent = Optimization method
简单线性回归也可以直接通过数学公式得到最优参数,但Neural Network 有几百万、几十亿参数时,通常必须靠迭代优化。
17. Python 从零实现
Scroll horizontally to view all columns.
| x / y,起点 w=b=0 | 预测 | 误差 | 误差平方 | 2×误差×x | 2×误差 |
|---|---|---|---|---|---|
| 1 / 3 | 0 | −3 | 9 | −6 | −6 |
| 2 / 5 | 0 | −5 | 25 | −20 | −10 |
| 3 / 7 | 0 | −7 | 49 | −42 | −14 |
| 4 / 9 | 0 | −9 | 81 | −72 | −18 |
| 四项平均 | — | — | 41 | dw=−35 | db=−12 |
用 η=0.01 同时更新,得到 w=0.35、b=0.12。重新预测四项得到 [0.47,0.82,1.17,1.52],新 MSE=28.45315,比 41 小。这是第一次更新的结果,不是已经学完;后面的循环继续从这里前进。
不使用sklearn / PyTorch / TensorFlow:
x_data = [1, 2, 3, 4]
y_data = [3, 5, 7, 9]
w = 0.0
b = 0.0
learning_rate = 0.01
for epoch in range(1000):
dw = 0.0
db = 0.0
loss = 0.0
n = len(x_data)
for x, y in zip(x_data, y_data):
# Forward pass
prediction = w * x + b
# Error
error = prediction - y
# Squared error
loss += error**2
# Gradients
dw += 2 * error * x
db += 2 * error
# MSE / mean gradients
loss /= n
dw /= n
db /= n
# Gradient descent
w -= learning_rate * dw
b -= learning_rate * db
print('w:', w)
print('b:', b)最终会接近:
w ≈2
b ≈1
也就是说模型自己从数据中学习出了:
Knowledge check
第一步为什么要用 -140/4=-35,而不是直接用 -140 更新 w?
18. 代码与数学一一对应
Model:
prediction = w * x + b对应:
Error:
error = prediction - y对应:
Loss:
loss += error**2对应:
(ŷ - y)²
Gradient for w:
dw += 2 * error * x对应:
Gradient for b:
db += 2 * error对应:
Parameter update:
w -= learning_rate * dw
b -= learning_rate * db对应:
parameter = parameter - learning_rate × gradient
19. Forward Pass 与Backward Pass
Forward Pass:
Input
↓
Model
↓
Prediction
↓
Loss
Backward Pass / Backpropagation:
Loss
↓
Gradients
↓
Optimizer / Gradient Descent:
Gradients → Updated Parameters
20. Epoch 与Batch
Epoch:模型完整看完训练数据一次。
例如:
for epoch in range(1000):
# Use the training data once per epoch.
...表示训练数据被重复学习1000 次。
- Batch 是一次forward/loss/backward/update 所处理的一组样本。它可以是整个训练集(full batch),也可以是其中一部分(mini-batch;实际训练更常见)。
例如一百万条数据,可以按batch_size = 32 或64 分批训练。
21. Linear Regression 与Neural Network 的关系
Linear Regression:
一个Neural Network neuron 的核心计算也是:
之后通常再接Activation Function。
所以Linear Regression 可以看作理解neuron 的最简单入口。
22. 从Linear Regression 到GPT
Linear Regression:
Input
↓
Parameters
↓
Prediction
↓
Loss
↓
Gradient
↓
Update Parameters
Neural Network:
Input
↓
Many layers / weights
↓
Prediction
↓
Loss
↓
Backpropagation
↓
Update weights
GPT:
Tokens
↓
Transformer
↓
Next-token Prediction
↓
Loss
↓
Backpropagation
↓
Update huge numbers of parameters
结构和规模变复杂了,但最底层的训练逻辑仍然是同一条主线。
23. Week 2 必须掌握的词
English
中文
核心理解
Feature
特征
输入x
Target / Label
目标/ 标签
正确答案y
Model
模型
wx+b
Parameter
参数
w、b
Prediction
预测
ŷ
Error
误差
ŷ-y
Loss
损失
模型有多差
MSE
均方误差
多样本squared error 平均
Derivative
导数
slope / 变化率
Partial Derivative
偏导
单个参数对Loss 的影响
Gradient
梯度
各参数偏导组成的方向信息
Gradient Descent
梯度下降
向Loss 更小的方向走
Learning Rate
学习率
每步走多远
Epoch
训练轮次
完整看一次数据集
Batch
批次
一次处理部分样本
Scroll horizontally to view all columns.
| English | 中文 | 核心理解 |
|---|---|---|
| Forward Pass | 前向传播 | Input → Prediction → Loss |
| Backward Pass | 反向传播 | Loss → Gradients |
| Chain Rule | 链式法则 | 沿依赖关系求导 |
24. Week 2 最重要的5 个公式
1. Prediction
2. MSE
3. Gradient for w
4. Gradient for b
5. Gradient Descent
其中第5 个最重要。
25. 最终Mental Model
请把下面这条链记牢:
DATA
↓
PARAMETERS
↓
MODEL
↓
PREDICTION
↓
COMPARE WITH TARGET
↓
LOSS
↓
GRADIENT
↓
UPDATE PARAMETERS
↓
BETTER MODEL
一句话概括Machine Learning:
Learning = finding parameters that minimize loss.
程序员版本:
while training:
prediction = model(input, parameters)
loss = calculate_loss(prediction, actual)
gradients = calculate_gradients(loss, parameters)
parameters -= learning_rate * gradients这就是Week 3 Neural Network、Backpropagation,以及后面Transformer / GPT 的地基。
Week 2 补充深入理解:把“公式结论”变成可运行的直觉
本节不改写Week 2 原文,而是在原文之后补充几个最容易卡住的连接。原文介绍了Prediction、Loss、Derivative、Gradient 和Gradient Descent;下面把它们放回同一条因果链。
1. Loss 不是Gradient
Loss 是一个数,表示当前参数下模型有多差。例如:
当w=1 时,prediction 是2,Loss 是9。
Gradient 则是Loss 对参数的变化率:
它回答的是另一个问题:如果只把w 增加一点,Loss 会增加还是减少、变化有多快?
Loss → 当前位置有多差
Gradient → 参数往哪边改会变好
没有指定“对谁求导”时,不能只说“Loss 的导数”。训练中通常是Loss 对weights、biases 等trainable parameters 的导数。
2. 一个parameter 与多个parameters
如果只有一个参数w:
这是一个数字,可以想成一维曲线在当前位置的坡度。
如果有w 和b:
Gradient 变成向量。它描述Loss 曲面上每个参数方向的局部坡度,整个向量指向Loss 增长最快的方向。Gradient Descent 使用负方向:
3. 为什么Gradient 为负时参数会增加
假设:
w = 1
gradient = -12
learning_rate = 0.01
更新:
负号来自Gradient Descent 的“反坡度”原则。Gradient 为负表示向右增加w 会让Loss 下降;公式中的减号把这个负数变成正的update。
4. Chain Rule 为什么是Backprop 的桥
每一项都可以由对应operation 单独提供,因此一个node 不需要理解整个network。
5. 为什么本周不需要二阶导数
一阶导数告诉我们当前位置的坡度;训练的第一步问题是“向左还是向右”。这已经足够执行:
二阶导数:
告诉我们坡度变化得多快,也就是曲面弯曲程度。它可以帮助某些方法估计更合适的步长,但对有数百万参数的网络,完整Hessian matrix 非常昂贵。因此GPT 训练主要使用一阶gradient 的SGD、Momentum、AdamW 等方法。
6. 用有限变化检查导数方向
导数也可以用一个很小的试探步近似检查:
以w=1、ε=0.001 为例:
Loss(1)
= 9.000000
Loss(1.001) ≈8.988004
变化
≈-0.011996
除以0.001
≈-11.996
接近解析结果-12。这种finite-difference check 是工程中验证手写gradient 的好工具,但不适合代替Backprop 训练,因为每个parameter 都需要额外forward,成本很高。
7. 一句话闭环
Parameters 决定prediction
Prediction 与target 决定Loss
Loss 对parameters 的gradient 提供方向
Gradient Descent 沿反方向更新parameters
重复后,prediction 通常逐渐改善