注意力机制之Pointer-Generator Networks

指针生成网络Pointer-Generator Networks

        一个应用是自动文本摘要,即自动地把一段文字压缩为它对应的较短的文本的任务。

文本摘要的主要方式分为两种,一种是抽取式(extractive),另一种是生成式(abstractive)。

抽取式是根据词语重要性、句子重要性排序,抽取出重要度高的句子,从而形成摘要。主要是对文本的选择,过程相对更容易,但是对于复杂的文本时,很难仅仅通过选择文本来形成摘要,如小说。

生成式则是通过自然语言处理,输出简洁、流畅、保留关键信息,更能模拟人进行摘要的过程,涉及到生成文本,过程更为复杂。但生成能力更强,可认为有一定的概括能力。sequence-to-sequence为生成式摘要提供了一种可行的新方法。

        然而,这些模型有两个缺点:它们容易复制事实上的细节不准确,他们倾向于重复自己。另外,在文本生成的方法中,通常由编码器和解码器两个部分组成,这两个部分的词典可以是不一样的,编码器的字典可以大些,解码器的字典可以小些,因为摘要通常都很短,解码器字典小些也有利于运算速度和提高准确率,不在解码器字典的词自然不会被预测出来。

        指针生成网络从两方面做了改进。第一,使用指针生成器网络可以通过指向从源文本中复制单词,这有助于准确复制信息,同时保留generater的生成能力。第二,使用coverage跟踪摘要的内容,不断更新注意力,从而阻止文本不断重复。

base模型

Baseline sequence-to-sequence model with attention:

 decoder形式和[Bahdanau Attention模型][Nallapati Attention模型]差不多,具体有点差异

1 decoder使用单向rnn。同时输入是没有加context_vec的(因为先过lstm再算attention的context_vec的),而Bahdanau模型用的当前轮的context_vec,因为先算好了attention再过lstm)。当然也可以在输入中加入上一轮的context vector,比如可以拼接到原y_t-1再过一个linear层作为新的输入。

注意,如果用的是lstm,则s_t-1应该是decoder_states向量,即lstm hidden拼接ceil向量(h_dec, c_dec = decoder_states    s_t = torch.cat([h_dec, c_dec], dim=2))。

2 这里attention用到的s_t是当前轮而不是上一轮的,所以先计算出了s_t,后面才算attention。

注意,这里v在所有batch和时间步一般是共享参数的。

34 和其它模型都一样

5 输出y_i的计算公式:将上下文向量(context vector) ℎ∗ 和当前步的隐状态s_i( 在原文实现中未考虑ceil向量)拼接,过全连接层后softmax得到预测词的概率分布

具体可以是   

把softmax后概率最大的词作为当前步预测出现的词

Pointer-generator

在base模型基础上额外加了门控生成机制:

        每个译码器时间步,计算一个生成概率p_gen∈[0,1],该概率决定从词汇表生成单词的概率,而不是从源文本复制单词的概率,即p_gen用来决定决定从词汇表生成单词,还是从源文本复制单词的概率,从而对词汇分布和注意力分布进行加权平均。 

其中h_t^*为上下文向量,s_t是当前步的状态向量(在原文实现中包括ceil向量), x_t 为当前步的输入向量。

最终分布由词汇分布和注意分布进行加权和求和得到,并据此进行预测。

如果w是词汇表外(oov)单词,则 P_vocab(w) 为零;同样,如果w未出现在源文档中,则 后一项求和项 是零。指针网络则有复制能力,不再局限于预设词汇表。

指针生成网络具有以下优点:

  1. 指针生成网络让从源文本生成单词变得更加容易。这个网络仅需要将足够多的 attention 集中在相关的单词上,并且让pgen 足够的大。
  2. 指针生成网络甚至可以复制原文本中的非正式单词。这是此方法带给我我们的主要福利,让我们能够处理那些没出现过的单词,同时也允许我们使用更小规模的词汇集(需要较少的计算资源和存储空间)。
  3. 指针生成网络能够被更快地训练,尤其是训练的前几个阶段。

示例

Coverage mechanism(汇聚机制)

        coverage vector,利用注意力分布追踪目前应被覆盖的单词,并且当网络再次注意同一部分的时候予以惩罚。coverage vector对于消除重复非常有效。不过要注意,coverage loss不是在训练一开头就加进去的,而是在训练的末尾才加进去的,作者说,这样的做法可以让模型学得更好,避免coverage目标一开始干扰主目标,毕竟避免重复生成只是一个附带的想法,主目标还是摘要生成。

增加一个coverage vector c^t ,它的值是解码器过往时间步attention分布的和。代表过去时间步对源文词的覆盖程度的分布。

将coverage vector c^t 加到attention机制中:目的是计算当前时间步对源文attention的时候,把之前时间步关注过的情况也考虑进来(例如之前的时间步对源文中某个词的attention总和已经很高了,这时就希望当前步对这个词的attention少一些,避免重复,当然,这是由模型考决定的,希望模型能学习到这些信息),最终目的就是减少重复生成。

这样上面第2步中的

就变成了

此外,每个时间步,增加一个coverage loss到损失函数中,covloss的形式为

假如过往某个词收到关注的程度已经很大,即 c_i^t 很大,而此时间受到的注意力也很大,即 a_i^t也很大,这种情况就会狠狠地受到惩罚。

最终,损失函数的形式为 

模型对比

 上面的是生成式方式,下面的是抽取式方法。

        本文提出的方法表现不如抽取式lead-3的方法(lead-3方法就是从源文里面的前三个句子中抽取重要信息,然后拼接成摘要)。作者提出两个解释,解释一,重要的信息通常在文章的开头。解释二,是文本摘要生成这个任务本质决定的,像文本摘要生成这种任务,天然就比较偏向于从源文摘取信息,所以从得分的表现来说,生成式的不如摘取式的。

图的纵坐标,表示摘要的词语有多少是新的(即在源文中每出现的),可以发现本文提出的PNG网络还是主要以COPY源文的词为主。The baseline model produces more novel n-grams, but many of these are erroneous (see section 7.2).

from:注意力机制之Pointer-Generator Networks

ref:[Get To The Point: Summarization with Pointer-Generator Networks]

[NLP系列之文本生成(一):《Pointer-Generator Networks》论文解读和代码 - 知乎]**

[真正理解指针生成网络 Pointer-Generator Networks - 知乎]

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值