之前我们介绍了几个 Insertion-based 的序列生成的方法,使我们跳出传统的从左到右的生成顺序的思维定式。既然有 Insertion 操作,那么一个很自然的想法就是,我们能不能再加入一个 deletion 操作呢?这样我们不仅能生成序列,还可以修改生成的序列,岂不美哉?Gu et al. (2019) 就针对这种想法提出了 Levenshtein Transformer 的模型。Levenshtein Distance 我们不陌生,也就是编辑距离,这里面涉及到三种操作:insertion、deletion、replace,严格意义上来讲 replace 实际上就是 insertion 和 deletion 的组合,所以 LevT 模型只用到了插入和删除操作。
1. Abstract Framework
LevT 不同于一般的生成模型,它不仅可以生成序列,还可以修改序列。这样的话他应该算是 generation model 和 refinement model 的组合体,比如,如果 解码端初始化是一个序列,那么该模型就是普通的生成模型;而如果解码端初始化是一段低质量的序列,那么该模型可以通过插入和删除操作将输入序列修改成一段高质量的序列,比如翻译后编辑任务(translation post-editing)。
作者将 generation 和 refinement 两个任务当成一个马尔科夫决策过程(Markov Decision Process, MDP),使用一个五元组来表示:(Y,A,E,R,y0)。
- Y=VNmax —— 表示一个序列集合,其中 V 表示词表;
- aa∈A —— 表示一个行为,A 表示动作集合;
- rr∈R —— 表示回馈,R 表示回馈函数;
- E —— 表示一个主体(agent);
- yy0 —— 表示初始序列,要么为空,要么是由其他模型生成的序列。
马尔科夫决策过程如下:一个主体 E 接受一个行为 aa,得到一个序列 yy, 然后反馈函数 R 度量这个序列与真实的序列的误差:R(y)=−D(y,y⋆)。由于操作基于插入和删除,自然地,我们可以使用 Levenshtein Distance 去度量。主体要采取什么动作则由策略 π 决定:将目前的序列映射成行为概率分布,即 π:Y→P(A)。
LevT 的任务就是给定一个序列 yyk=(y1,y2,…,yn),生成 yyk+1=E(yyk,aak+1),其中 y1 和 yn 分别为 <s> 和 </s>。
注意:在下面的描述中上角标 k,k+1 省略,以及对于条件概率生成,比如机器翻译,源序列输入 x 在下面的公式中也省略了。
删除
πdel(d|i,yy)∼Bernoulli(0,1)删除策略是一个 n 重伯努利分布:输入一个序列 y,对于序列中的每一个元素 yi∈yy 要么保留,要么删除,即 d=1(删除) 或者 d=0(保留)。为了避免 <s> 和 </s> 被删除,这里强制令 πdel(0|0,yy)=πdel(0|n,yy)=1。
插入
相对删除操作,插入就比较复杂了,因为你进要预测插入的词,还要预测插入的位置,我们还希望在同一个位置尽可能多的插入更多的词,这样就相当于模型具有并行的能力。这里作者将插入位置的预测称之为占位符预测(placeholder prediction);将词的预测称之为词预测(token prediction)。
第一步:占位符预测
(yi,yi+1)=πplh(p|i,yy)(yi,yi+1) 表示接下来的词插入到 yi,yi+1 之间。注意这里可以预测多个插入位置。
第二步:词预测
tokens=πtok(t|i,yy)每个位置可以有多个词。
这两个步骤可以看成是 Insertion Transformer 和 masked language model 的混合体。
删除和插入的综合
最后,作者将序列的生成分成三个阶段:① 删除词;② 插入占位符;③ 用词替换占位符。其中每一步都是可以并行处理的。
给定序列 yy=(y0,…,yn),预测行为 a={d0,…,dn⏟删除操作;p0,…,pn−1⏟占位符预测;t10,…,tp00,…,tpn−1n−1⏟词预测}:
π(aa|yy)=∏d1∈ddπdel(di|i,yy)⋅∏pi∈ppπplh(pi|i,y′y′)⋅∏ti∈ttπtok(ti|i,y″y″)其中 y′y′=E(yy,dd),y″y″=E(y′y′,pp)。
2. Levenshtein Transformer
2.1 Model
模型的整体结构仍然采用 Transformer,第 l 个注意力层的状态如下:
hh(l+1)0,...,hh(l+1)n={Ey0+P0,...,Eyn+Pn,l=0TransformerBlockl(hh(l)0,...,hh(l)n),l≠0其中 E∈R|V|×dmodel 表示词向量,P∈RNmax×Nmax 表示位置向量。
从图中我们可以看到,解码器的输出 (hh0,…,hhn) 被传入到三个分类器中:删除分类器、占位符分类器和词分类器。
删除分类器
πdelθ(d|i,yy)=softmax(hhi⋅AT)其中 A∈R2×dmodel。对序列中除了 <s> 和 </s> 之外的所有元素进行分类。
占位符分类器
πplhθ(p|i,yy)=softmax(concate(hhi,hhi+1)⋅BT)其中 B∈R(Kmax+1)×(2dmodel),(0∼Kmax) 表示在当前位置上插入占位符的个数,本文中占位符用
[PLH]
表示。比如 (A,D)→(A,[PLH],[PLH],D)。词分类器
πtokθ(t|i,yy)=softmax(hhi⋅CT)其中 C∈R|V|×dmodel。
2.2 Dual-policy Learning
接下来一个关键的问题是,模型怎么学习?最简单的,我们可以用模仿学习。
假设我们现在有一个参考策略 π⋆,这个参考策略要么使用真值,要么可以加入少许噪声。我们的目标是最大化以下期望值:
Eyydel∼d˜πdeldd⋆∼π⋆∑d⋆i∈dd⋆logπdelθ(d⋆i|i,yydel)⏟删除操作的目标+Eyyins∼d˜πinspp⋆,tt⋆∼π⋆[∑p⋆i∈pp⋆logπplhθ(p⋆i|i,yyins)+∑t⋆i∈tt⋆logπtokθ(t⋆i|i,y′y′ins)]⏟插入操作的目标其中 y′y′ins 表示在 yy 上插入占位符以后的序列。˜πdel,˜πins 是输入策略,我们不断从由它们导致的状态分布中抽样分布(序列),这些状态首先由参考策略运行,然后返回其行为,我们就是要去最大化这些行为概率。我们有两种方法定义输入策略:① 在真值上加噪; ② 使用对抗策略。如下图所示:
删除操作,我们可以定义:
d˜πdel={yy0,u<αE(E(y′y′,pp⋆),~tt),u≥α其中 yy0 是初始输入,α∈[0,1] 表示我们交替从 yy0 和 y′y′ 中选取样本,u∼U[0,1],y′y′ 是任意准备插入的序列,pp⋆ 取自参考策略, ~tt 取自当前策略。用这种方法,我们既可以学习对初始序列 yy0 如何删除,也可以学习在整个过程中如何对序列删除。
插入操作,类似于删除操作:
d˜πins={E(yy0,dd⋆),dd⋆∼π⋆,u<βE(yy⋆,~dd),~dd∼πRND,u≥β这里 u∼U[0,1],β∈[0,1],πRND 是从真值序列中随机丢弃一个字符。
现在还剩最后一个问题:如何构建参考策略?
Oracle:
aa⋆=argminaaD(yy⋆,E(y,ay,a))其中 D 表示 Levenshtein distance。
Distillation:我们首先训练一个 AR 模型,然后把真值序列 yy⋆ 用 distillation 模型的 beam search 结果 yyAR 进行替换。实验结果表明这个方法是对上一个方法的大幅改进,既可以边生成边修改,又可以并行。
2.3 Inference
在进行推理的时候采用 贪婪解码。解码终止条件有两个:
- Looping:当两次连续的修改操作(插入和删除)返回相同的序列。可能有两个原因:① 没有可插入或者可删除的词了;② 插入和删除相互抵消了,解码过程陷入死循环。
- Timeout:通过设置最大迭代次数保证模型不会在一个较差的结果上耗费过多时间。
另外为了防止不合理的空占位符的出现,作者这里和 Insertion Transformer 一样采取了惩罚措施:从占位符分类器的输出结果中剪掉 γ∈[0,3] 项。
3. Experiments
可以看到,Levenshtein oracle 的效果堪比 Transformer,而加了Transformer distillation之后表现几乎总好于 Transformer,并且还快得多。
另外,由于 LevT 还可以进行 refinement, 因此作者还评估了模型的修改效果,下表 APE(automatic post-editing)) 是实验结果:
左边的结果是 BLEU 值,右边的结果是 TER 翻译错误率。可以看到,LevT 几乎承包了所有任务上的最优结果,表明了这种修改的可行性。
Reference
- Levenshtein Transformer, Jiatao Gu , Changhan Wang & Jake Zhao (Junbo). 2019. arXiv: 1905.11006
- 香侬读 | 按什么套路生成?基于插入和删除的序列生成方法, 香侬科技, 知乎
Gitalking ...