
NIPS-2017
Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30.
文章目录
1、Introduction
在 AI 发展的长河中,有些论文是增量式的改进,而有些则是颠覆性的革命。2017 年由 Google 团队发表的 《Attention Is All You Need》 毫无疑问属于后者。它不仅埋葬了 RNN 在序列建模领域的统治地位,更开启了如今大模型(LLM)的辉煌时代。
今天,我们回到一切的起点,深度解读这篇论文的,看看作者是如何精准地切中当时技术的痛点,并提出那个大胆的命题:“注意力就是你所需要的全部。”
(1)曾经的霸主:循环神经网络(RNN)及其局限性
在 Transformer 出现之前,处理序列数据(如语言翻译、语音识别)的黄金标准是循环神经网络(RNN),包括其变体 LSTM 和 GRU。
RNN 的工作模式是串行的:
- 顺序依赖:为了生成当前时刻的隐藏状态
h
t
h_t
ht,模型必须先完成
h
t
−
1
h_{t-1}
ht−1 的计算。就像你在看电影,必须看完第一秒才能看第二秒。RNN 无法在不知道
h
t
−
1
h_{t-1}
ht−1 的情况下并行计算
h
t
h_t
ht。

h t = σ ( W h h h t − 1 + W h x x t + b ) h_t = \sigma(W_{hh} h_{t-1} + W_{hx} x_t + b) ht=σ(Whhht−1+Whxxt+b)
- 内存约束(计算密度低,不是计算受限任务而是内存受限任务):这种串行特性限制了批处理(Batching)的能力,因为你无法在知道“过去”之前并行处理“未来”。计算链断裂:即便你有 100 块顶级 GPU,你也只能让其中一块工作,而剩下的 99 块必须“原地待命”,等待前一时刻的计算完成。
痛点: 这种计算上的不可并行性,在处理长序列(Long sequences)时会变得极其低效,成为了制约模型扩展规模的致命瓶颈。
(2)补丁方案:卷积与注意力机制的萌芽
为了解决 RNN 的问题,当时的学者们尝试了一些折中方案:
- 卷积神经网络(CNN):通过卷积核并行处理,但难以捕获相距较远的词之间的依赖关系。
- 注意力机制(Attention):最初,注意力只是作为 RNN 的“辅助插件”,帮助模型在翻译时更好地聚焦于输入序列的特定部分。
然而,即便有了这些改进,底层的循环结构依然存在,计算效率的问题治标不治本。
(3)Transformer 的宏大愿景:彻底抛弃循环
作者提出的创新思路:我们为什么不彻底删掉 RNN,只保留注意力机制呢?
Transformer 架构应运而生,它具有以下两个颠覆性的优势:
A. 极致的并行化
- Transformer 放弃了隐藏状态的传递,改用 自注意力(Self-Attention)。这意味着序列中的每一个词都可以同时与其他所有词进行交互。
- 结果:模型在 GPU 上的训练速度得到了质的飞跃。
B. 解决长程依赖的“零距离”通信
- 在 RNN 中,如果两个词离得很远,信号需要经过层层传递,很容易丢失(梯度消失)。
- 在 Transformer 中,无论两个词相距多远,自注意力机制都能让它们通过一次矩阵运算直接“对话”。
Transformer 是第一个完全依赖自注意力机制来计算输入和输出表示的转导模型(Transduction model)。
它不仅在翻译质量上刷新了记录(SOTA),更重要的是,它证明了:
“复杂并不代表高效。通过更简单、更具并行性的架构,我们可以撬动更大规模的数据,实现更强的智能。”
2、Background
为什么老牌强权(RNN 和 CNN)在处理长序列时已经力不从心。
(1)串行的代价:计算代价的非线性增长
在 Transformer 诞生前,减少序列计算量(Sequential computation)是学术界的共同目标。
- 老牌强权的局限:
- Extended Neural GPU 和 ByteNet 等模型尝试用卷积神经网络(CNN)来处理序列。
- 核心痛点:在这些模型中,要将两个相距为 n n n 的位置联系起来,计算操作的数量会随着距离 n n n 的增加而增长。
- 后果:这使得学习两个远距离词之间的依赖关系变得极其困难且缓慢。
Transformer 的降维打击:作者提出,自注意力机制(Self-Attention)可以将这种计算操作减少到常数级别 O ( 1 ) O(1) O(1)。这意味着无论两个词隔了多远,它们在模型眼里都是“面对面”的。
(2)自注意力(Self-Attention)的真正定义
背景部分正式确立了 Self-Attention 的地位:它不再是 RNN 的点缀,而是一种独立的机制。
- 定义:自注意力是一种将单个序列的不同位置关联起来,以计算该序列表示形式的机制。
- 演进:在 Transformer 之前,自注意力已经在阅读理解、摘要生成等任务中崭露头角,但从未有人敢大胆到用它完全取代循环结构。
(3)端到端记忆网络(End-to-End Memory Networks)
作者特别提到了 End-to-End Memory Networks。这类模型基于循环注意力机制(Recurrent attention mechanism),而不是序列对齐循环(Sequence-aligned recurrence)。
- 继承与进化:Transformer 借鉴了这种“通过注意力来检索信息”的思想。不同之处在于,Transformer 彻底摆脱了“循环”的枷锁,实现了真正的并行化。
Transformer 的出现并非偶然,它是为了解决两个核心工程矛盾:
- 通信效率:长距离信息传递的成本太高。
- 并行潜力:串行架构无法压榨 GPU 的算力。
进步往往来自于对既定范式的怀疑。 当全世界都在研究如何让 RNN 跑得更快时,Google 的工程师们在思考如何杀掉 RNN。
3、Advantages / Contributions
- 架构创新:提出了一个完全基于注意力机制(Attention)的编码器-解码器架构。抛弃 RNN/CNN
- 机制创新:多头自注意力 (Multi-Head Self-Attention)
- 数学创新:位置编码 (Positional Encoding)
- SOTA,28.4 BLEU on the WMT 2014 Englishto-German translation task,比 ensemble 的模型还好,41.0 BLEU ont the WMT 2014 English-to-French translation task,single models 中的 SOTA

