日期:2026-06-12

今天的目标:建立 PyTorch 训练的基本手感。不要追求学完很多概念,今天只要把一条最小训练链路跑通,并能说清楚每一步在干什么。

今天的核心句子:

tensor 装数据,model 做预测,loss 衡量错得多离谱,backward 算梯度,optimizer 根据梯度改参数。

如果今天结束时能用自己的话讲清楚这句话,并跑通一个线性回归脚本,就算完成。

今日主线

  1. 理解 tensor、矩阵运算、参数、loss、梯度、反向传播。
  2. 学会 PyTorch 里的 requires_gradbackward().grad
  3. 亲手跑通 forward -> loss -> backward -> optimizer.step()
  4. 完成两个代码任务:autograd 练习 + 线性回归。
  5. 写一页笔记,回答训练循环相关的 5 个核心问题。

建议目录

D:\code\DL-study\
  notes\
    day01-plan.md
    day01-pytorch-basics.md
  src\
    day01_tensor_autograd.py
    day01_linear_regression.py
  experiments\
    day01\

学习资料

今天只用下面 3 类资料,不要再扩展太多。

  1. PyTorch 官方 Learn the Basics
    https://docs.pytorch.org/tutorials/beginner/basics/

  2. 《动手学深度学习》中文版
    https://zh.d2l.ai/index.html

  3. 动手学深度学习课程页
    https://courses.d2l.ai/zh-v2/

重点章节:

  • PyTorch 官方:Tensors
  • PyTorch 官方:Automatic Differentiation with torch.autograd
  • D2L:2.5 自动微分
    https://zh.d2l.ai/chapter_preliminaries/autograd.html
  • D2L:3.1 线性回归
    https://zh.d2l.ai/chapter_linear-networks/linear-regression.html
  • D2L:3.2 线性回归的从零开始实现
    https://zh.d2l.ai/chapter_linear-networks/linear-regression-scratch.html
  • D2L:3.3 线性回归的简洁实现
    https://zh.d2l.ai/chapter_linear-networks/linear-regression-concise.html

3 小时标准版

第 1 段:理论预热,60 分钟

这一段只学今天写代码马上会用到的东西。

1. Tensor 是什么,15 分钟

看 PyTorch 官方基础教程里的 Tensors 部分。

只关注:

  • tensor 和 Python list / NumPy array 的关系。
  • shape:比如 (100, 1)(32, 784) 是什么意思。
  • 加法、乘法、矩阵乘法。
  • dtype
  • requires_grad

最低掌握标准:

深度学习里的数据、参数、梯度,基本都以 tensor 的形式存在。

2. 自动微分 / autograd,20 分钟

看 D2L 2.5 自动微分,再配合 PyTorch 官方 autograd 教程。

重点理解:

  • requires_grad=True:告诉 PyTorch 这个变量需要求梯度。
  • backward():从结果往回算梯度。
  • .grad:保存梯度结果。
  • 计算图:PyTorch 会记录 tensor 是怎么一步步算出来的。

最低掌握标准:

定义 y = x ** 2 + 2 * x + 1,调用 y.backward() 后,PyTorch 能自动算出 y 对 x 的导数。

3. 线性回归,15 分钟

看 D2L 3.1 线性回归。

重点理解:

  • 输入 x
  • 标签 y
  • 参数 wb
  • 预测值 y_hat = xw + b
  • 平方损失 MSE
  • 训练目标:让预测值尽量接近真实值

最低掌握标准:

线性回归就是让模型自己学出一条线,比如从数据里学出 y ≈ 3x + 2

4. 训练循环,10 分钟

快速看 D2L 3.2 和 3.3,重点盯住这条链:

准备数据
-> 模型预测
-> 计算 loss
-> optimizer.zero_grad()
-> loss.backward()
-> optimizer.step()

注意:很多教程会把 zero_grad() 放在 backward() 前面。今天建议记成:

每次反向传播前,先清空上一轮梯度。

第 2 段:tensor 和 autograd 练习,40 分钟

创建文件:

D:\code\DL-study\src\day01_tensor_autograd.py

练习内容:

  • 创建两个矩阵,做加法。
  • 做逐元素乘法。
  • 做矩阵乘法。
  • 创建一个带 requires_grad=True 的变量。
  • 定义简单函数 y = x ** 2 + 2 * x + 1
  • 调用 y.backward()
  • 打印 x.grad

