[NLP/Attention]关于attention机制在nlp中的应用总结

原文链接: https://blog.csdn.net/qq_41058526/article/details/80578932

attention 总结

参考:注意力机制(Attention Mechanism)在自然语言处理中的应用

Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图。

在计算attention时主要分为三步:

  • 第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
  • 第二步一般是使用一个softmax函数对这些权重进行归一化
  • 最后将权重和相应的键值value进行加权求和得到最后的attention
  • 目前在NLP研究中,key和value常常都是同一个,即key=value。
  • Attention在NLP中其实我觉得可以看成是一种自动加权,它可以把两个你想要联系起来的不同模块,通过加权的形式进行联系。目前主流的计算公式有以下几种:

    通过设计一个函数将目标模块mt和源模块ms联系起来,然后通过一个soft函数将其归一化得到概率分布。

  • 目前Attention在NLP中已经有广泛的应用。它有一个很大的优点就是可以可视化attention矩阵来告诉大家神经网络在进行任务时关注了哪些部分。不过在NLP中的attention机制和人类的attention机制还是有所区别,它基本还是需要计算所有要处理的对象,并额外用一个矩阵去存储其权重,其实增加了开销。而不是像人类一样可以忽略不想关注的部分,只去处理关注的部分。

一、传统encoder-decoder模型

encoder-decoder模型

也就是编码-解码模型。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。

具体实现的时候,编码器和解码器都不是固定的,可选的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以自由组合。比如说,你在编码时使用BiRNN,解码时使用RNN,或者在编码时使用RNN,解码时使用LSTM等等。

1.1 encoder

  • 对于输入序列,其会将输入序列如图所示编码成一个context vector c ,encoder一般使用RNN,在RNN中,当前时间的隐藏状态是由上一时间的状态和当前时间输入决定的,也就是
  • 获得了各个时间段的隐藏层以后,再将隐藏层的信息汇总,生成最后的语义向量 c,相当于把整个句子的信息都包含了,可以看成整个句子的一个语义表示。

    其中的f和q是非线性的函数

    例如,在论文中有使用

    来简化计算

1.2 decoder

一般其作用为在给定context vector c和所有已预测的词去预测,故t时刻翻译的结果y为以下的联合概率分布

  • 在RNN中(如上图所示),t时刻隐藏状态为:
  • 而联合条件分布为:

    其中s是输出RNN中的隐藏层,C代表之前提过的语义向量,表示上个时间段的输出,反过来作为这个时间段的输入。而q则可以是一个非线性的多层的神经网络,产生词典中各个词语属于的概率。

1.3 存在问题:

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

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

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

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

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

二、加入attention

论文一:

参考博文:深度学习笔记(六):Encoder-Decoder模型和Attention模型

NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE

??这篇论文中首次将attention用到了nlp领域,论文中提出了一个想法,目前机器翻译的瓶颈在于无论是多长的输入,大家的普遍做法都是将所有输入通过一些方法合并成一个固定长度的向量去表示这个句子,这会造成的问题是,如果句子很长,那么这样的方法去作为decoder的输入,效果并不会很好。

?

该论文提出的加入attention的模型:

??相比于之前的encoder-decoder模型,attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。而且这种方法在翻译任务中取得了非常不错的成果。

1.1 编码(encoder)

此处并没有很多特殊,使用双向LSTM,第j个隐藏状态只能携带第j个单词本身以及之前的一些信息;而如果逆序输入,则包含第j个单词及之后的一些信息。如果把这两个结合起来,就包含了第 j 个输入和前后的信息。

1.2 解码(decoder)

1.2.1 context vector c

解码过程与传统encoder-decoder模型相同,只不过context vector c变为了

其中的是对每一个输入的encoder后的隐状态进行weighted sum(如上图所示)

  • 注:为encoder的隐状态,为decoder的隐状态
  • 的值越高,表示第i个输出在第j个输入上分配的注意力越多,在生成第i个输出的时候受第j个输入的影响也就越大。
  • :encoder i处隐状态和decoder j-1 处的隐状态的匹配 match,此处的 alignment model a 是和其他神经网络一起去训练(即 joint learning),其反映了的重要性

