Transformer论文中文翻译精读:架构参数、训练配置与避坑指南

发布时间:2026/10/26 20:01:42
Transformer论文中文翻译精读:架构参数、训练配置与避坑指南

简介:这份资源是 NIPS 2017 经典论文《Attention is All You Need》的中文翻译文档,面向自然语言处理学习者、Transformer 入门者以及需要研读原始论文的研究人员,帮助读者跨越英文原文的阅读门槛,理解自注意力机制与序列转导模型的核心思想。压缩包内共 1 个 docx 文件,约 856KB,内容完整覆盖论文摘要、引言、背景、模型架构、缩放点积注意力、多头注意力及机器翻译实验等章节,译文对编码器—解码器堆栈、残差连接与层归一化等关键结构均有对应说明。目前已有 1189 人学习下载,适合作为 Transformer 专题学习的第一手参考资料。读者可借助该译文对照原文梳理模型设计脉络,理解 WMT 2014 英德、英法翻译任务中 28.4 与 41.0 BLEU 结果的来源,并把握自注意力替代循环与卷积的论证逻辑,为后续复现与论文写作打下基础。

1. 一份被机翻毁掉的经典:为什么值得重新拆开看

如果你搜过 self-attention 或 Transformer 原理,大概率见过这篇论文的中文版本,但很多流传的 docx 打开就是灾难:公式变成乱码、dmodel和dk挤成一团、编码器和解码器的堆叠描述被机翻成“变压器”。这份 NIPS-2017 论文中文翻译 docx 的价值不在于“又一份翻译”,而在于它把原论文第 3 节到第 5 节的架构参数、训练配置、消融实验完整保留了下来,能让你对照代码逐项核对。它适合三类人:刚接触 attention 机制、想搞清 QKV 到底怎么算的新手;要复现 Transformer 但被论文里一堆符号卡住的工程师;以及需要一份可离线查阅、能直接标注的中文底稿做组内分享的从业者。下面我按“先立住原理、再落到参数、最后讲坑”的顺序,把这份文档拆成能照着用的东西。

2. 先把架构读对:编码器解码器堆栈与三处注意力的分工

2.1 六个层、两个子层,残差和 LayerNorm 的位置别搞反

文档第 3.1 节写得很清楚:编码器和解码器都是 N=6 个相同层堆叠。编码器每层两个子层——多头自注意力和逐位置全连接前馈网络;解码器多插一个对编码器输出做多头注意的第三子层。关键细节是每个子层外围都套了残差连接再做层归一化,原文给的式子是LayerNorm(x + Sublayer(x)),注意是“先加再归一”,不是先归一再加。这个顺序在后来的实现里有过争论,但这份文档忠实于原论文,你照着读就不会把 Post-LN 和 Pre-LN 搞混。

所有子层和嵌入层输出维度统一为d_model = 512,这是为了残差能直接相加。很多人第一次读会忽略这句,结果自己搭网络时前馈层输出维度写成 2048 就直接报维度不匹配。文档里d_ff = 2048是前馈网络内层维度,不是输出维度,输出仍然回到 512。把这两个数分清,后面看消融表才不会懵。

解码器自注意力子层还多了一个掩蔽操作,防止位置 i 关注到 i 之后的位置。文档的原话是“屏蔽设置为 softmax 输入中对应于非法连接的所有值”,翻成人话就是给未来位置的注意力打分填一个极大负数,softmax 之后权重趋近于零。这个掩蔽加上输出嵌入右移一位,共同保证自回归性质。读这段时建议拿纸画一遍:输入序列长度 n,注意力矩阵是 n×n,掩蔽就是把上三角置负无穷。

2.2 缩放点积注意力:除以根号 dk 不是可选项

第 3.2.1 节是整篇最该逐字读的部分。注意力本质是把 query 和一组 key-value 对映射成输出,输出是 value 的加权和,权重由 query 和对应 key 的兼容性函数算出来。文档给的公式是Attention(Q,K,V) = softmax(QK^T / √dk) V。这里dk是 query 和 key 的维度,除以根号dk是缩放因子。

为什么必须缩放?文档自己解释了:dk较大时点积结果数值增长大,会把 softmax 推进梯度极小的区域。我见过有人复现时图省事去掉这个除法,训练前几百步 loss 几乎不动,排查半天以为是学习率问题,其实就是 softmax 饱和了。这个坑在文档里白纸黑字写着,读的时候别跳过。

文档还对比了加性注意和点积注意:理论复杂度相近,但点积能用高度优化的矩阵乘法,实际更快、更省空间。小dk时两者表现差不多,大dk时加性注意反而更稳——这正是缩放要解决的问题。这段对比是选型依据,不是闲笔,读的时候要意识到作者是在为“为什么选点积”做辩护。

2.3 多头注意力:8 个头、每个头 64 维,总成本不变