4、Method
Most competitive neural sequence transduction models have an encoder-decoder structure
decoder output one element at a time,auto-regressive

4.1、Encoder and Decoder Stacks
(1)Encoder
N = 6 identical layers,每个 layer 有两个 sub-layer
- multi-head self-attention mechanism
- position-wise fully connected feed-forward network

employ a residual connection around each of the two sub-layers, followed by layer normalization
L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x + Sublayer(x)) LayerNorm(x+Sublayer(x))
(2)Decoder
stack of N = 6 identical layers,每个 layer 有三个 sub-layer,前两个同 encoder,多了一个 performs multi-head attention over the output of the encoder stack

和 encoder 一样,也是 residual connections around each of the sub-layers,followed by layer normalization
注意到 decoder 的 multi-head attention 是带 masked 的,to prevent positions from attending to subsequent positions
ensures that the predictions for position i i i can depend only on the known outputs at positions less than i i i.
4.2、Attention
An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors

(1)Scaled Dot-Product Attention
queries and keys of dimension d k d_k dk
values of dimension d v d_v dv
a set of queries simultaneously, packed together into a matrix Q.
K 和 V 也写成 matrix 的形式,加速计算

不 scale,the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients
不 scale,方差大,导致 softmax 的导数落到没有梯度的区间更大,公式推导见后面的分析
additive attention vs dot-prodct attention(加法注意力和点乘注意力)
f ( Q , K ) = w T ⋅ tanh ( W q Q + W k K ) f(Q, K) = w^T \cdot \text{tanh}(W_q Q + W_k K) f(Q,K)=wT⋅tanh(WqQ+WkK)
作者指出,在实践中,点积注意力速度更快,且空间利用率更高。
- 硬件加速友好:点积计算可以高度优化为 矩阵乘法 (Matrix Multiplication)。在现代 GPU 上,专门的算子(如 cuBLAS)对矩阵乘法有极其恐怖的加速效果。
- 参数量更少:加法注意力需要额外的权重矩阵 W q , W k , w T W_q, W_k, w^T Wq,Wk,wT,而点积注意力直接利用已有的向量。
虽然点积注意力在 d k d_k dk 较小时表现与加法注意力相当,但在 d k d_k dk 较大 时,如果不进行缩放,效果会变差。
(2)Multi-Head Attention
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions
模型并不会直接把原始的 Q , K , V Q, K, V Q,K,V 丢进注意力机制。相反,它会使用 h h h 组不同的权重矩阵(通常 h = 8 h=8 h=8),将 Q , K , V Q, K, V Q,K,V 分别投影到较小的维度 d k d_k dk 和 d v d_v dv。在论文中, d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model} / h = 64 dk=dv=dmodel/h=64。
与其让一个巨大的 d m o d e l d_{model} dmodel 维度头去处理所有信息,不如将其拆分成多个低维的“子空间”。
- 并行观察:不同的头可以专注于不同的依赖关系(有的看长距离,有的看短距离;有的看句法,有的看语义)。
- 特征解耦:通过并行学习,模型能够同时捕捉到输入序列在不同位置、不同表示子空间的信息。

可以注意到多了 linear 层

Multi-Head 的精髓就在于通过 Linear 映射,让模型具备了在不同子空间“多线程联想”的能力。
-
维度降解:这些线性层把原始的 512 维向量投影到更小的 d k = d m o d e l / h d_k = d_{model} / h dk=dmodel/h(比如 64 维)。
-
这相当于把一个“全才”拆成了 8 个“专才”,每个专才只负责观察 64 维的特定子空间。
-
如果没有这些 Linear 处理,即便你复制 8 个头,它们算出来的结果也是完全一样的。有了 Linear 处理:因为每个头的 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV 是独立初始化且独立学习的。
(3)Applications of Attention in our Model
-
encoder-decoder attention:也即 cross-attention,Q 来自 decoder,K 和 V 来自 encoder