1.2.2 其余部分

其余部分均与传统相同,y的联合概率分布

  • 在RNN中(如上图所示),t时刻隐藏状态为:

1.3 注意力矩阵

之前已经提过,每个输出都有一个长为Tx的注意力向量,那么将这些向量合起来看,就是一个矩阵。对其进行可视化,得到如下结果

其中x轴表示待翻译的句子中的单词(英语),y轴表示翻译以后的句子中的单词(法语)。可以看到尽管从英语到法语的过程中,有些单词的顺序发生了变化,但是attention模型仍然很好的找到了合适的位置。换句话说,就是两种语言下的单词“对齐”了。因此,也有人把注意力模型叫做对齐(alignment)模型。而且像比于用语言学实现的硬对齐,这种基于概率的软对齐更加优雅,因为能够更全面的考虑到上下文的语境。

论文二、

Effective Approaches to Attention-based Neural Machine Translation

这篇论文的看点:扩展attention的计算方式,还有就是局部的attention方法

文中提出了两种注意力机制,global attention和local attention

  • 1.global attention与论文一提到的模型很像,但做了简化
  • 2.local attention是一种介于soft和hard attention之间的模型,他相对于global attention或者soft attention计算量更小,同时不像hard attention,local attention是可微分的
1.global attention

这和上一篇论文提出的attention的思路是一样的,它都是对源语言对所有词进行处理,不同的是在计算attention

矩阵值的时候,他提出了几种简单的扩展版本。在他们最后的实验中general的计算方法效果是最好的。

对比论文一:

2.local attention

灵感来自于图像中的soft attention和hard attention,soft attention对于源图片中每一小块都进行权重的求和,计算较为费时,而hard attention则计算图像区域 a 在时刻 t 被选中作为输入decoder的信息的概率,有且仅有1个区域被选中,它不可微分,需更加复杂的处理。

local attention是一种介于soft和hard之间的方式,使用了一个人工经验设定的参数D去选择一个以为中心,为窗口的区域,进行对应向量的weighted sum,故不像global attention,local alignment vector 的维数是固定的,不随输入序列长度变化而变化,它的维度固定为2D+1

此处使用了两种方法去选择:

  • 1.单调对应(Monotonic alignment): 设定
  • 2.Predictive alignment:
    • 使用去预测所在位置:

      S为输入序列长度,此处保证了一定落在输入序列内

      为权重矩阵

    • 为了使得最后的求和更加的偏好靠近位置 附近的向量,又在求和时加入了一个高斯函数,该函数u =,使得周围的向量得到的权重更大,(s即为一般公式中的x,为u,为高斯分布峰值)

      此处依据经验

3.模型具体实现

将隐状态与进行拼接,产生输出

最后t时刻的输出

此处与论文一不同的点在于Input-feeding Approach

在机器翻译领域,都需要使用一个coverage set(覆盖集)去记录那些source words已经被翻译

  • 论文一中使用的是,其和上一个输出,隐状态一起作为时间t的输入
  • 本文中使用作为输入,但是此处并未做对比试验比较两者的差别

4.结果比较

论文结果中,dot对于global更好,general对于local更好,-m表示Monotonic alignment,-p表示Predictive alignment

4.补充

关于soft attention和hard attention
1.Soft Attention Model

所谓Soft,意思是在求注意力分配概率分布的时候,对于输入句子X中任意一个单词都给出个概率,是个概率分布。

2.Hard Attention Model

既然Soft是给每个单词都赋予一个单词对齐概率,那么如果不这样做,直接从输入句子里面找到某个特定的单词,然后把目标句子单词和这个单词对齐,而其它输入句子中的单词硬性地认为对齐概率为0,这就是Hard Attention Model的思想。

