在Transformer出现之前,NLP的最新技术是LSTM等循环架构。这些架构通过在神经网络连接使用反馈循环,允许信息从一步传播到另一步,使其成为对文本等序列数据进行建模的理想选择。如图1-2左侧所示,RNN接收一些输入(可以是单词或字符),将其馈送给神经网络,然后输出一个称为隐藏状态的向量。同时,模型通过反馈循环将信息反馈给自身,然后在下一步中使用。如果我们按照图1-2右侧所示“展开”循环,可以更清楚地看到这一点:RNN将有关其每一步的状态信息传给序列中的下一步操作。这点令RNN可以跟踪前面步骤中的信息,并将其用于输出预测。
图1-2:RNN架构展开
这些架构曾经(并将继续)广泛用于NLP任务、语音处理和时间序列。你可以在Andrej Karpathy的博客“The Unreasonable Effectiveness of Recurrent Neural Networks”( https://oreil.ly/Q55o0 )找到对它们能力的精彩阐述。
RNN发挥重要作用的一个领域是机器翻译系统,其目标是将一种语言中的单词序列映射到另一种语言。此类任务通常使用编码器-解码器或序列到序列架构 [5] 来解决,这些架构非常适合输入和输出都是任意长度序列的情况。编码器将输入序列的信息编码为通常称为最后隐藏状态的数字表示。然后编码器将该状态传给解码器,解码器生成输出序列。
通常,编码器和解码器组件可以是能够对序列进行建模的任何类型的神经网络架构。图1-3中的成对RNN说明了这一点,其中英语句子“Transformers are great!”编码为隐藏状态向量,然后解码以产生德语译文“Transformer sind grossartig!”输入字符通过编码器按顺序馈送,输出字符从上到下一次生成一个。
图1-3:采用成对RNN的编码器-解码器架构(具体循环的层数通常会比此处显示的要多得多)
虽然简单优雅,但这种架构的一个弱点是编码器的最终隐藏状态会产生信息瓶颈:它必须表示整个输入序列的含义,因为解码器在生成输出时只能靠它来读取全部内容。从而很难处理长序列,因为当序列过长时,在将所有内容压缩为单个固定表示的过程中可能会丢失序列开头的信息。
幸运的是,有一种方法可以摆脱这一瓶颈,就是允许解码器访问编码器的所有隐藏状态。这种通用机制称为注意力 [6] 。它是许多现代神经网络架构中的关键组件。了解整合了注意力机制的RNN能够帮助我们更好地理解Transformer架构。接下来我们深入了解一下注意力机制。