并行的代价:Transformer 的取舍
建议用时:25 分钟(含练习)
学习目标
能够说明并行化换来了什么、代价落在哪一格,并识别一道闪电式叙事的失真处。
本节产出
一张并行、长程依赖与显存的取舍表
核心知识:并行化换的是规模,代价落在平方与位置上
先钉住"并行"到底并行在哪一维
上一节已经算过递归的账:长度 L 的序列要走 L 步,批量只能把每一步变宽,不能把步数变少。2017 年那篇论文(arXiv,提交日期 2017-06-12,本课核到这一页的存在、标题与日期)把这件事换掉了:自注意力在训练时让序列里所有位置一次算完,每个位置同时发出读取请求,同时把所有位置的加权内容取回来。
一句话钉住范围:被并行掉的是同一条序列内部的时间维。这一格如果和批量混起来,就看不出它新在哪里,也会误以为"从此连生成也是一次算完"。第三格讲这个误读。
换来了什么,因果链要说对
- 步数从 L 降到 1:一条序列不再按位置排队
- 每步能塞更多 token:同样墙钟时间装得下更长上下文与更大批量
- 同样预算吞更多数据:更新次数与样本量一起上去
- 于是一条已有的路线被推到别人买不起的规模
最后一环最容易被讲反:把结果归因于"结构更聪明",就解释不了一件具体的事。同一时间窗里,那条仍在改进递归的路线(d2l 第 9 章那种做法)不是想不到并行,是它的结构决定了它并行不了这笔账。主角不是聪明,是排队消失了。
代价落在哪三格
第一格,平方。自注意力要给序列里每一对位置算一个分数,于是分数表是 L 乘 L。下面的数是本课按 L × L 现算的,不是论文表格里的数:
| L | 每个头的分数个数 |
|---|---|
| 256 | 65,536 |
| 512 | 262,144 |
| 768 | 589,824 |
| 1024 | 1,048,576 |
| 2048 | 4,194,304 |
长度翻倍,代价翻四倍;长度只加一半(512 到 768),代价已经是 2.25 倍。关键是这一格不是参数问题:参数只跟隐藏维度与层数有关,L 再大也不多加一个权重。它是显存问题:那张 L 乘 L 的表要留在显存里,直到反向传播用完。序列长度是这里唯一按平方长的东西。
第二格,位置。一次算完的结构对"先后"是盲的:把输入顺序打乱,注意力只是跟着换了名字,两两之间的分数关系不变。所以顺序信息必须另外注入进去,位置编码这一类做法补的就是这一格(机制说明;本课未逐字取证原论文用的是哪一种)。实用后果值得记住:位置是外挂的,它能外推到多长是另一个要单独问的问题,本课未取证。
第三格,推理仍然串行。逐词生成时第 t 个词必须等第 t-1 个词,自注意力没有取消这条依赖,它只让每一步整段读入、一次算完所有位置的分。把"训练时并行"讲成"它把生成变成了一次算完",是失真最容易长出来的地方。
图里四份材料之间的线都是无方向的关联线。刻意不画箭头:一旦画成箭头,读图的人就会把它当成一条"从对齐到 Transformer 的必然传承",而这正是下面要拆的那种叙事。
"一道闪电"的叙事错在哪两处
第一种失真,把架构选择讲成天才顿悟。反证就在白名单里:注意力这件事,2014 年 9 月那篇把对齐与翻译放在一起学的论文已经把它做成可训练的显式机制。所以本课明确不声称 Transformer 是第一个用注意力的模型,一枚更早的一手件就够把这类说法判掉。
第二种失真,抹掉同期工作与被放弃的分支。这一格本课只能写"未穷举":2014 到 2017 之间是否还有别的并行化路线、它们各自输在哪一格,需要遍历那几年的文献才能定,本轮没有做这一圈检索面。因此正文里它只能作为问题留着,不给结论,也不暗示"只有这两条路"。
两段的区别不在语气,在取证代价:第一句一枚已核链接就能反驳;第二句要一整轮穷举才配得上答案。
案例:十天预算里三种路线能吃多少数据(数字为教学编造)
下表全部数字都是本课为教学编造的假设值,不是任何真实训练的测量。设定:墙钟预算 10 天,一步记一个单位。
| 路线 | 一条长度 L 的序列要几步 | 每步可塞 token(假设值) | 预算内更新次数(假设值) | 能吃到的语料量级(假设值) |
|---|---|---|---|---|
| 甲:全串行递归 | L 步 | 4,000 | 120,000 | 千万级 token |
| 乙:撑长距离的递归变体 | L 步,但每步更贵 | 2,000 | 100,000 | 千万级以下 |
| 丙:一次算完 | 1 步 | 32,000 | 900,000 | 亿级以上 |
读这张表要用"它赢在哪一格"的问法。丙赢的不是"每步算得更准",而是步数与每步宽度同时变大,于是同样预算里更新次数与样本量都上去了。乙的处境最能说明分支不是错:它在时间维上仍然排队,这条限制是结构给的,跟它把距离撑得多好无关。
下面这段本课自造的流行短文用来练拆栏:
"2017 年,几位研究者灵光一闪,想到用注意力彻底取代递归,于是深度学习被一道闪电照亮,旧的循环路线当晚就被放弃了。"
这一句里有三处站不住:"当晚就被放弃"没有任何材料支持;"彻底取代"漏掉了推理侧仍然串行这一格;"想到用注意力"把 2014 年已经在做的一件事写成了从零开始。
动手练习
- 预算判断。沿用上面那张假设表:把墙钟预算从 10 天压到 3 天,并设亿级 token 大约需要 800,000 次更新(同样是编造值)。任务:给出三个"能 / 不能",各配一句依据。验收条件:依据必须落在步数或每步宽度上,不许写"丙更先进"。
- 平方账与叙事拆栏。任务一:算 L = 768 与 L = 1536 时每个头的分数个数,并写出它们相对 L = 512 的倍数。任务二:把上面那段自造短文拆成"可证"与"不可证"两栏,给不可证那一栏写一句"要证成它需要什么检索面"。验收条件:至少一行明确写"本课未取证"。
- 交一张取舍表:三行分别是并行、长程依赖、显存,每行两列"换来了什么"与"代价落在哪",再加第四行"位置信息"。验收条件:显存那一行必须写"随序列长度平方",不许写"很吃显卡"。
参考答案与推演
完成检查
- 能用一句话说清被并行掉的是序列内部的时间维,不是批量维,并说明为什么批量替代不了它。
- 能给出两个自己算过的数说明代价按平方长,并说清它落在显存而不是参数量上。
- 能指出"训练并行"不等于"生成并行",并讲出依赖关系在哪一步仍然留着。
- 能列出"一道闪电"叙事的两处失真,各写出它的取证代价:一枚链接,还是一轮穷举。
参考与来源
- Attention Is All You Need(arXiv,2017-06-12):2026-10-23 核到标题与提交日期;本节所有倍数都是本课按 L 乘 L 现算的,没有从论文表格里抄数。
- Neural Machine Translation by Jointly Learning to Align and Translate(arXiv,2014-09-01):这一枚一手件就是"注意力到 2017 年才出现"这类说法的反证。
- Sequence to Sequence Learning with Neural Networks(arXiv,2014-09-10):2026-10-23 核到标题与提交日期,用作同期时间轴的形状。
- d2l 中文:10. 注意力机制:10.1 注意力提示 … 10.7 Transformer,分节号当日回页核过。
- d2l 中文:9. 现代循环神经网络:2026-10-23 核到页面标题;本节用它说明"撑长距离"与"取消串行"是两件事。
并行的代价:Transformer 的取舍
3 道题 · 及格分 60 分