端到端序列模型(sequence-to-sequence framework)在最近几年的语法纠错(Grammatical Error Correction,GEC)任务上得到了普遍应用。然而,不像其他序列生成任务,如机器翻译(MT),GEC受限于不够充分的平行语料不能很好的产生效果。本文提出了两种通过增广平行语料的方式来提升GEC模型的效果,在测试集上达到了新的state-of-the-art。
论文地址:
https://arxiv.org/pdf/1904.05780.pdf
引言
语法纠错(Grammatical Error Correction,GEC)任务可以看作是从带有语法错误的源语言到语法规范的目标语言的一种“翻译”任务。这使得神经机器翻译(NMT)模型可以被应用在语法纠错任务上。然而,即使是最大的GEC任务数据集Lang-8,也仅只包含了约25M的词语,对于NMT模型而言,GEC完全是一个低资源任务。因此,如何增强GEC数据集成为了提升效果的一个关键。
数据集
文章使用的增广语料来自于:1、维基百科的历史更新记录,一共包含170M的句子,4.1B的词语;2、回环翻译(Round-trip translation)生成的语料,一共包含176M的句子,4.1B的词语。
本文使用的原始训练集包括:1、Lang-8,一共包含1.9M的句子,25M的词语;2、WikEd,一共包含12M的句子,292M的词语。论文还公开了生成维基百科语料的脚本。
本文使用的测试集来自:1、CoNLL-2014,包含1312条测试句子,使用
M
2
M^2
M2作为评价指标;2、JFLEG,包含747条测试句子,使用GLEU作为评价指标。
脚本地址:
https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/data_generators/wiki_ revision.py
语料增广
论文提出了两种语料增广的方式。
1、使用来自于维基百科的历史修改记录作为增广的语料。实验者们抛弃了大于64Mb的页面,同时为了避免更改次数过大带来的页面冗余,只挑选了
l
o
g
1.5
(
n
)
log_{1.5}(n)
log1.5(n)的页面,其中n为总修改次数。对于挑选出来的页面,采用对齐文本,剔除非文本元素,概率截取的方式抽取语料。
2、使用来自于回环翻译(RTT)的语料。使用在提取维基数据时抛弃的样本作为RTT的启动语料,目的是为了引入噪声。原始语料Y经过Y-X和X-Y的两次翻译得到新的语料Y’,(Y’, Y)组成新的平行语料。为了进一步引入GEC相关的错误,通过概率插入、删除、替换的方式为RTT语料引入噪声。
迭代解码
语料中的许多句子包含了不止一个的语法错误,因此,单次解码不能保证把所有的语法错误全部纠正过来。本文提出了一个迭代解码的算法,使得模型有多次机会选择高置信度的变换纠错,直到找不到任何可以纠正的地方。算法如下:
其中,
C
o
s
t
(
H
)
=
−
l
o
g
P
(
H
∣
S
)
Cost(H)=-logP(H|S)
Cost(H)=−logP(H∣S)。
实验细节
论文使用Transformer模型作为GEC任务的翻译模型。模型在编码端和解码端各使用6层结构,embedding维度为1024,前馈网络FFN层维度为4096。模型采用Adafactor作为优化函数,学习率变化采用inverse squared root decay。和翻译任务一样,模型采用BPE分词方式。
模型在维基百科数据集上训练了5轮,batch大小约为64k。在初始10k步时,模型学习率固定为0.01,之后采用学习率递减的方式继续训练。
在增广数据集上训练结束后,模型又继续在Lang-8标准数据集进行50轮的微调,学习率固定为
3
×
1
0
−
5
3\times10^{-5}
3×10−5。
实验结果
论文报道了在CoNLL-2014和JFLEG测试集上的表现。
结论
语料增广技术对于模型在低资源任务上的效果提升有着非常重要的影响。论文对如何进行高质量的语料增广提出了两种有效的方法。语料增广技术不仅在GEC任务上,在其他任务如翻译任务上也有着至关重要的作用。另外,GEC模型在服务于纠错任务的同时,也可以作为一些自然语言生成任务的后处理模型使用,辅助这些任务产出更高质量的结果。在未来,或许会有越来越多的序列生成任务通过多个模型联合协作来进行。
扫码识别关注,获取更多论文解读