- 这模拟了传统 Seq2Seq 模型中的典型注意力机制。它允许解码器在生成每一个单词时,都能通盘扫描输入序列的所有位置,从而决定哪些原始信息对当前预测最重要。
-
self-attention in encoder
- keys,values and queries come from the same place
- 它让输入序列中的每一个位置都能“关注”到序列中的所有其他位置。
-
self-attention in decoder
- 同 encoder,区别是 mask——masking out (setting to − ∞ -\infty −∞),
- We need to prevent leftward information flow in the decoder to preserve the auto-regressive property
- 这样模型在计算第 i i i 个位置时,只能看到第 i i i 个及其之前的词。这保证了模型生成的因果律 (Causality)。
“Leftward information flow” 指的就是这种“未来信息向过去回流”的过程。作者想表达的是“防止右边的(未来)信息流向左边(过去)”。所以,Leftward 指的是信息的目的地,而不是来源地。
mask 的实现原理
Softmax 函数的公式是: a i = e z i ∑ j e z j a_i = \frac{e^{z_i}}{\sum_{j} e^{z_j}} ai=∑jezjezi当我们将 Q K T QK^T QKT 的结果中某个位置(未来位置)的数值 z f u t u r e z_{future} zfuture 强行设置为 − ∞ -\infty −∞ 时:
-
根据指数函数的性质, e − ∞ = 0 e^{-\infty} = 0 e−∞=0。
-
此时,Softmax 的分子变成了 0 0 0。
-
结果:该位置对应的注意力权重 a f u t u r e a_{future} afuture 也就变成了 确定的 0 0 0。
-
直观理解:在注意力机制中,权重为 0 0 0 意味着模型在计算加权和 V V V 时,完全忽略了那个位置的信息。这就像是在算平均分时,给作弊的学生打了“负无穷”分,最后他的权重直接归零,不参与总分计算。
4.3、Position-wise Feed-Forward Networks
如果说多头注意力(MHA)负责的是“各词之间的沟通与联想”,那么这个 FFN 负责的就是“对每个词进行深度加工与特征提取”。

-
第一层(升维):将输入维度 d m o d e l = 512 d_{model} = 512 dmodel=512 投影到一个更大的空间 d f f = 2048 d_{ff} = 2048 dff=2048。
-
激活函数:通常使用 ReLU(或现代变体如 GeLU)。这赋予了模型非线性能力,让模型能处理更复杂的逻辑。
-
第二层(降维):再将 2048 维压回到 d m o d e l = 512 d_{model} = 512 dmodel=512。
code:
-
例如输入维度:[32, 100, 512],batch-size 32,Sequence Length ( L L L) 100, d m o d e l d_{model} dmodel: 512 (特征维度)
-
第一层线性映射维度变化:[32, 100, 512] → \rightarrow → [32, 100, 2048]
-
第二层线性映射维度变化:[32, 100, 2048] → \rightarrow → [32, 100, 512]
关于 position-wise 的理解

CNN (非 Position-wise):
- 卷积核会覆盖周围的像素。计算第 i i i 个位置的输出时,会用到第 i − 1 i-1 i−1 和 i + 1 i+1 i+1 个位置的信息。信息在空间(位置)维度上是交汇的。
Transformer FFN (Position-wise):它就像是 100 个完全一样且独立的小型全连接网络,排成一排。
- 第 1 个 Token 进入它自己的 FFN。当你进行 [32, 100, 512] -> [32, 100, 2048] 的映射时,线性层的权重矩阵 W W W 维度是 [512, 2048]。计算公式实际上是:每一个位置的 512 维向量,各自独立地乘以这个 W W W。
- 第 2 个 Token 进入它自己的 FFN(但参数 W W W 和第 1 个一模一样)。
- 它们之间互不打听,各算各的。
4.4、Embeddings and Softmax
Embedding 的本质:给每个单词分配一个高维空间里的坐标(向量)。
- 在 Transformer 中,这个空间是 512 维 ( d m o d e l d_{model} dmodel)。
- 语义相近的词(如“猫”和“喵”),它们的坐标在空间里离得非常近。
- 结构细节:它就是一个巨大的查找表(Lookup Table),形状为 [词表大小, 512]。
use the usual learned linear transformation and softmax function to convert the decoder output to predicted next-token probabilities
为什么要乘以 d m o d e l \sqrt{d_{model}} dmodel?
在论文的公式里:Input = Embedding(x) * sqrt(512)。这是为了平衡信号强度。
在下一节中,我们会学到 Transformer 会在 Embedding 上直接加一个 Positional Encoding(位置编码)。
-
问题:位置编码是通过 sin / cos \sin/\cos sin/cos 生成的,数值范围在 [ − 1 , 1 ] [-1, 1] [−1,1] 之间。冲突:原本的 Embedding 经过初始化后,数值通常非常小。如果不放大,位置信息(位置编码)就会反客为主,把单词本身的语义(Embedding)给“盖住”了。
-
解决:乘以 512 ≈ 22.6 \sqrt{512} \approx 22.6 512≈22.6,把语义信息的量级拉高,确保模型既能读懂“这是什么词”,也能看清“这个词在哪”。