Hard AM在图像里证明有用,但是估计在文本里面用处不大,因为这种单词一一对齐明显要求太高,如果对不齐对后续处理负面影响很大,所以你在NLP的文献里看不到用Hard AM的,估计大家都试过了,效果不好。

3.介于Soft 和Hard之间

Soft AM要求输入句子每个单词都要赋予单词对齐概率,Hard AM要求从输入句子中精确地找到一个单词来和输出单词对齐,那么可以放松Hard的条件,先找到Hard AM在输入句子中单词对齐的那个单词大致位置,然后以这个单词作为轴心,向左向右拓展出一个大小为D的窗口,在这个2D+1窗口内的单词内进行类似Soft AM的对齐概率计算即可。

论文三: ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs

  • 参考资料:

    卷积神经网络介绍

    论文解读

  • 这篇论文就提出了3中在CNN中使用attention的方法,是attention在CNN中较早的探索性工作。
  • 传统的CNN在构建句对模型时如上图,通过每个单通道处理一个句子,然后学习句子表达,最后一起输入到分类器中。这样的模型在输入分类器前句对间是没有相互联系的,作者们就想通过设计attention机制将不同cnn通道的句对联系起来
  • 这篇文章介绍的是利用带注意力机制的卷积神经网络进行句子对建模。句子对建模是自然语言处理中的一个经典问题,在诸如答案选择(Answer Selection, AS)、 释义鉴定(Paraphrase Identification, PI)、文本继承(Textual Entailment, TE)等场景中都有应用。
    • 之前的相关工作多局限于:

      • (1) 设计针对特定场景的特定系统;
      • (2) 对每个句子分开考虑,很少考虑句子之间的影响;
      • (3) 依赖人工设计的繁杂特征。
    • 该模型主要贡献有:
      • (1) 可以应对多种场景的句子对建模问题,泛化能力强;
      • (2) 利用注意力机制,在建模时考虑句子之间的影响;

1.注意力机制

该论文提出了三种注意力机制

1.1 ABCNN-1

两个句子的向量表示进行match生成attention矩阵,在卷积之前,加入attention矩阵,与表示矩阵s一起进行训练。

1.2 ABCNN-2

在卷积后,对于卷积完成的两个矩阵,进行match,match后按照行和列的求和生成两个矩阵各自的权重,再使用权重对其进行

1.3 ABCNN-3

对于1和2的共同使用

2.效果(3>2>1)

本文提出了三种用于卷积神经网络的注意力机制来进行句子对建模,并在三个常见任务上达到了较好的效果,体现了方法的泛化能力。同时也作者也指出,在三个任务上,两层注意力网络并不会明显优于一层注意力网络,可能是由于相关数据集较小的原因。总的来说,在自然语言处理的相关任务上,卷积神经网络上的注意力机制研究相比长短时记忆网络(LSTM)来说还相对较少,本文是一个较为不错的实现方式。

论文四:attention is all you need

参考:一文读懂「Attention is All You Need」| 附代码实现

自然语言处理中的自注意力机制(Self-attention Mechanism)

这篇论文主要亮点在于:

  • 1.不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架。
  • 2.提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。
  • 3.在WMT2014语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快。

原文地址:https://www.cnblogs.com/kk17/p/10274413.html

时间: 2024-08-26 17:51:22

[NLP/Attention]关于attention机制在nlp中的应用总结的相关文章

NLP复习之Attention概述

