Press "Enter" to skip to content

NLP硬核入门-PointerNet和CopyNet

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

本文需要的前序知识储备是: 注意力机制 Attention Mechanism

 

是同一类网络模型,只是在不同的论文里叫法不同,后文统一用 PtrNet 来表示。

 

1 背景介绍

 

1.1 OOV

 

在 NLP 领域中,由于词表大小的限制,部分低频词无法被纳入词表,这些词即为 OOV ( Out Of Bag )。它们会统一地被 UNK 替代显示,其语义信息也将被丢弃。

 

OOV 难以完全规避,有两个主要原因:

 

( 1 )命名实体常常包含重要的信息,但是许多命名实体也是低频词,常常无法被纳入词表。

 

( 2 )网络新词层出不穷,旧词表无法及时的更新。尤其是在模型越来越大的现状下,加入新词后模型重新训练的成本代价很高。

 

应对 OOV 的三个主要方法

 

( 1 )扩大词表:扩大词表后,可以将部分低频词纳入了词表,但是这些低频词由于缺乏足够数量的语料,训练出来的词向量往往效果不佳,所以扩大词表在提升模型的效果方面,存在一定的瓶颈。

 

( 2 )指针拷贝网络:这正是本文将要介绍的模型。

 

( 3 )字向量 /n-gram :中文任务使用字向量(例如 BERT ),英文任务使用 n-gram 。

 

1.2 PtrNet

 

本文将要介绍的 PtrNet 模型脱胎于 Attention 机制,使用了 Attention 机制里的对齐向量 a 。

 

PtrNet 主要应用于 NLP 的文本摘要任务、对话任务、(特定条件下)的翻译任务,目的在于应对 OOV 问题。

 

本文选取了 4 篇 PtrNet ,我按照论文的发表顺序,分别在本文的 2~5 节进行呈现,以此来介绍 PtrNet 提出、改进和发展的过程。

 

2 Pointer Networks

 

 

图 2.1 PointerNetwork

 

《 Pointer Networks 》论文是 PtrNet 模型的开山之作,发表于 2015 年。

 

论文提出了当前文本序列生成模型的三个问题,这三个问题都可以通过使用 PtrNet 解决:

 

( 1 )目标序列的词表,和源序列的词语内容是强相关的。面对不同语言、不同应用场景的任务,往往需要重新构造词表。

 

( 2 )词表的长度需要在模型构建之前作为超参数进行配置。如果需要变更词表的长度,就需要重新训练模型。

 

( 3 )在部分任务场景里,不允许有 OOV 的存在。

 

本论文的思路,就是让 decoder 输出一个由目标序列指向源序列的指针序列,而如何去选择这个指针,就是论文的主要内容。

 

PtrNet 利用了 Attention 模型的一个中间变量:对齐系数 a 。因为对齐系数 a 表示目标序列当前 step 和源序列所有 step 之间的相关性大小,所以我们可以通过选取对齐系数向量 a (向量 a 长度为源序列的 step 长度)中数值最大的那个维度(每个维度指向源序列的一个 step ),实现一个从目标序列 step 到源序列 step 的指针。最后,根据这个指针指向的源序列的词,直接提取这个词进行输出。

 

通过以上方法,就能够在 decoder 的每一个 step ,从源序列的所有 step 中抽取出一个,进行输出。这样,由于 decoder 输出的是一个指针序号的序列,而不是具体的词,也就没有了 OOV 问题;同时,因为不需要构建词表,就从根本上解决了词表内容和词表长度的问题。

 

很遗憾的,虽然论文中有提及: PtrNet 可以在翻译任务中提取命名实体,在摘要任务中提取关键词,但是论文中并没有更进一步,将 PtrNet 应用于 NLP 任务,而是利用凸包求解问题、旅行商问题进行了实验和论证。

 

3 Pointing the Unknown Words

 

 

图 3.1 PointerSoftmax Network

 

论文《 Pointing the Unknown Words 》发表于 2016 年,将 PtrNet 模型在 NLP 领域的文本摘要任务和翻译任务上进行了落地实践。

 

这篇论文提出的 Pointer Softmax Network 模型包含三个主要模块。用通俗的语言解释,如果传统模型效果好,就选择传统模型的输出值进行输出,如果 PtrNet 模型效果好,就选择 PtrNet 模型的输出值进行输出,然后需要有一个开关网络来判断,传统模型效果好还是 PtrNet 模型效果好。这三个模块的描述如下:

 

( 1 ) Shortlist Softmax :这个模块由传统的 Attention Mechanism 实现,输出一个在词表里的词的条件概率。这个模块需要维护一个固定大小的词表。在下面的公式中, p(w) 就是 ShortlistSoftmax 的输出:

 

 

