序列模型与注意力机制

Seq2Seq 模型

Seq2Seq模型的核心思想是,通过深度神经网络将一个作为输入的序列映射为一个作为输出的序列,这一过程由编码输入与解码输出两个环节构成。在经典的实现中,编码器和解码器各由一个循环神经网络构成,既可以选择传统循环神经网络结构,也可以使用长短期记忆模型、门控循环单元等。在Seq2Seq模型中,两个循环神经网络是共同训练的。

对应于机器翻译过程,如上图所示。输入的序列是一个源语言的句子,有三个单词A、B、C,编码器依次读入A、B、C和结尾符。 在解码的第一步,解码器读入编码器的最终状态,生成第一个目标语言的词W;第二步读入第一步的输出W,生成第二个词X;如此循环,直至输出结尾符。输出的序列W、X、Y、Z就是翻译后目标语言的句子。

如下图所示,在图像描述文本生成任务中,输入是图像经过视觉网络的特征,输出的序列是图像的描述短句。在文本摘要任务中,输入的序列是长句子或段落,输出的序列是摘要短句。进行语音识别时,输入的序列是音频信号,输出的序列是识别出的文本。不同场景中,编码器和解码器有不同的设计,但对应Seq2Seq的底层结构却如出一辙。

Seq2Seq模型最核心的部分是其解码部分,大量的改进也是在解码环节衍生的。Seq2Seq模型最基础的解码方法是贪心法,即选取一种度量标准后,每次都在当前状态下选择最佳的一个结果,直到结束。贪心法的计算代价低,适合作为基准结果与其他方法相比较。很显然,贪心法获得的是一个局部最优解,由于实际问题的复杂性,该方法往往并不能取得最好的效果。

提出 Seq2Seq 模型的相关论文:


集束搜索

集束搜索是常见的改进算法,它是一种启发式算法。该方法会保存beam size(后面简写为b)个当前的较佳选择,然后解码时每一步根据保存的选择进行下一步扩展和排序,接着选择前b个进行保存,循环迭代,直到结束时选择最佳的一个作为解码的结果。下图是b为2时的集束搜索示例。

由图可见,当前已经有解码得到的第一个词的两个候选:I和My。然后,将I和My输入到解码器,得到一系列候选的序列,诸如I decided、My decision、I thought等。最后,从后续序列中选择最优的两个,作为前两个词的两个候选序列。很显然,如果b取1,那么会退化为前述的贪心法。随着b的增大,其搜索的空间增大,最终效果会有所提升,但需要的计算量也相应增大。

在实际的应用(如机器翻译、文本摘要)中,b往往会选择一个适中的范围,以8~12为佳 。解码时使用堆叠的RNN、增加Dropout机制、与编码器之间建立残差连接等,均是常见的改进措施。在实际研究工作中,可以依据不同使用场景,有针对地进行选择和实践。

另外,解码环节中一个重要的改进是注意力机制。注意力机制的引入,使得在解码时每一步可以有针对性地关注与当前有关的编码结果,从而减小编码器输出表示的学习难度,也更容易学到长期的依赖关系。

文章相关:


Bleu 得分

Bleu(Bilingual Evaluation Understudy) 得分用于评估机器翻译的质量,其思想是机器翻译的结果越接近于人工翻译,则评分越高。

最原始的 Bleu 将机器翻译结果中每个单词在人工翻译中出现的次数作为分子,机器翻译结果总词数作为分母得到。但是容易出现错误,例如,机器翻译结果单纯为某个在人工翻译结果中出现的单词的重复,则按照上述方法得到的 Bleu 为 1,显然有误。改进的方法是将每个单词在人工翻译结果中出现的次数作为分子,在机器翻译结果中出现的次数作为分母。

上述方法是以单个词为单位进行统计,以单个词为单位的集合称为unigram(一元组)。而以成对的词为单位的集合称为bigram(二元组)。对每个二元组,可以统计其在机器翻译结果($count$)和人工翻译结果($count_{clip}$)出现的次数,计算 Bleu 得分。

以此类推,以 n 个单词为单位的集合称为n-gram(多元组),对应的 Blue(即翻译精确度)得分计算公式为:

