【来源】:ACL2019
【链接】:https://arxiv.org/abs/1906.02448
【代码、数据集】: 无

这篇论文由中科院发表,获得了ACL2019的 “best long paper”。

要解决的问题

在Neural Machine Translation(NMT)任务中,模型通常采用encoder-decoder框架,基于RNN 或 CNN 或attention。假设输入为$X = \lbrace{x_1,x_2,…,x_m}\rbrace$,真实输出为$Y = \lbrace{y_1^*,y_2^*,…,y_n^*}\rbrace$,预测输出为$Y’ = \lbrace {y_1’,y_2’,…,y_m’}\rbrace$。

第一个问题是:decoder会一个词一个词地生成整个回复。在train阶段,在时间步t生成$y_t’$时,decoder会根据之前真实的词$\lbrace{y_1^*,y_2^*,…,y_{t-1}^*}\rbrace$来预测$y_t’$。在infer阶段,由于不可能知道真实输出,在时间步生成$y_t’$时,decoder会根据之前预测的词$\lbrace{y_1’,y_2’,…,y_{t-1}’}\rbrace$来预测$y_t’$。
可以看到train阶段与infer阶段所依据的词是不同的,train阶段和infer阶段预测的词$y_t’$来自两个不同的概率分布,分别是数据分布(data distribution)和模型的分布(model distribution),这种差别称为“爆炸偏差(exposure bias)”。随着预测序列的长度增加,错误会逐渐累积。
为了解决第一个问题,消除train阶段和infer阶段的这种差别,一个可能的解决方法是:在train阶段,decoder同时根据真实的词$\lbrace{y_1^*,y_2^*,…,y_{t-1}^*}\rbrace$和预测的词$\lbrace{y_1’,y_2’,…,y_{t-1}’}\rbrace$来生成$y_t’$。

第二个问题是: NMT模型通常最优化$Y与Y’$之间的交叉熵目标函数来更新模型参数,但交叉熵函数会严格匹配预测输出$Y’$与真实的输出$Y$。但在NMT任务中,一句话可以有多个不同但合理的翻译。一旦预测输出$Y’$的某个词与$Y$不同,尽管它是合理的,也会被交叉熵函数纠正。这种情况称为“过度纠正的现象”。

为了消除train阶段与infer阶段的差别,论文提出了一种在train阶段做改进的解决方案。首先,从预测的词中选择oracle word $y_{j-1}^{oracle}$,设真实输出中上一个词为$y_{j-1}^{*}$。接着从$\lbrace{y_{j-1}^{oracle},y_{j-1}^{*}}\rbrace$中抽样一个词,抽中$y_{j-1}^{*}$的概率为$p$,抽中$y_{j-1}^{oracle}$的概率为$1-p$。最后,decoder根据抽样的这个词来预测$y_j$。

在train阶段刚开始时,抽中真实的词$y_{j-1}^{*}$的概率比较大,随着模型逐渐收敛,抽中预测的词$y_{j-1}^{oracle}$的概率变大,让模型有能力处理”过度纠正的问题”。

Fig.1 论文提出的方法的结构图
Fig.1 论文提出的方法的结构图

RNN-based NMT Model

NMT任务常采用encoder-decoder框架,可以基于RNN或CNN或纯attention。论文提出的消除train阶段和infer阶段差别的方法,可以用于任何NMT模型。论文以基于RNN的NMT模型为例,来介绍这种方法。这一节先介绍RNN-based NMT模型。下一节介绍NMT模型如何结合这种方法。

encoder

记输入为$X = \lbrace{x_1,x_2,…,x_m}\rbrace$,真实输出为$Y = \lbrace{y_1,y_2,…,y_n}\rbrace$。encoder采用bi-GRU分别获取正向和反向的隐藏状态$\overrightarrow{h_i},\overleftarrow{h_i}$。$x_i$的embedding向量为$e_{x_i}$。$$\overrightarrow{h_i} = GRU(e_{x_i},h_{i-1})$$ $$\overleftarrow{h_i} = GRU(e_{x_i},h_{i+1})$$ 将$\overrightarrow{h_i},\overleftarrow{h_i}$连接起来,作为$x_i$对应的隐藏状态:$$h_i = [\overrightarrow{h_i},\overleftarrow{h_i}] \tag{1}$$