we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation
三位一体
(1)核心主角:共享矩阵 W e m b e d W_{embed} Wembed
在模型初始化时,只定义一个核心权重矩阵,我们称之为 W s h a r e d W_{shared} Wshared。具体 Shape: [Vocab_Size, d_model]
-
假设词表大小 V = 30000 V = 30000 V=30000, d m o d e l = 512 d_{model} = 512 dmodel=512。
-
该矩阵的 Shape 就是 [30000, 512]。
(2)权重共享作用在哪些层?
这个 [30000, 512] 的矩阵在模型的三个关键“关卡”反复出现:
第一处:Encoder 的 Input Embedding
- 位置:编码器的最底端。
- 操作:这是一个 查找 (Lookup) 操作。输入是一个词 ID(例如 5),模型从矩阵中抽出第 5 行。
- Shape 变化:[Batch, Seq_Len](词 ID) → \rightarrow → [Batch, Seq_Len, 512](向量)。一个词 512 维的 embedding,许多词组成了 sequence
- 作用:将离散的符号转换为模型能理解的连续稠密向量。
eg:5 对应”我“字,抽 W e m b e d W_{embed} Wembed 第五行对应的 512 embedding
第二处:Decoder 的 Output Embedding
-
位置:解码器的最底端。
-
操作:同样是 查找 (Lookup)。它处理已经生成的“目标语言”词汇。
-
Shape 变化:同上,输出 [Batch, Seq_Len, 512]。
-
作用:提供解码器所需的上下文输入。
eg:模型已经翻译/识别出了“I”,它的 ID 是 10。现在要根据“I”预测下一个词。
第三处:Decoder 顶层的 Pre-softmax Linear
-
位置:解码器的最顶端(输出头)。
-
操作:这是一个 矩阵乘法 (MatMul)。模型用计算出的特征向量去和这个大矩阵做点积。
-
Shape 变化:[Batch, Seq_Len, 512] × \times × [512, 30000] (即 W s h a r e d W_{shared} Wshared 的转置) → \rightarrow → [Batch, Seq_Len, 30000]。
-
作用:计算当前向量与词表中每一个词的“相似度”,得分最高的词即为预测结果。
| 维度 | 细节 | 理由 |
|---|---|---|
| 层 (Layers) | Input Embed, Output Embed, Linear Head | 统一语义空间 |
| 矩阵 Shape | [30000, 512] | 对应词表与特征维度的映射 |
| 数学操作 | 查表 (Lookup) & 投影 (Projection) | 互为逆运算,逻辑闭环 |
| 缩放 (Scale) | 乘以 512 \sqrt{512} 512 | 保护语义特征不被位置编码覆盖 |
4.5、Positional Encoding
we add “positional encodings” to the input embeddings at the bottoms of the encoder and decoder stacks.
positional embedding 和 d m o d e l d_{model} dmodel 的 shape 一样
很有多 positional encodings 方式,作者选择的是 sine and cosine functions of different frequencies,选择理由 we hypothesized it would allow the model to easily learn to attend by relative positions

i 对应的是 d m o d e l d_{model} dmodel 的索引,pos 对应 token 长度
import numpy as np
import matplotlib.pyplot as plt
def get_positional_encoding(max_seq_len, d_model):
pe = np.zeros((max_seq_len, d_model))
for pos in range(max_seq_len):
for i in range(0, d_model, 2):
div_term = np.exp(i * -(np.log(10000.0) / d_model))
pe[pos, i] = np.sin(pos * div_term)
pe[pos, i + 1] = np.cos(pos * div_term)
return pe
# 参数设置:显示前 100 个位置,维度为 512
pe = get_positional_encoding(300, 512)
plt.figure(figsize=(12, 8))
plt.pcolormesh(pe, cmap='RdBu')
plt.xlabel('Dimension ($d_{model}$)')
plt.ylabel('Position ($pos$)')
plt.colorbar(label='PE Value')
plt.title('Positional Encoding Matrix')
plt.show()
输入 token 300,embedding d m o d e l = 512 d_{model} = 512 dmodel=512

任意一行(纵轴的一个切面),就是 512 个不同频率的 sin / cos \sin/\cos sin/cos 值组成的向量。因为每个“表盘”的转速都不一样,所以没有任何两行的颜色组合是完全相同的。这就给每个位置打上了唯一的“指纹”。
每个位置(每一行)对应唯一的位置编码(颜色不一样)
左侧(低维区域):条纹非常密集,意味着 sin \sin sin 波跳动很快,负责捕捉“邻居词”之间的细微差异。
右侧(高维区域):条纹非常宽大,颜色变化缓慢,负责捕捉大跨度的“长距离”位置关系。
如果把公式中的 10000 改为 100
-
后果:所有维度的波长都变短了。即便是高维度的“时针”,转得也会变快。
-
影响:模型对长距离的感知会变得“模糊”。因为波长太短,当句子很长时,正弦波会频繁重复。模型可能分不清第 10 个词和第 110 个词,因为它们的编码值可能因为周期性而撞车。

如果调大(比如 10000 → \rightarrow → 1000,000):
- 后果:高维度的波长变得极长。
- 影响:虽然能区分极长的句子,但在有限的维度内,相邻位置的数值差异会变得极其微小(分母太大导致相位变动极小)。模型可能需要更难的精度才能分辨出“第 5 个”和“第 6 个”词的区别。
10000 是“最慢那根针”的制动器。
-
它规定了最慢的一维波长是多少。如果设为 100,你的“尺子”就只有 100 那么长,超过 100 个词,编码就会开始重复,模型就会变“路痴”。
-
设为 10000,这把“尺子”就足够长,能够覆盖几乎所有的自然语言句子。
频率(Frequency):指针转动的“快慢”
波长(Wavelength):转满一圈需要的“距离”
短波长:
-
比如波长等于 2。这意味着第 1 个词和第 3 个词的编码是一样的。
-
问题:这会产生“歧义”,模型分不清 1 和 3。
长波长(右侧维度):
-
这就是 10000 出现的原因。公式设计使得最右侧维度的波长非常巨大。
-
表现:指针要走完 10000 个单词才能转回原点。
-
意义:这保证了即使句子很长(比如 5000 个词),最右边的“时针”也还没转完一圈,从而保证了全局位置的唯一性。