对 N 个 pn 进行几何加权平均得到:

有一个问题是,当机器翻译结果短于人工翻译结果时,比较容易能得到更大的精确度分值,因为输出的大部分词可能都出现在人工翻译结果中。改进的方法是设置一个最佳匹配长度(Best Match Length),如果机器翻译的结果短于该最佳匹配长度,则需要接受 简短惩罚(Brevity Penalty,BP)

因此,最后得到的 Bleu 得分为:

Bleu 得分的贡献是提出了一个表现不错的单一实数评估指标,因此加快了整个机器翻译领域以及其他文本生成领域的进程。

相关论文:neni et. al., 2002. A method for automatic evaluation of machine translation


注意力机制

Seq2Seq模型引入注意力机制是为了解决什么问题? 为什么选用了双向的循环神经网络模型?

在实际任务(例如机器翻译)中,使用Seq2Seq模型,通常会先使用一个循环神经网络作为编码器,将输入序列(源语言句子的词向量序列)编码成为一个向量表示;然后再使用一个循环神经网络模型作为解码器,从编码器得到的向量表示里解码得到输出序列(目标语言句子的词序列)。在Seq2Seq模型中,当前隐状态以及上一个输出词决定了当前输出词,即


其中f和g是非线性变换,通常是多层神经网络;yi 是输出序列中的一个词,si 是对应的隐状态。

在seq2seq的实际使用中,会发现随着输入序列的增长,模型的性能发生了显著下降。这是因为编码时输入序列的全部信息压缩到了一个向量表示中。随着序列增长,句子越前面的词的信息丢失就越严重。试想翻译一个有100个词的句子,需要将整个句子全部词的语义信息编码在一个向量中。而在解码时,目标语言的第一个词大概率是和源语言的第一个词相对应的,这就意味着第一步的解码就需要考虑100步之前的信息。建模时的一个小技巧是将源语言句子逆序输入,或者重复输入两遍来训练模型,以得到一定的性能提升。使用长短期记忆模型能够在一定程度上缓解这个问题,但在实践中对于过长的序列仍然难以有很好的表现。

同时,Seq2Seq模型的输出序列中,常常会损失部分输入序列的信息,这是因为在解码时,当前词及对应的源语言词的上下文信息和位置信息在编解码过程中丢失了。Seq2Seq模型中引入注意力机制就是为了解决上述的问题。

在注意力机制中,仍然可以用普通的循环神经网络对输入序列进行编码,得到隐状态h1 ,h2 …hT 。但是在解码时,每一个输出词都依赖于前一个隐状态以及输入序列每一个对应的隐状态,


其中语境向量c i 是输入序列全部隐状态h 1 ,h 2 …h T 的一个加权和

其中注意力权重参数α ij 并不是一个固定权重,而是由另一个神经网络计算得到

神经网络a将上一个输出序列隐状态si−1 和输入序列隐状态hj 作为输入,计算出一个xj ,yi 对齐的值eij ,再归一化得到权重αij 。我们可以对此给出一个直观的理解:在生成一个输出词时,会考虑每一个输入词和当前输出词的对齐关系,对齐越好的词,会有越大的权重,对生成当前输出词的影响也就越大。

整个注意力机制解码详情如下:

下图展示了翻译时注意力机制的权重分布,在互为翻译的词对上会有最大的权重。

那为什么注意力机制的编码网络,通常选用双向循环神经网络呢?

在机器翻译这样一个典型的Seq2Seq模型里,生成一个输出词yj ,会用到第i个输入词对应的隐状态hi 以及对应的注意力权重αij 。如果只使用一个方向的循环神经网络来计算隐状态,那么hi 只包含了x0 到xi 的信息,相当于在αij 这里丢失了xi 后面的词的信息。而使用双向循环神经网络进行建模,第i个输入词对应的隐状态包含了和 ,前者编码x0 到xi 的信息,后者编码xi 及之后所有词的信息,防止了前后文信息的丢失,如下图所示。

相关文章:

相关论文:


吴恩达课程代码

吴恩达-序列模型和注意力机制-代码示例