论文阅读笔记-Get To The Point: Summarization with Pointer-Generator Networks

news2024/11/27 10:46:25

前言

最近看2021ACL的文章,碰到了Copying Mechanism和Coverage mechanism两种技巧,甚是感兴趣的翻阅了原文进行阅读,Copying Mechanism的模型CopyNet已经进行阅读并写了阅读笔记,如下:
论文阅读笔记:Copying Mechanism缓解未登录词问题的模型–CopyNet
而本篇文章则是讲Coverage mechanism,当然这篇并不是Coverage mechanism最初的技巧原文(最早出现在这一篇:Statistical machine translation),本篇只是将这个技巧进行改进使其更加适用于RNN-base的Seq2Seq模型。Copying Mechanism和Coverage mechanism两个技巧的提出都比较早,但是其应用得当,在特定任务上给模型带来效果提升会令人意想不到。

本论文主要围绕解决Seq2Seq模型应用于摘要生成时主要存在两个问题:

  • 难以准确复述原文的事实细节、无法处理原文中的未登录词(OOV)
  • 生成的摘要中存在重复的片段

对于OOV的问题,一种很自然的想法就是将source doc也纳入输出词的考虑范围,即可以直接从source doc中复制相关相应的token作为输出,这一点在CopyNet中应用的效果很不错。而对于重复词的问题,需要通过一种手段,利用之前所生成的token来影响当前time step的决策(可以认为是已出现的token概率进行惩罚),从而避免产生重复词,不过论文作者为了避免影响模型的效果,对不同的模型任务进行了改进,比如额外加上了coverage loss来将token位置也给考虑进去。

模型细节

在这里插入图片描述

encoder部分采用一个单层双向LSTM,输入原文的词向量序列,输出一个编码后的隐层状态序列 h i h_i hi。decoder部分采用一个单层单向LSTM,每一步的输入是前一步预测的词的词向量,同时输出一个解码的状态序列 s t s_t st,用于当前步的预测。attention具体的计算公式为:
e i t = v T t a n h ( W h h i + W s s t + b a t t n ) e_i^t=v^Ttanh(W_hh_i+W_ss_t+b_{attn}) eit=vTtanh(Whhi+Wsst+battn)
a t = s o f t m a x ( e t ) a_t=softmax(e_t) at=softmax(et)
其中 h i , s t h_i,s_t hi,st分别是source doc进行双向LSTM编码的hidden state和cell state, W , b W,b W,b则是参数。在计算出当前步的attention分布后,对encoder输出的隐层做加权平均,获得输入序列的动态表示,即context-vector:
h t ∗ = ∑ i a i t h i h_t^*=\sum_ia_i^th_i ht=iaithi
在不使用Copy Mechanism的情况下,我们的Seq2Seq是依靠decoder输出的隐层和context-vector,共同决定当前time step预测在词表上的概率分布:
P v o c a b = s o f t m a x ( V ′ ( V [ s t , h t ∗ ] + b ) + b ′ ) P_{vocab}=softmax(V^{'}(V[s_t,h_t^*]+b)+b^{'}) Pvocab=softmax(V(V[st,ht]+b)+b)

Copying Mechanism

而论文则是在预测的每一个time step,通过动态计算一个生成概率 p g e n p_{gen} pgen,巧妙的把seq2seq模型和pointer network结合起来,使得即保留了seq2seq模型保持抽象生成的能力,也保留了pointer network直接从原文中取词的Copy能力:
p g e n = σ ( w h ∗ T h t ∗ + w s T s t + w x T + b p t r ) p_{gen}=\sigma(w_{h^*}^Th_t^*+w_s^Ts_t+w_x^T+b_{ptr}) pgen=σ(whTht+wsTst+wxT+bptr)
P ( W ) = p g e n P v o c a b ( w ) + ( 1 − p g e n ) ∑ i : w i a i t P(W)=p_{gen}P_{vocab}(w)+(1-p_{gen})\sum_{i:w_i}a_i^t P(W)=pgenPvocab(w)+(1pgen)i:wiait
其中, σ \sigma σ 是sigmoid激活函数,这样就直接把seq2seq模型计算的attention分布作为pointer network的输出,源代码实现上通过参数复用,大大降低了模型的复杂度,如下:

with tf.variable_scope('calculate_pgen'):
p_gen = linear([context_vector, state.c, state.h, x], 1, True) # Tensor shape (batch_size, 1)
p_gen = tf.sigmoid(p_gen)
p_gens.append(p_gen)
Coverage mechanism

