理解LSTM/RNN中的Attention机制

转自:http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享!

导读

目前采用编码器-解码器 (Encode-Decode) 结构的模型非常热门,是因为它在许多领域较其他的传统模型方法都取得了更好的结果。这种结构的模型通常将输入序列编码成一个固定长度的向量表示,对于长度较短的输入序列而言,该模型能够学习出对应合理的向量表示。然而,这种模型存在的问题在于:当输入序列非常长时,模型难以学到合理的向量表示

在这篇博文中,我们将探索加入LSTM/RNN模型中的attention机制是如何克服传统编码器-解码器结构存在的问题的。

通过阅读这篇博文,你将会学习到:

  • 传统编码器-解码器结构存在的问题及如何将输入序列编码成固定的向量表示;
  • Attention机制是如何克服上述问题的,以及在模型输出时是如何考虑输出与输入序列的每一项关系的;
  • 基于attention机制的LSTM/RNN模型的5个应用领域:机器翻译、图片描述、语义蕴涵、语音识别和文本摘要。

让我们开始学习吧。

长输入序列带来的问题

使用传统编码器-解码器的RNN模型先用一些LSTM单元来对输入序列进行学习,编码为固定长度的向量表示;然后再用一些LSTM单元来读取这种向量表示并解码为输出序列。

采用这种结构的模型在许多比较难的序列预测问题(如文本翻译)上都取得了最好的结果,因此迅速成为了目前的主流方法。

例如:

  • Sequence to Sequence Learning with Neural Networks, 2014
  • Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation, 2014

这种结构在很多其他的领域上也取得了不错的结果。然而,它存在一个问题在于:输入序列不论长短都会被编码成一个固定长度的向量表示,而解码则受限于该固定长度的向量表示

这个问题限制了模型的性能,尤其是当输入序列比较长时,模型的性能会变得很差(在文本翻译任务上表现为待翻译的原始文本长度过长时翻译质量较差)。

“一个潜在的问题是,采用编码器-解码器结构的神经网络模型需要将输入序列中的必要信息表示为一个固定长度的向量,而当输入序列很长时则难以保留全部的必要信息(因为太多),尤其是当输入序列的长度比训练数据集中的更长时。”

— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015

使用attention机制

Attention机制的基本思想是,打破了传统编码器-解码器结构在编解码时都依赖于内部一个固定长度向量的限制

Attention机制的实现是通过保留LSTM编码器对输入序列的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时将输出序列与之进行关联

换一个角度而言,输出序列中的每一项的生成概率取决于在输入序列中选择了哪些项。

“在文本翻译任务上,使用attention机制的模型每生成一个词时都会在输入序列中找出一个与之最相关的词集合。之后模型根据当前的上下文向量 (context vectors) 和所有之前生成出的词来预测下一个目标词。

… 它将输入序列转化为一堆向量的序列并自适应地从中选择一个子集来解码出目标翻译文本。这感觉上像是用于文本翻译的神经网络模型需要“压缩”输入文本中的所有信息为一个固定长度的向量,不论输入文本的长短。”

— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015

虽然模型使用attention机制之后会增加计算量,但是性能水平能够得到提升。另外,使用attention机制便于理解在模型输出过程中输入序列中的信息是如何影响最后生成序列的。这有助于我们更好地理解模型的内部运作机制以及对一些特定的输入-输出进行debug。

“论文提出的方法能够直观地观察到生成序列中的每个词与输入序列中一些词的对齐关系,这可以通过对标注 (annotations) 权重参数可视化来实现…每个图中矩阵的每一行表示与标注相关联的权重。由此我们可以看出在生成目标词时,源句子中的位置信息会被认为更重要。”

— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015

大型图片带来的问题

被广泛应用于计算机视觉领域的卷积神经网络模型同样存在类似的问题: 对于特别大的图片输入,模型学习起来比较困难。

由此,一种启发式的方法是将在模型做预测之前先对大型图片进行某种近似的表示。

“人类的感知有一个重要的特性是不会立即处理外界的全部输入,相反的,人类会将注意力专注于所选择的部分来得到所需要的信息,然后结合不同时间段的局部信息来建立一个内部的场景表示,从而引导眼球的移动及做出决策。”

