第 1 课编程练习手册

主题

PyTorch 入门:从张量、自动求导到一个简单的 NLP 窗口分类器

对应材料

建议时长

练习目标

这次编程练习的目标不是“把所有代码抄一遍”,而是建立三层理解:

  1. 看懂 PyTorch 最基本的数据对象和运算方式。
  2. 理解“前向计算 - 损失 - 反向传播 - 参数更新”这条训练主线。
  3. 用一个很小的 NLP 任务,把数据预处理、Embedding、DataLoader、模型定义和训练循环串起来。

一、整体结构

这个 notebook 可以分成四个部分:

  1. 张量基础:创建、形状、索引、reshape、与 NumPy 转换。
  2. 自动求导与神经网络模块:autogradnn.Linear、激活函数、nn.Sequential、自定义 nn.Module
  3. 优化与训练循环:损失函数、optimizer.zero_grad()loss.backward()optimizer.step()
  4. 玩具 NLP 任务:构造语料、建立词表、Embedding、batch 处理、窗口分类模型、训练与预测。

建议不要跳着看。前半段是后半段能看懂的基础。


二、Part A:张量基础(约 10 到 15 分钟)

你会做什么

本部分重点理解

  1. PyTorch 的核心数据结构是 tensor
  2. shape 意识非常重要
  3. 向量化计算是深度学习的基本工作方式

建议你重点试的代码

最容易忽略的问题


三、Part B:Autograd 与神经网络模块(约 10 到 15 分钟)

你会做什么

本部分重点理解

  1. 为什么自动求导重要
  2. 梯度会累积
  3. nn.Module 是模型组织的基本单位
  4. forward 定义了“数据怎么流过模型”

建议你重点观察

最容易忽略的问题


四、Part C:优化与训练循环(约 10 分钟)

你会做什么

在 notebook 中,作者先构造了一个小玩具任务:

然后依次完成:

标准训练循环

你需要把下面这四步记熟:

  1. optimizer.zero_grad()
  2. y_pred = model(x)
  3. loss = loss_function(y_pred, y)
  4. loss.backward()optimizer.step()

本部分重点理解

  1. 训练循环是深度学习代码的主骨架
  2. zero_grad() 不是形式主义
  3. loss 在下降,说明模型正在学
  4. 训练数据和测试数据不是一回事

建议你重点观察


五、Part D:玩具 NLP 任务(约 20 到 30 分钟)

是整份 notebook 最有价值的地方,因为它把 PyTorch 基础和一个小型真实任务连起来了。

任务是什么

作者构造了一个简单的序列标注任务:

例如:

这部分做了哪些事情

1. 数据预处理

重点理解:

2. 建词表

重点理解:

3. 词转索引,再转 embedding

重点理解:

4. 批处理与 DataLoader

重点理解:

5. 构造窗口

重点理解:

6. 定义模型 WordWindowClassifier

模型包括:

重点理解:

7. 训练与预测

重点理解:


六、建议课堂练习步骤

步骤 1:先跑通 notebook

目标:

步骤 2:只看张量与 autograd 部分

目标:

步骤 3:只看 toy MLP 训练部分

目标:

步骤 4:只看 NLP 数据处理部分

目标:

步骤 5:看懂 WordWindowClassifier

目标:

步骤 6:做一到两个小改动

建议学生任选一项:

目标:


七、建议学生重点记录的问题

  1. 在这个 notebook 中,tensor、module、optimizer 各自扮演什么角色?
  2. 为什么 backward() 之后一定还需要 step()
  3. 为什么文本任务要先建词表,再转索引,再做 embedding?
  4. <unk><pad> 分别解决什么问题?
  5. 这个窗口分类器为什么能做地点词识别?它的局限又是什么?
  6. 如果句子特别长、依赖特别远,这种 window 方法还够用吗?

八、练习提交建议

可以要求学生提交下面几项内容:

  1. 一张 notebook 运行截图。
  2. 一段自己整理的最小训练循环代码。
  3. 一段对 WordWindowClassifier 的文字说明。
  4. 至少一个自己改动的实验结果。
  5. 3 条本次练习的关键收获。

九、本次练习的核心结论

  1. PyTorch 的核心不是“会调库”,而是理解 tensor、shape、module 和 gradient。
  2. 深度学习训练代码虽然看起来很多,但骨架始终是前向、损失、反向、更新。
  3. 一个真实任务的难点,往往不只在模型,还在数据预处理、批处理和输入表示。
  4. 即使是一个很小的窗口分类器,也已经包含了现代 NLP 系统的关键思想:词表、Embedding、batch、模型、loss、optimizer、prediction。
  5. 真正重要的能力不是照着 notebook 跑通,而是能解释“每一步为什么这样写”。