序列模型与Transformer

自注意力(self-attention)

/ self uh-TEN-shun /

自注意力,是把注意力转向内部:序列中的每个词都去看同一序列里的其他每个词——包括它自己——以构建对自身含义更丰富的理解。普通注意力或许是让翻译的输出回望输入,而自注意力则让输入审视它自身。每个位置都在问:「在这里其他人都在的前提下,我在这个语境中究竟该是什么意思?」

在机制上,每个词从自己的向量里产出三样东西:一个查询(query,我在找什么?)、一个键(key,我能提供什么?)、一个值(value,我要传递的内容是什么?)。一个词的查询会与每个词的键相比较,得到相关度分数;这些分数变成权重,于是该词收集到一份对所有人之值的加权调和。结果就是:「它」的表示可以吸收来自「奖杯」的信息,「岸」的表示可以吸收来自「河」的信息,如此等等——而这一切对每个位置都是并行计算、一趟完成的。

这是 Transformer 的发动机舱。因为所有位置是同时相互注意、而非从左到右逐字行进,自注意力高度并行,在现代硬件上训练很快;它还让相隔很远的词能直接相互影响,而不必经过一长串中间步骤。诚实的代价在于规模:让每个词都与其他每个词比较,意味着计算量随序列长度的平方增长,这正是超长输入至今仍昂贵的原因,也是为何大量工程心血都花在驯服这一代价上。

在「那只动物没有过马路,因为它太累了」中,自注意力让「它」的向量从「动物」(而非「马路」)那里汲取大部分含义。把「累」换成「宽」,同一机制就会把「它」转向「马路」。

每个词的含义,都是从整句话里一次性重新调和出来的。

自注意力本身没有词序观念——在它眼里,一句话就是一袋东西。若不加帮助,「狗咬人」和「人咬狗」看起来一模一样。这份帮助来自位置编码,这也是为何这两个概念总是结伴出现。

又称
intra-attention自注意力intra-sentence attention