( 2 ) Location Softmax :这个模块利用了 Attention Mechanism 的对齐系数 a 。对齐系数 a 的向量长度是源序列的 step 长度,并且对齐系数 a 每个维度的值,表示 decoder 当前 step 输出源序列每个 step 的概率大小。我们就可以在对齐系数 a 的各个维度中,取出数值最大的那个维度,作为 decoder 当前 step 的指针,这个维度上的值就是其概率大小。该模块输出词表的大小为输入序列的 step 序列长度。在下面的公式中, p(l) 就是 LocationSoftmax 的输出:

 

 

( 3 ) Switching Network :前面两个模块的公式里的 p(z) 项,就是由 SwitchingNetwork 模块生成输出的。 Switching Network 模型通过 p(z) 选择是采纳 ShortlistSoftmax 输出的预测词,还是采纳 Location Softmax 输出的预测词。 Switching Network 由一个多层感知机 MLP 实现,并在最后接一个 sigmoid 激活函数。 Switching Network 的输出值如下:

 

 

将整个模型拼接起来,公式如下:

 

 

关于这篇论文,还有额外的几点需要说明下:

 

( 1 )在 decoder 的公式中,每个 step 有且仅有一个 softmax 会生效并输出预测值。这个比较理想化,因为开关网络最后一层接的是 sigmoid ,不能完全保证输出的是 0 或者 1 。所以工程实践估计是采用 0.5 作为判决门限,来选择使用哪个 softmax 。

 

( 2 )这篇论文和论文 [4] ,都有提及:虽然引入 PtrNet 机制会扩大网络规模,增加网络的参数,但是在模型训练环节,反而会让模型收敛得更快。

 

( 3 )要将 PtrNet 用于翻译任务,需要做一些额外的工作:遇到 OOV 词时,在使用 Location Softmax 模块前,会进行两个判定,一个是对 OOV 词进行查表(法语 – 英语字典)判断相应的词是否在 target 和 source 中同时出现,另一个是查找 OOV 词是否直接在 target 和 source 中同时出现,如果其中一个判定成功,则模型可以使用 Location Softmax (逻辑上很麻烦对不对,特别是还要额外引入一个词典)。

 

4 Incorporating Copying Mechanism in Seq2Seq Learning

 

 

图 4.1 CopyNet

 

论文《 Incorporating Copying Mechanism in Sequence-to-Sequence Learning 》也发表于 2016 年,将 PtrNet 应用于文本摘要任务和单轮对话任务。

 

(这篇论文的参考资料里包含《 Pointing the Unknown Words 》,所以我将这篇论文排在 [2] 之后)

 

这篇论文提出的 CopyNet 模型包含两个具有创新点的模块( encoder 模块不算在内):

 

( 1 ) Generate-Mode & Copy-Mode

 

CopyNet 把 [2] 中的两个预测输出模块融合到一起去了。

 

Generate-Mode& Copy-Mode 模块会维护两个词表,一个是传统的词表(但是这个词表不包含 UNK ),一个是源序列中的词构成的词表。

 

( a )对于传统词表中的词和 UNK ,模型采用 Generate-Mode 计算词语输出概率:

 

 

 

其中 v 是词的 onehot 表示, W 是 Generate-Mode 的词向量表, s 是 decoder 的状态。公式的意思也就是拿词向量乘以状态 s ,得到一个分数,再进行归一化,获得概率值。

 

这个概率是直接计算出来的,不像 attention 要经过好几层网络。

 

( b )对于源序列词表中的词,模型采用 Copy-Mode 计算词语输出概率:

 

 

 

其中 h 是 encoder 输出的 output , w 是待训练矩阵, s 是 decoder 的状态。

 

需要注意的有两点:

 

第一点是:这里词表的长度是源序列中的词去重后的数量,和 [2] 中源序列的长度不一样。

 

第二点是:如果目标序列中的词 y 有在源序列词表中,那幺 Copy-Mode 输出的概率就不为 0 。 y 在源序列的各个 step 中每出现一次,就要根据公式计算一次概率值,最后 Copy-Mode 输出的概率,等于源序列的所有 step 中有出现 y 的概率值之和。

 

( c )最后,模型会将 Generate-Mode 和 Copy-Mode 输出的词语概率进行相加汇总,得到最终的词语概率分布。

 

 

( 2 ) State Update

 

 

 

在 CopyNet 的 decoder 中,要将 e 与ζ拼接,作为前一个 step 的状态 s ,传入下一个 step 。其中 e 是上一步输出词的词向量,ζ是一个类似上下文的向量。

 

在论文结尾的分析部分,提出了两个很棒的思路和想法:

 

( 1 ) CopyNet 模型融合了生成式( abstractive )摘要任务和抽取型( extractive )摘要任务的思想。 decoder 输出的大部分关键词来源于 Copy-Mode ,这体现了 abstractive summarization 。然后再由 Generate-Mode 把语句撸通顺,这体现了 extractive summarization 。

 

( 2 )拷贝机制的本质是提取关键词,这个输出可以作为上游模块,和其它任务相结合,例如文本分类任务。

 

另外说几个我对这篇论文的吐槽:

 

( 1 )论文读起来比较累,尤其是模型结构图。

 

( 2 ) Generate-Mode 使用的是固定的词向量,没有利用 attention 机制引入上下文信息。

 

( 3 ) Generate-Mode 的计算公式有点冗余,把 OOV 词都标注为 UNK 会简单点,而且我估计模型效果也不会下降。

 

( 4 ) State Update 模块中的ζ,从计算公式来看,很像上下文向量 c 。论文里解释说这个ζ是用来为 Copy-Mode 提供信息的,但是根据 Copy-Mode 的计算公式,其中本来就带有上下文信息和对齐信息了,再加上ζ里的信息就有点多余了。反而是 Generate-Mode 里缺乏上下文信息。并且,论文里没有给出权重ρ的具体计算公式,所以我猜测,这个ζ可能用的就是 attention 的计算公式,实际上起到了给 Generate-Mode 提供上下文信息的作用。

 

( 5 ) State Update 中的 e 使用的是上个 step 输出词的 word embedding ,这样在解码时候,岂不是只能用 greedy search ,而不能用 beam search 了?

 

5 Summarization with Pointer-Generator Networks

 

 

图 5.1 Pointer-GeneratorNetwork

 

论文《 Get To The Point: Summarization with Pointer-Generator Networks 》发表于 2017 年,是一篇很棒的论文,如果只能从本文提及的四篇论文中选一篇来读,我建议读这篇。

 

如论文名所示,本论文模型被应用于文本摘要任务。

 

模型的结构和 [2] 类似,包含以下几个部分:

 

( 1 )传统的带 Attention 机制的 Generator Network :

 

 

 

 

 

计算公式大部分和 Bahdanau Attention 一致,只有一个差异:输出层 P_vocab 用了个两层的 MLP 。

 

( 2 )用于从源序列拷贝词语的 Pointer Network :

 

向量 a^t 代表的是 decoder 在 step t 的对齐向量 a 。对于任意一个词 w , Pointer Network 输出的 w 的概率值,等于输入序列中 所有 等于 w 的词所在的 step ,对应 a^t 的相应维度的概率值的和。

 

Pointer Network 的词表长度,为源序列词语构成的集合的元素个数。

 

( 3 )最后,利用开关网络汇总概率值:

 

 

 

这篇论文还提出了一个创新点: Coverage Mechanism 。这个创新点和本文主题无关,但是又非常经典,所以作个简单的介绍: Coverage Mechanism 通过统计各个词语在历史对齐向量 a 中的出现的概率值的累积和,将累计和分别纳入 Generator Network 公式和惩罚项,以达到解决序列生成任务中,相同文本不停循环出现的问题。

 

这篇论文还非常详尽地描述了调参细节,并给出了一些能够在其它工作中借鉴的思路:

 

( 1 )在模型训练到一定程度后,再使用 Coverage Mechanism 。否则模型容易收敛到局部最优点,影响整体效果。

 

( 2 )传统 Attention 机制的基线模型包含 21,499,600 个参数,训练了 33 个 epochs 。本文模型添加了 1153 个额外的参数,训练了 12.8 个 epochs 。所以合适的模型不但效果好,而且快。

 

( 3 )在模型的训练环节,刚开始的时候,大约有 70% 的输出序列是由 Pointer Network 产生的,随着模型逐渐收敛,这个概率下降到 47% 。然而,在测试环节中,有 83% 的输出序列是由 Pointer Network 产生的。作者猜测这个差异的原因在于:训练环节的 decoder 使用了真实的目标序列。

 

( 4 )虽然 Generator Network 生效的概率不高,但是其依旧不可或缺,例如在下面的几个场合,模型有较大的概率会使用 Generator Network :在句子的开头,在关键词之间的承接文本。

 

( 5 )在摘要任务中,适当地截断句子反而能产生更好的预测效果,原因在于这篇论文用的语料是新闻语料,而新闻语料经常把最重要的内容放在开头。

 

( 6 )作者曾尝试使用一个 15 万长度的大词表,但是并不能显着改善模型效果。

 

参考资料

 

[1] Vinyals O,Fortunato M, Jaitly N. Pointer Networks[J]. Computer Science, 2015, 28.

 

[2] Gulcehre C,Ahn S, Nallapati R, et al. Pointing the Unknown Words[J]. 2016.

 

[3] Gu J , Lu Z, Li H , et al. Incorporating Copying Mechanism in Sequence-to-SequenceLearning[J]. 2016.

 

[4] See A , LiuP J , Manning C D . Get To The Point: Summarization with Pointer-GeneratorNetworks[J]. 2017.

 

由于微信文章 修改字数的限制,故附上知乎文章的链接: https://zhuanlan.zhihu.com/p/73590690

 

后续有更新或纠错,会在知乎文章上呈现。

 

本文转载自公众号: 数论遗珠,作者:阮智昊

 

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注