论文阅读:《Encode, Tag, Realize_ High-Precision Text Editing》

最近想看一下语法检查的东西,关注到了这一篇谷歌去年出的论文。

参考:
https://arxiv.org/abs/1909.01187
https://zhuanlan.zhihu.com/p/82196470

论文简介

论文提出了一种用于sequence tagging的模型LASERTAGGER,它的基本思想是将文本生成任务转化为3种token操作的组合:keep、delete和add。它使用了bert作为编码器,transformer作为解码器,并将该模型用于 sentence fusion、sentence splitting、abstractive summarization和grammar correction任务中。LASERTAGGER在训练数据量少的情况下依然能达到不错的效果,且速度提升了很多倍。

研究人员是怎么想到的这个方法的呢?其实在很多text generation任务中,output和input有很大重合, 在Incorporating copying mechanism in sequence-to-sequence learning这篇论文中使用了copy机制用于在解码时选择copy一个source端词汇,抑或是生成一个新的词。但是这样的模型依旧需要庞大的训练集以保证解码端的vocabulary size是足够的。

通过研究发现,使用一个相对较小的output tags的集合来表示文本的deletion、rephrasing和reordering,对于生成训练语料中的大部分文本是足够的。这样就会使模型可以使用比较小的vocabulary来训练,并且由于输出长度只跟输入长度有关,就可以使用更少的语料达到精确的结果。

模型的主要流程如下图所式:先使用encode模块构建输入的表示,tag模块产生edit tags,realize模块通过规则将tags转换成输出tokens。

图片

本文提出两种LASERTAGGER架构,一种只使用BERT,另一种使用了BERT encoder+transformer deocder。实验表明LASERTAGGER有更快的推理速度,需要更少的训练语料,相比于seq2seq更可控(因为词表小了),更不易产生hallucination问题(生成的输出不受输入文本支持)。

相关工作

Text Simplification

这个任务很适用edit operations modeling的方法解决。Dong等人提出了一个文本编辑模型,类似于本文,主要差异是:

  • 使用了interpreter module语言模型,来实现本文Realize部分的功能
  • 使用了full vocabulary来生成added tokens,而本文使用了optimized set of frequently added phrases集合

虽然Dong的模型生成更多样化的输出,但它可能会在推理时间、精度和数据效率上产生负面影响。另外一个跟本文相似的论文为Gu等人提出的Levenshtein Transformer模型,通过sequence of deletion and insertion actions来生成文本。

Single-document summarization

这个任务可以使用在token-level和sentence-level上的deletion-based方法解决。也有论文使用了seq2seq做抽象摘要,但其缺陷是产生的操作不仅仅是删除。因此,Jing和McKeown(2000)的工作使用还原、组合、句法转换、词汇释义、泛化和重新排序操作解决。也有论文使用copy机制来使模型更容易复制source端词汇。

Grammatical Error Correction

此类任务需要利用task-specific knowledge,比如无监督得对某类错误类型构造分类器。这种error detection任务也可以使用sequence label方法,或者seq2seq方法(需要大量数据)。

序列标注任务

本文使用的方法是将text edit转换为序列标注的问题,主要包含3个部分:定义tagging operation;将训练数据的plain-text target转换为tagging格式;将tag转变为输出文本。

定义Tagging Operations

基本定义

一个Tag包含两个部分:base tag(KEEP/DELETE) + added phrase(表示在token前需要增加phrase,可以为空)。Added phrase事先在词表V中定义,确保通过在input中加入后可以转换成output。这种tag+phrase的组合定义为B^P,数量大约有2^V个。

不同任务可以有task-specific的tag,比如在sentence fusion任务中可以把SWAP标记添加到第一句话的最后部分(如下图);还比如为了用代词替换命名实体,可以用PRONOMINALIZE标签,在realize阶段通过查找知识库中命名实体的gender信息来用she、he、they替换(这比用she^DELETE, he^DELETE, they^DELETE要好)

图片

优化Phrase Vocabulary

从词表V中选择出一个子集P,使其覆盖到所有候选added phrase且P最大为l,这个问题类似于minimum k-union问题(参考https://xbuba.com/questions/12424155)。可以证明这个问题是NP-hard问题。具体实现时本文时这样做的:先使用最长公共字串将source text和target text对齐,将没对齐的n-grams加入到P中,再从P中选择最频繁出现的l个phrase作为phrase vocabulary。(本文也尝试过使用贪心策略,每次从P中选择对覆盖率增加最多的token,但发现一个问题,如’(‘和’)’这样的token通常成对出现,但增加’(‘和’)’都对覆盖率影响很小,但如果成对增加’()’则会覆盖到很多)

Train targets转Tags

具体算法如下:

图片

本文特别强调了,即便在转换时遇到了想要增加的phrase不在V中,也不会影响整个模型的质量。比如虽然’;’不在V中,也会用’,’替代。

Tags转输出文本

对于不同任务,可以使用不同realization。比如上面提到的关于entity mention的替换方法,可以让我们对于代词的替换更confidence。另外一个优点是specific loss patterns can be addressed by adding specialized realization rules。比如说对于模式entity mention’s,使用his^DELETE,则对于这种模式模型更会DELETE掉entity mention后面的’s。

模型整体框架

模型使用encoder+decoder架构,encoder采用了bert-base架构,用pretrained case-sensitive BERT-base model初始化。原始的bert在encoder logits上做argmax作为解码输出,忽略了解码端前后的dependency。为了更好地建模output tags之间的依赖关系,在bert encoder上面增加一层transformer decoder。在计算decoder和encoder的联系时有两种方式,一种是计算全部的attention activation,另一种是只计算当前step的encoder activation。本文发现使用后一种方法效果更好,速度也更快。整体框架图如下:

图片

实验部分

Sentence Fusion

实验首先分析了不同的vocabulary size对结果的影响,发现vocabulary size上升到一定值后,提升就很小了。

图片

同时也对不同的baseline进行了比较,为了公平,本文也重新训练了一个用BERT结构的seq2seq模型,来说明本文方法的效果。

图片

同时本文也发现,当训练数据量减少到450或4500时,本文方法仍能表现良好。

图片

Abstractive Summarization

图片

Grammatical Error Correction

图片

推理时间比较

图片

质量评测

图片