除此之外,针对重复词问题,论文使用Coverage mechanism,Coverage模型的重点在于预测过程中,维护一个coverage vector:
c t = ∑ t ′ = 0 t − 1 a t ′ c^t=\sum_{t^{'}=0}^{t-1}a^{t^{'}} ct=t=0t1at
这个向量是过去所有预测步计算的attention分布的累加和,记录着模型已经关注过source doc的哪些token,并且让这个coverage vector影响当前time step的attention计算:
e i t = v T t a n h ( W h h i + W s s t + w c c i t + b a t t n ) e_i^t=v^Ttanh(W_hh_i+W_ss_t+w_cc_i^t+b_{attn}) eit=vTtanh(Whhi+Wsst+wccit+battn)
这样做的目的在于,在模型进行当前time step进行attention计算的时候,告诉它之前它已经关注过的token,希望避免出现连续attention到某几个token上的情况。同时,考虑到重复token的位置的影响,coverage模型还添加一个额外的coverage loss,来对重复的attention作惩罚:
c o v l o s s t = ∑ i m i n ( a i t , c i t ) covloss_t=\sum_imin(a_i^t,c_i^t) covlosst=imin(ait,cit)
这样这个loss只会对重复的attention产生惩罚,并不会强制要求模型关注原文中的每一个词。加上词表预测的损失函数采用交叉熵:
l o s s = − 1 T ∑ t = 0 T l o g P ( w t ∗ ) loss=-\frac{1}{T}\sum_{t=0}^TlogP(w_t^*) loss=T1t=0TlogP(wt)
最终,模型的整体损失函数为:
l o s s t = − l o g P ( w t ∗ ) + λ ∑ i m i n ( a i t , c i t ) loss_t=-logP(w_t^*)+\lambda\sum_imin(a_i^t,c_i^t) losst=logP(wt)+λimin(ait,cit)
文章在实验部分提到,如果移除了covloss,单纯依靠coverage vector去影响attention的计算并不能缓解重复token的问题,模型还是会重复地attention到某些token上。而加上covloss的模型训练上也比较trick,需要先用主函数训练好一个收敛的模型,然后再把covloss加上,做个finetune,不然的话效果还是不好。

实验结果

论文用的数据集是CNN/DailyMail数据集,可以看到论文的模型在该任务上有着明显的提升。
在这里插入图片描述
下面是三种模型对同一篇原文生成的摘要,橘色的是最终coverage vector在原文上的分布,红色的是事实细节和OOV问题,绿色的是生成摘要时 p g e n p_{gen} pgen 的大小。
在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

本文模型改善了抽象文本摘要中存在的主要问题,但与具象摘要结果相比仍然存在差距,同时考虑到新闻文章重要信息普遍集中分布于前部分的特性,抽象摘要模型受到了一定影响,模型的普适性需要进一步地验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unocss 添加支持使用本地 svg 预设图标,并支持更改大小