— Recurrent Models of Visual Attention, 2014

这种启发式方法某种程度上也可以认为是考虑了attention,但在这篇博文中,这种方法并不认为是基于attention机制的。

基于attention机制的相关论文如下:

  • Recurrent Models of Visual Attention, 2014
  • DRAW: A Recurrent Neural Network For Image Generation, 2014
  • Multiple Object Recognition with Visual Attention, 2014

基于attention模型的应用实例

这部分将列举几个具体的应用实例,介绍attention机制是如何用在LSTM/RNN模型来进行序列预测的。

1. Attention在文本翻译任务上的应用

文本翻译这个实例在前面已经提过了。

给定一个法语的句子作为输入序列,需要输出翻译为英语的句子。Attention机制被用在输出输出序列中的每个词时会专注考虑输入序列中的一些被认为比较重要的词。

我们对原始的编码器-解码器模型进行了改进,使其有一个模型来对输入内容进行搜索,也就是说在生成目标词时会有一个编码器来做这个事情。这打破了之前的模型是基于将整个输入序列强行编码为一个固定长度向量的限制,同时也让模型在生成下一个目标词时重点考虑输入中相关的信息。

— Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015

Attention在文本翻译任务(输入为法语文本序列,输出为英语文本序列)上的可视化(图片来源于Dzmitry Bahdanau, et al., Neural machine translation by jointly learning to align and translate, 2015)

2. Attention在图片描述上的应用

与之前启发式方法不同的是,基于序列生成的attention机制可以应用在计算机视觉相关的任务上,帮助卷积神经网络重点关注图片的一些局部信息来生成相应的序列,典型的任务就是对一张图片进行文本描述。

给定一张图片作为输入,输出对应的英文文本描述。Attention机制被用在输出输出序列的每个词时会专注考虑图片中不同的局部信息。

我们提出了一种基于attention的方法,该方法在3个标准数据集上都取得了最佳的结果……同时展现了attention机制能够更好地帮助我们理解模型地生成过程,模型学习到的对齐关系与人类的直观认知非常的接近(如下图)。

— Show, Attend and Tell: Neural Image Caption Generation with Visual Attention, 2016

Attention在图片描述任务(输入为图片,输出为描述的文本)上的可视化(图片来源于Attend and Tell: Neural Image Caption Generation with Visual Attention, 2016)

3. Attention在语义蕴涵 (Entailment) 中的应用

给定一个用英文描述的前提和假设作为输入,输出假设与前提是否矛盾、是否相关或者是否成立。

举个例子:

前提:在一个婚礼派对上拍照

假设:有人结婚了

该例子中的假设是成立的。

Attention机制被用于关联假设和前提描述文本之间词与词的关系。

我们提出了一种基于LSTM的神经网络模型,和把每个输入文本都独立编码为一个语义向量的模型不同的是,该模型同时读取前提和假设两个描述的文本序列并判断假设是否成立。我们在模型中加入了attention机制来找出假设和前提文本中词/短语之间的对齐关系。……加入attention机制能够使模型在实验结果上有2.6个点的提升,这是目前数据集上取得的最好结果…

— Reasoning about Entailment with Neural Attention, 2016

Attention在语义蕴涵任务(输入是前提文本,输出是假设文本)上的可视化(图片来源于Reasoning about Entailment with Neural Attention, 2016)

4. Attention在语音识别上的应用

给定一个英文的语音片段作为输入,输出对应的音素序列。

Attention机制被用于对输出序列的每个音素和输入语音序列中一些特定帧进行关联。

…一种基于attention机制的端到端可训练的语音识别模型,能够结合文本内容和位置信息来选择输入序列中下一个进行编码的位置。该模型有一个优点是能够识别长度比训练数据长得多的语音输入。

— Attention-Based Models for Speech Recognition, 2015.

Attention在语音识别任务(输入是音帧,输出是音素的位置)上的可视化(图片来源于Attention-Based Models for Speech Recognition, 2015)

5. Attention在文本摘要上的应用

