考虑把一句较长的话翻译成另一种语言。早期的编码器—解码器做法让编码器逐词读入原文,把最后的隐藏状态交给解码器。解码器每生成一个词都依赖这个状态。问题是:原文中有关某个专有名词的信息,必须一路保存在有限维的状态里,才能在较晚的位置被使用。
循环状态的代价
典型 RNN 写作 。 依赖上一步 ,所以同一条序列的时间步通常不能完全并行。长距离信息还要跨越许多状态传递;梯度可能消失或爆炸。LSTM、GRU 的门控结构缓解了信息保留问题,但没有消除逐步计算的依赖。
注意这不是说“RNN 永远记不住长句”,而是只把整句压缩为一个固定向量会形成信息瓶颈。早期的注意力机制让解码器在生成第 个词时,直接读取编码器各位置的状态 :
是解码器当前的查询状态, 是对原文第 个位置的权重, 是本次生成使用的上下文。不同输出位置可以得到不同的 :生成专有名词时,模型有机会参考对应的原文片段,而不必只依靠最后一个编码状态。
从跨序列查询到序列内部查询
上述注意力中,查询来自解码器,候选信息来自编码器;后来 Transformer 里的 Self-Attention 把查询、键和值都从同一条序列的表示中投影出来,让序列内部的位置直接交换信息。它也让训练阶段的整段序列计算更容易并行,但要存储位置之间的成对关系,长序列时成本较高。
因此,Attention 的历史线索不是“RNN 完全没用”,而是:固定上下文不够灵活,显式检索序列中的位置更合适。下一篇会具体拆开 Self-Attention 的 Q、K、V。