attention

attention机制用来联系encoder和decoder,更好地捕捉source sequence的信息。也就是在时间步t,通过encoder所有的隐藏状态$\lbrace h_1,h_2,…,h_m \rbrace$来计算context vector $c_t$。记decoder上一时间步的隐藏状态为$s_{t-1}$。 $c_t$是encoder所有隐藏状态$\lbrace h_1,h_2,…,h_m \rbrace$的加权和:$$c_t = \sum_{i=1}^{m}\alpha_{ti}h_i \tag{2}$$ 其中$\alpha_{ti}$是attention权重,计算方式为:$$\beta_{ti} = v_a^\top tanh(W_as_{t-1} + U_ah_i) \tag{3}$$ $$\alpha_{ti} = softmax(\beta_{ti}) = \frac{exp(\beta_{ti})}{\sum_jexp(\beta_{tj})}$$

decoder

decoder采用单向GRU的变体,隐藏状态更新公式为:$$s_t = GRU(s_{t-1},e_{y_{t-1}^*},c_t) \tag{4}$$ 最后根据e_{y_{t-1}^*},decoder的隐藏状态$s_t$,对应的context vector $c_t$来预测$y_t$。 $$o_t = W_og(e_{y_{t-1}^*},s_t,c_t) \tag{5}$$ 在词汇表上的概率分布为:$$P_t(y_t = w) = softmax(o_t) \tag{6}$$

方法

为了消除或减轻train阶段和infer阶段的差别,论文提出 从真实的词$y_{t-1}*$和$y_{t-1}^{oracle}$预测的词中抽样,decoder根据抽样的词来预测下一个词$y_t$。使用论文提出的方法,在时间步t预测$y_t$分为三步:

  1. 先从预测的词中选择$y_{t-1}^{oracle}$。 论文提出了两种方法来选择oracle word,分别是词级别的方法和句子级别的方法。
  2. 从$\lbrace{y_{t-1}^{oracle},y_{t-1}*}\rbrace$中抽样得到$y_{t-1}$,抽中$y_{t-1}*$的概率为$p$,抽中$y_{t-1}^{oracle}$的概率为$1-p$。
  3. 用抽样的词$y_{t-1}$来替换公式$(4)(5)$中的$y_{t-1}^*$来预测下一个词。

oracle word的选择

传统的方法中,decoder会根据上一个时间步真实的$y_{t-1}^*$来预测$y_t$。为了消除train阶段的infer阶段的差别,可以从预测的词中选择oracle word $y_{t-1}^{oracle}$来代替$y_{t-1}^*$。一种方法是每个时间步采用词级别的greedy search来生成oracle word,称为word-level oracle(WO),另一种方法是采用beam-search,扩大搜索空间,用句子级的衡量指标(如:BLEU)对beam-search的结果进行排序,称为sentence-level oracle(SO).

word-level oracle

选择$y_{t-1}^{oracle}$最简单直观的方法是,在时间步t-1,选择公式$P_{t-1}$中概率最高的词作为$y_{t-1}^{oracle}$,如Fig.2所示。 为了获得更健壮的$y_{t-1}^{oracle}$,更好地选择是使用gumbel max技术来冲离散分布中进行抽样,如Fig.3所示。
具体地讲,将gumbel noise $\eta$作为正则化项加到公式(5)中的$o_{t-1}$,再进行softmax操作得到$y_{t-1}$的概率分布。$$\eta = -log(-log(u)) $$ $$\tilde{o_{t-1}} = \frac{o_{t-1} + \eta}{\tau} \tag{7}$$ $$\tilde{P_{t-1}} = softmax(\tilde{o_{t-1}}) \tag{8}$$ 其中变量$u \sim U(0,1)$服从均匀分布。$\tau$为温度系数,当$\tau \to 0$时,公式(8)的softmax()逐渐相当于argmax()函数;当$\tau \to \infty$时,softmax()函数逐渐相当于均匀分布。
则$y_{t-1}^{oracle}$为$$y_{t-1}^{oracle} = y_{t-1}^{WO} =argmax(\tilde{P_{t-1}}) \tag{9}$$需要注意的是gumbel noise $\eta$只用来选择oracle word,而不会影响train阶段的目标函数。