给定一篇英文文章作为输入序列,输出一个对应的摘要序列。

Attention机制被用于关联输出摘要中的每个词和输入中的一些特定词。

… 在最近神经网络翻译模型的发展基础之上,提出了一个用于生成摘要任务的基于attention的神经网络模型。通过将这个概率模型与一个生成式方法相结合来生成出准确的摘要。

— A Neural Attention Model for Abstractive Sentence Summarization, 2015

Attention在文本摘要任务(输入为文章,输出为文本摘要)上的可视化(图片来源于A Neural Attention Model for Abstractive Sentence Summarization, 2015)

进一步的阅读

如果你想进一步地学习如何在LSTM/RNN模型中加入attention机制,可阅读以下论文:

  • Attention and memory in deep learning and NLP
  • Attention Mechanism
  • Survey on Attention-based Models Applied in NLP
  • What is exactly the attention mechanism introduced to RNN? (来自Quora)
  • What is Attention Mechanism in Neural Networks?

目前Keras官方还没有单独将attention模型的代码开源,下面有一些第三方的实现:

  • Deep Language Modeling for Question Answering using Keras
  • Attention Model Available!
  • Keras Attention Mechanism
  • Attention and Augmented Recurrent Neural Networks
  • How to add Attention on top of a Recurrent Layer (Text Classification)
  • Attention Mechanism Implementation Issue
  • Implementing simple neural attention model (for padded inputs)
  • Attention layer requires another PR
  • seq2seq library

总结

通过这篇博文,你应该学习到了attention机制是如何应用在LSTM/RNN模型中来解决序列预测存在的问题。

具体而言,采用传统编码器-解码器结构的LSTM/RNN模型存在一个问题:不论输入长短都将其编码成一个固定长度的向量表示,这使模型对于长输入序列的学习效果很差(解码效果很差)。而attention机制则克服了上述问题,原理是在模型输出时会选择性地专注考虑输入中的对应相关的信息。使用attention机制的方法被广泛应用在各种序列预测任务上,包括文本翻译、语音识别等。


本文结束,感谢欣赏。

感谢原作者Jason Brownlee。原文链接见:Attention in Long Short-Term Memory Recurrent Neural Networks

 

转载于:https://www.cnblogs.com/baiting/p/8824925.html

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

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

相关文章

[BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)

Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]f[n-1]*10^kn$ 对于每一段位数个数相同的$n$(如$10\sim99,100\sim999,23333\sim66666,1018701389\sim2147483647$),$k$是个定值 然…

HALCON示例程序texture.hdev检测树木

