LEARNING UNIT · 04
Transformer 计算图与语言模型训练
建立从加权平均、分块矩阵乘法到 teacher forcing、错位预测和并行训练的完整计算图。
- 已整理章节
- 12 节
- 单元来源
- 11 条视频
- 总时长
- 25:24
- 状态
- 已发布
- 学习位置
- 4 / 20
主题讲解 · 02:53
Decoder-Only Transformer:从 Token 投影到下一层
学习目标
- 沿一次 decoder-only 前向传播追踪 embedding、QKV、attention、 与 FFN。
- 区分 token-wise 线性投影与 attention 中的 token 混合。
- 解释 、因果掩码、行 softmax 与 的作用。
- 用 shape 验证各阶段输入输出。
- 理解层间拓扑相似不代表参数共享。
- 识别板书为易读而省略的关键实现细节。
前置与衔接
本课采用 decoder-only Transformer, 把一层中最重要的数据流放进一张板书。
一张板书串起 embedding、QKV 投影、因果 attention、输出投影、FFN 与下一层。
原视频 · 00:00 ↗视频在 00:12 明确省略:
- 多头拆分;
- 缩放因子 ;
- 位置编码;
- 残差连接。
板书还没有展开 Norm、dropout、FFN 激活与门控。 因此它是理解数据依赖关系的骨架, 不是某个 LLM 的逐算子实现图。
本课统一采用:
其中行对应 token,列对应特征。
核心讲解
1. Token 先变成表示矩阵
设三个 token 的表示为:
embedding 只给出初始表示。 在更高层, 则是上一层 block 的输出。
2. QKV 投影不会混合 token 行
线性投影为:
按行分块的输入乘共享权重矩阵后仍按行输出,每个 token 的线性投影互不混行。
原视频 · 00:40 ↗逐行看:
只生成 , 不会在线性投影这一步直接改写 。
这里的“独立”只指共享线性层对各 token 行分别作用。 它不等于整个 Transformer 都不混合 token; 混合发生在 attention 的 阶段。
3. Q 的行乘 K 的列得到分数
单头 scaled dot-product attention 的分数是:
元素为:
的行索引是 query token, 列索引是被读取的 key token。
4. 因果掩码在 softmax 前加入
decoder 不能让位置 读取未来位置 。 因此先加 mask:
Q 与转置后的 K 形成分数矩阵,右上角因果掩码阻止当前位置读取未来 token。
原视频 · 01:20 ↗再按行 softmax:
理想数学表达中, 被 掩蔽的位置概率为 , 且每个 query 行的可见权重和为 。
5. 乘 V 才发生 token 间汇聚
attention 输出为:
逐行展开:
按行 softmax 后的权重乘 V,得到每个 query 对历史 Value 的加权汇聚。
原视频 · 01:40 ↗这一步与 QKV 投影不同:
- QKV 投影只改变每行的特征坐标;
- 沿 token 轴把不同行的 Value 混合起来。
因果 mask 使第一行只能得到 , 第二行可以得到 、 的加权组合。
6. 输出投影与 FFN 再次逐 token 作用
多头输出拼接后经过:
仍是对每个 token 行独立的共享线性映射。
简化 FFN 可写为:
attention 输出经 W_O 后进入 FFN,先升到中间维度,再投影回模型维度。
原视频 · 02:20 ↗真实 LLM 常使用 GELU、SiLU 或 SwiGLU, 所以不能把两次线性层之间的非线性或门控永久省略。
FFN 不混合 token 行, 但会在单个 token 内混合特征通道。
7. 下一层结构相同,参数不同
下一层重复同类拓扑,但拥有自己的一组 Q、K、V 与 FFN 参数。
原视频 · 02:40 ↗若第 层使用:
第 层通常使用另一组可训练参数:
它们常有相同 shape, 但参数数值不同。
跟练与练习
跟练:给每一步标 shape
设:
单头情况下:
若 , 则输出重新变成 , 可回到模型维度的残差流。
编者练习
有三个 token,因果 attention 的第二行概率为: 给定: 求第二个 query 的输出, 并解释为什么 不参与。
查看参考答案
对应未来位置,
其分数在 softmax 前被因果 mask 设为 ,
所以概率为 。
常见误区
误区 1:QKV 投影已经让 token 互相通信
它们是逐行共享投影; token 混合发生在 。
误区 2:先 softmax,再加因果 mask
mask 必须在 softmax 前加入分数, 才能让未来位置概率归零并重新归一化。
误区 3:板书没有 ,公式就不需要缩放
视频明确省略缩放细节; 标准 scaled dot-product attention 仍需该项。
误区 4:FFN 就是两次纯线性变换
真实 FFN 中间有激活, 现代 LLM 还常有门控分支。
误区 5:不同层同名权重就是同一参数
同名表示功能对应, 不表示跨层共享数值。
误区 6:这张板书已经包含完整 block
多头、位置编码、Norm、残差、dropout 等均被省略。
本课小结
- embedding 或上一层输出组成按 token 行排列的 。
- QKV、 与 FFN 线性层对 token 行独立作用。
- 产生 query-key 分数,因果 mask 阻止读取未来位置。
- 行 softmax 把分数变成概率, 才沿 token 轴汇聚信息。
- FFN 在单 token 内升维、非线性变换并降回模型维度。
- 相邻层拓扑相似,但通常各自拥有独立参数。
主题讲解 · 02:58
Transformer 的四种分块矩阵乘法视角
学习目标
- 用统一 shape 记号理解 Transformer 中四种分块矩阵乘法视角。
- 区分 token 行分块、特征列分块、二维 tile 与收缩维分块。
- 把 QKV/FFN 投影、、 映射到不同分块方式。
- 理解 FlashAttention 如何把标量解释推广到 tile。
- 从外积累加角度重写一般矩阵乘法。
- 避免把教学分类误认为唯一的数学或 kernel 分类标准。
前置与衔接
视频的结论是:
同一张板书并列 token-wise 投影、分数分块、Value 汇聚与外积累加四种视角。
原视频 · 00:00 ↗“三种”或“四种”不是矩阵乘法的唯一分类定理, 而是根据 Transformer 数据流挑出的四个有解释力的切面。
统一设:
矩阵乘法的核心仍然是收缩共享轴。 “按行”“按列”“按小块”只是选择如何观察或执行这次收缩。
核心讲解
1. 第零种:普通二维分块
把 、、 都切成兼容的二维小块, 有:
这是通用 block matrix multiplication 的定义。 视频不把它计入后面三种, 因为它对 Transformer 的具体语义帮助较少。
但工程 kernel 往往正是从这种二维 tiling 出发。
2. 第一种:行块乘共享矩阵
把输入按 token 行切分:
权重 不沿 token 轴切分,则:
输入按 token 行分块而权重不分块时,每个输入行独立映射到对应输出行。
原视频 · 00:40 ↗每个 token 行块独立投影, 不会在这次乘法中读写别的 token 行。
对应 Transformer 中的:
- 、、;
- attention 后的 ;
- FFN 的 与 。
“token 独立”只描述这类线性投影, 不描述 attention 的全部行为。
3. 第二种:Q 行块乘 K 的列块
attention 分数为:
若取 Q 的 query 行块 , 再取 的 key 列块 , 则:
Q 的行块乘 K 转置后的列块,产生 attention 分数中的一个标量或 tile。
原视频 · 01:40 ↗如果 、 都只含一个 token, 输出是标量:
如果各包含多个 token, 输出就是一个二维 score tile。
收缩轴是 head 特征维 ; 输出保留 query 轴与 key 轴。
4. 第三种:概率 tile 乘 V 行块
attention 的第二次矩阵乘法是:
把 按 query-key 二维 tile 划分, 把 按 key 行块划分:
概率矩阵的小块乘 V 的行块,并沿 key 方向累加,得到 query 行块的输出。
原视频 · 02:00 ↗这里收缩的是 key 轴, 输出保留 query 行块与 value 特征维。
单个 query 的写法是:
因为 softmax 权重非负且总和为一, 它可解释为对 Value 的加权平均。
5. FlashAttention 把行列解释推广为 tile
FlashAttention 把单行、单列的解释推广为 Q、K、V tile 上的分块计算。
原视频 · 02:20 ↗朴素教学图常一次画一个 , 但 GPU kernel 会一次处理多个 query 与 key。
FlashAttention 的关键不只是“做了分块”, 而是在 tile 上在线维护 softmax 统计量与输出累积, 避免物化完整 attention 矩阵到高带宽显存。
具体 tile 尺寸、循环顺序与融合策略随实现和硬件而变。 本课只建立块乘法语义, 不把板书当作某个 kernel 的固定调度图。
6. 第四种:列块乘行块的外积累加
一般矩阵乘法:
还可以按收缩维 展开:
每一项:
是一个列向量与行向量的外积, 输出与 同 shape。
按收缩维取一列与一行做外积,再把所得矩阵逐项累加,也能重建矩阵乘积。
原视频 · 02:40 ↗视频在结尾把这一视角联系到 LLM.int8 与底层 GEMM 优化。 这里应把它当作应用线索:
- 某些量化分解会把不同通道贡献拆开处理;
- 某些 GEMM 数据流会采用外积式累加。
不能仅凭这张板书断言所有 LLM.int8 或 GEMM kernel 都采用同一调度。
跟练与练习
跟练:写出三段 attention 的保留轴
对:
有:
- 收缩 ,保留 query 与 key 两个 token 轴;
- softmax 不改变 shape;
- 收缩 key 轴,保留 query 轴与 value 特征轴。
因此:
编者练习
给定: 用两个外积之和计算 。
查看参考答案
沿收缩维展开:
分别得到:
这与普通行乘列计算完全一致。
常见误区
误区 1:四种分块会得到四种不同数学结果
它们是同一矩阵乘法的不同划分与累加顺序, 精确算术下结果一致。
误区 2:行块乘共享权重也会混合 token
这一步只在特征轴收缩; token 混合发生在 attention 的 。
误区 3: 的收缩轴是 token 轴
它收缩的是 head 特征轴, query 与 key token 轴保留为分数矩阵两维。
误区 4:FlashAttention 只是把图切小
它还需在线维护 softmax 与输出累积, 以避免物化完整分数或概率矩阵。
误区 5:外积视角等于所有 kernel 的唯一实现
真实 kernel 可采用内积、外积或混合 tiling, 并由硬件与调度共同决定。
本课小结
- token-wise 线性层可看成行块乘共享矩阵。
- 可看成 query 行块乘 key 列块,得到 score tile。
- 可看成概率 tile 乘 Value 行块并沿 key 轴累加。
- FlashAttention 把标量教学图推广到 tile,并在线维护 softmax 状态。
- 一般矩阵乘法也可写成列向量与行向量的外积之和。
- “四种”是有助理解的视角集合,不是唯一分类标准。
主题讲解 · 02:58
教师强制训练:为什么只算分布而不生成 Token
学习目标
- 区分训练中的 logits/概率计算与推理中的 token 采样。
- 写出 teacher forcing 的输入右移、标签对齐和交叉熵。
- 解释因果 Transformer 为什么能并行计算所有训练位置。
- 理解后续位置看到的是 ground-truth 前缀,而不是模型采样结果。
- 把同一机制迁移到 SFT 与 decoder 式多模态 OCR。
- 识别 teacher forcing 与 exposure bias 的关系。
前置与衔接
视频用一个直观比喻概括 teacher forcing:
板书用‘只感觉、不生成’概括教师强制:训练计算各位置分布,但不逐步采样 token。
原视频 · 00:00 ↗这里:
- “感觉”指为词表中每个候选计算分数或概率;
- “生成”指依据分布采样,或用 argmax/贪心解码选出具体 token。
更精确地说, 神经网络最后一层先输出 logits:
softmax 后才是概率:
训练实现通常直接把 logits 与标签交给 cross-entropy, 内部使用稳定的 log-softmax, 不必先显式保存概率向量。
核心讲解
1. 分布预测不等于选出 token
‘感觉’对应预测分布,‘生成’对应采样或贪心选择一个具体 token。
原视频 · 00:20 ↗若某位置目标 token 是“雪”, 模型可以给它概率 。
训练损失已经可以据此计算:
无需真的采样出“雪”再送入下一个训练位置。
推理不同: 系统必须从分布中选择一个 token, 把它追加到上下文, 再运行下一次 decode。
2. Teacher forcing 的右移结构
设目标序列为:
训练输入右移一位:
监督标签为:
第 个位置预测 时, 上下文中出现的是正确的:
不是模型此前采样的:
序列负对数似然为:
其中 可以是 prompt、图像 token 或其他条件前缀。
3. 因果掩码允许训练并行
因果掩码下,训练可一次前向并行计算所有目标位置的 logits。
原视频 · 01:00 ↗把整段右移后的输入一次送入 Transformer, 模型可同时产生:
这不违反自回归因果性, 因为 causal mask 保证第 行只读取位置 。
并行的是不同位置的矩阵计算, 不是让早期位置偷看未来目标。
推理时未来 token 尚不存在, 因此必须逐步生成; 训练时整个 ground-truth 序列已知, 可以一次性构造所有右移输入。
4. SFT 中标签从答案右移而来
视频以“题目—思维过程—答案”的样本为例。 回答部分是 ground truth, 每个 token 都有对应的 next-token 标签。
SFT 用已知回答作为右移标签,并在每个监督位置计算下一个 token 损失。
原视频 · 01:40 ↗实践中可选择:
- 对 prompt 与回答所有 token 都计算 loss;
- 只对 assistant/回答区域计算 loss,prompt 标签设为 ignore。
无论采用哪种 loss mask, 回答 token 仍以 ground-truth 前缀作为训练上下文。
5. 负对数似然直接惩罚目标 token
目标 token 概率越高,负对数似然越小;实际实现通常直接对 logits 做交叉熵。
原视频 · 02:00 ↗若目标类别为 , 单位置损失为:
不需要先把分布变成离散 token。
训练可对所有受监督位置的 loss 求和或平均, 再一次反向传播。
这使某一位置的错误概率不会通过“错误采样 token”级联污染后面的训练输入。 但梯度仍会通过网络参数影响所有相关位置, 不能把它理解成各位置训练完全无关。
6. 多模态 OCR 使用同一 teacher-forcing 逻辑
图像 token 与提示 token 作为前缀,文字 ground truth 仍按同一右移规则提供监督。
原视频 · 02:20 ↗输入可以由:
构成。
如果真实文字是 , 预测 时模型看到正确的 ; 不会在训练图中先采样 , 再依赖它预测下一字。
多模态只改变条件前缀的来源, next-token teacher forcing 的数学形式不变。
7. Teacher forcing 没有消除 exposure bias
训练优化的是:
而推理实际遇到:
如果早期生成错误, 后续会处在训练中较少见的错误前缀上。 这种训练—推理条件分布不一致就是 exposure bias 的来源之一。
因此“训练时不会一步错、步步错”只表示: 同一个样本的一次 teacher-forced 前向不会把采样错误作为后续输入。 它不保证推理阶段没有误差累积。
跟练与练习
跟练:手工右移
目标序列:
训练输入是:
标签是:
预测“雨”的位置看到的是 ground-truth“海、安”, 而不是模型前两步实际采样的结果。
编者练习
某位置的目标 token 概率是 , 另一位置是 。 分别计算负对数似然, 并说明哪一个位置惩罚更大。
查看参考答案
采用自然对数:
目标概率越低,
负对数似然越大,
所以概率 的位置受到更大惩罚。
这个计算只需要目标类别的对数概率,
不需要先采样一个 token。
常见误区
误区 1:模型最后一层直接输出概率
它通常输出 logits; softmax 或交叉熵内部再完成归一化。
误区 2:训练也要逐 token 采样
完整 ground truth 已知, 因果 mask 允许一次前向并行计算所有位置。
误区 3:并行计算意味着看到未来标签
矩阵计算并行不改变 causal mask 的可见范围。
误区 4:后续位置使用模型上一步预测
标准 teacher forcing 使用右移后的 ground-truth token。
误区 5:Teacher forcing 彻底解决误差累积
它避免训练前向中的采样级联, 但训练—推理前缀不一致仍会产生 exposure bias。
误区 6:SFT 必须对 prompt 全部计算 loss
是否监督 prompt 取决于 label mask; 许多实现只监督 assistant 回答区域。
本课小结
- “只感觉”是计算 logits/分布,“不生成”是不在训练位置之间采样 token。
- Teacher forcing 把 ground-truth 序列右移后作为输入,原序列作为标签。
- 因果 mask 让所有训练位置可并行计算,同时保持自回归可见性。
- 交叉熵可直接从 logits 与标签计算,不需要离散解码。
- SFT 与 decoder 式 OCR 都可使用同一 teacher-forcing 结构。
- Teacher forcing 不会消除推理阶段的 exposure bias。
主题讲解 · 01:53
Attention 是加权平均:Softmax 权重如何汇聚 Value
学习目标
- 区分普通平均、加权平均与一般加权和。
- 写出单个 query 对 Value 向量的 attention 汇聚公式。
- 解释 softmax 为什么让每行权重非负且总和为一。
- 理解较大缩放点积如何在同一行中对应较大 attention 权重。
- 明确“attention 是加权平均”只适用于 阶段的边界。
- 用凸组合视角检查结果范围与 shape。
前置与衔接
本课从日常成绩平均出发, 把 attention 的核心汇聚写成:
板书把普通平均、加权平均与 decoder attention 放在同一张图中比较。
原视频 · 00:00 ↗这里:
- 是 query 位置;
- 是被读取的 key/value 位置;
- 是标量权重;
- 是同一 head 中的 Value 向量。
如果:
那么 是 Value 向量的加权平均, 也就是凸组合。
核心讲解
1. 普通平均给所有项相同权重
三个数 的算术平均是:
普通平均其实也是加权平均, 只是每一项权重恰好相同。
2. 加权平均按重要性分配权重
若三门课学分不同, 可以先把学分归一化:
再计算:
加权平均先把重要性归一化,使非负权重总和为一。
原视频 · 00:20 ↗“平均”要求结果仍处在输入项的凸包内。 标量情况下有:
3. 加权和不要求系数总和为一
强化学习回报常写成:
这些系数通常不归一化到总和为一, 因此更准确地称为加权和。
若系数不要求总和为一,更准确的名称是加权和,而不是加权平均。
原视频 · 00:40 ↗加权平均是加权和的特殊情况:
4. Attention 权重来自缩放点积
单头 attention 先计算:
decoder 中还要加因果 mask:
每个 query 与可见 key 的缩放点积形成一行分数,因果掩码排除未来位置。
原视频 · 01:00 ↗分数本身可以为负, 也不要求和为一。 此时还只能称为相关性 logits, 不能称为平均权重。
5. Softmax 把一行分数归一化
对固定 query :
因此:
softmax 把每个 query 的可见分数变成非负且和为一的一行权重。
原视频 · 01:20 ↗mask 为 的项满足:
所以未来位置不会参与加权平均。
6. 概率乘 Value 得到凸组合
把所有 query 一起写成矩阵:
第 行为:
每行权重乘同形状 Value 向量并求和,得到该 query 的上下文表示。
原视频 · 01:40 ↗所有 必须有相同的 Value 维度, 才能逐元素相加。
若某行权重为:
则:
7. 为什么某个权重更大
在同一个 query 行、mask 状态相同且其他 logit 固定时, 若:
则 softmax 单调性保证:
可以直观说 query 更偏向读取第二个 Value。
但“点积更大”是模型学到的表示空间关系, 不保证每个 head、每层都能被人类直接解释成某种确定语义。
8. “Transformer 是加权平均”有边界
严格来说, 每个 attention head 的 阶段是 Value 的凸组合。
但随后还有输出投影:
以及残差、Norm、FFN。
是一般线性变换, 结果不必仍处在原始 Value 向量的凸包中。
多头 attention 还会在不同子空间各自做加权平均, 再拼接并投影。
因此准确表述是:
跟练与练习
跟练:判断是不是加权平均
对三个向量 :
- :是加权平均。
- :通常只是加权和,因为权重和为 。
- :权重和虽为 ,但有负权重,不是凸组合。
- softmax 输出乘 :是加权平均。
编者练习
给定: 求 attention 输出, 并检查每个坐标是否位于两个 Value 对应坐标的最小值与最大值之间。
查看参考答案
第一坐标位于 ,
第二坐标位于 。
因为权重非负且总和为一,
位于 与 连线段上。
常见误区
误区 1:任意加权和都叫加权平均
加权平均还要求非负权重归一化到和为一。
误区 2: 的分数本身就是概率
分数可为任意实数, 需要经过 mask 与行 softmax 才成为权重。
误区 3:Softmax 对整个矩阵一起归一化
标准 attention 对每个 query 行分别归一化。
误区 4:权重更大一定代表人类可解释的语义关系
它只严格表示该 head、该层、该上下文中的归一化读取强度更大。
误区 5:整个 Transformer 输出都在 Value 凸包内
是凸组合, 但 、残差与 FFN 会继续变换表示。
误区 6:多头 attention 只做一次统一平均
每个 head 在自己的 Value 子空间使用自己的权重, 然后再拼接与投影。
本课小结
- 普通平均是等权的加权平均。
- 加权平均要求权重非负且总和为一;一般加权和不要求归一化。
- Attention 先用缩放点积和 mask 产生 logits,再按 query 行做 softmax。
- 是 Value 向量的凸组合。
- 在同一行其他条件固定时,更大的点积对应更大的 softmax 权重。
- “加权平均”精确描述 阶段,不等于整个 Transformer 只是平均器。
主题讲解 · 03:04
Teacher Forcing 的三条依赖:Token、分布与下一位置
学习目标
- 区分训练前向、推理 prefill 与自回归 decode。
- 判断“上一个 token”究竟是真值 token、采样 token 还是预测分布。
- 解释 teacher forcing 为什么能让多个位置并行预测。
- 从计算图角度说明前一位置的 logits 不直接输入下一位置。
- 理解“不直接影响”不等于参数、激活与梯度完全独立。
- 用输入张量与标签右移关系检查自己的推理。
前置与衔接
本课讨论三个表面相似、实际不同的命题:
- 推理时,上一步选出的 token 直接影响下一步预测。
- 训练时,上一个 ground-truth token 直接影响下一位置预测。
- 训练时,上一个位置预测出的概率分布直接影响下一位置预测。
板书用三个命题区分推理 token、训练真值 token 与训练预测分布的依赖关系。
原视频 · 00:00 ↗结论是前两个成立,第三个不成立。
但要先固定“直接影响”的含义:
这个定义不会否认多个位置共享模型参数, 也不会否认损失会共同更新这些参数。
核心讲解
1. 推理 decode:选出的 token 成为下一步输入
自回归生成第 个 token 时,模型计算:
采样或取最大概率得到 后, 把它追加到上下文:
自回归 decode 把刚选出的 token 追加到上下文,下一步直接以它为输入。
原视频 · 00:40 ↗于是下一步分布为:
这里真正进入下一步的是离散 token 的 id, 再经过 embedding lookup 变成向量。
通常并不是把上一时刻完整的词表概率向量直接送回模型。
2. 训练 teacher forcing:喂入固定真值序列
训练样本已经给出完整序列:
teacher forcing 使用真值前缀预测下一个真值:
teacher forcing 在训练时喂入固定的 ground-truth token,而不是上一步采样结果。
原视频 · 01:20 ↗例如输入中已有“海”, 对应位置的隐藏状态可用于预测下一个真值“安”。
训练样本中的前一真值 token 通过因果上下文参与下一位置的预测。
原视频 · 01:40 ↗因此第二个命题成立:
3. 因果掩码只允许读取当前位置及以前
对序列位置 和被读取位置 , 因果 mask 可写为:
attention 权重为:
位置 只能读取输入表示的前缀, 不会偷看未来 ground-truth token。
这使并行计算满足自回归条件, 而不是把任务改成双向补全。
4. 前一位置的预测分布没有直接回边
最后一层隐藏状态 投影到词表 logits:
再得到:
在标准 teacher-forced 前向中, 下一位置 的输入来自固定 token embedding 与前层表示, 不是 。
同一次训练前向中,前一位置输出的概率分布不作为下一位置的输入。
原视频 · 02:00 ↗即便把 人为改成另一组数, 只要不改输入 token、参数和此前激活, 同一次前向里的 不会因此变化。
所以第三个命题不成立。
5. 为什么所有位置仍能同时预测
训练输入是预先给定的完整真值序列。
每个位置读取各自允许的真值前缀, 所有位置的 Q、K、V 与 logits 可以合并成矩阵运算。
固定真值序列配合因果掩码,让各位置的 next-token logits 可以并行计算。
原视频 · 02:40 ↗若输入为:
标签可右移为:
每行 loss 为:
总损失通常对有效位置求和或平均。
6. “训练前向近似 prefill”只是结构类比
训练前向与推理 prefill 都会:
- 一次接收多 token 序列;
- 用因果 mask 计算多行隐藏状态;
- 主要使用矩阵—矩阵乘法。
但二者并不相等。
训练还有:
- 标签与交叉熵;
- 反向传播与优化器更新;
- 可能开启 dropout;
- 通常保留反向所需激活。
推理 prefill 则建立 KV Cache, 随后进入逐 token decode,且不计算训练梯度。
因此应说“前向计算形态相似”, 不能说训练就是 prefill。
7. 不直接输入,不代表完全没有耦合
多个位置使用同一个参数集合 。
总损失:
产生:
一次参数更新会改变下一训练步所有位置的预测。
此外,位置 的隐藏状态会通过 attention 读取位置 的前层表示。
准确边界是:
- 会读取前缀 token 对应的隐藏表示;
- 不读取前一位置最终输出的词表概率向量;
- 各位置的 loss 通过共享参数共同作用于后续训练步。
跟练与练习
跟练:给计算图中的箭头分类
判断下列箭头是否存在于标准训练前向:
- :存在,经 embedding 与 causal attention 间接作用。
- :不存在,不把上一位置概率分布回灌。
- :存在,经反向传播累加到共享参数梯度。
- 下一步 decode 输入:推理时存在。
编者练习
设训练输入为: 标签为: 问题:预测 的位置以什么为输入前缀? 如果该位置之前用于预测 的概率分布从 改成 , 但输入 token 与参数均不变,预测 的 logits 会不会在同一次前向中改变?
查看参考答案
预测 的位置读取真值前缀:
标准 teacher forcing 不把前一位置的预测分布作为输入。
因此只改那组输出分布、且不改输入、参数与上游激活时,
预测 的 logits 不会在同一次前向中改变。
不过训练 loss 和参数更新可能改变下一次前向,
这属于跨训练步的共享参数影响。
常见误区
误区 1:Teacher forcing 使用模型上一步采样结果
标准 teacher forcing 使用 ground-truth token; 使用模型采样结果属于另一种训练策略。
误区 2:训练并行意味着可以看见未来 token
并行是硬件计算方式, 因果 mask 仍约束每个位置的信息范围。
误区 3:上一个预测 token 与上一个预测分布是一回事
decode 通常反馈选出的离散 token, 不是完整词表概率向量。
误区 4:没有直接概率回边,所以各位置完全独立
它们共享参数, 并通过 causal attention 读取此前隐藏表示。
误区 5:训练前向等同于推理 prefill
二者有相似的并行形态, 但训练包含损失、反向与优化,推理 prefill 建立 KV Cache。
误区 6:Teacher forcing 消除了训练—推理差异
训练看到真值前缀, 生成时看到模型自己产生的前缀,仍可能产生 exposure bias。
本课小结
- 推理 decode 中,刚选出的 token 会成为下一步输入。
- 训练 teacher forcing 中,下一位置以 ground-truth 前缀为条件。
- 前一位置的词表 logits 或概率分布不直接输入下一位置。
- 固定真值序列加因果 mask,使多位置 next-token logits 可以并行计算。
- “训练前向近似 prefill”只描述部分计算形态,不代表完整流程相同。
- “没有直接概率回边”不等于没有 attention、共享参数或梯度耦合。
主题讲解 · 02:43
训练并行预测 Token:因果掩码与 Prefill 类比
学习目标
- 解释训练时为何能同时得到多个位置的 next-token logits。
- 理解 teacher forcing 与因果 mask 分别解决什么问题。
- 用 激活矩阵描述逐层并行计算。
- 区分训练前向、推理 prefill 与带 KV Cache 的 decode。
- 说明标签右移与有效监督位置数量的关系。
- 避免把“同时预测”误解成位置之间可以偷看未来。
前置与衔接
自回归分解写成:
这个公式有顺序, 但训练每个条件分布时,前缀已经来自固定真值序列。
因此多个位置的条件分布可以放入一次张量前向中计算。
板书并列训练整序列并行与推理 decode 逐 token 增长两条路径。
原视频 · 00:00 ↗本课的核心不是取消自回归约束, 而是把多个受约束的位置批量计算。
核心讲解
1. Teacher forcing 固定了所有训练输入
给定真值序列:
每个位置都使用真值前缀:
输入 token 在前向开始前已经确定, 不需要等待前一个位置采样完成。
这提供了并行计算的第一个条件。
2. 因果掩码为每一行规定可见前缀
attention logits 为:
其中:
softmax 后,未来位置权重为零。
于是第 行虽然与其他行同时计算, 却只依赖 。
并行与因果性并不冲突:
- 并行描述计算调度;
- mask 描述信息依赖。
3. 每层处理整张 token-by-hidden 激活平面
若序列长度为 ,隐藏维为 , 一层输入可写为:
已知训练序列中的每个 token 都对应一行隐藏表示。
原视频 · 00:40 ↗线性投影一次作用于所有行:
矩阵乘法会同时生成所有 token 行的 Q、K、V。
同一层可同时更新整张 token-by-hidden 的激活平面,因果掩码负责阻断未来信息。
原视频 · 01:00 ↗后续 attention、输出投影与 FFN 也都可以对多行批量执行。
4. 最后一层同时投影到多个词表分布
最后一层隐藏矩阵为:
词表投影得到:
每一行 都是一个位置的 next-token logits。
最后一层各位置同时投影到词表 logits,再与右移标签计算损失。
原视频 · 01:40 ↗交叉熵可写为:
表示没有被 padding 或 label mask 排除的位置。
5. 为什么五个 token 常得到四个监督对
若完整片段为:
采用常见切片:
就得到四个 input-target 对:
但“四个”不是架构常数。
若数据管线显式加入 BOS、EOS, 或提供比输入多一个 token 的目标, 有效监督位置会随切片和 label mask 改变。
不变量是:
6. 训练前向与 inference prefill 的相似处
训练前向与 inference prefill 都能对已知序列的多行表示做并行计算。
原视频 · 00:20 ↗相似处包括:
- 一次输入多 token;
- 多个位置通过 GEMM 并行计算;
- decoder-only 模型都使用因果 mask;
- 每层都生成整段前缀的隐藏表示。
所以教学中常用:
作为计算形态类比。
7. 训练前向并不等于 inference prefill
训练需要:
- 构造 labels;
- 计算所有有效位置的 loss;
- 保存反向所需中间激活;
- 反向传播并更新参数;
- 可能使用 dropout。
推理 prefill 通常需要:
- 构建各层 KV Cache;
- 只取所需位置的 logits;
- 不保留训练反向图;
- 随后切换到 decode。
因此“近似”不能删掉。
8. Decode 为什么仍要逐 token
生成未来 token 时, 真实的 尚不存在。
必须先从:
选出 , 才能计算:
带 KV Cache 的 decode 每步只新增并计算当前 token 的一行表示。
原视频 · 02:20 ↗KV Cache 保存此前 token 的 K/V, 每步只为新 token 计算一行新的 Q/K/V。
这降低重复计算, 但不能消除 token 之间的自回归时序依赖。
跟练与练习
跟练:写出张量 shape
设:
则:
- 隐藏状态 :;
- 词表权重 :;
- logits :;
- labels 通常为 ,其中无效位置可用 ignore index 屏蔽。
编者练习
训练片段为: 采用 tokens[:-1] 作为输入、tokens[1:] 作为标签。
- 写出四个 input-target 对。
- 预测 的位置能否读取 EOS 的 embedding?
- 为什么四个位置可以在一次矩阵前向中计算?
查看参考答案
四个监督对为:
预测 的位置只允许读取:
不能读取未来的 EOS embedding。
输入序列在训练前已经由真值固定,
因果 mask 又为每行屏蔽未来位置,
所以四行可以合并进一次矩阵计算而不发生标签泄漏。
常见误区
误区 1:同时预测等于所有位置彼此可见
每行同时计算, 但因果 mask 仍使第 行只能看见 。
误区 2:训练按位置逐个执行 softmax
数学上是逐行 softmax, 实现上可在一个批量张量算子中同时完成。
误区 3:五个 token 永远只产生四个 loss
这取决于序列切片、BOS/EOS、padding 与 label mask 约定。
误区 4:训练前向就是 inference prefill
两者前向形态相似, 但目标、缓存、梯度与运行模式不同。
误区 5:KV Cache 能让未来所有 token 并行生成
KV Cache 减少历史 K/V 的重复计算, 不能提前知道尚未采样出的 token。
误区 6:训练并行改变了自回归概率分解
概率分解没有改变, 只是用固定真值前缀同时估计多个条件分布。
本课小结
- Teacher forcing 让训练输入在前向开始前全部已知。
- 因果 mask 让每行只读取合法前缀,因此并行计算不会泄漏未来。
- 每层可处理完整的 激活矩阵,最终一次得到 logits。
- 标签相对输入右移一位,有效位置数量由具体切片和 mask 约定决定。
- 训练前向与推理 prefill 只有计算形态上的类比关系。
- Decode 必须等待新 token 被选出;KV Cache 只避免重算历史 K/V。
主题讲解 · 01:07
一张图读懂 Transformer:Attention、FFN 与三组边界
学习目标
- 从 、softmax、 汇聚与 FFN 串起最小 Transformer 骨架。
- 说清 attention 分数矩阵的行、列与 shape。
- 区分自注意力和交叉注意力的 Q/K/V 来源。
- 理解标准 BERT 与 GPT 自注意力的 mask 差异。
- 说明不同层为何默认拥有不同投影参数与 Q/K/V 数值。
- 识别简图主动省略的多头、缩放、残差与 Norm。
前置与衔接
视频试图用一张板书保留 Transformer 的最小主干:
一张总图串起 Q、K、V、attention 输出与 FFN 的最小 Transformer 骨架。
原视频 · 00:00 ↗这张图适合建立空间直觉, 但简化图不能替代完整公式。
本课会在保留主线的同时, 补齐缩放、softmax、mask、残差与架构边界。
核心讲解
1. 输入首先投影成 Q、K、V
设:
单个 attention head 使用:
若 head 维度为 , 则:
矩阵的每一行对应一个 token 位置。
2. Q 的行乘 K 的列形成分数矩阵
Q 的每一行与转置后的 K 各列做点积,形成 token-to-token 分数矩阵。
原视频 · 00:20 ↗因为:
所以:
第 项是:
其语义是:第 个 query 对第 个 key 的未归一化匹配分数。
完整缩放点积公式还要除以:
避免维度较大时点积方差过大、softmax 过早饱和。
3. Mask 与 softmax 把分数变成权重
完整权重矩阵为:
softmax 按 query 行归一化, 因此:
简图若只画 后直接乘 , 应把 mask 和 softmax 理解为被省略的中间步骤, 不能真的跳过。
4. 权重乘 V 得到每个 query 的上下文
attention 输出为:
shape 为:
第 行:
归一化权重汇聚 V 得到 O,随后 FFN 在隐藏维上先扩张再收缩。
原视频 · 00:30 ↗每个 query 用自己的一行权重, 读取所有允许位置的 Value。
5. FFN 对每个 token 独立变换隐藏维
典型 FFN 写成:
通常:
且 。
“先扩张再收缩”发生在特征维, 不会混合不同 token 行。
token 之间的信息混合主要发生在 attention, 逐 token 非线性变换发生在 FFN。
6. 完整 block 还有残差、Norm 与输出投影
多头 attention 会为每个 head 独立计算:
拼接后再做:
实际 block 还包含:
- attention 子层的残差连接;
- FFN 子层的残差连接;
- LayerNorm 或 RMSNorm;
- dropout 等训练组件。
Pre-Norm 与 Post-Norm 的排列也不同。
所以总图是“计算骨架”, 不是任何具体模型的逐算子复刻。
7. 标准 BERT 与 GPT 的 mask 差异
标准 BERT 自注意力双向可见,而自回归 GPT 使用因果掩码屏蔽未来位置。
原视频 · 00:40 ↗标准 BERT encoder 的 self-attention 通常双向可见:
对所有非 padding 位置成立。
GPT decoder-only self-attention 使用因果 mask:
这使 GPT 可按 next-token 目标自回归生成。
但不能据此断言 encoder 与 decoder “只有 mask 不同”。
在经典 encoder-decoder Transformer 中, decoder block 还包含读取 encoder memory 的 cross-attention。
8. Self-attention 与 cross-attention 看数据来源
自注意力的 Q、K、V 来自同一表示流;交叉注意力的 Q 与 K/V 来自不同表示流。
原视频 · 00:50 ↗Self-attention:
三者来自同一表示序列 。
Cross-attention:
其中 是 decoder 查询流, 是 encoder memory。
判别关键不是 shape 是否相同, 而是 Q 与 K/V 是否来自不同表示流。
9. 不同层的参数和数值默认都不同
不同层默认拥有各自的 Q/K/V 投影参数,输入改变也使逐层 Q/K/V 数值不同。
原视频 · 01:00 ↗第 层有:
下一层:
通常同时满足:
- ,参数不共享;
- ,输入表示已更新。
任一条件都足以让逐层 Q 数值改变。
若某个特殊模型显式做跨层参数共享, 也必须另看输入表示是否相同,不能仅凭共享权重断言 Q/K/V 相同。
跟练与练习
跟练:用 shape 检查 attention
设:
则:
因此:
这也是 cross-attention 中查询长度与 memory 长度不同的合法情形。
编者练习
decoder cross-attention 的输入为: 单头维度 。 写出 Q、K、V、分数矩阵与输出 O 的 shape, 并判断它是不是 self-attention。
查看参考答案
因此:
Q 来自 ,K/V 来自 ,
所以这是 cross-attention,不是 self-attention。
常见误区
误区 1: 可以直接乘 V
标准 attention 还需要缩放、mask 与行 softmax。
误区 2:分数矩阵每一列对应一个 query
通常每一行对应 query, 每一列对应 key。
误区 3:FFN 在 token 维混合信息
FFN 对每个 token 独立复用同一组参数, 主要改变特征维表示。
误区 4:BERT 和 GPT 只差一个 mask
简化 self-attention 骨架可这样突出可见性, 完整模型还可能在目标、位置编码、Norm、激活等方面不同。
误区 5:decoder 一定只有 masked self-attention
decoder-only 模型如此; 经典 encoder-decoder 的 decoder 还有 cross-attention。
误区 6:所有层共用一套 Q/K/V
标准 Transformer 各层默认拥有独立投影参数, 逐层输入表示也在变化。
本课小结
- 最小主干是 Q/K/V 投影、缩放点积分数、mask、行 softmax、Value 汇聚与 FFN。
- 的行是 query、列是 key,输出 shape 为 。
- FFN 在每个 token 的特征维上先扩张再收缩,不负责 token 间混合。
- 标准 BERT self-attention 双向可见,GPT 使用因果 mask,但完整架构差异不止 mask。
- Self-attention 的 Q/K/V 来自同一表示流;cross-attention 的 Q 与 K/V 来自不同流。
- 不同层默认参数独立,输入也不同,因此逐层 Q/K/V 数值会改变。
主题讲解 · 02:11
Bigram 语言模型:一个 V×V 矩阵如何预测下一个 Token
学习目标
- 理解最简 bigram 语言模型为何可用一个 embedding 层实现。
- 说明参数矩阵 的行列语义。
- 区分 embedding lookup、logits、softmax 概率与采样 token。
- 从字符级例子构造相邻 token 训练对。
- 写出 bigram 的交叉熵目标与一阶 Markov 假设。
- 认识它与一般 Transformer 语言模型的共同目标和能力差异。
前置与衔接
视频从 Karpathy 的入门 bigram 示例切入。
板书从最小 bigram 实现切入,追问一个 embedding 层为何足以预测下一个 token。
原视频 · 00:00 ↗令人困惑的地方是:
答案不在“embedding”这个名称, 而在查表得到的向量恰好被解释成 next-token logits。
核心讲解
1. Bigram 只用当前 token 预测下一个 token
一般自回归语言模型学习:
Bigram 做一阶 Markov 近似:
也就是说, 预测时只保留当前 token ,忽略更早的历史。
这仍然是合法的 next-token 概率模型, 只是上下文能力极弱。
2. 模型不是一个向量,而是一张 表
设词表大小为 。
模型参数为:
最简模型使用形状为 V×V 的参数矩阵,而不是单独一个 embedding 向量。
原视频 · 00:20 ↗把它实现为:
``python token_embedding_table = nn.Embedding(vocab_size, vocab_size) ``
第一个 vocab_size 表示可查询的 token 行数, 第二个表示每行输出维度。
因此“只有一个词嵌入”更准确的说法是:
3. 当前 token 索引选中矩阵的一行
若当前 token id 为 , embedding lookup 得到:
当前 token 的索引选中一行,该行直接作为所有候选 next token 的 logits。
原视频 · 00:40 ↗的第 个分量表示:
从线性代数看, one-hot 向量 左乘参数矩阵:
所以 embedding lookup 等价于 one-hot 线性层, 只是无需显式构造稀疏 one-hot。
4. 查表结果是 logits,不是概率
查表得到的是未归一化 logits,需要经过 softmax 才成为条件概率分布。
原视频 · 01:40 ↗参数行的元素可为任意实数, 不要求非负,也不要求总和为一。
需要 softmax:
于是矩阵第 行定义一个分类分布。
模型可从该分布采样, 也可选择概率最大的 token。
5. 字符级 zoo 示例如何形成训练对
字符级 tokenizer 可把:
拆成:
字符级 tokenizer 把 zoo 拆成 z、o、o,使相邻字符构成 bigram 训练对。
原视频 · 01:20 ↗相邻训练对为:
若还加入 BOS/EOS, 则可多出:
每出现一次 , 就推动第 行在第 列给出更高相对 logit。
6. 训练目标是逐相邻对的交叉熵
对一个训练对 , 损失为:
对语料中的相邻对求和:
若数据足够且没有额外正则, 每一行 softmax 会趋向该当前 token 后继 token 的经验条件频率。
因此这张表也可理解为可学习的转移矩阵。
7. 一次批量查询仍能产生多位置 logits
输入 token id 张量若为:
embedding lookup 输出:
每个位置独立按自己的当前 token 选一行。
这可以批量执行, 但不同位置之间没有 attention 或递归状态交换。
8. 每行表达一个条件分布
矩阵每一行学习一个 p(next token | current token),忽略更早的上下文。
原视频 · 02:00 ↗行索引:
列索引:
softmax 后第 行就是:
这也解释了为什么输出维必须等于词表大小 。
9. 与 Transformer 语言模型有什么关系
Bigram 使用:
Transformer 使用整个前缀生成上下文表示:
再投影:
共同点是最终都输出 维 logits, 并用 next-token 交叉熵训练。
区别是 Transformer 的 可以编码长上下文, 而 bigram 的“表示”只由当前 token id 决定。
因此“语言模型的本质是把 token embedding 映射到预测向量”只适合这个最简模型。
更一般的表述是:
跟练与练习
跟练:三 token 词表
词表为:
参数矩阵为:
当前 token 为 时, 模型选择第一行 作为 logits。
它倾向预测 , 但必须经过 softmax 才能给出具体概率。
编者练习
语料只有: 忽略 BOS/EOS。
- 列出所有 bigram 训练对。
- 哪一行参数会同时收到两个不同目标的梯度?
- 模型能否区分上下文
BA与CA后面的预测?
查看参考答案
训练对为:
当前 token 为 的参数行同时收到目标 和 的监督。
Bigram 只看当前 token。BA 与 CA 的最后一个 token 都是 ,
所以两种上下文会查询同一行 ,得到完全相同的 next-token 分布。
常见误区
误区 1:一个 embedding 层只有一个向量
nn.Embedding(V,V) 包含 行, 总计 个参数。
误区 2:Embedding 输出天然就是概率
输出是任意实数 logits, softmax 后才是概率。
误区 3:行表示下一个 token,列表示当前 token
在这里行由当前 token 索引, 列对应候选 next token。
误区 4:Bigram 能利用任意长度上下文
它只条件于当前 token, 无法区分末 token 相同但更早历史不同的前缀。
误区 5:没有 attention 就不能是语言模型
只要定义并学习序列概率或 next-token 条件概率, 它就是语言模型;attention 只是更强的建模机制。
误区 6:字符级 bigram 与现代 subword LM 的 token 完全相同
原理都基于 token, 但 tokenizer 粒度与词表会改变训练对和条件分布。
本课小结
- Bigram 用 近似完整前缀条件分布。
nn.Embedding(V,V)是一张 参数表,不是单独一个向量。- 当前 token id 选择一行,该行的 个数是 next-token logits。
- Softmax 把 logits 转成每行的条件概率分布。
- 交叉熵让每行学习语料中的后继 token 统计。
- Transformer 与 bigram 都预测 next-token logits,但前者能编码长上下文,后者只能看当前 token。
主题讲解 · 01:39
Next-Token 训练的右移对齐:BOS、EOS 与 Loss 位置
学习目标
- 理解输入 token 与 next-token labels 为什么恰好错开一位。
- 写出
tokens[:-1]与tokens[1:]的训练切片。 - 区分 BOS 作为起始上下文、EOS 作为序列结束目标的角色。
- 解释视频示例中五个 token 为什么产生四个 loss 位置。
- 把每行隐藏状态、词表 logits 与目标 token 对齐。
- 认识监督位置数量随数据预处理约定变化的边界。
前置与衔接
自回归语言模型在位置 使用前缀:
预测:
因此输入位置与监督目标天然相差一个 token。
板书总览训练激活矩阵与 next-token 标签恰好错开一个位置的关系。
原视频 · 00:00 ↗“右移标签”不是额外技巧, 而是 next-token 任务定义在数组切片上的直接结果。
核心讲解
1. 每个 token 位置对应一行隐藏状态
设训练输入长度为 , 隐藏维为 。
第 层表示为:
已知整段训练序列时,各层可并行计算所有 token 行的隐藏表示。
原视频 · 00:20 ↗第 行 在因果 mask 下只能汇总:
它正好具备用于预测 的合法前缀信息。
2. 最后一层逐行投影到词表 logits
最后一层:
词表投影:
第 行:
是基于前缀 的 next-token logits。
它应当与目标 计算交叉熵, 而不是与当前输入 对齐。
3. 最常见的切片:输入去尾,标签去头
给定完整 token 数组:
构造:
``python x = tokens[:-1] y = tokens[1:] ``
即:
位置 i 的输出与原序列位置 i+1 的 token 对齐,因此输入和标签右移一位。
原视频 · 00:40 ↗两者长度相等, 且逐元素满足:
4. BOS 是起点输入,通常不是本片段的预测目标
以:
为完整数组。
切片后:
BOS 的用途是给第一个真实 token 一个起始上下文:
在这个片段内, 没有哪个位置要预测 BOS。
5. 因果 mask 下,BOS 可被所有后续位置读取
BOS 位于序列起点,在因果掩码下可作为所有后续位置的公共前缀。
原视频 · 01:20 ↗因果 mask 允许:
BOS 位于 , 所以所有 的位置都可读取它。
这不表示 BOS 对所有位置的 attention 权重都很大, 只表示它没有被因果 mask 禁止。
“可见”是权限, “实际读取多少”由 attention 权重决定。
6. EOS 是最后一个可预测目标
在上述切片中, 输入“雨”的位置预测 EOS:
这让模型学习何时停止生成。
EOS 可以是标签, 并不意味着还必须把 EOS 作为同一个样本的输入位置。
7. 为什么视频里的五个 token 只有四个 loss
视频把完整数组画成五个 token, 又指出最后 EOS 输入位置没有下一个答案。
若 EOS 已是样本最后一个输入,它在样本内没有后继 token,因此该位置不计算 next-token loss。
原视频 · 01:00 ↗若先把五个 token 全部送入模型, 可得到五行 logits。
但最后一行以 EOS 为当前输入, 样本内没有 , 因此最后一行不进入 next-token loss。
这与预先使用 tokens[:-1] 去掉最后输入在监督上等价。
8. 四个位置不是固定规则
监督位置数量由以下因素共同决定:
- 原始 token 数量;
- 是否显式添加 BOS;
- 是否显式添加 EOS;
- sequence packing 是否跨样本拼接;
- padding 位置是否设为 ignore index;
- 是否为最后输入额外提供下一 token。
例如长度为 的完整数组做相邻切片, 会产生 个监督对。
真正不变的是:
9. Causal mask 与 label shift 缺一不可
Label shift 规定“要预测谁”:
Causal mask 规定“预测时能看谁”:
只有 shift 没有 mask, 模型可能从输入中直接看到目标 ,造成标签泄漏。
只有 mask 没有 shift, 若 logits 与当前 token 对齐,任务会变成复原已知输入, 而不是 next-token prediction。
10. 交叉熵如何忽略无效位置
有效位置集合记为 :
padding、跨文档边界或无后继标签的位置, 可在 labels 中写成框架约定的 ignore index。
这些位置即使产生 logits, 也不会贡献 loss 或梯度。
跟练与练习
跟练:手工右移
完整数组:
常见训练切片为:
| 位置 | 输入 | 标签 |
|---|---|---|
| 0 | BOS | A |
| 1 | A | B |
| 2 | B | C |
| 3 | C | EOS |
这里没有 EOS 作为当前输入的监督行, 也没有 BOS 作为标签。
编者练习
完整 token 数组为: 采用相邻切片训练。
- 写出输入与标签。
- 哪个位置学习预测 EOS?
- 若把完整四个 token 都送入模型,哪一行 logits 应被忽略?
查看参考答案
输入为:
标签为:
当前输入为“风”的位置学习预测 EOS。
若完整四个 token 都产生 logits,
最后以 EOS 为当前输入的那一行没有样本内后继标签,
应通过切片或 ignore index 从 loss 中排除。
常见误区
误区 1:标签右移意味着把 token embedding 真正搬到右边
它主要是输入数组与目标数组的索引对齐, 不必在模型内部移动隐藏状态。
误区 2:BOS 需要由同一个样本的某位置预测
BOS 是人为提供的起点上下文, 通常不作为该片段的目标。
误区 3:EOS 不参与 loss
EOS 常作为最后一个有效目标, 用于学习停止生成。
误区 4:五个 token 必然产生五个监督位置
若没有第六个后继 token, 最后输入行没有 next-token 标签。
误区 5:BOS 对所有位置可见,所以 attention 权重一定最大
可见只表示没有被 mask; 具体权重仍由 query-key 分数决定。
误区 6:右移标签后可以取消因果 mask
输入仍包含未来真值 token, 没有 mask 会让较早位置偷看目标。
本课小结
- 位置 的隐藏状态基于 ,对应预测 。
- 常见切片是输入
tokens[:-1]、标签tokens[1:]。 - BOS 提供起始上下文,EOS 通常作为最后一个可预测目标。
- 五 token 示例产生四个 loss,是相邻切片或忽略最后无后继行的结果。
- 监督位置数量随 BOS/EOS、padding 与 packing 约定变化,右移一位的关系不变。
- Label shift 决定预测目标,causal mask 防止未来信息泄漏。
主题讲解 · 01:18
BERT 与 GPT 的共同骨架:双向注意力和因果掩码
学习目标
- 识别 encoder-only BERT 与 decoder-only GPT 的共同 block 骨架。
- 串起 Q/K/V、attention、残差、FFN 与第二条残差。
- 比较双向 self-attention 与 causal self-attention 的可见区域。
- 解释 mask 差异如何服务 Masked LM 与自回归建模目标。
- 区分“简图相似”与“完整模型完全相同”。
- 认识经典 encoder-decoder Transformer 额外的 cross-attention。
前置与衔接
BERT 常被称为 encoder-only, GPT 常被称为 decoder-only。
名称不同, 它们的简化 Transformer block 却共享大量结构。
板书把 encoder-only BERT 与 decoder-only GPT 放入同一简化 block 骨架中比较。
原视频 · 00:00 ↗本课要回答两个问题:
- 哪些模块可以用同一张图表示?
- 哪些边界不能被“它们很像”这句话抹掉?
核心讲解
1. 两者都从 token 表示 X 开始
输入可以是 embedding 与位置编码的组合, 也可以是上一层输出:
在每个 block 内, X 先进入 self-attention 子层。
“self”表示 Q、K、V 来自同一表示流 X。
2. 共同的 Q/K/V attention 主干
投影为:
两类 block 都可用 X 投影 Q/K/V、计算 attention 分数并汇聚 V 的骨架表示。
原视频 · 00:20 ↗attention 为:
BERT 与 GPT 都可以使用多头 attention, 都对各 head 输出拼接并做输出投影。
共同骨架不要求二者的参数数值相同, 只表示算子类型与数据流可以相似。
3. 两者都有残差与逐 token FFN
attention 子层输出会通过残差路径与原表示结合。
随后进入 FFN:
它通常在隐藏维上:
attention 输出经过残差连接,再进入逐 token FFN 与第二条残差路径。
原视频 · 00:40 ↗FFN 子层后还有第二条残差路径。
完整实现还会在相应位置使用 LayerNorm 或 RMSNorm; Pre-Norm 与 Post-Norm 的排列取决于架构。
4. 最关键的简图差异是 self-attention mask
标准 BERT encoder self-attention 对非 padding token 双向可见。
其 mask 可近似写为:
GPT decoder-only self-attention 使用因果 mask:
标准 GPT 自注意力屏蔽未来位置,标准 BERT 自注意力允许双向可见。
原视频 · 01:00 ↗对长度 的 attention 矩阵:
- BERT 可使用整张非 padding 区域;
- GPT 只能使用含主对角线的下三角区域。
5. Mask 差异与训练目标相互配合
BERT 的经典 Masked Language Modeling 随机遮蔽部分输入 token, 再利用左右两侧上下文恢复它们。
因此目标位置需要双向上下文。
GPT 学习:
预测位置不得读取未来真值, 因此需要 causal mask。
mask 并不是随意的视觉差异, 而是概率分解与训练目标的结构约束。
6. 双向可见不等于 BERT 能直接自回归生成
BERT 的每个表示可以融合左右上下文。
这适合理解、分类、抽取与填空, 却不直接满足从左到右生成所需的因果条件。
GPT 的位置 只能依赖前缀, 所以训练时学到的条件分布能直接用于逐 token 生成。
架构骨架相似, 不代表使用方式相同。
7. “除了 mask 都一样”只是教学简化
实际 BERT 与不同 GPT 版本还可能在以下方面不同:
- 训练目标与数据构造;
- 位置编码;
- LayerNorm/RMSNorm 与 Pre/Post-Norm;
- FFN 激活函数与门控结构;
- tokenizer 与词表;
- 参数规模、宽度与深度;
- 是否使用 bias、dropout 或权重绑定。
因此准确表述是:
8. Encoder-decoder 还多一条 cross-attention 数据流
经典 encoder-decoder 的 decoder 通常包含:
- causal self-attention;
- cross-attention;
- FFN。
Cross-attention 中:
Q 来自 decoder, K/V 来自 encoder memory。
所以不能把“decoder-only GPT 的简图”直接等同于经典 Transformer decoder。
跟练与练习
跟练:画出可见位置
长度为 4 的序列中, 位置 2 的可见集合为:
- 标准 BERT:,忽略 padding 等其他 mask;
- GPT:。
位置 0 的可见集合为:
- 标准 BERT:;
- GPT:。
编者练习
句子 token 为:
- 标准 BERT 中,位置 能否读取 ?
- GPT 中,位置 能否读取 ?
- 若某模块的 Q 来自 decoder、K/V 来自 encoder,它属于哪类 attention?
查看参考答案
标准 BERT 使用双向 self-attention,
位置 可以读取 ,前提是 不是 padding 或被其他 mask 排除。
GPT 使用 causal self-attention,
位于 的未来,因此不可读取。
Q 与 K/V 来自不同表示流时,
该模块是 cross-attention。
常见误区
误区 1:BERT 没有任何 mask
BERT 没有 GPT 式因果 mask, 但仍可能有 padding mask 与输入 token 的 MLM 遮蔽策略。
误区 2:GPT 的上三角权重只是变小
因果 mask 在 softmax 前加 , 使对应权重严格为零。
误区 3:BERT 与 GPT 完全相同,只差模型名字
简化 block 骨架相似, 训练目标和实现选择仍有重要差异。
误区 4:Decoder-only 就是经典 decoder
经典 encoder-decoder 的 decoder 还包含 cross-attention; decoder-only 模型没有 encoder memory 可读。
误区 5:FFN 会在不同 token 之间交换信息
FFN 对各 token 行独立应用; token 间信息混合主要来自 attention。
误区 6:双向模型也能无修改地做因果生成
双向训练允许未来信息, 与从左到右条件分解不一致。
本课小结
- BERT 与 GPT 都可用 Q/K/V self-attention、残差、FFN、残差的简化骨架表示。
- 标准 BERT self-attention 双向可见,GPT self-attention 使用下三角 causal mask。
- 可见性差异分别服务 Masked LM 与自回归 next-token 目标。
- “简图很像”不等于完整模型只差 mask;位置编码、Norm、FFN 等也可能不同。
- Decoder-only GPT 不等同于经典 Transformer decoder,后者通常还有 cross-attention。
- 判断 self/cross attention 应看 Q 与 K/V 的表示来源。
主题讲解 · 02:40
从线性层到注意力:读懂最简 Transformer 反向传播图
学习目标
- 按反向执行顺序追踪 FFN 与 attention 梯度。
- 掌握线性层输入梯度和权重梯度公式。
- 严格区分 attention score、softmax 概率及其梯度。
- 识别简图省略的 dV、dK、激活函数与参数梯度。
前置与衔接
本课假设单头 attention,并省略 batch、head、残差和归一化轴。
视频的价值是提供矩阵 shape 直觉;课程稿在此基础上补齐不能混用的梯度符号。
核心讲解
1. 先读完整前向主线
令
随后 进入 FFN,简化为两层线性变换。
视频把前向 Q、K、A、V、O、FFN 与反向梯度流排成上下两条路径。
原视频 · 00:00 ↗反向传播必须从损失端倒序穿过前向操作。
2. 线性层反传的完整公式
对线性层
已知上游梯度 ,则
视频重点画了输入梯度 ,但训练还必须计算 和 。
3. FFN 反向必须逆序
先暂时忽略激活函数,写成
则
线性层输入梯度沿反向顺序依次右乘 W_downᵀ 与 W_upᵀ。
原视频 · 01:00 ↗“先反向变长、再反向变短”来自 shape,而不是把前向矩阵简单倒放。
真实 FFN 常含 GELU、SiLU 或 gated 分支;这些算子的局部导数必须插在相应线性层之间。
4. 从 O=AV 返回 A 与 V
矩阵乘法的两侧都需要梯度:
由 O=AV 可得 dA=dO·Vᵀ,同时还应计算 dV=AᵀdO。
原视频 · 01:40 ↗视频主线只继续追踪 到 ,但 不是可选项。
5. A 与 S 不能共用一个梯度符号
是 softmax 后概率, 是 softmax 前 score。
注意力概率 A=softmax(S) 时,dA 还需经过 softmax 雅可比才能得到 dS。
原视频 · 01:20 ↗必须先计算
对每一行,可写成高效形式
其中求和沿 key 轴并保留维度。
视频为保持图简洁,统一用 指代中间注意力矩阵;阅读公式时必须恢复这层区别。
6. 从 S=QK^T/√d_k 返回 Q 与 K
前向行列切分帮助检查 shape。
前向 QKᵀ 的行列切分帮助对照反向 dQ=dS·K。
原视频 · 02:00 ↗反向公式是
从 dO 经过 Vᵀ、softmax 反传与 K,最终得到 dQ。
原视频 · 02:20 ↗视频画到 为止,但完整 attention 反传还包括 与前面的 。
7. 这张图刻意省略了什么
它没有完整画出:
- Q、K、V 投影权重及其参数梯度。
- 多头 reshape、transpose 与 concat 的逆操作。
- mask 与 dropout 的反传。
- 输出投影。
- 残差连接与 LayerNorm/RMSNorm。
- FFN 激活与 gated 分支。
因此“最简”表示一条教学主线,不等于可直接替代自动微分图。
跟练与练习
原视频练习
编者练习
线性层 中, shape 为 , 为 。写出 与 的公式和 shape。
查看参考答案
若 为 ,则
shape 为 ;
shape 为 。
常见误区
- 输出梯度乘权重转置只给出输入梯度,不包含权重梯度。
- 后不能跳过 softmax 就直接写 。
- 计算 不代表 attention 反传完成,还需要 与 。
- FFN 有非线性或门控时,不能只连续乘两个转置权重。
- 残差与 LayerNorm/RMSNorm 被简图省略,不代表真实 Transformer 没有这些算子。
本课小结
- 反向传播按前向操作的逆序执行。
- 线性层需同时计算输入、权重和偏置梯度。
- 产生 与 两条分支。
- softmax 把 转为 。
- 再产生 与 。
- 最简可视化适合建立 shape 直觉,不能替代完整计算图。
单元综合
Transformer 计算图与语言模型训练综合
单元能力目标
完成本单元后, 应能从同一份 shape 与依赖账本同时回答三类问题:
- Transformer 前向中每个矩阵乘法在收缩哪一轴、保留哪一轴?
- next-token 训练为何能并行,又为何不把前一位置的预测分布回灌?
- 损失如何沿 FFN、attention 与投影层反向传播?
最终目标不是背一张模型结构图, 而是能对任意简化图执行四步检查:
- 写 shape;
- 标数据来源;
- 标可见范围;
- 反向追踪梯度分支。
本单元可用一条主链统摄:
其中:
- 是逐 token 表示;
- 是 softmax 前 attention score;
- 是按 query 行归一化的权重;
- 是 Value 汇聚结果;
- 是逐位置词表 logits;
- 是与右移标签计算的损失。
概念连接
1. 先建立统一 shape 账本
设 batch 维暂时省略, 序列长度为 ,模型维为 ,单头维为 ,词表大小为 。
单头 Q/K/V 投影:
这里用 表示 Value 矩阵, 避免与词表大小 混淆。
分数矩阵:
加 mask 并按行归一化:
汇聚 Value:
多头拼接与输出投影后回到:
FFN 保持 token 轴不变:
最终词表投影:
只要每一步收缩轴与保留轴一致, 这条主链就在 shape 上闭合。
2. Token-wise 投影与 token mixing 分工不同
以下操作对每个 token 行独立使用共享参数:
- 、、;
- 多头后的 ;
- FFN 的升维、激活与降维;
- 最后的词表投影 。
它们收缩特征轴, 不会在这次矩阵乘法中混合不同 token 行。
Token 间信息汇聚发生在:
这里沿 key/token 轴求和, 第 个 query 读取允许位置的 Value。
因此“线性层逐 token 独立”与“Transformer 能交换上下文信息”并不矛盾。
3. 加权平均、分块乘法与 attention 是同一计算的三种读法
对固定 query:
因为 softmax 保证:
是该 head 内可见 Value 的加权平均。
矩阵视角写成:
分块视角写成:
三种表述分别强调:
- 加权平均:概率与凸组合;
- 矩阵乘法:shape 与轴收缩;
- tile:GPU 上如何分块计算与累加。
FlashAttention 进一步在 tile 上维护 softmax 统计量和输出累积, 避免把完整 概率矩阵写回高带宽显存。
它改变计算调度与内存访问, 不改变 attention 的数学结果。
4. Mask 把同一骨架变成不同的信息流
标准 GPT causal self-attention 使用:
第 行只能读取当前位置及以前。
标准 BERT self-attention 通常对所有非 padding token 双向可见, 没有 GPT 式上三角 causal mask。
因此二者可以共享:
的简化骨架, 却具有不同的有效依赖图。
经典 encoder-decoder 的 decoder 还增加 cross-attention:
判断 self/cross attention 的可靠线索是 Q 与 K/V 的数据来源, 不是模块名称或 shape 是否相同。
5. Teacher forcing 把未来真值变成标签,不变成可见输入
给定完整序列:
常见切片为:
位置 的 logits 与标签 对齐。
训练前已经知道所有 ground-truth token, 所以整张输入张量可一次送入模型。
因果 mask 又保证:
不会读取作为未来标签的 。
所以所有位置能并行产生 logits, 而概率分解仍是自回归的:
6. “只算分布,不生成 token”是训练并行的关键
训练在每个位置得到 logits:
交叉熵可直接计算:
不需要先采样 。
因此标准 teacher forcing 的单次前向中不存在:
这条直接回边。
下一位置读取的是 ground-truth token embedding 与此前隐藏表示, 不是前一位置的完整词表分布。
但各位置并非完全独立:
- 后一位置可通过 causal attention 读取此前隐藏表示;
- 各位置共享同一组模型参数;
- 各位置 loss 的梯度会在参数上累加。
7. BOS、EOS 与有效 loss 位置由切片约定决定
完整数组:
使用相邻切片后:
BOS 提供第一个真实 token 的起始上下文; EOS 是最后一个可预测目标。
若把完整数组都送入模型, 最后以 EOS 为输入的 logits 行在样本内没有后继标签, 应通过切片或 ignore index 排除。
“四个 token 产生三个监督位置”不是架构定理, 它来自具体数组长度与切片方式。
不变量只有:
8. Bigram 是整条语言模型主链的最小退化
Bigram 参数矩阵:
当前 token id 为 时:
它跳过 attention 与 FFN, 直接把当前 token 的查表结果解释为 next-token logits。
softmax 后得到:
因此 bigram 与 Transformer 都使用 next-token 交叉熵, 差别在上下文表示:
它是检查 token、logits、概率与标签关系的最小模型。
9. 反向传播按前向主链逆序展开
线性层:
的完整梯度为:
Attention 输出:
产生两条分支:
是 softmax 后概率, 是 softmax 前 score,必须先经过:
再由:
得到:
若只画出 , 并不表示 、 或参数梯度可以省略。
对比与决策
1. 看到一张矩阵图,先判断它在做哪种混合
| 操作 | 收缩轴 | 保留轴 | 是否混合 token |
|---|---|---|---|
| 特征轴 | token、head 特征 | 否 | |
| head 特征 | query、key | 产生两 token 关系分数 | |
| key/token 轴 | query、Value 特征 | 是 | |
| FFN | 特征轴 | token、输出特征 | 否 |
| 模型特征轴 | token、词表 | 否 |
若说“token 在这一层被混合”, 应进一步指出是 沿 key 轴汇聚, 不能把所有线性投影统称为 token mixing。
2. 区分 score、概率、logits 与 token
| 名称 | 典型 shape | 约束 | 用途 |
|---|---|---|---|
| attention score | 任意实数 | query-key 匹配 | |
| attention 权重 | 每行非负且和为一 | 汇聚 Value | |
| vocab logits | 任意实数 | next-token 分类 | |
| vocab 概率 | 每行非负且和为一 | loss、采样或排序 | |
| token id | 标量或 | 离散整数 | embedding lookup |
两个 softmax 虽然形式相同, 归一化对象与语义完全不同:
- attention softmax 在 key 轴归一化;
- vocab softmax 在词表轴归一化。
3. 训练、prefill 与 decode 的决策线索
| 阶段 | token 是否已知 | 多位置是否并行 | 是否采样 | KV Cache |
|---|---|---|---|---|
| 训练前向 | ground truth 已知 | 是 | 否 | 通常不用作推理缓存 |
| 推理 prefill | prompt 已知 | 是 | 通常只在末端选下一 token | 建立 |
| 推理 decode | 新 token 未知 | 每步只新增一行 | 是 | 读取并追加 |
“训练前向近似 prefill”只描述一次处理多 token 的计算形态。
训练还要计算 labels、loss、反向与参数更新; prefill 主要建立缓存并进入 decode。
4. BERT、GPT 与 encoder-decoder 的判断线索
- Q/K/V 都来自同一表示流:self-attention。
- Q 来自 decoder,K/V 来自 encoder memory:cross-attention。
- 双向可见:更接近标准 BERT encoder self-attention。
- 只能读取当前位置及以前:更接近 GPT causal self-attention。
- 同时有 causal self-attention 与 cross-attention:经典 encoder-decoder 的 decoder。
“BERT 与 GPT 的 block 很像”只适用于简化算子骨架, 不应覆盖训练目标、位置编码、Norm 布局、激活与 tokenizer 等差异。
5. 简图省略项的恢复顺序
看到教学简图时,按以下顺序补回:
- shape 与 batch/head 轴;
- 缩放;
- mask 与 softmax 归一化轴;
- 多头 reshape、concat 与 ;
- 残差、Norm、dropout;
- FFN 激活或门控;
- labels、loss 与反向分支。
这样既保留简图的直觉价值, 也不会把“画面没画”误判成“模型没有”。
综合训练
编者练习
设 decoder-only 模型处理完整 token 数组: 采用相邻切片训练。 单头张量 shape 为: 请完成以下任务:
- 写出输入与标签。
- 写出 、、 和词表 logits 的 shape,设词表大小为 20。
- 说明位置 1 能读取哪些 token,又要预测哪个 token。
- 判断前一位置的词表概率是否直接进入位置 1 的隐藏状态。
- 已知 ,写出 与 ;再说明为何不能把 直接当成 。
查看参考答案
输入与标签为:
shape 链为:
多头输出投影回模型维后,
词表 logits 为:
位置 1 的当前输入为 。
因果 mask 允许它读取:
对应标签是下一个 token 。
标准 teacher forcing 不把位置 0 的词表概率向量回灌到位置 1;
位置 1 读取真值 token 表示与合法前缀隐藏状态。
由:
得到:
,
所以还必须通过 softmax Jacobian 把 转成 。
自检标准:
• 每个矩阵乘法的收缩轴相同;
• 因果可见集合不含未来 token;
• logits 标签恰好右移一位;
• 反向同时保留矩阵乘法两侧的梯度分支。
进入下一单元前
- 已能从 输入完整推出 attention、FFN 与 logits 的 shape。
- 已能指出 token-wise 投影与 token mixing 的边界。
- 已能区分 attention score、attention 权重、vocab logits、vocab 概率与离散 token。
- 已能解释 teacher forcing、label shift 与 causal mask 如何共同支持训练并行。
- 已能区分训练前向、inference prefill 与 KV Cache decode。
- 已能用 Q/K/V 来源判断 self-attention 与 cross-attention。
- 已能从 反推出 、,并继续经过 softmax 得到 。
- 若仍会把“没有直接概率回边”理解为各位置完全独立,回看 teacher forcing 与共享参数梯度。
- 若仍会混淆矩阵的 token 轴和特征轴,回看分块矩阵乘法与 shape 账本。
- 若仍会把简化 BERT/GPT 图当作完整实现,回看 mask、cross-attention 与省略项恢复顺序。