第 1 课作业手册

主题

作业 1:PyTorch 与机器学习基础复习

对应材料

致谢

本作业主要来自 Yejin Choi 老师的课程 CSE 517/447(Winter 2024)中的 Assignment 0。
同时,作业 notebook 中的部分 PyTorch 教学内容改编自 Stanford CS224N PyTorch Tutorial。在此一并致谢。


一、这份作业在做什么

这不是一份“拼命写很多代码”的作业,而是一份入门校准作业。它的目标是确认你已经具备后续课程所需的三项基础能力:

  1. 会使用 PyTorch 的基本 tensor 操作。
  2. 理解神经网络中的前向传播、损失函数、反向传播和梯度下降。
  3. 能把“手推出来的训练过程”转化成 PyTorch 代码。

这份作业和第 1 课内容高度一致。它本质上是在把课堂上的概念真正落到代码里。


二、整体结构

这份 notebook 可以分成三段:

Part 1:PyTorch 张量基础

这部分主要是复习和热身,不是评分重点,但后面所有题目都建立在这些操作之上。

Part 2:手工实现一个小神经网络

这部分是作业核心。作者构造了一个很小的 toy neural network,并让你:

这部分最能帮助你真正理解“神经网络训练到底在发生什么”。

Part 3:用 PyTorch 自动完成刚才那些事

把前面手工做的内容改写成 PyTorch 版本:

这部分的重点是:理解 PyTorch 不是魔法,它只是把你前面手工做的步骤自动化了。


三、作业题目概览

根据 notebook,真正需要你完成的题目主要有 5 个。

Exercise 1:手工实现 forward pass

你需要补全 forward(x),完成:

本题重点

本题最容易错的地方


Exercise 2:手工实现 backprop

你需要补全 backprop(x),显式写出:

本题重点

本题最容易错的地方

学习意义

这道题是整份作业最重要的部分。
如果你能独立写出这题,说明你对“反向传播为什么成立”已经不是停留在口头理解。


Exercise 3:回答概念题

题目问的是:

推荐回答方向

你应该结合学习率和优化地形来思考:

本题重点


Exercise 4:用 nn.Module 实现同一个 toy model

你需要定义 ToyModel 类,把前面手工写的网络改成 PyTorch 模块形式。

本题重点

本题最容易错的地方


Exercise 5:写最小优化循环

你需要让 ToyModel 在 toy data 上训练到足够低的 mse loss

作业要求是:

你需要做的典型步骤

  1. 定义模型
  2. 定义优化器
  3. 前向计算
  4. 计算 loss
  5. zero_grad()
  6. backward()
  7. step()
  8. 重复多轮

本题重点

本题最容易错的地方


四、建议完成顺序

建议按下面节奏做:

第 1 步:先完整跑一遍 notebook

第 2 步:先完成 Exercise 1

第 3 步:再做 Exercise 2

第 4 步:跑通 autograd 对照部分

第 5 步:完成 ToyModel

第 6 步:最后做优化循环


五、完成这份作业时应该重点观察什么

1. shape

每一步都要问自己:

如果 shape 没搞清楚,后面很多 bug 会看起来像“神秘错误”。

2. 梯度

要理解三件事:

3. 手工实现 vs PyTorch 自动实现

这份作业最有价值的地方就在于:

如果跳过前半部分,后半部分就会只剩“调库”。

4. 训练是否真的学到了

loss 下降说明模型正在拟合训练数据。
但 notebook 最后也提醒你:

这其实是在提醒你:


六、建议学生记录的关键问题

做作业时建议顺手记下:

  1. 手工写 forward 时,网络每一层到底在算什么?
  2. 手工写 backprop 时,最难理解的是哪一段?
  3. 为什么自动求导能替代手工推梯度?
  4. zero_grad() 为什么一定要有?
  5. 为什么 loss 下降了,模型仍可能不能很好泛化到新样本?

七、常见卡点

1. Forward 写出来了,但数值很怪

可能原因:

2. Backprop 写不出来

建议做法:

3. 手工梯度和 autograd 对不上

优先检查:

4. 优化循环 loss 降不下去

优先检查:


八、建议提交内容

如果你按课程作业形式来收,可以要求学生提交:

  1. 完整填写后的 .ipynb
  2. 简短文字说明:

如果只提交 notebook,也建议学生保留运行结果,方便检查。


九、这份作业真正想让你带走什么

  1. 神经网络训练并不神秘,本质就是前向、损失、反向、更新。
  2. 反向传播不是一句口号,而是可以被手工写出来的链式法则。
  3. PyTorch 的自动求导只是把这些步骤自动化了。
  4. nn.Module 和优化循环是今后阅读深度学习代码的基础。
  5. “能跑通 notebook”只是起点,“能解释每一步为什么这样写”才是真正学会。