神经翻译笔记5扩展a:序列到序列模型解码的二三事

神经翻译笔记5扩展a. 序列到序列模型解码的二三事

本章(即神经翻译笔记5)主要围绕编码器解码器模型(这个名词与序列到序列模型混用,本章内不再赘述)展开,在上一节的核心知识点里,已经介绍了解码器的主流解码过程——集束搜索。这一解码方法得到了非常广泛的应用,在机器翻译领域已经成为了标配。但是,该方法也存在两个问题

  • 难以控制句子长度
  • 难以控制句子多样性。这一点对机器翻译问题不大(但是从后面的讲述中可以看到,如果能在这点上做出改进,也可以通过其它途径提升翻译质量),但是序列到序列模型并非只用于机器翻译领域,在自然语言处理的其它领域也都有所应用。例如在会话领域,多样性就是关注的一个重点,此时集束搜索更难以满足人们的要求

本节将就解码的这些问题做展开,介绍一些在集束搜索上做的扩展工作。其中大部分都来自于两大神经翻译框架fairseqOpenNMT-tf提供的功能

惩罚机制

在神经翻译出现后的第一篇有影响力的系统论文[GNMT2016]中,Google介绍了他们对解码器引入的两个额外项,分别为覆盖度惩罚项(coverage penalty)和长度归一项(length normalization, 文章里的记号也可以解读为长度惩罚项length penalty),其初衷是让解码器产生长度更长的句子,同时尽量覆盖源句。假设原先集束搜索时每一步的打分函数为s(YX)=log(P(YX)){\rm s}(Y|X) = \log (P(Y|X)),现在则修改为

s(Y,X)=log(P(YX))/lp(Y)+cp(X,Y)lp(Y)=(5+Y)α(5+1)αcp(X,Y)=βi=1Xlog(min(j=1Ypi,j,1)) \begin{aligned} {\rm s}(Y,X) &= \log (P(Y|X)) / {\rm lp}(Y) + {\rm cp}(X, Y) \\ {\rm lp}(Y) &= \frac{(5+|Y|)^\alpha}{(5+1)^\alpha}\\ {\rm cp}(X, Y) &= \beta \sum_{i=1}^{|X|}\log\left(\min\left(\sum_{j=1}^{|Y|}p_{i,j}, 1\right)\right) \end{aligned}

其中pi,jp_{i,j}是解码器生成的第jj个目标单词与输入句第ii个源单词计算得出的注意力概率。这里对cp函数稍作解释:从宏观、抽象的角度看,对每个i,1iXi, 1 \le i \le |X|计算一个值,取log并求和,其实暗合了信息论的计算方法,可以大致解读为该公式计算了源句单词生成目标句所有单词能力的信息。更具体地拆开说,在解码的每一步,对每个源单词ii,cp都会计算其与每个已经生成的单词jj的注意力概率p(i,j)p(i,j)。如果已经解码出了一个跟ii意思一样的单词,那么会有一个很大的p(i,j)p(i,j)出现,使得所有注意力概率求和以后很可能超过1,进而min(p,1)=1,log1=0\min(\sum p, 1) = 1, \log 1 = 0,对打分没有影响;否则,由于还未产生对源句该单词的翻译,因此内部求和项的各子项都是比较小的数,相加结果很可能小于1,求对数后是一个负值,降低得分

FAIR实现的fairseq中同样有对长度进行惩罚的机制,不过该机制相对来讲比较简单,只是根据长度减小<eos>的得分,逻辑仅有一行:

eos_scores /= (step + 1) ** self.len_penalty

GNMT原始论文中的长度惩罚项α\alpha取值范围为α[0,1]\alpha \in [0, 1],推荐设置为0.6到0.7(可以通过开发集微调)。若设置为0,则退化为原始集束搜索。fairseq中的长度惩罚参数lenpen无明确推荐值,一般也是根据开发集上的解码结果设置。该值无取值范围,如果大于1则鼓励长句,小于1则鼓励短句。注意fairseq的lenpen与源句-目标句比值无严格关系