any fixed offset k,
P
E
p
o
s
+
k
PE_{pos+k}
PEpos+k can be represented as a linear function of
P
E
p
o
s
PE_{pos}
PEpos
选 sin \sin sin 和 cos \cos cos 的理由:
- 有界性:数值永远在 [ − 1 , 1 ] [-1, 1] [−1,1],不会像直接加数字那样导致数值爆炸。
- 相对性:利用三角函数的加法定理,模型只要学会了处理当前位置,就能通过数学上的“旋转”感知到它与其他位置的相对间隔。
- 外推性:即使遇到比训练时更长的句子,正弦波的周期性也能让模型具备一定的处理能力。
5、Why Self-Attention

n n n is the sequence length
d d d is the representation dimension
(1)计算复杂度 (Total Computational Complexity per Layer)
在大规模并行计算时代,每一层的总计算量直接决定了训练成本。
- Self-Attention: 每一层的复杂度是 O ( n 2 ⋅ d ) O(n^2 \cdot d) O(n2⋅d)。其中 n n n 是序列长度, d d d 是向量维度。
- 对比: 当序列长度 n n n 小于维度 d d d 时(这是当时大部分 NLP 任务的常态,比如 n = 50 n=50 n=50, d = 512 d=512 d=512),Self-Attention 的计算量其实比 RNN 还要小。
sequence length n n n is smaller than the representation dimensionality d d d,
(2)并行化能力 (Parallelized Operations)
这是 Transformer 能够甩开 RNN 几个身位的核心原因。
-
RNN: 必须像“接力赛”一样,算出前一个词才能算后一个词,这种串行依赖导致它无法充分利用 GPU 的成千上万个核心。其并行化受限的操作步数为 O ( n ) O(n) O(n)。
-
Self-Attention: 所有的词可以“同时”进行两两比对。其并行化操作步数仅为 O ( 1 ) O(1) O(1)。这意味着无论句子多长,只要算力够,一层计算的时间是恒定的。
(3)最大路径长度 (Maximum Path Length)
这个指标衡量的是:模型处理“长距离依赖”有多难?
-
RNN: 信息从句首传到句尾,需要经过 n n n 次非线性变换。就像“传声筒”游戏,传得越远,信息丢失和梯度消失就越严重。
-
CNN: 卷积核有大小限制(如 k = 3 k=3 k=3)。要让两个相距很远的词建立联系,必须堆叠很多层卷积,路径长度为 O ( l o g k ( n ) ) O(log_k(n)) O(logk(n))。
-
Self-Attention: 任何两个词之间,路径长度永远是 O ( 1 ) O(1) O(1)。直觉理解:在注意力机制里,句首的“他”和句尾的“书”是直接“面对面”连接的。这种极致的短路径,让 Transformer 捕捉长文本逻辑的能力极其强悍。
为什么 self-attention 的 Maximum Path Length 是 O(1)
直观比喻:对讲机 vs. 传声筒
-
RNN(传声筒游戏): 如果你想让句首的词(位置 1)和句尾的词(位置 100)建立联系,信息必须像“传声筒”一样,经过位置 2、3、4… 一直传到 100。路径长度: O ( n ) O(n) O(n)。传得越远,信息模糊和丢包(梯度消失)的可能性就越大。
-
Self-Attention(全员对讲机): 在 Self-Attention 层中,每个词都在同时“听”所有词。位置 1 和位置 100 之间有一条直连的电路。路径长度: O ( 1 ) O(1) O(1)。无论这两个词离得有多远,它们之间只有一步之遥。
6、Experiments
(1)Hardware and Schedule
8 NVIDIA P100 GPUs.
小模型,100,000 steps or 12 hours,step took about 0.4 seconds
大模型,300,000 steps (3.5 days),step time was 1.0 seconds
(2)optimizer

