PointerNet和CopyNet
参考:https://cloud.tencent.com/developer/article/1537657
由于时间问题,这里只是简单做个记录,有机会再回来补充。这两个算法是比较经典的解决OOV问题的方法,之后也有很多基于此的工作。应对OOV的三个主要方法:
- 扩大词表:扩大词表后,可以将部分低频词纳入了词表,但是这些低频词由于缺乏足够数量的语料,训练出来的词向量往往效果不佳,所以扩大词表在提升模型的效果方面,存在一定的瓶颈。
- 指针拷贝网络
- 字向量/n-gram:中文任务使用字向量(例如BERT),英文任务使用n-gram。
这两个算法的思想基本都是利用了Attention机制里的对齐向量a。
Pointer Networks
论文提出了当前文本序列生成模型的三个问题,这三个问题都可以通过使用PtrNet解决:
(1)目标序列的词表,和源序列的词语内容是强相关的。面对不同语言、不同应用场景的任务,往往需要重新构造词表。
(2)词表的长度需要在模型构建之前作为超参数进行配置。如果需要变更词表的长度,就需要重新训练模型。
(3)在部分任务场景里,不允许有OOV的存在
本论文的思路,就是让decoder输出一个由目标序列指向源序列的指针序列。Pointer Networks利用了Attention模型的一个中间变量:对齐系数a。因为对齐系数a表示目标序列当前step和源序列所有step之间的相关性大小,所以我们可以通过选取对齐系数向量a(向量a长度为源序列的step长度)中数值最大的那个维度(每个维度指向源序列的一个step),实现一个从目标序列step到源序列step的指针。最后,根据这个指针指向的源序列的词,直接提取这个词进行输出。
Pointing the Unknown Words
这篇论文将pointer networks在NLP领域的文本摘要任务和翻译任务上进行了落地实践(上一篇并没有)。
论文提出的Pointer Softmax Network模型包含三个主要模块。用通俗的语言解释,如果传统模型效果好,就选择传统模型的输出值进行输出,如果PtrNet模型效果好,就选择PtrNet模型的输出值进行输出,然后需要有一个开关网络来判断,传统模型效果好还是PtrNet模型效果好。这三个模块的描述如下:
- Shortlist Softmax:这个模块由传统的Attention Mechanism实现,输出一个在词表里的词的条件概率。这个模块需要维护一个固定大小的词表。
- Location Softmax:这个模块利用了Attention Mechanism的对齐系数a。对齐系数a的向量长度是源序列的step长度,并且对齐系数a每个维度的值,表示decoder当前step输出源序列每个step的概率大小。我们就可以在对齐系数a的各个维度中,取出数值最大的那个维度,作为decoder当前step的指针,这个维度上的值就是其概率大小。
- Switching Network:前面两个模块的公式里的p(z)项,就是由SwitchingNetwork模块生成输出的。Switching Network模型通过p(z)选择是采纳ShortlistSoftmax输出的预测词,还是采纳Location Softmax输出的预测词。Switching Network由一个多层感知机MLP实现,并在最后接一个sigmoid激活函数。
额外说明的点:
- 在decoder的公式中,每个step有且仅有一个softmax会生效并输出预测值。这个比较理想化,因为开关网络最后一层接的是sigmoid,不能完全保证输出的是0或者1。所以工程实践估计是采用0.5作为判决门限,来选择使用哪个softmax。
- 虽然引入PtrNet机制会扩大网络规模,增加网络的参数,但是在模型训练环节,反而会让模型收敛得更快。这一点深有体会。
- 要将PtrNet用于翻译任务,需要做一些额外的工作:遇到OOV词时,在使用Location Softmax模块前,会进行两个判定,一个是对OOV词进行查表(法语-英语字典)判断相应的词是否在target和source中同时出现,另一个是查找OOV词是否直接在target和source中同时出现,如果其中一个判定成功,则模型可以使用Location Softmax(逻辑上很麻烦对不对,特别是还要额外引入一个词典)。
Incorporating Copying Mechanism in Seq2Seq Learning
这篇论文提出的CopyNet模型包含两个具有创新点的模块(encoder模块不算在内):
Generate-Mode & Copy-Mode
Generate-Mode& Copy-Mode模块会维护两个词表,一个是传统的词表(但是这个词表不包含UNK),一个是源序列中的词构成的词表。
- 对于传统词表中的词和UNK,模型采用Generate-Mode计算词语输出概率:
其中v是词的onehot表示,W是Generate-Mode的词向量表,s是decoder的状态。公式的意思也就是拿词向量乘以状态s,得到一个分数,再进行归一化,获得概率值。
- 对于源序列词表中的词,模型采用Copy-Mode计算词语输出概率:
其中h是encoder输出的output,w是待训练矩阵,s是decoder的状态。
第一点是:这里词表的长度是源序列中的词去重后的数量,和[2]中源序列的长度不一样。
第二点是:如果目标序列中的词y有在源序列词表中,那么Copy-Mode输出的概率就不为0。y在源序列的各个step中每出现一次,就要根据公式计算一次概率值,最后Copy-Mode输出的概率,等于源序列的所有step中有出现y的概率值之和。
- 最后,模型会将Generate-Mode和Copy-Mode输出的词语概率进行相加汇总,得到最终的词语概率分布。
- State Update
t-1时刻的单词被用来更新t时刻的状态,但是copynet不仅用t-1时刻单词的word_embedding,也用t-1时刻的单词在M中隐藏层状态的具体位置有关。
思路:
(1)CopyNet模型融合了生成式(abstractive)摘要任务和抽取型(extractive)摘要任务的思想。decoder输出的大部分关键词来源于Copy-Mode,这体现了abstractive summarization。然后再由Generate-Mode把语句撸通顺,这体现了extractive summarization。
(2)拷贝机制的本质是提取关键词,这个输出可以作为上游模块,和其它任务相结合,例如文本分类任务。
Get To The Point: Summarization with Pointer-Generator Networks
最好的一篇工作。https://blog.csdn.net/appleml/article/details/87105488
模型结构包含以下几个部分:
传统的带Attention机制的Generator Network:
计算公式和Bahdanau Attention基本一致,差异是:输出层P_vocab用了个两层的MLP。
用于从源序列拷贝词语的Pointer Network: