点击上方,选择星标置顶,每天给你送干货

阅读大概需要17分钟

跟随小博主,每天进步一丢丢

来自 | 数论遗珠

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

PointerNet和CopyNet是同一类网络模型,只是在不同的论文里叫法不同,后文统一用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

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


方便交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

推荐阅读:

【ACL 2019】腾讯AI Lab解读三大前沿方向及20篇入选论文

【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency  Parsing

【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译

【一分钟论文】Semi-supervised Sequence Learning半监督序列学习

【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing

详解Transition-based Dependency parser基于转移的依存句法解析器

经验 | 初入NLP领域的一些小建议

学术 | 如何写一篇合格的NLP论文

干货 | 那些高产的学者都是怎样工作的?

一个简单有效的联合模型

近年来NLP在法律领域的相关研究工作


让更多的人知道你“在看”

NLP硬核入门-PointerNet和CopyNet相关推荐

  1. js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...

    本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...

  2. 程序员需要了解的硬核知识之操作系统入门

    对于程序员来说,最莫大的荣耀莫过于自己的软件被大多数人使用了吧. 历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 程序员需要了解的硬核 ...

  3. 计算机软硬知识有哪些,电脑入门硬核必备知识大全

    计算机视觉是人工智能技术的一个重要领域,打个比方(不一定恰当),我认为计算机视觉是人工智能时代的眼睛,可见其重要程度.计算机视觉其实是一个很宏大的概念,下图是有人总结的计算机视觉所需要的技能树.下面就 ...

  4. 全网最硬核PWN入门_图解分析

    PWN 序 Linux环境下的基础知识 从C源码到可执行文件的生成过程 程序的编译与链接 什么是可执行文件 可执行文件分类PE/ELF ELF文件格式 区分节和段的存储区域 加载ELF / 查看节和段 ...

  5. B站硬核up主稚晖君:对于有志学习嵌入式开发的软件工程师,我有这些建议!...

    稚晖君,何许人也? 本硕就读于电子科技大学 华为AI架构师 热爱硬件开发 B站硬核UP主 "栈溢出"工程师 加入"华为天才少年计划" 或许当你看到这一堆Titl ...

  6. 【20210108期AI简报】技术宅硬核跨年,开源DIY墨水屏日历!

    导读:本期为 AI 简报20210108期,将为您带来 9 条相关新闻,新年新气象,恭祝大家牛年大吉~ 1. 技术宅硬核跨年,DIY墨水屏日历:自动刷新位置.天气,随机播放2000多条「毒鸡汤」| 开 ...

  7. 这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 晓查 发自 凹非寺  本文转自自:量子位(QbitAI) 一个低调的 ...

  8. 真正的全栈工程师!B站硬核UP主自己造了一个激光雷达

    机器之心报道 机器之心编辑部 转载自:机器之心 从零造一个激光雷达,需要多久? 激光雷达(LiDAR)是激光探测及测距系统的简称,目前广泛应用在无人驾驶和扫地机器人等领域.这种广泛的应用一方面得益于激 ...

  9. 十几年后我才知道,嫁了一个硬核老公

    本文转载自 公众号 牛娃成长记 我的闺蜜小雨妈,从小就是个数理内容的小白. 所以,编程从她嘴里说出来的时候,差点没一口水呛着我. 这几年编程教育的确是火,但我没想到,数学从小就不好的小雨妈,竟然比我还 ...

  10. 程序猿必备的硬核知识,你知道哪些?

    这是一本程序员必知的硬核基础知识,这是一本非常入门的经典 PDF,看完能让你对计算机有一个基础的了解和入门,是培养你 内核 的基础,我们看下目录大纲 基本上涵盖了计算机所有基础知识,从 CPU 到内存 ...

最新文章

  1. IaaS、PaaS 和 SaaS:云服务模型概述
  2. AI一分钟 | 特朗普以国家安全为由否决博通收购高通;阿里发起时尚AI算法大赛
  3. 《认知设计:提升学习体验的艺术》——小结
  4. 南通大学16级软嵌班软件工程课程成绩汇总
  5. 影响程序性能的几个关键因素
  6. nginx linux详细安装部署教程,Nginx Linux详细安装及部署实战
  7. JavaScript面向对象之Object类型
  8. Ubuntu运行坦克大战
  9. RK3588超强8K视频输出NRV边缘计算盒 AI人工智能
  10. tomcat9安装及其简单测试
  11. 解读SIM卡、USIM卡、UICC卡、eSIM卡的区别
  12. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)
  13. 天池竞赛赛题-特征工程-天猫用户重复购买预测解析
  14. 锚点是什么?锚点的使用
  15. android加载efi分区,高通Android UEFI XBL 代码流程分析
  16. 滑块JS破解/本地识别DLL
  17. ipsec与服务器协议失败,IPSEC SA无法协商成功
  18. 自京赴奉先县咏怀五百字
  19. vue引入第三方原生js库
  20. 物联网实验-温湿度实时监测系统

热门文章

  1. Oracle的去重函数 distinct
  2. [机器学习] ——KNN K-最邻近算法
  3. android操作XML的几种方式(转)
  4. oracle注意事项
  5. hdu 4351 Digital root
  6. dotNET中创建自定义的配置节
  7. 八.创建型设计模式——Singleton Pattern(单例模式)
  8. 雷声大雨点小-参加江西省网站内容管理系统培训有感
  9. 20190925 On Java8 第二十二章 枚举
  10. c#语法复习总结(1)-浅谈c#.net