import numpy as np
import matplotlib.pyplot as plt
def get_lr(step, d_model, warmup_steps):
# 避免 step 为 0 导致计算错误
step = max(step, 1)
arg1 = step ** -0.5
arg2 = step * (warmup_steps ** -1.5)
return (d_model ** -0.5) * min(arg1, arg2)
d_model = 512
warmup_steps = 4000
steps = np.arange(1, 20000)
lrs = [get_lr(s, d_model, warmup_steps) for s in steps]
plt.figure(figsize=(10, 6))
plt.plot(steps, lrs, color='royalblue', linewidth=2)
plt.axvline(x=warmup_steps, color='orange', linestyle='--', label=f'Warmup (step={warmup_steps})')
plt.xlabel('Training Steps')
plt.ylabel('Learning Rate')
plt.title('Transformer Learning Rate Schedule (Noam Scheduler)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

(3)Regularization
- Residual Dropout, P d r o p = 0.1 P_{drop} = 0.1 Pdrop=0.1
- Label Smoothing
6.1、Datasets and Metrics
Datasets:
-
WMT 2014 English-German dataset:4.5 million sentence pairs,about 37000 tokens
-
WMT 2014 English-French dataset:36M sentences and split tokens into a 32000 word-piece vocabulary
Metrics:
-
BLEU
-
PPL
6.2、Results
(1)Machine Translation

EN-FR 比之前所有的 single models 效果要好,training cost 也更小
小模型,averaging the last 5 checkpoints
大模型,we averaged the last 20 checkpoints
模型平均 (Model Averaging):平滑权重
-
含义:在训练快结束时,模型会每隔 10 分钟保存一个“快照”(Checkpoint)。作者并没有只选最后那一个,而是把最后 5 个(Base 模型)或 20 个(Big 模型)快照的权重参数直接取平均值,合成一个新的模型。
-
作用:训练后期的模型参数往往会在最优解附近震荡。通过平均化,可以抵消掉某个特定时刻的随机噪声,让模型更加稳健,通常能稳定提升 0.5 到 1 个 BLEU 分数。
集束搜索与长度惩罚 (Beam Search & Length Penalty)
Beam Search (集束搜索):
- 在推理时,模型不是只看当前概率最高的词(贪心搜索),而是同时维护 4 个最优可能的句子候选。
Length Penalty (长度惩罚 α \alpha α):
- 背景:Beam Search 往往倾向于选择更短的句子,因为每多选一个词,概率累乘就会变小。
- 解决:引入 α = 0.6 \alpha = 0.6 α=0.6。这个参数会对长句子的概率进行补偿。 α \alpha α 越大,模型越倾向于输出长句子。 0.6 0.6 0.6 是一个平衡点,确保翻译出的句子长度适中且自然。
推理限制 (Inference Constraints)
-
最大长度:限制输出长度不超过“输入长度 + 50”。这主要是为了防止模型在某些极端情况下进入死循环,疯狂输出重复的词。
-
提早终止:一旦模型输出了结束符号( < E O S > <EOS> <EOS>),就立即停止。
(2)Model Variations

用了 beam search,没有用 checkpoint averaging
(A)组:多头注意力(Multi-head Attention)的影响
h h h 表示 number of attention heads
d k d_k dk 表示 attention key dimensions
d v d_v dv 表示 attention value dimensions
“多头”确实比“单头”好,它能让模型同时关注不同位置的多种特征。但每个头的维度不能太小,否则无法表达复杂的语义。
(B)组:注意力 Key 的维度 d k d_k dk
实验结果:减小 d k d_k dk(从 64 减小到 16 或 32)会导致模型性能下降。
结论:计算注意力权重时,维度不能太低。如果 d k d_k dk 太小,模型很难精准地通过点积找出“谁该关注谁”。
This suggests determining compatibility is not easy and that a more sophisticated compatibility function than dot product may be beneficial
点积(Dot Product)的局限性
- 点积的本质是 ∑ ( q i ⋅ k i ) \sum (q_i \cdot k_i) ∑(qi⋅ki)。它是一种极度线性且硬性的匹配方式。它强制要求 Query 和 Key 必须在同一个维度的“数值”上完全对齐才能产生高分。
为什么 (B) 组证明了点积“不够老练”?
- 如果点积是一个完美的“兼容性判定器”,那么即便 d k d_k dk 很小(比如 16),模型也应该能找到某种最优的匹配方式。
- 但实验结果显示: d k d_k dk 越小,点积的表现越拉跨。
- 这意味着:点积对维度的依赖性极高。 它需要足够多的维度空间来容纳复杂的匹配逻辑。

(B) 组告诉我们:在固定头数时,如果压缩匹配空间( d k d_k dk),简单的点积就无法处理复杂的兼容性了。
(A) 组告诉我们:与其用一个超级复杂的函数,不如多开几个头,每个头用简单的点积去处理不同的子空间。
所以,作者说这句话的真正用意是:判定“这个 Query 该找哪个 Key”比我们想象的要复杂得多。既然点积在单一低维空间里表现不好,我们才需要多头并行或者保持足够的维度宽度,来变相实现一个“更老练”的匹配逻辑。
(C)组:模型尺寸(Model Size)
加深( N N N 层数)、加宽( d m o d e l d_{model} dmodel 和 d f f d_{ff} dff)。
实验结果:层数 N N N 从 2 增加到 8,效果稳步提升。维度从 256 增加到 1024,BLEU 分数显著提高。
结论:大就是好(Scaling Law)。更大的模型容量(Params)通常意味着更强的翻译能力,但代价是显存消耗和计算时间激增。
(D) 组:正则化(Dropout & Label Smoothing)
这一组测试的是为了防止过拟合而引入的“杂音”。
P d r o p P_{drop} Pdrop (Dropout):
- 设为 0.0(不开启)时效果很差(24.6)。
- 设为 0.1 时效果最佳。
ϵ l s \epsilon_{ls} ϵls (Label Smoothing):
- 设为 0.0 时困惑度(PPL)看起来很好,但 BLEU 分数一般。
- 设为 0.1 时,虽然模型“自信度”降低了(PPL 变高),但实际翻译效果(BLEU)变好了。
结论:适当的“折磨”模型有助于泛化。Dropout 和标签平滑能防止模型死记硬背训练集。
(E) 组:位置编码(Positional Encoding)
作者测试了用“学习出来的 Embedding”代替之前讨论的“正余弦函数(Sinusoids)”。
-
实验结果:两者的 BLEU 分数几乎一模一样(25.8 vs 25.7)。
-
结论:正余弦函数是极佳的平替。既然效果一样,当然选不需要额外参数、能处理超长序列的正余弦函数。
7、Conclusion(own) / Future work

- 作者提到的 “Making generation less sequential(减少生成的序列依赖性)”,其核心目标是实现 “非自回归生成(Non-Autoregressive Generation)”。打破“逐字生成”的枷锁
-

-
Transduction(转导) 的本质是学习一个函数 f f f,使得 f ( i n p u t _ s e q u e n c e ) = o u t p u t _ s e q u e n c e f(input\_sequence) = output\_sequence f(input_sequence)=output_sequence。
-
在Sequence to Sequence架构下(Encoder- Decoder的一种),RNN来提取特征,Attention机制将Encoder提取到的特征高效传递给Decoder
-
Q K V 的理解
-


Transformer 的本质就是把一个序列 transform 成另一个序列
文本:天然的序列
图像:ViT 16x16
玩游戏时的按键输入同样是序列,属于离散值,比如懂得都懂的“上上下下左右左右BABA”。
操纵机器人时的传感器信号和关节力矩属于连续值,也通过一系列采样和编码处理成离散序列。
Generative Pre-trained Transformer是一种基于互联网可用数据训练的文本生成深度学习模型。它用于问答、文本摘要生成、机器翻译、分类、代码生成和对话AI。
ChatGPT 的缺点
(1)首先,对于不少知识类型的问题,ChatGPT会给出看上去很有道理,但是事实上是错误答案的内容(你可以看到各式各样的奇葩回答)。
(2)其次,ChatGPT目前这种基于GPT大模型基础上进一步增加标注数据训练的模式,对于LLM(Large Language Model)模型吸纳新知识是非常不友好的。
- 新知识总是在不断出现,而出现一些新知识就去重新预训练GPT模型是不现实的,无论是训练时间成本还是金钱成本,都不可接受。
- 如果对于新知识采取Fine-tune的模式,看上去可行且成本相对较低,但是很容易产生新数据的引入导致对原有知识的灾难遗忘问题。
(3)成本
-
目前这种AI训练和产出结果的成本依然不便宜。如果面向真实搜索引擎的以亿记的用户请求,假设继续采取免费策略,OpenAI无法承受。
-
但是如果采取收费策略,又会极大减少用户基数,是否收费是个两难决策。

OpenAI推出了最新的人工智能绘画系统DALL·E 2(同期还有不少类似的产品,例如Midjourney等)。用户只需要提供语言描述,DALL·E 2 就能够根据该描述生成一幅画。不夸张地说,这些图画的质量、风格、均可与专业画家创作的作品媲美。
一方面,知乎答主、自然语言处理专家@张俊林指出,近乎实时地将新知识融入大规模语言模型,非常有挑战性,一种解决办法是,把它存到传统搜索引擎的索引里,ChatGPT 如果回答不了时效性的问题,可以转向搜索引擎抽取对应的答案。
背靠谷歌的 DeepMind、背靠微软的 OpenAI 和背靠 Facebook 的 FAIR。

在大多数自然语言理解任务中,如果这些任务带有丰富的、注释良好的数据,并且在测试集上包含很少的分布外示例,那么微调模型性能更好。
LLM对这种具有分布外和注释稀疏的数据有良好的泛化能力,微调模型不行。
Appendix
Scale Dot-Prodct Attention 中 scale 的必要性
通过 Softmax 梯度的数学性质,我们可以从根本上理解为什么 Transformer 必须要进行 1 d k \frac{1}{\sqrt{d_k}} dk1 的缩放(Scale)。
(1)Softmax 的偏导数
假设我们的点积注意力得分(Attention Logits)为
z
i
z_i
zi,Softmax 的输出为
a
i
a_i
ai:
a
i
=
softmax
(
z
i
)
=
e
z
i
∑
j
e
z
j
a_i = \text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}}
ai=softmax(zi)=∑jezjezi
根据微调/自动微分原理,Softmax 对其输入
z
i
z_i
zi 的偏导数为:
∂
a
i
∂
z
j
=
a
i
(
δ
i
j
−
a
j
)
\frac{\partial a_i}{\partial z_j} = a_i (\delta_{ij} - a_j)
∂zj∂ai=ai(δij−aj)
其中 δ i j \delta_{ij} δij 是克罗内克 d e l t a delta delta 函数( i = j i=j i=j 时为 1 1 1,否则为 0 0 0)。
- 当 i = j i=j i=j 时: ∂ a i ∂ z i = a i ( 1 − a i ) \frac{\partial a_i}{\partial z_i} = a_i(1 - a_i) ∂zi∂ai=ai(1−ai)
- 当 i ≠ j i \neq j i=j 时: ∂ a i ∂ z j = − a i a j \frac{\partial a_i}{\partial z_j} = -a_i a_j ∂zj∂ai=−aiaj
当
i
=
j
i =j
i=j 时对应的梯度图如下