[YangYilin2018]也对集束搜索失效的情况进行了分析。其分析指出集束搜索在宽度bb变大时更容易产生短句,进而因BLEU计算时会对短句惩罚而降低模型效果。更容易产生短句的原因是随着bb变大结束符<eos>出现的概率增加,而短句的模型打分在不加长度惩罚时肯定要比长句高,因此模型更容易输出短句

文章提出的解决方案分为如下几步

  1. 将编码器的所有隐藏状态求平均,平均之后得到的向量送入一个二层MLP,通过求解回归问题来预测目标句长度与源句长度的比值。假设源句为XX,长度为X|X|,计算得到的比值为gr(X){\rm gr}^\ast(X),则解码结果预计长度为Lpred(X)=gr(X)XL_{\rm pred}(X) = {\rm gr}^\ast(X) \cdot |X|
  2. 惩罚项为rL(X,Y),L(X,Y)=min{Y,Lpred(X)}r \cdot L^\ast(X, Y), L^\ast(X, Y) = \min\{|Y|, L_{\rm pred}(X)\},加到原来的模型得分上(注意这里是加法操作,并非前面GNMT提出的除法操作)

然而这里仍然带有一个超参数rr。为了彻底消除解码过程中的额外超参数,文章进一步提出了两种计算方法

有界自适应奖励项(bounded adaptive reward)。对宽度为bb的集束搜索,在时刻tt,对当前集束,有

rt=1bi=1blogP(wordi)S^AdaR(X,Y)=S(X,Y)+t=1L(X,Y)rt \begin{aligned} r_t &= -\frac{1}{b}\sum_{i=1}^b \log P({\rm word}_i) \\ \hat{S}_{\rm AdaR}(X, Y) &= S(X, Y) + \sum_{t=1}^{L^\ast(X, Y)}r_t \end{aligned}

BP惩罚项,该方法灵感直接来自于BLEU的计算方式(BLEU的计算方式在本章补充笔记第3篇介绍)

S^bp(X,Y)=logbp+1YS(X,Y)bp=min{e11lr,1}lr=YLpred(X) \begin{aligned} \hat{S}_{\rm bp}(X, Y) &= \log bp + \frac{1}{|Y|}S(X, Y) \\ bp &= \min\left\{e^{1-\frac{1}{lr}}, 1\right\} \\ lr &= \frac{|Y|}{L_{\rm pred}(X)} \end{aligned}

(本文后面还介绍了应该在何时停止搜索,但感觉讲得不太明确,这里先不介绍)

增加解码结果的多样性

序列到序列模型是一种比较强力,在当今NLP领域里应用比较广泛的模型,其不仅被应用于机器翻译领域,也可以应用在其它方向。例如,对于生成式闲聊机器人,通常也是使用编码器-解码器模型来解决问题,此时编码器编码的内容是对方发送来的内容,解码器需要根据这样的内容产生回复。这种为聊天生成回复的场景与机器翻译领域不同:机器翻译对于一个给定的源句,生成的目标句形式通常比较有限,例如“What’s this”大部分情况下只能翻译成“这是什么”——当然,也可以生成“这是啥”等变种,但是其语义必须要与源句相同。然而回复生成的可选范围是宽泛的,对“你吃了什么”的回答可以是包子、饺子、面条……等等。在这种情况下,如果对同样的问题总有确定的回答,反而会让人觉得无聊

基于这样的背景,增加解码结果多样性实际上成为了生成式闲聊机器人领域的刚需。此外,在机器翻译领域中,也有一个分支是研究如何产生多样性的翻译。本小节将对多样性解码的经典工作做一简要介绍

带“温度”的集束搜索

[Chorowski2016]在利用softmax函数计算概率分布时,引入了“温度”的概念(怀疑这个概念来自于模拟退火算法,但是不确定)。这个思路比较简单,直接将得到的所有得分都统一除以一个超参数T>0T > 0,再做softmax来得到最后的概率向量:

P(yi)=exp(si/T)jexp(sj/T) P(y_i) = \frac{\exp(s_i / T)}{\sum_j \exp(s_j/T)}

TT为1时,该方法退化为经典的集束搜索;当T>1T>1时,整个分布变得平滑,头部单词的概率变小(当TT\infty时,最后得到的是均匀分布);当0<T<10 < T < 1时,分布变得更“尖锐”,头部单词的概率被进一步放大

