1. 引言
自然语言处理(Natural Language Processing, NLP)是一种重要的人工智能(Artificial Intelligence, AI)技术,可以完成文本分类、序列标注、自动问答、机器翻译和摘要生成等任务,促进了搜索引擎、智能客服和推荐系统等应用的产生和发展,影响着生活的方方面面,值得我们去学习和研究。
最近几年,基于深度学习(Deep Learning, DL)的NLP技术在各项任务中取得了很好的效果,这些基于深度学习模型的NLP任务解决方案通常不使用传统的、特定任务的特征工程而是仅仅使用一个端到端(end-to-end)的神经网络模型就可以获得很好的效果。其中,Transformer是目前最前沿的深度学习模型结构,与之相关的概念有目前很火的attention(注意力)机制和BERT等。
在飞速发展的计算机领域,紧跟技术前沿是非常重要的,因此我们很有必要去学习目前最流行也是最有潜力的transformer模型架构及其相关知识。首先,本文将介绍之前比较流行的NLP处理技术seq2seq模型及其局限性。然后,本文将引出可解决seq2seq模型局限性的attention机制的思想和具体原理。最后,本文将介绍基本能够取代RNN的包括attention机制的transformer模型架构。
2. seq2seq模型
2.1 功能
seq2seq模型是RNN最重要的一个变种,可以处理非等长的输入和输出序列。
例如,在机器翻译中,输入一连串的单词,可以输出一连串其他语言的单词。
2.2 结构
seq2seq 模型是由编码器(Encoder)和解码器(Decoder)组成的。其中,编码器会处理输入序列中的每个元素,把这些信息转换为一个向量(称为上下文(context))。当我们处理完整个输入序列后,编码器把上下文(context)发送给解码器,解码器开始逐项生成输出序列中的元素。
得到 context 有多种方式,最简单的方法就是把 Encoder 的最后一个隐状态赋值给 context,还可以对最后的隐状态做一个变换得到 context,也可以对所有的隐状态做变换。其中,编码器和解码器一般都使用 RNN 结构。
2.3 运行
在机器翻译任务中,上下文(context)是一个向量(基本上是一个数字数组)。
你可以在编写seq2seq模型的时候设置上下文向量的长度。这个长度是基于编码器 RNN 的隐藏层神经元的数量。上图展示了长度为 4 的向量,但在实际应用中,上下文向量的长度可能是 256,512 或者 1024。
我们在处理单词之前,需要把他们转换为向量。这个转换是使用 word embedding 算法来完成的。
模型的主要模块是 RNN,其机制如下图所示:
Seq2seq 在机器翻译等应用中,呈现出序列计算的特点,如下所示:
2.4 局限
在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征 context 再解码,因此, context 中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个 context 可能存不下那么多信息,就会造成翻译精度的下降。
3. Attention机制
3.1 功能
在 Bahdanau等2014发布的Neural Machine Translation by Jointly Learning to Align and Translate 和 Luong等2015年发布的Effective Approaches to Attention-based Neural Machine Translation
两篇论文中,提出并改进了一种叫做注意力 Attention 的技术,它极大地提高了机器翻译的质量。注意力机制可以使模型根据需要,个性化地在每个输出时间步使用不同的 context 来解决单一 context 存储信息受限的问题。
3.2 结构
注意力模型不同于经典的序列到序列(seq2seq)模型,主要体现在 2 个方面:
首先,编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个 hidden state(隐藏层状态):
第二,注意力模型的解码器在产生输出之前,做了一个额外的处理。为了把注意力集中在与该时间步相关的输入部分。解码器做了如下的处理:
- 查看所有接收到的编码器的 hidden state(隐藏层状态)。其中,编码器中每个 hidden state(隐藏层状态)都对应到输入句子中一个单词。
- 给每个 hidden state(隐藏层状态)一个分数(我们先忽略这个分数的计算过程)。
- 将每个 hidden state(隐藏层状态)乘以经过 softmax 的对应的分数,从而,高分对应的 hidden state(隐藏层状态)会被放大,而低分对应的 hidden state(隐藏层状态)会被缩小。
- 对所有 hidden state进行加权求和,得到个性化的 context 用于解码。
3.3 运行
注意力模型的整个过程:
- 注意力模型的解码器 RNN 的输入包括:一个embedding 向量,和一个初始化好的解码器 hidden state(隐藏层状态)。
- RNN 处理上述的 2 个输入,产生一个输出和一个新的 hidden state(隐藏层状态 h4 向量),其中输出会被忽略。
- 注意力的步骤:我们使用编码器的 hidden state(隐藏层状态)和 h4 向量来计算这个时间步的上下文向量(C4)。
- 我们把 h4 和 C4 拼接起来,得到一个向量。
- 我们把这个向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。
- 前馈神经网络的输出表示这个时间步输出的单词。
- 在下一个时间步重复这个步骤。
请注意,注意力模型不是无意识地把输出的第一个单词对应到输入的第一个单词。实际上,它从训练阶段学习到了如何在两种语言中对应单词的关系(在我们的例子中,是法语和英语)。
3.4 注意力分数的计算
为了便于说明,我们以 RNN 作为具体模型的 Encoder-Decoder 框架为例。
其中,EOS 表示 End Of Sentence,在这里作为一句话的开始,也即上一句话的结束。
下图可以较为便捷地说明注意力分配概率分布值的通用计算过程。
对于采用 R N N RNN RNN 的 D e c o d e