第 27 章练习与答案

🌈 关于《AI 零基础 36 讲》课后训练
📚 与正式讲解配套学习
本篇是《AI 零基础 36 讲》的配套课后训练,与对应章节的正式讲解一起使用。整个系列面向初学者,从日常 AI
使用逐步进入编程、模型训练和大模型应用开发。
✍️ 先独立作答,再核对答案
训练围绕本章知识安排概念判断、结果分析或动手任务,并提供参考答案与解释。建议先读完对应的正式文章,再独立作答;遇到困难时回看相关例子,最后核对答案。
💻 代码题请亲手运行
观察程序输出,确认自己能解释结果、发现错误并完成修复。做完一道题,也要弄清答案为什么成立。
题目
- 提示"小猫"为什么有三个输入 Token,嵌入之和与词表分数是什么形状。
- 两个头、总宽 16,每个头的 Q、K、V 特征宽是多少。前馈宽度增加到 32 是否改变 Token 数。
[1,2,3,4]的总体方差为何为 1.25。LayerNorm 是否在整句所有位置上做同一次均值计算。- 分支最后输出 32 维,主干输入 16 维,能否直接残差相加。如何修复。
- 为什么训练"小猫吃鱼。"时需要输入与目标错开一位,并屏蔽未来位置。
- 模型对"小猫"后面选择"吃"的概率约 0.4995,是否说明训练失败。限制仅生成一个 Token 时得到什么停止原因。
参考答案
1. 开始标记和形状
三个 Token 为 BOS、小、猫。单句输入 (1,3),嵌入之和 (1,3,16),词表分数 (1,3,31)。生成时取最后一个位置的 31 个分数。
2. 头宽和前馈
每头 8 维。前馈仅改变每个位置的特征宽度,T 不变,中间 32 维后还要回到 16 维。
3. 总体方差
均值为 2.5,平方偏差为 2.25、0.25、0.25、2.25,除以四个数得到 1.25。本章 LayerNorm 在每个位置最后一维计算,保持各 Token 位置分开。
python
import torch
values = torch.tensor([1., 2., 3., 4.])
print(float(values.mean()), float(values.var(unbiased=False)))
结果为 2.5 1.25。
4. 残差尺寸
不能直接逐元素相加。让分支最后一层由 32 投影回 16,再与主干相加,或明确改变主干投影。本章采用前者。
5. 下一 Token 目标
当前位置预测下一项,输入以 BOS 开始,目标以第一个普通字开始,最后预测 EOS。因果限制阻止当前位置读到后面的真实目标。补齐位置不参与损失。
6. 多种续写与停止
语料有"小猫吃鱼。"和"小猫喝水。",同样前缀存在分支,这个分数不直接说明失败。仅生成一项时结果为"小猫吃",停止原因为新 Token 上限,通常不是 EOS。
python
from examples.toy_transformer import ROOT, load_model, generate
model, tokenizer = load_model(ROOT / "results/tiny-transformer.pt")
result = generate(model, tokenizer, "小猫", max_new_tokens=1)
print(result["text"], result["stop_reason"])