安装 pnpm install iconify/utils 在配置文件 unocss.config.ts: presets > presetIcons 选项中 通过 FileSystemIconLoader 加载本地图标,并指定目录。 import presetWeapp from unocss-preset-weapp import { extractorAttributify, transformer…

NineData云原生智能数据管理平台新功能发布|2024年10月版

10 月发布内容 本月发布 7 项更新,其中重点发布 2 项、功能优化 3 项、性能优化 1 项、其他发布 1 项。 重点发布​ 数据库 Devops - 数据生成​ NineData 支持在数据库中自动生成符合特定业务场景的随机数据,用于模拟实际生产环境中的数据情况&…

10种数据预处理中的数据泄露模式解析:识别与避免策略

在机器学习教学实践中,我们常会遇到这样一个问题:"模型表现非常出色,准确率超过90%!但当将其提交到隐藏数据集进行测试时,效果却大打折扣。问题出在哪里?"这种情况几乎总是与数据泄露有关。 当测试数据在数据准备阶段无意中泄露(渗透)到训练数据时,就会发生数据泄露…

<十六>Ceph mon 运维

Ceph 集群有故障了,你执行的第一个运维命令是什么? 我猜测是ceph -s 。无论执行的第一个命令是什么,都肯定是先检查Mon。 在开始之前我们有必要介绍下Paxos协议,毕竟Mon就是靠它来实现数据唯一性。 一: Paxos 协议 1…

Spring Boot的核心优势及其应用详解

目录 前言1. Spring Boot的核心优势1.1 启动依赖的集成1.2 自动化配置 2. 内嵌服务器支持2.1 内嵌Tomcat服务器2.2 独立运行与便捷部署 3. 外部配置管理3.1 多环境支持3.2 配置优先级与外部化配置 4. Spring Boot的应用场景4.1 微服务架构4.2 云原生应用 结语 前言 在现代的Ja…

8进制在线编码工具--实现8进制编码

具体前往:文本转八进制在线工具-将文本字符串转换为8进制编码,支持逗号,空格和反斜杠分隔符

Windows 命令提示符(cmd)中输入 mysql 并收到错误消息“MySQL不是内部或外部命令,也不是可运行的程序或批处理文件?

目录 背景: 过程: 1.找到MySQL安装的路径 2.编辑环境变量 3.打开cmd,输入mysql --version测试成功 总结: 背景: 很早之前安装了Mysql数据库,想查询一下当前安装的MySQL客户端的版本号,我在命令行界面输入mysql --verion命令回…

Python学习的自我理解和想法(22)

学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第22天,学的内容是正则表达式,明天会出一篇详细实例介绍。电脑刚修好!开学了,时间不多&…

大数据-203 数据挖掘 机器学习理论 - 决策树 sklearn 剪枝参数 样本不均匀问题

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

报错:npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

报错场景 使用npm run dev 报错 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 npm…

Python基于TensorFlow实现双向循环神经网络GRU加注意力机制分类模型(BiGRU-Attention分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的发展,循环神经网络(RNN)及其变种如门控循环…

从APP小游戏到Web漏洞的发现

一、前因: 在对一次公司的一个麻将游戏APP进行渗透测试的时候发现,抓到HTTP请求的接口,但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字,对此感到了好奇。 于是直接解压后everything搜索了一下&#xff…

C++ | Leetcode C++题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMaxLength(vector<int>& nums) {int maxLength 0;unordered_map<int, int> mp;int counter 0;mp[counter] -1;int n nums.size();for (int i 0; i < n; i) {int num nums[i];if …

一个月调研分析标的“英伟达”

放在现在依然成立 一、移动网兴起至今的最佳股票与人工智能时代的目标 9 年移动网兴起至今&#xff0c;若选一只股票长期持有&#xff0c;最佳解是 ARM&#xff08;涨了 20 倍&#xff09;&#xff0c;因为无论系统层和应用层谁胜出&#xff0c;底层一定是芯片&#xff0c;而…

5.Java入门笔记--数组

数组就是一个容器&#xff0c;用来存储一批同种类型的数据。 1.静态初始化数组 定义数组的时候直接给数组赋值。 静态初始化数组的格式&#xff1a; //完整格式 数据类型[] 数组名 new 数据类型[]{元素1,元素2,元素3...}; int [] ages new int[]{12,24,36} double[] scor…

SSM学习 day02

一、vue项目开发流程 vue根组件 <template><div><h1>{{ message }}</h1><element-view></element-view></div> </template><script> import ElementView from ./views/Element/ElementView.vue export default {compon…

OpenGL入门003——使用Factory设计模式简化渲染流程

前面两节已经学会了如何使用opengl创建窗口并绘制三角形&#xff0c;我们可以看出有些步骤是固定的&#xff0c;而且都写在main.cpp&#xff0c;这一节我们将了解如何使用Factroy设计模型。将模型渲染逻辑封装在一个单独的类中&#xff0c;简化开发流程&#xff0c;且提高代码复…

【CSS/SCSS】@layer的介绍及使用方法

目录 基本用法layer 的作用与优点分离样式职责&#xff0c;增强代码可读性和可维护性防止无意的样式冲突精确控制样式的逐层覆盖提高复用性 兼容性实际示例&#xff1a;使用 import 管理加载顺序实际示例&#xff1a;混入与 layer 结合使用 layer 是 CSS 中用于组织和管理样式优…

PHP反序列化原生类字符串逃逸框架反序列化利用

PHP反序列化 概念 序列化的原因&#xff1a;为了解决开发中数据传输和数据解析的一个情况(类似于要发送一个椅子快递&#xff0c;不可能整个椅子打包发送&#xff0c;这是非常不方便的&#xff0c;所以就要对椅子进行序列化处理&#xff0c;让椅子分成很多部分在一起打包发送…