注意力机制之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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Form-generator是一款强大的表单生成器,它可以帮助开发人员快速生成各种表单。通过集成Form-generator,我们可以在项目中快速搭建起符合业务需求的表单页面。 首先,通过npm或者yarn安装Form-generator,然后在项目的入口文件中引入Form-generator的相关组件。接着,我们可以在需要使用表单的页面中,使用Form-generator提供的表单组件进行布局和配置。 Form-generator提供了丰富的表单元素和校验规则,可以满足各种场景下的需求。我们可以使用Form-generator内置的表单元素,例如输入框、下拉框、复选框等,也可以根据需要自定义表单元素。同时,我们可以根据业务需求配置表单元素的属性,例如必填、只读、禁用等。 在配置表单时,Form-generator还提供了灵活的校验规则设置。我们可以根据需求对表单元素进行校验,例如必填校验、正则表达式校验、长度限制等。同时,Form-generator还支持自定义校验方法,可以根据业务需求实现特定的校验逻辑。 除了基本的表单元素和校验功能外,Form-generator还支持表单布局的配置。我们可以通过配置表单的列数和每列的宽度,来实现灵活的表单布局。这样可以在不同的平台和设备上,提供更好的用户体验。 总的来说,Form-generator集成使得表单的开发变得简单高效。通过通过这个强大的工具,我们可以快速生成各种表单页面,并且能够灵活配置表单元素和校验规则。这大大提高了开发效率,减少了开发人员的工作量。 ### 回答2: form-generator 是一个基于 Vue.js 的表单生成器,可以通过简单的配置生成复杂的表单页面。在前端开发中,表单是非常常见的功能需求,而使用传统的方式一个个手动编写表单元素、布局和校验规则是非常繁琐且耗时的。form-generator 的出现解决了这一问题,通过配置化的方式快速生成表单,极大地提高了开发效率。 form-generator 的集成是指将该组件库融入到具体的项目中,让项目能够使用其中提供的表单生成功能。集成的过程相对简单,通常包括以下几个步骤: 1. 下载和安装:在项目中使用 npm 或 yarn 命令下载 form-generator 的包,并进行安装。 2. 引入和注册:在需要使用表单生成器的页面或组件中,引入 form-generator 的库文件,并在 Vue 实例中注册该组件。 3. 编写表单配置:根据项目的需求,编写表单的配置文件。配置文件通常以 JSON 或 JavaScript 对象的形式存在。配置包括表单的布局、字段名称、类型、校验规则等。 4. 生成表单:在页面中使用 form-generator 组件,并将编写好的表单配置作为组件的 props 属性传入。当页面加载时,form-generator 会根据配置自动展示对应的表单元素。 5. 处理表单提交:监听表单的提交事件,收集表单数据并进行相关处理。 通过上述几个步骤,就成功地将 form-generator 集成到项目中了。使用 form-generator 可以极大地简化表单开发的工作,提高了开发效率和代码质量。而且 form-generator 还支持自定义组件、自定义表单验证规则等高级功能,为表单开发提供了更多的灵活性和扩展性。 ### 回答3: form-generator 是一款基于Vue和Element UI的表单生成工具,帮助开发人员快速构建动态表单。它具有以下几个方面的集成优势。 首先,form-generator 集成了丰富的表单组件。Element UI本身提供了很多常见的表单组件,如输入框、下拉框、日期选择器等,这些组件都可以直接在 form-generator 中使用。同时,开发人员还可以根据业务需求自定义组件,然后将其集成到 form-generator 中,从而实现更复杂的表单功能。 其次,form-generator 集成了表单校验功能。在 form-generator 中设置校验规则非常简单,开发人员只需要在配置项中添加相应的校验规则即可。这些校验规则可以直接应用于各个表单组件,从而实现前端表单的数据校验。 第三,form-generator 集成了数据动态绑定功能。在 form-generator 中,可以通过配置项将表单与后台数据进行绑定,实现数据的自动填充和双向绑定。这样,开发人员就可以很方便地实现表单的数据展示和修改。 最后,form-generator 集成了表单提交功能。在 form-generator 中,可以通过配置项设置表单提交的接口地址和请求方式,实现表单数据的提交和处理。同时,form-generator 还提供了提交前的表单校验功能,确保提交的数据符合要求。 综上所述,form-generator 集成了丰富的表单组件、表单校验功能、数据动态绑定功能和表单提交功能,帮助开发人员快速构建高效的动态表单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值