Fig.2. word level oracle without gumbel noise
Fig.2. word level oracle without gumbel noise
Fig.3. word level oracle with gumbel noise
Fig.3. word level oracle with gumbel noise
sentence-level oracle

为了选择sentence-level oracle word,首先要进行beam-search解码,设beam size为k,得到k个candidate句子。在beam-search解码的过程中,生成每个词时也应用gumbel max技术。
接着,得到k个candidate句子后,用句子级衡量指标BLEU来给这k个句子打分,得分最高的句子为oracle sentence $Y^S = \lbrace{y_1^S,y_2^S,..,y_{|y^S|}^S}\rbrace$。
则时间步t解码对应的oracle word $y_{t-1}^{oracle}$为$$y_{t-1}^{oracle} = y_{t-1}^{SO} = y_{t-1}^{S} \tag{10}$$ 当模型从真实输出$Y$和sentence oracle $Y^S$抽样,这有一个前提是,这两个序列的长度需要是一致的。但beam-search decode不能保证解码序列的长度。为了保证这两个序列长度一致,论文提出了force decoding的解决方法。

force decoding
设真实输出$Y = \lbrace{y_1,y_2,…,y_n}\rbrace$的序列长度为n。force decoding需要解码得到长度同样为n的序列,以特殊字符”EOS”结束。设beam search decode时,时间步t对应的概率分布为$P_t$。

  • 当$t< n$时,对于概率分布$P_t$,即使字符”EOS”是概率最高的词,那么生成概率次高的词。
  • 当$t = n+1$时,对于概率分布$P_{n+1}$,即使字符”EOS”不是概率最高的词,也要生成”EOS”。

果真是强制生成长度为n的序列。这样beam-search decode得到的序列与真实输出序列的长度就是一致的,都为n。

递减抽样

根据公式(9)或(10)得到$y_{t-1}^{oracle}$后,下一步是从$\lbrace{y_{t-1}^{oracel},y_{t-1}^*}\rbrace$中抽样,抽中$y_{t-1}^*$的概率是p,抽中$y_{t-1}^{oracle}$的概率是1-p。在训练的初始阶段,如果过多地选择$y_{t-1}^{oracle}$,会导致模型收敛速度慢;在训练的后期阶段,如果过多地选择$y_{t-1}^*$,会导致模型在train阶段没有学习到如何处理infer阶段的差别。
因此,好的选择是:在训练的初始阶段,更大概率地选择$y_{t-1}^*$来加快模型收敛,当模型逐渐收敛后,以更大概率选择$y_{t-1}^{oracle}$,来让模型学习到如何处理infer阶段的差别。从数学表示上,概率$p$先大后逐渐衰减,$p$随着训练轮数$e$的增大而逐渐变小。$$p = \frac{\mu}{\mu + exp(\frac{e}{\mu})} \tag{11}$$其中,$\mu$是超参数。$p$是轮数$e$的单调递减函数。$e$从0开始,此时,$p=1$。

训练

将采样得到的$y_{t-1}$代替公式(4)-(6)中的$y_{t-1}^*$来预测$y_t$在词汇表上的概率分布。采用最大似然估计,相当于最小化以下目标函数:$$L(\theta) = -\sum_{n=1}^{N}\sum_{j=1}^{|y_n|}logP_j^n[y_j^n]$$