多样化集束搜索

[LiJiwei2016]认为在集束搜索的原理是导致生成结果差别不大的原因。这里举一个搜索宽度bb设置为2的情况:假设在第t1t-1步排序最高的候选词A对应的生成序列概率对数值总和为-1.5,排序第二的候选词B对应的生成序列概率对数值综合为-2.2。现在扩展到第tt步,如果以A为父节点的搜索得到的两个新候选词概率的对数值为-1.0和-1.3,以B为父节点的搜索得到的两个新候选词概率的对数值分别为-0.8和-1.1。尽管但看这一步B分支占有优势,但是由于集束搜索考虑了到该时刻为止,序列中生成的词的概率对数总和,那么A分支的两个节点累积值为-1.5 - 1.0 = -2.5和-1.5 - 1.3 = -2.8,而B分支的两个节点累积值为-2.2 - 0.8 = -3.0和-2.2-1.1 = -3.3,综合排序B分支都被丢弃,后面展开的序列都以A为祖先

为了让类似这样的情况更少发生,[LiJiwei2016]对传统集束搜索做出了一个修改,称为“多样化集束搜索”(diverse beam search,为了与后面介绍的方法区别开,本文称之为“分支内排序多样化集束搜索”),即在打分时将各个候选词在各分支内的排序考虑进来,给历史总分占劣势的分支里高概率候选词一个翻身的机会。更形式化的表示如下:若输入句为XX,集束搜索的宽度为bb,在第t1t-1时刻得到了bb个搜索分支,各分支记为Yk(t1)(1kb)Y_k^{(t-1)} (1 \le k \le b)。在第tt时刻,每个分支产生的候选词再取前bb个,对第kk分支的第kk'个候选词,传统的集束搜索算法打分为

S(Yk(t1),yk,k(t)X)=S(Yk(t1)X)+logP(yk,k(t)X,Yk(t1)) S\left(Y_k^{(t-1)}, y_{k,k'}^{(t)} \big| X\right) = S\left(Y_k^{(t-1)} \big| X\right) + \log P\left(y_{k,k'}^{(t)} \big| X, Y_k^{(t-1)}\right)

分支内排序多样化集束搜索在此基础上添加了一项

S^(Yk(t1),yk,k(t)X)=S(Yk(t1),yk,k(t)X)γk \hat{S}\left(Y_k^{(t-1)}, y_{k,k'}^{(t)} \big| X\right) = S\left(Y_k^{(t-1)}, y_{k,k'}^{(t)} \big| X\right) - \gamma k'

对前面的例子,如果使用γ=1\gamma=1的多样化集束搜索,则A分支的两个节点累积值为-1.5 - 1.0 - 1 = -3.5和-1.5 - 1.3 - 2 = -4.8,而B分支的两个节点累积值为-2.2 - 0.8 - 1 = -4.0和-2.2 - 1.1 - 2 = -5.3,接下来会以两个分支的第一个候选词各自展开

前述例子更直观的解释可见下图

分支内排序多样化集束搜索示意图。左边为标准集束搜索

原文还提出了使用强化学习确定超参数γ\gamma的方法,这里不赘述

[Vijayakumar2016]提出了一种类似的多样化集束搜索策略,不过其使用的额外惩罚项与每个候选词在分支内的排名无关,依赖的是更复杂的自定义比较项,且对候选句作了分组(因此本文称其为“分组多样化集束搜索”)。其思路大致为:

  1. 将宽度为bb的集束搜索的结果划分为GG个组,每组包含bb'个候选
  2. 对第1组进行宽度为bb'的、正常的集束搜索,得到的候选句集合记为Y1(t){\bf Y}_1^{(t)}
  3. 对第2至第GG组,记tt时刻组ggkk个候选为Yg,k(t)Y_{g,k}^{(t)}。在进行集束搜索时,额外加入一个惩罚项h=1g1λhΔ(Yg,k(t),Yh(t))\sum_{h=1}^{g-1}\lambda_h\Delta\left(Y_{g,k}^{(t)}, {\bf Y}_h^{(t)}\right),以新的打分函数对每组进行宽度为bb'的集束搜索。这里λh\lambda_h称为“多样化系数”,通常设置在0.2到0.8之间;Δ\Delta是自定义的比较函数,文章称汉明函数(正比于该句标识符数在之前各组中出现的总次数)效果最好
  4. 最终得到的搜索结果为Y(T)=g=1GYg(T){\bf Y}^{(T)} = \bigcup_{g=1}^{G}{\bf Y}_g^{(T)}