小哥哥小姐姐觉得有用点个赞呗! HALCON示例程序texture.hdev检测树木 示例程序源码(加注释) 关于显示类函数解释 dev_close_window () Interactive : 0 dev_close_window () read_image (MreutHill, ‘mreut_y’) get_image_size (MreutH…

1、python基础速成

基础模块 def prt(age,name):#函数定义 print("%s is %d 年龄 old"%(name,age)) if __name__"__main__":#程序入口 print("Hello World") prt(45,"gaici") 获取输入:使用input()函数 nameinput("you name &#x…

老男孩博客园杨海潮MySQL--MySQL机构逻辑2

转载于:https://blog.51cto.com/yanfeilai528/2103403

法国标致雪铁龙汽车公司采用通快碟片激光器进行焊接

发布日期:2011-10-14 来源:光电新闻网 发布人:星之球科技 摘要:3月11日消息,十一个碟片激光器(disk laser)将安装在标致雪铁龙集团的工厂,这家法国汽车制造商准备使用4千瓦的激光器…

HALCON示例程序vessel.hdev血管的分割与测量

小哥哥小姐姐觉得有用点个赞呗! HALCON示例程序vessel.hdev血管的分割与测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_window (‘off’) dev_close_window () dev_open_window (0, 0, 512, 512, ‘black’, WindowID) set_d…

浙南联合训练赛20180414

这次题目的代码都不长,CF的一贯风格 A - Game CodeForces - 513A Two players play a simple game. Each player is provided with a box with balls. First players box contains exactly n1 balls and second players box contains exactly n2balls. In one move…

Gym 100090D Insomnia

从 n 变到 1&#xff0c;有多少种方案&#xff1f; 打表记忆化。 1 #include <bits/stdc.h>2 3 using namespace std;4 5 int n;6 int dp[1000005];7 int dfs(int n) {8 if(n1)9 return 1; 10 if(dp[n]>0) 11 return dp[n]; 12 int cnt0;…

IP/TCP/UDP/RTP/RTCP 包结构图

IP 包头结构: TCP 包头结构: UDP 包头结构: RTP 包头结构: RTCP 包头结构:

webservices系列(二)——JAX-WS文件上传下载

新建ImgData类&#xff0c;存放文件javabean DataHandler&#xff1a;使用这个类型存放文件 XmlRootElement(name"ImaData") XmlAccessorType(XmlAccessType.FIELD) public class ImgData {private Integer id;XmlMimeType("application/octet-stream")pri…

halcon sobel边缘检测sobel_amp

目录sobel_amp&#xff08;算子&#xff09;描述参数sobel_amp&#xff08;算子&#xff09; sobel_amp - 使用Sobel算子检测边缘&#xff08;幅度&#xff09;。 sobel_amp&#xff08;图片&#xff1a;边缘图像&#xff1a;滤波器方式&#xff0c;掩膜大小:) 描述 sobel_…

es中的一些知识点记录

1. forcemerge接口 强制段合并&#xff0c;设置为1时&#xff0c;是期望最终只有1个索引段。但实际情况是&#xff0c;合并的结果是段的总数会减少&#xff0c;但仍大于1&#xff0c;可以多次执行强制合并的命令。 设置的的目标值越小。合并消耗的时间会越久。 curl -XPOST htt…

通过border来实现各种三角符号

很长时间没有动笔了&#xff0c;最近学的东西很杂很乱&#xff01;又有点丢了西瓜捡芝麻&#xff0c;走马观花&#xff0c;瞻前顾后的感觉&#xff01; 因此&#xff0c;我决定一步步来&#xff0c;化繁为简&#xff0c;今天就从border入手。 很多时候我们都会需要一个三角形或…

MFC封装API

一、Win32Application Architecture 一个Win32 Application Architecture的代码结构如下&#xff1a; LRESULT CALLBACK WinWordsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //定义回调处理消息函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPr…

4.10下午

转载于:https://www.cnblogs.com/yanyuying/p/6690662.html

halcon sobel 边缘检测 sobel_dir

目录sobel_dir&#xff08;算子&#xff09;描述参数sobel_dir&#xff08;算子&#xff09; sobel_dir - 使用Sobel算子检测边缘&#xff08;振幅和方向&#xff09;。 sobel_dir(Image : EdgeAmplitude, EdgeDirection : FilterType, Size : ) 描述 sobel_dir计算图像的一…

【译】x86程序员手册37-第10章 初始化

Chapter 10 Initialization 第10章 初始化 After a signal on the RESET pin, certain registers of the 80386 are set to predefined values. These values are adequate to enable execution of a bootstrap program, but additional initialization must be performed by s…

秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别

本文将带领你与多线程作第一次亲密接触&#xff0c;并深入分析CreateThread与_beginthreadex的本质区别&#xff0c;相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别&#xff0c;在实际的编程中到底应该使用CreateThread还是…

如何传输文件到linux服务器?

我们知道&#xff0c;云主机文件传输是一件相对复杂的事情&#xff0c;经常需要搭建FTP服务器或者是借助其他工具来完成。下面为大家介绍一种简单易操作的传输文件到Linux服务器的方法。 Linux文件传输同Windows文件传输一样&#xff0c;我们为每一台Linux主机配置了一个1G的网…

秒杀多线程第三篇 原子操作 Interlocked系列函数

上一篇《多线程第一次亲密接触 CreateThread与_beginthreadex本质区别》中讲到一个多线程报数功能。为了描述方便和代码简洁起见&#xff0c;我们可以只输出最后的报数结果来观察程序是否运行出错。这也非常类似于统计一个网站每天有多少用户登录&#xff0c;每个用户登录用一个…