第 3.2.2 节讲多头。做法是把d_model维的 Q、K、V 分别做 h 次线性投影到dk、dk、dv维,并行跑注意力,再把各头输出拼接后投影回d_model。文档给的配置是h = 8,每个头dk = dv = d_model / h = 64。因为每个头维度降了,总计算成本和全维单头注意力相近,但模型能同时关注不同位置的不同表示子空间。

这里有个容易读漏的点:投影矩阵是学习出来的,不是简单切分。有人以为多头就是把 512 维平均切成 8 份各跑各的,虽然实现上常这么写,但论文强调的是“不同的、学习过的线性投影”。读文档时要抓住“学习过”三个字,否则理解不到多头为什么比单头强。

第 3.2.3 节列了多头注意力在模型里的三种用法,这段建议做成对照表贴在代码旁边:编码器-解码器注意力里 query 来自前一个解码器层、key 和 value 来自编码器输出;编码器自注意力里 QKV 同源,都来自前一层输出;解码器自注意力同样同源,但要加掩蔽。三种用法的 QKV 来源不同,是搭模型时最容易接错线的地方。

2.4 位置编码:正弦函数为什么能外推

第 3.5 节的位置编码常被当成公式背诵,其实文档给了选型理由。因为模型没有递归也没有卷积,必须显式注入位置信息。作者用不同频率的正弦余弦函数:偶数维用 sin、奇数维用 cos,波长从 2π 到 10000·2π 成几何级数。选它的理由是对于任意固定偏移 k,PE(pos+k)可以表示成PE(pos)的线性函数,模型容易学相对位置;而且正弦版本可能允许外推比训练时更长的序列。

文档还提到试过学习式位置嵌入,结果几乎一样(表 3 行 E),最终选正弦是为了外推。这个细节对做长文本的人有用:如果你要处理比训练集长得多的序列,正弦编码至少给了理论上的可能性,虽然实际外推效果另说。读这段时把公式和“线性函数”那句连起来看,就明白不是随便选了个周期函数。

3. 训练配置与消融表:把论文参数翻译成可复现的清单

3.1 数据、批处理与优化器:warmup 4000 步怎么用

第 5 节是复现的地基。训练数据是 WMT 2014 英德约 450 万句对,用字节对编码,共享源目标词表约 37000 个 token;英法用更大的 3600 万句对,词表 32000。句子对按大致序列长度分批,每批约 25000 个源 token 和 25000 个目标 token。硬件是 8 块 P100,基础模型每步约 0.4 秒,共训 10 万步或 12 小时;大模型每步 1.0 秒,训 30 万步约 3.5 天。

优化器用 Adam,学习率按文档式 (3) 变化:前warmup_steps = 4000步线性增长,之后按步数平方根倒数衰减。这个 warmup 是 Transformer 训练的玄学之一,直接上大学习率很容易发散。我一般会先把 warmup 写死成 4000,确认 loss 前几千步平滑下降再调。文档还写了三种正则:每个子层输出加 dropout 再相加归一化、嵌入与位置编码之和加 dropout、标签平滑。基础模型P_drop = 0.1,大模型英德用 0.3、英法用 0.1。

推理阶段文档给了具体参数:beam size = 4,长度惩罚 α = 0.6,最大输出长度为输入长度 + 50,能提前终止就终止。基础模型平均最后 5 个 checkpoint(每 10 分钟存一次),大模型平均最后 20 个。这些数字直接抄进配置就行,不用自己猜。

3.2 消融表怎么读:哪些改动真的伤模型

表 3 是这份文档里信息密度最高的部分,但机翻后排版容易乱。我按行拆一下:行 A 改注意力头数和 key/value 维度,保持计算量不变,单头比最佳设置差 0.9 BLEU,头太多也掉质量;行 B 减小dk伤质量,说明兼容性函数不简单,比点积更复杂的函数可能有益;行 C、D 说明模型越大越好、dropout 对防过拟合很有用;行 E 用学习式位置嵌入替换正弦,结果和基础模型几乎一样。

读这张表要带着问题:你想改哪个组件,先看对应行有没有被验证过。比如有人想减小编码器层数省显存,表里没有直接对应行,但行 C/D 的“越大越好”趋势能给你预警。再比如想换位置编码方案,行 E 告诉你学习式和正弦差不多,那选实现简单的就行。表格里的 PPL 是按 BPE 词算的,文档特意提醒不能和按词算的困惑度直接比,这个注释别漏。

3.3 复杂度对比表:self-attention 什么时候真的比 RNN 快

第 4 节表 1 对比了不同层类型的每层复杂度、顺序操作数和最大路径长度。自注意力每层O(n²·d)、顺序操作O(1)、最大路径O(1);循环层O(n·d²)、顺序操作O(n)、最大路径O(n);卷积层O(k·n·d²)、顺序操作O(1)、最大路径O(log_k n)。文档的结论是:当序列长度 n 小于表示维度 d 时,自注意力比循环层快,而这正是机器翻译里词块和 BPE 表示的常见情况。