我们可以看 Softmax 导数的简化形式: Gradient ≈ a i ( 1 − a i ) \text{Gradient} \approx a_i(1 - a_i) Gradient≈ai(1−ai)。
- 敏感区(梯度大):当 a i ≈ 0.5 a_i \approx 0.5 ai≈0.5 时,梯度最大( 0.5 × 0.5 = 0.25 0.5 \times 0.5 = 0.25 0.5×0.5=0.25)。
- 饱和区(梯度消失):
- 当 a i → 1 a_i \rightarrow 1 ai→1 时(该项极强), Gradient → 1 ( 1 − 1 ) = 0 \text{Gradient} \rightarrow 1(1-1) = 0 Gradient→1(1−1)=0。
- 当 a i → 0 a_i \rightarrow 0 ai→0 时(该项极弱), Gradient → 0 ( 1 − 0 ) = 0 \text{Gradient} \rightarrow 0(1-0) = 0 Gradient→0(1−0)=0。
(2)推理:为什么数值大会导致梯度消失?
观察导数公式 ∂ a i ∂ z i = a i ( 1 − a i ) \frac{\partial a_i}{\partial z_i} = a_i(1 - a_i) ∂zi∂ai=ai(1−ai)。
极端情况分析
如果 z i z_i zi 中的某一个数值显著大于其他数值(例如 z = [ 100 , 1 , 1 ] z = [100, 1, 1] z=[100,1,1]),Softmax 的输出 a a a 会非常接近一个 One-hot 向量(例如 a ≈ [ 1 , 0 , 0 ] a \approx [1, 0, 0] a≈[1,0,0])。
此时,代入导数公式:
- 对于最大的项: a 1 ≈ 1 a_1 \approx 1 a1≈1,则 ∂ a 1 ∂ z 1 ≈ 1 ( 1 − 1 ) = 0 \frac{\partial a_1}{\partial z_1} \approx 1(1 - 1) = 0 ∂z1∂a1≈1(1−1)=0。
- 对于其他项: a j ≈ 0 a_j \approx 0 aj≈0,则 ∂ a j ∂ z j ≈ 0 ( 1 − 0 ) = 0 \frac{\partial a_j}{\partial z_j} \approx 0(1 - 0) = 0 ∂zj∂aj≈0(1−0)=0。
结论: 当输入 z z z 的方差很大,导致 Softmax 概率分布极其尖锐(Peaky)时,所有项的梯度都会趋近于 0。这会导致神经网络的参数无法通过反向传播进行更新,训练陷入停滞。
(3) d k d_k dk 是如何推高数值的?
在点积注意力中, z = Q K T z = Q K^T z=QKT。假设 Q Q Q 和 K K K 是独立同分布的随机变量,均值为 0 0 0,方差为 1 1 1。
根据方差的性质,两个独立随机变量乘积的方差:
Var
(
q
⋅
k
)
=
E
[
q
2
]
E
[
k
2
]
−
(
E
[
q
]
E
[
k
]
)
2
=
1
⋅
1
−
0
=
1
\text{Var}(q \cdot k) = E[q^2]E[k^2] - (E[q]E[k])^2 = 1 \cdot 1 - 0 = 1
Var(q⋅k)=E[q2]E[k2]−(E[q]E[k])2=1⋅1−0=1
由于
z
z
z 是
d
k
d_k
dk 个元素乘积的和(点积):
Var
(
z
)
=
Var
(
∑
i
=
1
d
k
q
i
k
i
)
=
∑
i
=
1
d
k
Var
(
q
i
k
i
)
=
d
k
\text{Var}(z) = \text{Var}\left(\sum_{i=1}^{d_k} q_i k_i\right) = \sum_{i=1}^{d_k} \text{Var}(q_i k_i) = d_k
Var(z)=Var(i=1∑dkqiki)=i=1∑dkVar(qiki)=dk

