提纲
1 简介
2 FELIX
2.1 Tagging
2.2 Insertion
2.3 实验结果
3 总结
参考文献
1. 简介
写这篇文章的目的很单纯,就是想科普下FELIX。其实之前已经写过一篇帖子“文本生成系列之文本编辑”,里面对两个文本编辑模型LASERTAGGER跟FELIX做过一定介绍了,但是发现FELIX貌似没什么热度,网上基本没有相关的文章对它做进一步的解读。我就很郁闷了,这两篇方法都是谷歌出品的,其中有一个作者同时参与了这两篇文章LASERTAGGER是19年提出的方法,而FELIX是21年提出的方法,所以FELIX明显是LASERTAGGER基础上做的改进, 大家为何对它如此冷漠?我实在想不通,所以专门写一篇帖子对它做进一步的解读。
图1:LASERTAGGER跟FELIX在知乎的搜索结果
文本生成任务是自然语言处理中常见的任务,包括机器翻译,文本摘要,句子融合等等。 **目前seq2seq的方法基本占据了这个领域,但是seq2seq在数据效率,推理时间,可控性等问题上存在一定短板,况且对于很多生成任务而言,源文本跟目标文本存在一定重复,在源文本的基础上做下增删改插是不是更加合理一点。于是文本编辑的方法应运而生。**
文本编辑任务其实是在源文本的基础上进行一定的编辑操作,判断哪些token需要保留,哪些token需要被移除,哪些token需要交换位置,哪些位置需要插入新的token等等,所以文本编辑操作本质上是一个序列标注方法,预测各个位置上应该执行的编辑操作,得到相应的文本编辑操作序列后加上一定的规则就可以实现将源文本转换成目标文本。 2019年谷歌提出的文本编辑方法LASERTAGGER提出后也曾火过一阵,那么它的改进版FELIX大家是否也应该关注一下呢?
2. FELIX
不同于LASERTAGGER, **FELIX把整个文本生成任务分解成两部分tagging跟insertion。** 其中tagging负责文本编辑的部分,判断哪些token需要被保留,哪些token被移除,哪些位置需要插入新的token(而LASERTAGGER不仅会预测哪些位置会插入新的token,同时还会预测插入的具体token),同时还要负责调整文本的顺序。而insertion部分主要负责对需要插入新的token的位置预测合适的token,也就是对这些需要插入的位置进行填空。乍看 **之下这种分解的方法貌似很奇怪,像LASERTAGGER那样明明一个模型就可以完成文本生成任务了,为什么要大费周章的把它分解成两个任务呢?这个问题会在文章后面作答。**
图2:FELIX框架图
2.1 tagging
tagging部分其实也分为两个部分,第一个是Tagger,负责预测源文本各个位置的文本编辑操作。另一个是Pointer,负责调整文本的顺序。
首先来看Tagger,FELIX有三种基本的文本编辑操作类型,第一种是KEEP,表示保留这个token,第二种是DELETE,表示删除这个token,第三种是INSERT,表示要插入新的的token。第三种编辑类型不会单独出现,只能跟第一种或者第二种编辑类型组合出现,例如KEEPINSERT表示保留当前位置token并在它前面插入新的token,DELETEINSERT表示删除当前位置token并在它前面插入新的token。(LASERTAGGER的插入编辑操作会同时指定要插入的具体token或者片段)。 另外,为了明确INSERT操作表示的插入token的数量,作者尝试了两种不同做法,一种是Infill,即一个INSERT代表插入固定长度的token,另一种做法是Mask,即在INSERT后面加上相应的后缀表示要插入token的数量,例如INSERT.2就表示要插入2个token。FELIX这里采用的是12层的BERT-base模型+一层全连接层+SoftMax,预测当前位置的token,每个位置都是一个分类任务。源文本通过Tagger后,会得到相同长度的一个文本编辑序列。
图3: INSERT的不同方式
再来看看Pointer, **FELIX采用一个指针网络,将当前位置Tagger的encoder最后一层隐状态跟当前位置Tagger预测的文本编辑操作类型向量和位置向量作为输入,通过attention机制计算相应的下一个位置,进而能实现调整文本的顺序。** 为了避免形成闭环,作者采用了有约束的beam search方法,实现最终只有不到3%的样例会形成闭环。这里可以简单理解为首先从第一个位置开始,寻找最应该衔接在它后面的位置,然后将这个位置当作第二位置,用同样的方式去寻找第三个位置,这样依次进行下去。Pointer每个位置输出的长度都等于文本长度,表示文本中某个位置作为当前位置下一个位置相应的概率,通过搜索加上规则加上源文本很容易得到调整顺序过的文本。
图4: 指针网络工作方式
2.2 insertion
**insertion的输入是经过调整顺序过后的文本,但是这些文本里带有若干【Mask】标记,这是由于文本编辑中的插入操作带来的,所以insertion需要做的事情就是在这些【Mask】位置上预测相应的token,看起来是不是很像MLM预训练任务?insertion采用的也是Bert-base模型,预测出【Mask】位置的token就可以得到最终的目标文本结果。**
2.3 模型效果
论文在句子融合,文本简化,摘要生成,语法纠错四个子任务都做了相关实验,结果就是FELIX在各方面的表现都很优秀,各个指标上都碾压了LASERTAGGER。
图5: 实验结果对比
**除此之外,我觉得需要关注的是,论文比较了使用固定词表的FELIXPOINT(使用LASERTAGGER的词表),不使用固定词表但不使用Pointer的FELIXINSERT和不使用固定词表但使用Pointer的FELIX。**
a). 使用固定词表的方法比不上不使用固定词表的方法。
b). 在数据不足的情况下使用Pointer在效果上有明显提升,但是在数据充足条件下,不使用Pointer的方法稍微领先一点。这里只能说明BERT的强大,只要数据量足够,它连调整文本顺序的能力都可以学到。
另外,关于插入方法Infill跟Mask的比较,可以看到Infill获得更高的标记得分但是更低的插入得分,而Mask刚好相反。这里是因为Mask的方式需要具体预测要插入token的数量,使得标记任务更难,进而相应的标记得分会低点,但是标记任务变难那么后面的插入任务就相对简单点了,所以相应的插入得分会更高点。FELIX的标记得分比FELIXINSERT低但是插入得分更高也是这个道理。
3. 总结
**个人认为,FELIX巧妙的利用了文本编辑方法跟MLM语言模型的优势** ,FELIX把整个文本生成任务分解成文本编辑任务跟MLM任务,利用文本编辑任务能够对源文本做充分的利用,保证可控性,再用预训练模型Bert来预测需要插入的token, **这里的Bert在微调过程中的任务跟它预训练的任务基本是一样,这不就解决了大家经常诟病的MLM语言模型在预训练跟微调过程中的不匹配问题了嘛?** 这也是就是为什么要把任务进行分解的原因吧。这里的分解将难度合理分配到两个模型上去,使得各个模型的难度降低。从结果来看,这种分解方式带来的收益明显高于自带的损失。
我们来看看FELIX是否能解决好seq2seq的几个短板。
a). OOV,一方面有Tagging可以从源文本中复制一定数据,另一方面Insertion的MLM语言模型可以利用非常庞大的词表进行插入,所以OOV不是FELIX的问题。
b). 数据效率,一方面Tagging基本采用的是文本编辑的方法,对数据要求不大,另一方面Insertion使用的是预训练模型Bert,只需要少量数据微调,甚至支持zero-shot。所以数据效率也不是FELIX的问题。
c). 推理时间,Tagging跟Insertion部分采用的都是Bert-base,支持并行化加速。
d). 可控性跟解释性,Tagging限制了后续Insertion的操作范围,Insertion又是预训练模型,具备一定的通用知识能力,保证一定的多样性,所以整体可控。
可以看到FELIX很好的解决了seq2seq方法的常见问题,但是FELIX本身还是有一些可以去继续优化的地方。
a). FELIX两部分模型都用了Bert Base,如何实现彼此之间高效共享?
b). FELIX其实是由两个模型组成,彼此的训练相互独立,如何实现联合训练?
c). 在数据不足情况下如何实现tagging模型部分的无监督预训练?
d). 蒸馏学习?
参考文献
- ( LASERTAGGER,
- Encode, Tag, Realize: High-Precision Text Editing
ht t ps://acla nthology. or g/D19-1510. pdf
(FELIX, 2021) FELIX: Flexible Text Editing Through Tagging and Insertion
https://arxiv. or g/pdf/200
1068 7 . pdf