《Sequence-to-Sequence Learning as Beam-Search Optimization》阅读笔记

论文地址:Sequence-to-Sequence Learning as Beam-Search ...

代码地址:harvardnlp/BSO

来源:EMNLP 2016

本篇论文讨论了以往的seq2seq问题解决方案中局部训练的缺陷。通过改变模型结构和训练方式,将seq2seq问题看成寻求图上的最优路径问题,使其能够学习全局序列的分数,从而避免了局部训练的缺陷。


Motivation

seq2seq问题,是指将一个序列 X 转化为另一序列 Y 的一类问题,主要的应用包括机器翻译、自动摘要等。

目前主要的解决方案,是将seq2seq问题视为条件语言模型,即在已知输入序列和前序生成序列的条件下,最大化下一目标词的概率:

P(Y|X)=\sum_{t=1}^{T}logP(y_t|y_{1 :t-1},X)

这里需要注意的是,在训练过程中, y_{1:t-1} 使用的是前序的ground truth tokens,然而在测试过程中,ground truth tokens 不得知,故用预测得到的 \widehat{y}_{1:t-1} 代替。由此引发第一个问题:

  • Exposure Bias : 训练过程中,模型使用的是 y_{1:t-1} ,而在测试过程中,模型使用的是 \widehat{y}_{1:t-1} 。一旦预测得到的 \widehat{y}_{1:t-1} 存在错误,由于模型没有见过 \widehat{y}_{1:t-1} 的分布,模型将没有能力纠正这个错误,并导致误差传播。

此外,这种局部训练的模型还存在另外两个问题:

  • Loss-Evaluation Mismatch : 局部训练的训练目标是最小化词级别的交叉熵,而最终我们的评价指标是句子级别的评价指标BLEU,这就导致了训练目标和评价指标不一致。
  • Label Bias : 因为在每一步中,模型都对词的概率进行归一化处理(Softmax),当每一步可能的候选个数不一致时,就可能导致标记偏差。也即,在测试过程中使用beam-search时,我们会更偏爱于后继候选个数少的token。详细解释可以参考这里

针对以上问题,作者提出了一个非概率的变异的seq2seq模型,能够对任何可能的生成序列进行打分。同时,定义了一个loss函数来计算beam-search的误差,并提出了一个有效算法进行反向传播。如此,该模型实现了句子级别的训练,同时使得模型在训练过程中也使用了自己的预测结果。接下来会详解该模型是如何解决以上提出三个问题的。


Related Work

  • Beam-Search

Beam-Search是全局解码算法,其实我们的目的是要得到概率最大的句子,这其实是一个图上的最优路径问题,应该是一个动态规划问题。在解决最优路径算法上,可以利用维特比算法。其思想是既然知道到第t步所有j个节点的最短路径\mathbf{d}_t=[d_1,d_2,..,d_j] ,那么到第t+1步节点的最短路径就等于 \mathbf{d}_t 加上第t步中j个节点到第t+1步中各个节点的距离的最小值 \mathbf{d}_{t+1} 。该算法的算法复杂度为 o(TV^2) ,但是一般seq2seq问题中搜索空间V较大,为了降低算法复杂度,我们采用Beam-Search的方法,每步只保留K个最优解,算法复杂度降低为 o(TKV)

应用在seq2seq中,就是在每一次解码过程中,只保留累积概率最高的K条路径,把整个解码过程看出寻求最大联合概率的图搜索过程。以往方法在测试过程中,经常利用Beam-Search算法降低Exposure Bias的影响。由于其考虑了全局解码概率,而不仅仅依赖与前一个词的输出,所以模型前一个预测错误而带来的误差传递的可能性就降低了。

针对Exposure bias问题,bengio提出了DAD的方法。他认为Exposure Bias的主要问题是训练过程中模型不曾接触过自己预测的结果,在测试过程中一旦预测出现错误,那么模型将进入一个训练过程中从未见过的状态,从而导致误差传播。为此,提出了一个训练过程逐渐地迫使模型处理自己的错误,因为在测试过程中这是必须经历的。DAD提出了一种退火算法来解决这个问题,在训练过程中引入一个概率值参数 \epsilon_i ,每次以 \epsilon_i 的概率选取ground truth token作为输入, 1-\epsilon_i 的概率选取自己的prediction作为输入。逐渐降低 \epsilon_i ,最终模型全都利用自己的prediction作为下一步的输入,和测试过程一致。

该方法的解码过程如下:

DAD的一个明显缺陷就是不管解码过程中是以ground truth token或prediction作为输入,训练目标词一直是使用的ground truth target。这可能迫使模型学习解码出错误的序列。

  • Reinforcement Learning

以上提到的两种方法都只是解决模型的曝光偏差问题。将强化学习应用到seq2seq问题中,能够实现模型在句子级别上进行训练。强化学习的四要素:action, state, reward, policy \pi 。应用于seq2seq中,action是每一步的候选词,state是每一步 RNN隐层的神经元状态,reward是整个后续sequence解码完后的BLEU等指标。训练的目标为:

max_θ∑R(a,s)logπ(a|s,θ)