fairseq对这两种方法都进行了实现:

  • diversity-rate选项对应于分支内排序多样化集束搜索中,惩罚项的系数γ\gamma
  • diverse-beam-groups选项对应于分组多样化集束搜索中的GG
  • diverse-beam-strength选项对应于分组多样化集束搜索中的λ\lambda

随机搜索

除去正文中讲述的集束搜索和贪婪搜索,还有一种纯随机采样(也称为全分布采样)的搜索方式:softmax得到目标语言在时刻tt各单词的概率以后,不选取最佳nn个候选展开,而是根据该概率分布,随机选取一个单词作为这一步解码的结果。在这之上的变种是指定采样时选取概率最高的kk个输出,在这个范围内做随机采样,称为top-k采样。然而,在不同环境下,top-k词表涵盖的词并不相同

[Holtzman2019]在top-k采样的基础上做了一些修改。文章认为解码时在不同情况下,候选词的概率分布不同。例如对于“China 's capital is ____”,此时Beijing的概率肯定会非常高,远超其他所有单词,如果使用top-k采样而且k设置得太大,会可能引入不自然的候选词;但是对于“I feel ____”,不同形容词(如sad、happy、frustrated、angry……)的概率又都相近,太小的k会排除掉本该合理的词。因此同样的k,在不同情况下都会多少带来负面影响,不够灵活。文章提出的工作称为nucleus sampling,也可以称作top-p采样,基本思路就是以概率值0<p<10 < p < 1作为超参数,在解码时,对得到的单词按照概率值从高到低排列,遍历单词,逐个累加其对应的概率值,直到累加概率值超过pp停止。将收集到的头部单词按照归一化的概率分布重新采样。实验表明这种方法既可以生成更通顺的结果,也兼顾了多样性的要求,同时有效避免了编码器解码器模型将一个片段重复生成的异常现象

随机搜索是最有效的增加解码器多样性的方法,但是大部分情况下生成的句子都可能不太通顺,比较奇怪。稍微有违直觉的是,这些方法在机器翻译中也有比较重要的应用价值,具体场景将在后面介绍

参考文献

  • [GNMT2016]: Wu, Y., Schuster, M., Chen, Z., Le, Q. V., Norouzi, M., Macherey, W., … & Klingner, J. (2016). Google’s neural machine translation system: Bridging the gap between human and machine translation. arXiv preprint arXiv:1609.08144.
  • [YangYilin2018]: Yang, Y., Huang, L., & Ma, M. (2018). Breaking the Beam Search Curse: A Study of (Re-) Scoring Methods and Stopping Criteria for Neural Machine Translation. In Proceedings of the 2018 Conference on Empirical Methods in Natural Language Processing (EMNLP 2018) (pp. 3054-3059).
  • [Chorowski2016]: Chorowski, J., & Jaitly, N. (2016). Towards better decoding and language model integration in sequence to sequence models. arXiv preprint arXiv:1612.02695.
  • [LiJiwei2016]: Li, J., Monroe, W., & Jurafsky, D. (2016). A simple, fast diverse decoding algorithm for neural generation. arXiv preprint arXiv:1611.08562.
  • [Vijayakumar2016]: Vijayakumar, A. K., Cogswell, M., Selvaraju, R. R., Sun, Q., Lee, S., Crandall, D., & Batra, D. (2016). Diverse beam search: Decoding diverse solutions from neural sequence models. arXiv preprint arXiv:1610.02424.
  • [Holtzman2019]: Holtzman, A., Buys, J., Du, L., Forbes, M., & Choi, Y. (2019). The curious case of neural text degeneration. arXiv preprint arXiv:1904.09751 (Accepted at ICLR 2020 Poster).
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章