这意味着,随着维度 d k d_k dk 的增加,点积结果 z z z 的方差线性增长。
- 当 d k = 64 d_k=64 dk=64 时,标准差 σ = 64 = 8 \sigma = \sqrt{64} = 8 σ=64=8。
- 当 d k = 512 d_k=512 dk=512 时,标准差 σ = 512 ≈ 22.6 \sigma = \sqrt{512} \approx 22.6 σ=512≈22.6。
数值波动范围从 ± 8 \pm 8 ±8 扩大到 ± 22.6 \pm 22.6 ±22.6,这会极大地增加 z z z 落在 Softmax 梯度饱和区(Saturated region)的概率。
(4)Scale 的必要性:重置方差
为了抵消 d k d_k dk 的影响,我们将点积结果除以 d k \sqrt{d_k} dk。
根据方差的性质
Var
(
a
X
)
=
a
2
Var
(
X
)
\text{Var}(aX) = a^2 \text{Var}(X)
Var(aX)=a2Var(X):
Var
(
Q
K
T
d
k
)
=
(
1
d
k
)
2
⋅
Var
(
Q
K
T
)
=
1
d
k
⋅
d
k
=
1
\text{Var}\left(\frac{QK^T}{\sqrt{d_k}}\right) = \left(\frac{1}{\sqrt{d_k}}\right)^2 \cdot \text{Var}(QK^T) = \frac{1}{d_k} \cdot d_k = 1
Var(dkQKT)=(dk1)2⋅Var(QKT)=dk1⋅dk=1


mean ± std 中的 std 是标准差
μ ± σ \mu ± \sigma μ±σ
总结
- 导数本质:Softmax 的梯度取决于输出概率。如果概率分布太“极化”(一枝独秀),梯度就会消失。
- 方差爆炸:点积运算会随着维度 d k d_k dk 的增加而放大结果的方差,让输入值冲向 Softmax 的饱和区。
- Scale 作用:通过除以 d k \sqrt{d_k} dk,我们将 z z z 的方差强行拉回 1 1 1。
这确保了无论模型设计得多么宽( d k d_k dk 多大),Softmax 的输入始终处于梯度敏感区。
更多论文解读,请参考 【Paper Reading】



6557

被折叠的 条评论
为什么被折叠?