为了提高强化学习过程的稳定性,可以采用了REINFORCE with baseline。将训练的目标修改为:

max_θ∑(R(a,s)-b(s))logπ(a|s,θ)

将Reinforcement Learning应用于seq2seq中的论文可以参考:

SEQUENCE LEVEL TRAINING WITH RECURRENT NEURAL NETWORKS

An Actor-Critic Algorithm for Sequence Prediction

强化学习的缺点就是训练过程的不稳定性,两篇论文都在训练过程起始时刻用传统的交叉熵训练来进行模型的初始化。


Model

本文不再把seq2seq问题建模成一个条件语言模型,而是建模成一个图上的最优路径问题。其实我们的目的是要得到概率最大的句子,很显然在每一步都取概率最大的词是不合理的。seq2seq问题应该是一个动态规划问题而不是一个贪心问题。

首先,将decoder中计算下一词的概率替换成对已生成的序列进行打分。

定义函数f(w_t,\mathbf{h}_{t-1},\mathbf{x}) 为前序序列 w_{1:t-1} 跟上 w_t得到的序列得到的score。相比以往的seq2seq模型,函数f是不经过softmax处理得到的结果,所以模型输出的是unnormalized score,这样就解决了Label Bias。此外,对序列进行打分,实现了句子级别的训练。

在此基础上,模型希望目标序列的得分最高。理想情况下,我们应该把得分最高的完成的序列和目标序列进行比较,但像上文介绍Beam-Search时提到的,如此的算法复杂度非常高。于是,作者将Beam-Search的方法引入训练过程中,并且定义了Loss函数对ground truth序列不在Beam中的情况进行惩罚。如此,模型在训练过程中也接触到了自己的prediction,解决了Exposure Bias。

  • Search-Based Loss

假定我们得到了一个集合 S_t ,该集合中包含了K个候选的长度为t的序列。 \widehat{y}^{(K)}_{1:t}\in S_t 代表了 S_t 中的从大到小得分第K个的序列:

然后定义了全局的loss函数,对于ground truth序列 y_{1:t} 的score没有高于 \widehat y^{(K)}_{1:t} 的score一定的差距进行惩罚,如此我们可以不断提高ground truth的得分,降低错误序列的得分,最终达成目标序列的得分最高的目标:

\Delta(\widehat y_{1:t}^{(K)}) 可以由 \widehat y^{(K)}_{1:t} 错误的严重性而定。一般情况下,当差距margin requirement 被满足的时候, \Delta(\widehat y_{1:t}^{(K)})=0 ,否则则为一个正数。

由于我们希望目标序列在搜索过程的最后得分最高,所以在 t=T 时,Loss函数修改为ground truth序列 y_{1:T}\widehat y _{1:T}^{(1)} 的scores进行比较。

为了优化这个loss函数。这个算法分为两个部分,首先是Forward: Find Violations,找到候选句子集合 S_t 。然后是Backward: Merge Sequences。用反向传播的方式更新权重。

可以看到,Beam-Search Optimization其实和强化学习方法类似,但是不需要探索解的过程。作者认为像强化学习中的采样探索是不必要的,因为我们已经知道了最优路径解。

  • Forward: Find Violations

定义 succ 函数是由 w_{1:t-1} 映射到所有可能 [w_{1:t-1},w] 的函数:

我们的候选集合 S_t 由如下公式得到:


上式中,margin violation at t-1是指 f(y_{t-1},\mathbf{h}_{t-2})<f(\widehat y_{t-1}^{(K)},\widehat {\mathbf{h}}_{t-1}^{(K)})+1 的情况,也即 y_{1:t} 的score没有高于 \widehat{y}_{1:t}^{(K)} 的score一定差距。此时,下一步的候选集合 S_t 直接由ground truth 产生的前K个得分最高的序列组成,否则用beam-search得到的前K个得分最高的序列组成。具体过程如下图:

  • Backward: Merge Sequences

在反向传播过程中,我们不仅回传ground truth的梯度,还回传wrongly predicted history的梯度。

由于我们的loss函数是简单的加减计算,所以BRNN的梯度计算是共享回传的。

下面就是这个算法的伪代码:


Experiments & Results

  • addtional trick

1.用词级别的交叉熵loss对模型进行预训练。如果随机初始化,模型效果不好。

2.在训练过程中使用 "curriculum beam" 策略,一开始beam-size为2,之后每两个epoch,beam-size增加1。从贪心算法向动态规划转变。

  • Result

该模型在word ordering, dependency parsing, and machine translation任务上取得明显提升,具体参见论文,此处不再讨论。


Innovation

  1. 把seq2seq问题转化为一个动态规划问题,在训练过程中对全局序列进行优化,解决了局部优化的Exposure Bias、Loss-Evaluation Mismatch和Label Bias的缺点。同时,相比较于强化学习的方法,提出一种更简单的训练方式完成句子级别的训练。
  2. 用序列打分函数打破传统生成模型对词概率的计算,解决了Label Bias的问题。

编辑于 2017-10-11

文章被以下专栏收录