第三页 · 做法
论文的假设很明确:一个完全依赖、把一种序列变成另一种序列的模型——不要按位置逐步更新的循环网络,也不要卷积——仍然能建立全局依赖,仍然能并行,并且翻译质量可以走到当时的最前排。
具体形状仍是编码器–解码器。编码器把源序列 (x1…xn) 映成内部表示 z;解码器再依据 z,按已经写出的词逐步吐出 (y1…ym)。两端各叠 N=6 层相同的块。词首先经嵌入变成向量:词嵌入把每个词映成固定长度的实数向量,使后续运算可以在同一向量空间中进行。残差连接把子层的输入直接加到输出上,使深层中的信号不必只经过一层层变换才能传递;层归一化则对单个样本的特征维做尺度调整,用以稳定深层堆叠。每个子层外包这两种操作,分别称为与 。写成 LayerNorm(x + Sublayer(x))。base 配置里所有子层和嵌入都是 =512,这样残差才能按维相加。每一层在注意力之后还跟一个两层 ReLU 前馈网络,内宽 dff=2048,同一变换施于每个位置,各层参数不同。
Section 3.1–3.4 · Figure 1 是这两列残差栈,跨栈唯一接口是 encoder–decoder multi-head attention。嵌入矩阵与预 softmax 线性层共享(Press & Wolf),权重再乘 √d_model。
循环网络的逐步更新本身携带了“谁在谁前面”:后一个位置只能在前一个位置算完之后出现。卷积核沿位置轴滑动,同样会读到邻域里的左右次序。注意力本身对置换不敏感:把输入词打乱,各位置之间的点积仍是那些点积。没有逐步更新,也没有核在位置轴上滑动,模型因此看不见词序。
所以作者在嵌入上加上一组随位置变化、与词义无关的向量,与词嵌入相加,把“第几个位置”写进表示。这组向量称为。偶数维用正弦,奇数维用余弦,波长从 2π 几何地走到 10000·2π:
选用正弦并非出于形式偏好。作者假设:对固定偏移 k,PEpos+k 可以写成 PEpos 的线性函数——相对位置于是有机会被学成一次线性变换。Table 3 行 (E) 把正弦换成可学习的位置嵌入,开发集几乎一样(dev BLEU 25.7 对 base 的 25.8);留下正弦,是因为也许能外推到训练时未见过的长度。
下面这块画布是公式本身,不是训练出来的权重。拖动长度和维度,可看见波长怎样从左到右变慢。
教具 · Section 3.5 正弦位置编码。横轴 dimension,纵轴 position。颜色把 [−1,1] 映到墨–赭。不是论文里的 Figure。
顺序有了着落,注意力本身用的是缩放点积。查询(Q)与键(K)做点积,得到各位置的相符程度,再据以对值(V)加权。公式即论文 (1):
softmax 把一组实数压成和为 1 的非负权重,因而可以用作对各个位置的分配比例;下文记为 。加性注意力(Bahdanau)也能用,但点积可以整段变成矩阵乘,更契合当时硬件。问题在维度。若 Q、K 的分量大致独立、均值 0、方差 1,点积的方差会跟着 dk 增长(footnote 4)。数值一大,softmax 就进入饱和区:分布接近只选中一项,梯度变小,学习变难。
因此除以 √dk:把点积的尺度按回不饱和的区间,而不是出于书写上的整齐。论文 base:h=8,故每头 dk=dv=dmodel/h=64。
单头注意力被迫把许多种关系——句法、指代、对齐——挤进同一次加权平均。作者指出,这会抑制模型同时关注不同子空间。所以切开为 h=8 组并行的投影,每组 dk=64,各自在自己的子空间里对齐,再拼接起来乘 WO。这称为:用意不是把一次注意力做宽,而是让不同的关系可以同时被看见。
计算量故意压住:因为每头变窄,八个头的总账和“一个宽头用满 dmodel”相近。Table 3 行 (A) 的评述更直白——单头比最佳头数设置在开发集上差 0.9 BLEU;头太多也会掉点。
热力图是教具。句子固定为 “Attention is all you need”,嵌入由 token 的确定性哈希生成,再投影到某个头的 dk。公式仍是 softmax(QKT / √dk / T)。T 不是论文超参,只是让锐度可见。换 head 只换一组投影种子,不要把它读成附录里 making…more difficult 或 its 的指代头。
DIDACTIC TOY · 不是附录 Figure 3–5,也不是 WMT 权重。行 = query,列 = key。哈希嵌入 + 固定伪随机投影。
训练编码器时,一层里每个位置可以同时看整句:源句在训练时已经完整给出。解码器不行。它仍然按已写出的词预测下一个词;若训练时看见了尚未写出的目标词,测试时却没有这些词,两端条件就不一致。
查询、键、值都来自同一条序列的注意力称为。解码器这一侧必须遮住未来。softmax 之前把非法位置设成 −∞,再配合输出嵌入右移一位,位置 i 只能看见小于 i 的输出。第三种注意力才是跨栈的:查询来自解码器,键与值来自编码器输出。论文说这模仿 / Bahdanau / 里典型的序列到序列注意力,只是两端都不再是循环网络。
训练时目标序列可以一次喂进(用已给出的正确答案作为上文,再加遮罩)。生成时仍逐步:每写出一个词,才把它送回去预测下一个。Conclusion 把 “making generation less sequential” 列为下一步。训练配方——数据、优化器、随机丢弃、墙钟——在证据页。
Section 3.2.3 · Section 3 · Conclusion