Preview 这一部分主要对注意力机制(Attention Mechanism)做一个概述,整合一下之前学习的内容,免得遗忘. 来源 注意力机制的设计,或者说命名,是借鉴了人类的注意力机制.人类的注意力机制属于生物的天性之一,无论是视觉还是听觉,都可以让我们在大量信息中筛选并关注高价值信息,获取更多所需要关注目标的细节信息,而抑制其他无用信息,极大地提高了信息处理的效率与准确性. 而应用于深度学习的注意力机制,其核心目标也是在海量信息中挑选出最有价值的信息. Encoder-Decoder(S

自注意力机制在图像中的应用

笔者的毕设是做人脸图像的补全,开始使用经典的变分自编码器模型,能达到比较好的补全效果.后来看到BIGGAN的论文,里边他们使用了self attention提高图片生成的效果,查阅了相关资料后也在模型中加入了自注意力层,确实对补全后的图像有了显著的提升.当然了BIGGAN生成的图片能达到以假乱真的地步也不光是靠加入了自注意力层,具体可以看http://www.twistedwg.com/2018/10/02/BigGAN.html这篇博客里对BIGGAN的解读.本文主要分析为何加入自注意力层可以

页面状态保持机制(编辑中)

在ASPX页面中,每个控件的状态,通过VIEWSTATE进行保持,但前提是必须以回调的方式进行调用.我们的很多页面处理,都是以URL调用的方式进行的,无法使用VIEWSTATE. 在上例的分页处理中,使用了URL参数来传递状态,这种传递方式简单明了,但也存在问题: 1.复杂 2.和其他方式之间的共处存在问题 特别是第二点,在分页中体现得非常明显:既要能通过URL传递,还要允许页面控制,还要能传递新的参数.要实现这一要求,只能借助复杂的处理逻辑来实现了: 这种方式,当页面还有其他参数的时候,就会很

日志机制在编程中的作用

日志: 说白了就是为了恢复(撤销机制) 软件里面不都有撤销ctl+z吗?但是怎么实现的呢?想一下就是记下过程,逆向操作一遍即可. Log4j原理: 一个循环处理过程--日志组,循环使用. DB里面的日志: 一条SQL进行解析之后,形成redo,undo日志,然后操作存储设备(也就是物理的操作过程,直接操作数据块),而逻辑的就是通过SQL操作+数据块操作. 审计:就是为了查账(国家不由审计署吗?干什么的呀) 日志机制在编程中的作用,布布扣,bubuko.com

红茶一杯话Binder (传输机制篇_中)

红茶一杯话Binder (传输机制篇_中) 侯 亮 1 谈谈底层IPC机制吧 在上一篇文章的最后,我们说到BpBinder将数据发到了Binder驱动.然而在驱动层,这部分数据又是如何传递到BBinder一侧的呢?这里面到底藏着什么猫腻?另外,上一篇文章虽然阐述了4棵红黑树,但是并未说明红黑树的节点到底是怎么产生的.现在,我们试着回答这些问题. 1.1 概述 在Binder驱动层,和ioctl()相对的动作是binder_ioctl()函数.在这个函数里,会先调用类似copy_from_user

Java通过反射机制修改类中的私有属性的值

首先创建一个类包含一个私有属性: class PrivateField{ private String username = "Jason"; } 通过反射机制修改username的值: //创建一个类的对象 PrivateField privateField = new PrivateField(); //获取对象的Class Class<?> classType = privateField.getClass(); //获取指定名字的私有域 Field field =

【CV中的Attention机制】BiSeNet中的FFM模块与ARM模块

前言:之前介绍过一个语义分割中的注意力机制模块-scSE模块,效果很不错.今天讲的也是语义分割中使用到注意力机制的网络BiSeNet,这个网络有两个模块,分别是FFM模块和ARM模块.其实现也很简单,不过作者对注意力机制模块理解比较深入,提出的FFM模块进行的特征融合方式也很新颖. 1. 简介 语义分割需要丰富的空间信息和相关大的感受野,目前很多语义分割方法为了达到实时推理的速度选择牺牲空间分辨率,这可能会导致比较差的模型表现. BiSeNet(Bilateral Segmentation Ne

浅谈利用同步机制解决Java中的线程安全问题

我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等着前面千百万人挑选购买,最后心仪的商品下架或者售空......假如饿了吗是单线程程序,那么一个用户得等前面全国千万个用户点完之后才能进行点餐,那饿了吗就该倒闭了不是吗?以上两个简单的例子,就说明一个程序能进行多线程并发访问的重要性,今天就让我们去了解一下Java中多线程并发访问这个方向吧. **第一

MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文 [转]

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API.你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的 MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石. 1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装W