具身智能论文伴读 | 第一期 | 精读 04|Attention Is All You Need:如何用 self-attention 和前馈层搭出一个完全不依赖循环结构
具身智能论文伴读 | 第一期 | 精读 04 精读 Transformer|Attention Is All You Need:如何用 self-attention 和前馈层搭出一个完全不依赖循环结构的编码器-解码器
一句话结论与分析框架
这两段在做一件事:先交代 Transformer 沿用了序列转导任务中久经检验的编码器-解码器(encoder-decoder)骨架,再逐层说明它在这个骨架内部具体堆了哪些模块、怎么连接。
这不是摘要,而是正文的方法描述段落,方法描述段落有自己的组织逻辑,通常是从宏观到微观、从共性到个性:先说"我和前人共享什么结构"(定位),再说"我在这个结构里换了什么、怎么搭"(细节)。
逐句拆解

Most competitive neural sequence transduction models have an encoder-decoder structure [5, 2, 35].
位置:沿用的部分(定位)。
先解释术语。sequence transduction(序列转导) ,如前文所述,指的是把一个序列映射为另一个序列的任务,机器翻译是最典型的例子:输入一句英文序列,输出一句德文序列。"transduction"这个词比"translation"更抽象、更泛化,它不限定语言,涵盖了摘要生成、语音识别等一切"序列进、序列出"的任务。作者用这个词,是在把自己的工作放到一个比翻译更大的问题类别里。
encoder-decoder(编码器-解码器)结构是这类任务的主流范式:编码器负责"读懂"输入,解码器负责"写出"输出。
值得留意的是句首的 Most competitive … models。这里的写作考量在于:作者没有说"我们提出一个全新结构",而是先承认"最有竞争力的模型都用这套骨架"。这是一种稳妥的定位方式——先把自己接入公认的传统,表明 Transformer 的创新不在于推翻编码器-解码器范式,而在于范式内部的实现方式。competitive 一词也用得克制:它只是说"有竞争力的",而非"最好的",既点明了参照系是当前的强模型,又没有把话说满。三个引用 [5, 2, 35] 则是在向读者(和审稿人)表明,这是一个有充分文献支撑的共识,而非作者的一面之词。
Here, the encoder maps an input sequence of symbol representations (x1, …, xn) to a sequence of continuous representations z = (z1, …, zn).
位置:沿用的部分(定位)。
这句给编码器一个数学描述。输入是 (x1,...,xn)(x_1, ..., x_n)(x1,...,xn),称为 symbol representations(符号表示)——注意作者的措辞:输入不是"符号"本身,而是符号的"表示",也就是每个词已经被转成了向量(词嵌入)。编码器把它映射为 z=(z1,...,zn)z = (z_1, ..., z_n)z=(z1,...,zn),一串 continuous representations(连续表示)。
这里有一个值得说清的对照:symbol 与 continuous 的对立。语言的符号是离散的(词表里第 3721 个词),而神经网络内部流动的是连续的实数向量。编码器的职责,正是把离散符号所承载的信息,重新编排成一串利于后续计算的连续向量。还要注意输入和输出的长度都是 nnn——编码阶段不改变序列长度,只做"逐位置的信息重整"。这一点在读到后面 self-attention 时会变得重要。
Given z, the decoder then generates an output sequence (y1, …, ym) of symbols one element at a time.
位置:沿用的部分(定位)。
拿到编码器给出的 zzz,解码器开始产出 (y1,...,ym)(y_1, ..., y_m)(y1,...,ym)。这里有两个细节值得停一下。
其一,输出长度是 mmm,与输入长度 nnn 不同。这符合直觉:一句话译成另一种语言,词数往往不等。编码阶段保持等长,解码阶段则可长可短,这个不对称是编码器与解码器分工不同的直接体现。
其二,one element at a time(一次一个元素)。解码器不是一口气吐出整句,而是逐词生成。这看似是个平淡的描述,实则为下一句的"自回归"埋了伏笔。
At each step the model is auto-regressive [10], consuming the previously generated symbols as additional input when generating the next.
位置:沿用的部分(定位),但引出了后文关键约束。
auto-regressive(自回归) 这个术语。它并非深度学习的原创概念,而是借自时间序列统计学:自回归模型指用一个变量自身的历史值来预测其当前值(所谓"auto",即"用自己回归自己")。经典的 AR 模型就是这一思想。这里作者把它迁移到序列生成上,指代一个明确的机制——生成下一个词时,要把已经生成的所有词当作额外输入喂回去。也就是说,写第 5 个词时,模型看得到自己刚写下的第 1 到第 4 个词。
理解这一点,你就能预判后面解码器为什么必须做"掩码"。自回归的本质约束是:生成过程中,未来的词还不存在,模型只能依赖过去。这个约束会在 3.1 末尾以 masking 的形式被强制实现。此处埋下的这条线,请记住。
The Transformer follows this overall architecture using stacked self-attention and point-wise, fully connected layers for both the encoder and decoder …
位置:改动的部分(方法总纲)。
这是第一段的落点,也是整段的转折。前面铺垫的都是"沿用",这句才亮出"改动":Transformer 仍走编码器-解码器这条大路(follows this overall architecture),但填充这条路的材料换了——用的是堆叠的自注意力(stacked self-attention) 和逐点全连接层(point-wise fully connected layers)。
这句话的份量,要放到论文的历史背景里才看得清。在此之前,编码器-解码器几乎清一色由 RNN 或 CNN 构成。而这里,循环和卷积一个都没出现——这正是论文标题"Attention Is All You Need"的技术兑现。作者的写法很含蓄:他没有大声宣布"我们抛弃了 RNN",而是平静地列出自己用了什么。你若不熟悉背景,几乎读不出这句的锋芒。这是一种成熟的写法:让事实本身说话,把判断留给读者。
point-wise(逐点/逐位置) 需要解释:它指这个全连接层独立地作用在序列的每一个位置上,各位置之间不共享计算、互不干扰。序列内位置之间的信息交流,全部交给 self-attention 去做;而 point-wise 前馈层只在每个位置内部做变换。这个"分工"是 Transformer 结构的一条基本原则,后文会反复体现。
进入 3.1,视角从"整体骨架"下沉到"单层内部"。前面的两个格子里,以下内容全部落在改动的部分——作者开始交代自己究竟怎么搭。
Encoder: The encoder is composed of a stack of N = 6 identical layers. Each layer has two sub-layers.
编码器是 6 个结构完全相同(identical) 的层堆叠而成。注意 identical 指结构相同,而非参数共享——每一层有各自独立的权重,只是形状和组件一样。每层内含两个子层(sub-layer)。这种"重复同一模块 N 次"的设计,在工程上极为清爽:你只需定义好一层,再堆 6 份即可。
The first is a multi-head self-attention mechanism, and the second is a simple, position-wise fully connected feed-forward network.
两个子层分别是:多头自注意力,和逐位置全连接前馈网络。这里的 position-wise 与前文的 point-wise 是同一个意思的两种说法,都强调"逐位置、独立作用"。留意 simple 这个形容词——作者称前馈网络"简单"。这不是自谦,而是一种有意的对照:复杂的、承担位置间交互的活儿,交给了 attention;前馈层只做简单的逐位置变换。用"simple"点出这种分工,是精准而非随意的用词。
We employ a residual connection [11] around each of the two sub-layers, followed by layer normalization [1]. That is, the output of each sub-layer is LayerNorm(x + Sublayer(x)) …
residual connection(残差连接) 出自 ResNet [11],其核心思想是:不让子层直接输出结果,而是让它学习"在输入基础上的增量"。写成公式就是 LayerNorm(x+Sublayer(x))\text{LayerNorm}(x + \text{Sublayer}(x))LayerNorm(x+Sublayer(x))——注意那个 x+x +x+,输入 xxx 被原封不动地加到了子层输出上。这样做的意义在于,当网络很深时,梯度可以顺着这条"加法捷径"直接回传,缓解深层网络难以训练的问题。这是深层堆叠(这里堆了 6 层)能够成立的前提之一。
layer normalization(层归一化) [1] 则是对每个样本、在特征维度上做归一化,稳定每一层的数值分布,让训练更平稳。
这里顺带点破一处写作规范:作者先用文字描述(residual + layer norm),紧接着用一句 That is, … 引出精确的公式表达。That is 是学术写作里高频的"改述"信号词,意思是"换一种更精确的方式再说一遍"。当一个机制用自然语言容易产生歧义时,补一个公式来锁定含义,是方法描述的良好习惯——你在自己写论文时可以借鉴这个"先文字、后公式"的节奏。
To facilitate these residual connections, all sub-layers in the model, as well as the embedding layers, produce outputs of dimension dmodel = 512.
这句解释了一个工程约束的由来。既然残差连接要做 x+Sublayer(x)x + \text{Sublayer}(x)x+Sublayer(x) 这个加法,那么 xxx 和 Sublayer(x)\text{Sublayer}(x)Sublayer(x) 的维度就必须一致,否则加不起来。于是作者索性让全模型所有子层、乃至词嵌入层的输出维度统一为 dmodel=512d_{\text{model}} = 512dmodel=512。注意句首的 To facilitate(为了便于)——作者明确告诉你,这个"处处 512"的设定不是随意选的,而是为了让残差连接能够顺畅相加。读方法描述时,多留意这种"因为要做 A,所以约束 B"的因果链,它能帮你理解设计背后的动机,而不是把一堆数字死记下来。
Decoder: The decoder is also composed of a stack of N = 6 identical layers. In addition to the two sub-layers in each encoder layer, the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack.
解码器同样是 6 层堆叠,但每层比编码器多一个子层,共三个。这第三个子层做的是"对编码器输出的多头注意力"——也就是常说的 cross-attention(交叉注意力),虽然此处作者还没用这个名字。
这里要辨清一个容易混淆的点:编码器层里的注意力是 self-attention(自注意力),查询、键、值都来自同一串序列(输入序列关注自己);而解码器新增的这个子层不是自注意力,它让解码端去"查阅"编码器的输出 zzz。这正是编码器-解码器之间信息流动的桥梁——解码器每生成一个词,都要回头看一眼编码器对整个输入的理解。翻译时"边写译文边参照原文"的直觉,在结构上就落在这个第三子层。
We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.
位置:改动的部分,且是前文伏笔的收束。
还记得前面讲 auto-regressive 时埋的那条线吗?这里就是它的兑现。解码器的自注意力被特意修改(modify),以阻止某个位置去关注它之后的位置——这就是 masking(掩码)。
为什么必须这样?因为自注意力天生能看到序列里的所有位置,包括未来。但自回归生成要求"预测第 iii 个词时只能依赖 iii 之前的已知输出"。如果不加约束,训练时模型就能"偷看"到本该由它预测的答案,这在推理时是不可能拥有的信息——学到的就是作弊的捷径。掩码的作用,就是把每个位置对未来的注意力强行屏蔽掉,让训练阶段的信息可见性与推理阶段严格一致。
还有一个配合的细节:output embeddings are offset by one position(输出嵌入偏移一位)。这是说解码器的输入相对目标序列整体右移一位,使得预测位置 iii 时,喂进去的是位置 iii 之前的词。掩码与这个偏移两者叠加,共同保证了那句结论:对位置 iii 的预测只能依赖 iii 之前的已知输出。
留意作者的用词 modify——它暗示解码器的自注意力并非另起炉灶,而是在编码器同款自注意力之上"改一处约束"。这种"同一机制、按需加约束"的表述方式,既说清了差异,又强调了结构的统一性。
今日知识点
英文表达
- sequence transduction:序列转导,泛指"序列进、序列出"的任务类别,比 translation 更抽象、更具概括性,用于把工作定位到更大的问题域。
- Most competitive … models have …:方法定位的常用开头,先接入公认传统,再引出自己的改动;比"we propose a novel …"更稳妥。
- follows this overall architecture using …:“沿用整体框架,但用……来实现”,精确划分"继承"与"创新"边界的句式。
- That is, …:改述信号词,用于"换一种更精确(常为公式)的方式重述前文",是先文字后公式的过渡标记。
- To facilitate … , all … produce outputs of dimension …:“为便于……,故统一……”,交代设计动机与工程约束因果关系的句型。
- In addition to … , the decoder inserts a third sub-layer:描述"在共性基础上增加个性组件"的标准表达。
- prevent positions from attending to subsequent positions:描述掩码机制的地道说法,
attend to是注意力语境下"关注"的固定动词。
顺手攒个小词
本段的 simple(“a simple … feed-forward network”)用得颇有分寸。表"简单"的一组词里,simple 中性偏褒,强调"结构清爽、无冗余",作者用它点出前馈层的"简单"是有意的分工设计,并非能力不足;plain 更强调"朴素、无修饰",略带"平平无奇"的意味;trivial 则带贬义,指"简单到不值一提",绝不能用来描述自己方法中真正起作用的组件,否则等于自我贬低。写作时若想说明"我这一部分刻意做得简单以突出别处的创新",用 simple 最为得体。
科研知识
- 方法描述段落的组织逻辑通常是"从宏观到微观、从共性到个性":先声明与前人共享的骨架,再集中笔墨于自己的改动。阅读时应把重心放在"改动"上。
- 交代设计时讲清"动机—约束"的因果链(如"为便于残差相加,故统一维度为 512")比单纯罗列超参数更有价值,自己写作时也应如此,让读者理解数字背后的理由。
- 残差连接与层归一化是深层堆叠得以训练的支撑性技术,几乎是深层网络的标配;它们的存在往往是"能堆到 N 层"的前提。
- 自回归生成与训练阶段的信息一致性,是通过掩码来保证的:训练时必须屏蔽未来信息,否则模型会学到推理时无法复现的作弊捷径。这是理解一切自回归生成模型的关键约束。
- 含蓄陈述事实、把判断留给读者,是成熟论文的常见笔法;本段全程未强调"我们抛弃了 RNN/CNN",而是让"只用了 attention 和前馈层"这一事实自行传达标题的主张。
一句话带走:这两段说明 Transformer 保留了序列转导任务通用的编码器-解码器骨架,却将其内部实现全部替换为堆叠的自注意力与逐位置前馈层,并借助残差连接、层归一化以及解码端的掩码机制,搭出了一个不含任何循环与卷积、却严格满足自回归约束的深层结构。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)