这张表是选型的硬依据。很多人问“Transformer 是不是一定比 LSTM 快”,答案取决于 n 和 d 的关系。n 很大时n²项会反超,所以后来才有各种稀疏注意力和局部注意力。文档也提到可以把自注意力限制在邻域 r 内,最大路径变成O(n/r),这是长序列优化的源头。读这段时把 n、d、k、r 四个符号的含义记牢,后面看任何 Transformer 变体都能对上号。

4. 避坑与排查:读这份翻译文档时最容易翻车的五处

4.1 公式乱码导致符号认错

现象:docx 里d_model、dk、dv显示成乱码或粘连,把d_model/h看成d_model除以别的量。原因:机翻和公式编辑器混排,下标丢失。解决:对照第 3.2.2 节文字描述反推,h=8、dk=dv=d_model/h=64,用这三个数互相校验;实在看不清就按原论文的符号体系重建,别硬猜。

4.2 把“变压器”当成模型名去搜

现象:文档里多处把 Transformer 译成“变压器”“变形金刚”,新手搜“变压器 自注意力”找不到资料。原因:机翻没保留专有名词。解决:读的时候在脑子里统一替换回 Transformer,检索时用英文原名加 self-attention;文档里“张量2传感器”其实是 Tensor2Tensor 的误译,看到这类词直接跳过,不影响理解架构。

4.3 残差和 LayerNorm 顺序读反

现象:照着文档搭网络,把LayerNorm(x + Sublayer(x))实现成x + LayerNorm(Sublayer(x)),训练初期 loss 震荡。原因:中文语序把“接着是层归一化”放在残差之后,容易读成先归一。解决:以公式为准,先残差相加再归一化;如果要做 Pre-LN 变体,明确知道自己改了什么,别以为是照论文实现。

4.4 掩蔽位置填错导致标签泄漏

现象:解码器训练 loss 降得异常低,推理却崩。原因:掩蔽矩阵方向搞反,或者 softmax 前填的是 0 而不是负无穷。解决:确认掩蔽加在 softmax 之前,未来位置填极大负数;用一个小序列手动算一遍注意力权重,检查上三角是否全为零。文档第 3.2.3 节说“设置为 softmax 输入中对应于非法连接的所有值”,这个“所有值”指负无穷,不是零。

4.5 消融表数字对不上就怀疑文档

现象:表 3 里 BLEU 和 PPL 的小数位在 docx 里错位,以为翻译错了。原因:表格跨页和机翻排版导致列对齐丢失。解决:按行标签(base、A、B、C、D、E、big)逐行核对,BLEU 一般在 25 到 28 区间、PPL 在 4.5 到 6 区间,用数量级判断哪列是哪列;对不上的个别数字以趋势为准,不影响选型结论。

5. 进阶用法:把这份 docx 变成可检索的对照底稿

读第二遍时我一般不做通读,而是把文档拆成“架构参数表 + 训练配置表 + 消融结论表”三块,和代码逐项对齐。具体做法:先在第 3 节标出所有维度符号(d_model=512、d_ff=2048、h=8、dk=dv=64、N=6),做成一张参数表贴在模型定义文件旁边;再把第 5 节的warmup_steps=4000、P_drop=0.1、beam=4、α=0.6 抄进配置注释;最后把表 3 的消融结论写成“改 X 会掉 Y BLEU”的备注,改代码前先看一眼。

文档位置提取内容落到代码哪里
3.1 节N=6、d_model=512、d_ff=2048编码器/解码器层数与维度
3.2.2 节h=8、dk=dv=64多头注意力头数与每头维度
3.5 节正弦位置编码公式位置编码模块
5.3 节warmup_steps=4000学习率调度器
5.4 节P_drop=0.1、标签平滑dropout 层与损失函数
6.1 节beam=4、α=0.6推理解码配置

这样做的额外好处是:docx 里的机翻错误在你做对照时会被自然筛掉,因为你是拿数字和公式去核,不是拿句子去背。我还会把第 4 节表 1 的复杂度对比单独截出来,遇到“要不要换稀疏注意力”的讨论时直接引用,比空口争论有用。

有个习惯我保持了挺久:每次要改 Transformer 的某个组件,先把这份文档对应小节重读一遍,确认原论文在这个点上的原始设定和消融证据,再动手。血泪经验是,很多“优化”其实是在重复论文已经试过并否定的方向,比如减小dk、去掉缩放、换位置编码,表 3 里都有现成结论。从那以后我每次改架构前都强制走一遍“查文档对应行”的流程,省下的调试时间比读文档多得多。希望这份拆解帮到你,拿到 docx 后先别通读,按上面的对照表拆一遍,再用它去核你的代码。

本文还有配套的精品资源,点击获取