注意力的起源
在自注意力之前,是 Bahdanau 注意力:2014 年为翻译打的一个补丁,让解码器能回看整个输入。这个想法从哪来,又是怎么工作的。
今天,注意力(attention)以 Transformer 引擎的身份出名,但它其实早诞生了三年,为的是解决一个具体而平淡的问题:序列到序列翻译在长句上垮掉了。Bahdanau 和同事在 2014 年发表的这个修补方案,就是你熟悉的自注意力(self-attention)的直系祖先。看过它的原始形态,现代版本会清楚得多。
它解决的问题
回想一下 seq2seq 的瓶颈。编码器 RNN 读完整段输入,把它压成一个固定大小的上下文向量,再由解码器解开。句子一长,这一个向量装不下所有东西,翻译质量随句长崩塌。
浪费是刺眼的。编码器在每一个输入词上都算了一个隐状态,每个都带着该词的丰富细节,然后全扔了,只留最后一个。当解码器要生成「cat」对应的法语词时,编码器在「cat」那一步的状态恰恰就是它想要的——可那个状态已经没了。
思路:让解码器回看
Bahdanau 的做法是保留编码器的每一个隐状态,并让解码器能访问全部。生成输出的每一步,解码器都不再依赖某一份冻住的摘要。它把当前关心的那些编码器状态混合起来,现场造一个上下文向量,专门为即将生成的那个词量身定制。
解码器每一步的做法:
- 打分。 拿解码器当前的状态和编码器的每个隐状态逐一比较,为每个输入词算出一个相关性分数。Bahdanau 用一个小神经网络来算这个分数——一个学出来的函数,输入两个状态,输出它们有多匹配。
- 归一化。 把分数过一遍 softmax,变成加起来等于 1 的权重。这就是注意力权重:此刻该在多大程度上关注每个输入词。
- 混合。 用这些权重对编码器状态求加权和。这就是这一步的上下文向量——主要由分数高的那些状态组成。
- 生成。 解码器用这个定制出来的上下文向量生成下一个词。
每个输出词都有自己的上下文向量。生成「chat」时大量取用「cat」处的编码器状态;生成动词时取自动词处。瓶颈消失了,因为解码器现在能直接伸手进完整输入里,挑它要的东西。
对齐关系是白送的
一个惊人的附赠品:注意力权重是可解释的。把它们画成「输出词 × 输入词」的矩阵,你会看到模型的对齐关系——生成每个目标词时,它看了哪些源词。
对翻译来说,这等于自动复原了语言学家过去手工构建的东西。英译法时,注意力矩阵大致沿对角线亮起,而偏离对角线的跳动,正好出现在两种语言调换语序的地方。没人告诉过模型这两种语言怎么对齐;它自己学会了该看哪里,而权重把这件事摊开给你看。这是早期一份令人欣慰的证据:注意力在做合理的事。
加性注意力 vs 缩放点积
Bahdanau 的打分函数叫加性注意力(additive attention),也叫「拼接式」:把解码器状态和一个编码器状态一起喂进一个小前馈网络,由它学会给两者的匹配程度打分。效果很好,但每次比较都要多花参数和计算。
对比现代 Transformer 里的自注意力,用的是**缩放点积(scaled dot-product)**注意力。那里分数就是 query 向量和 key 向量的点积,再除以维度的平方根。不需要额外的网络——就是一个光秃秃的点积,一次廉价、高度可并行的矩阵乘法。
这几处差异值得并排放在一起看:
- 打分方式。 加性用一个学出来的小网络;缩放点积用普通点积加一个缩放系数。
- 开销。 点积在 GPU 上快得多,这也是后来那个版本能规模化的原因之一。
- 方向。 Bahdanau 注意力是交叉注意力(cross-attention):解码器(一条序列)去关注编码器(另一条序列)。自注意力则是让一条序列关注它自己。
最后这一点,正是 Transformer 完成的概念飞跃。Bahdanau 注意力连接的是两条序列。自注意力把同一套回看手法用在一条序列内部,让每个词关注其他所有词——然后干脆把 RNN 整个扔掉。
通往 Transformer 的桥
Bahdanau 注意力是拧在 RNN 上面的;输入仍然是一步一步按序读的,它只是多加了一次更聪明的交接。它缓解了瓶颈,却没有除掉 RNN 更深的毛病:串行处理,无法并行。
2017 年,《Attention Is All You Need》问出了下一个显然的问题:如果让翻译跑起来的是注意力,那 RNN 还需要吗?把它拿掉,只留注意力,你得到的就是一个并行处理所有位置的模型。那就是 Transformer,而它为什么胜出的故事,写在 transformer 为什么胜出 里。
要点回顾
- 注意力诞生于 2014 年,是为了修 seq2seq 的瓶颈,不是为 Transformer 而生。
- 核心思路:保留编码器的全部状态,让解码器为每个输出词现场造一个加权上下文向量。
- 打分、softmax、混合这三步,和现代注意力是同一个形状。
- Bahdanau 用的是加性打分(一个小网络)和交叉注意力(解码器关注编码器);Transformer 用的是缩放点积打分和自注意力。
- 注意力权重同时充当输入与输出之间可解释的对齐关系。
下一篇: transformer 为什么胜出 —— 研究者留下注意力、扔掉 RNN 之后发生了什么。