最小示例:

import torch

x = torch.tensor(2.0, requires_grad=True)
y = x ** 2 + 2 * x + 1

y.backward()

print("x:", x.item())
print("y:", y.item())
print("dy/dx:", x.grad.item())

你要能解释:

  • y = x^2 + 2x + 1
  • dy/dx = 2x + 2
  • x = 2 时,梯度是 6
  • 所以 x.grad 应该接近 6

第 3 段:PyTorch 线性回归,80 分钟

创建文件:

D:\code\DL-study\src\day01_linear_regression.py

任务目标:

用 PyTorch 构造模拟数据:

y = 3x + 2 + noise

然后让模型自己学出接近 3 的权重和接近 2 的偏置。

代码需要包含:

  • 构造输入 x
  • 构造标签 y
  • 定义 nn.Linear(1, 1)
  • 使用 nn.MSELoss()
  • 使用 torch.optim.SGDtorch.optim.Adam
  • 训练 200-500 步
  • 打印 loss、weight、bias

训练循环结构:

for step in range(num_steps):
    y_pred = model(x)
    loss = loss_fn(y_pred, y)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

今天最重要的是看懂这条链:

输入数据 -> 模型预测 -> 计算 loss -> 清空旧梯度 -> 反向传播 -> 更新参数

第 4 段:整理笔记,30 分钟

创建或填写文件:

D:\code\DL-study\notes\day01-pytorch-basics.md

回答下面 5 个问题:

  1. loss.backward() 做了什么?
  2. optimizer.step() 做了什么?
  3. 为什么训练前要 optimizer.zero_grad()
  4. 为什么 loss 下降不代表模型一定有泛化能力?
  5. 如果 loss 不下降,应该先检查哪些地方?

5-6 小时增强版

如果今天时间更充足,在 3 小时标准版基础上增加下面内容。

增强 1:理论预热扩展到 90 分钟

额外补充:

  • D2L 3.2 线性回归的从零开始实现。
  • D2L 3.3 线性回归的简洁实现。
  • 动手学深度学习课程页里的“自动求导”“线性回归”相关视频。

这 30 分钟不是为了背公式,而是为了对比两种实现方式:

  • 从零开始实现:更容易理解训练到底在做什么。
  • 简洁实现:更接近以后真实项目里写 PyTorch 的方式。

增强 2:对比不同学习率

分别尝试:

learning_rate = 0.001
learning_rate = 0.01
learning_rate = 0.1

观察:

  • 哪个 loss 下降最快?
  • 哪个 loss 几乎不下降?
  • 哪个 loss 可能震荡甚至变大?

把现象记录到:

D:\code\DL-study\experiments\day01\

增强 3:对比不同训练步数

分别尝试:

num_steps = 100
num_steps = 500
num_steps = 1000

观察:

  • 训练步数增加后,loss 是否继续下降?
  • weight 是否更接近 3
  • bias 是否更接近 2
  • 到什么程度后继续训练收益变小?

增强 4:故意制造错误

尝试下面任意一个错误:

  • 忘记调用 optimizer.zero_grad()
  • 把学习率调得特别大,比如 1.0
  • 把输入和标签维度写错。
  • 把 loss 写成不合理的形式。

记录:

  • 错误现象是什么?
  • 报错信息是什么?
  • loss 如何变化?
  • 最后是怎么定位问题的?

今天不要学这些

  • 不要深入推导反向传播公式。
  • 不要学 CNN。
  • 不要学 Transformer。
  • 不要看完整概率论。
  • 不要纠结 Adam 优化器的内部细节。
  • 不要一口气看完整个 PyTorch 文档。

今日验收标准

今天结束时,你应该能做到:

  • 能说清楚一次训练循环的 6 步:准备数据、前向计算、计算 loss、清空旧梯度、反向传播、更新参数。
  • 能运行一个 PyTorch 线性回归脚本。
  • 能看懂 model.parameters()
  • 能解释 loss.backward() 的作用。
  • 能解释 optimizer.step() 的作用。
  • 能解释为什么模型可以通过梯度学习参数。
  • 能初步判断 loss 不下降时该查数据、模型、loss、学习率还是训练循环。

今日重点提醒

今天别贪多。把这条小小的训练链路真正跑顺,后面 MNIST、CNN、Transformer 都是在这条链路上加复杂度。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