原文链接: 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

  • 对于输入序列x=(x1,...,xTx)" role="presentation" style="position: relative;">x=(x1,...,xTx)x=(x1,...,xTx),其会将输入序列如图所示编码成一个context vector c ,encoder一般使用RNN,在RNN中,当前时间的隐藏状态是由上一时间的状态和当前时间输入决定的,也就是

    ht=f(xt,ht−1)" role="presentation" style="position: relative;">ht=f(xt,ht−1)ht=f(xt,ht−1)
  • 获得了各个时间段的隐藏层以后,再将隐藏层的信息汇总,生成最后的语义向量 c,相当于把整个句子的信息都包含了,可以看成整个句子的一个语义表示。

    c=q(ht,...,hTx)" role="presentation" style="position: relative;">c=q(ht,...,hTx)c=q(ht,...,hTx)

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

    例如,在论文中有使用

    q(ht,...,hTx)=hTx" role="presentation" style="position: relative;">q(ht,...,hTx)=hTxq(ht,...,hTx)=hTx

    来简化计算

1.2 decoder

一般其作用为在给定context vector c和所有已预测的词{y1,...,yt−1}" role="presentation" style="position: relative;">{y1,...,yt−1}{y1,...,yt−1}去预测yt" role="presentation" style="position: relative;">ytyt,故t时刻翻译的结果y为以下的联合概率分布

p(y)=∏t=1Tp(yt|{y1,...,yt},c)" role="presentation">p(y)=∏t=1Tp(yt|{y1,...,yt},c)p(y)=∏t=1Tp(yt|{y1,...,yt},c)

  • 在RNN中(如上图所示),t时刻隐藏状态st" role="presentation" style="position: relative;">stst为:

    st=f(st−1,yt−1,c)" role="presentation" style="position: relative;">st=f(st−1,yt−1,c)st=f(st−1,yt−1,c)

  • 而联合条件分布为:

    p(y)=∏t=1Tp(yt|{y1,...,yt},c)=q(yt−1,st,c)" role="presentation">p(y)=∏t=1Tp(yt|{y1,...,yt},c)=q(yt−1,st,c)p(y)=∏t=1Tp(yt|{y1,...,yt},c)=q(yt−1,st,c)

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

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个隐藏状态hj→" role="presentation" style="position: relative;">hj→hj→只能携带第j个单词本身以及之前的一些信息;而如果逆序输入,则hj←" role="presentation" style="position: relative;">hj←hj←包含第j个单词及之后的一些信息。如果把这两个结合起来,hj=[hj→,hj←]" role="presentation" style="position: relative;">hj=[hj→,hj←]hj=[hj→,hj←]就包含了第 j 个输入和前后的信息。

1.2 解码(decoder)

1.2.1 context vector c

解码过程与传统encoder-decoder模型相同,只不过context vector c变为了ci" role="presentation" style="position: relative;">cici



其中的ci" role="presentation" style="position: relative;">cici是对每一个输入的{x1,...,xT}" role="presentation" style="position: relative;">{x1,...,xT}{x1,...,xT}encoder后的隐状态进行weighted sum(如上图所示)

ci=∑j=1Txaijhij" role="presentation" style="position: relative;">ci=∑Txj=1aijhijci=∑j=1Txaijhij

aij=exp(eij)∑k=1Txexp(eik)" role="presentation" style="position: relative;">aij=exp(eij)∑Txk=1exp(eik)aij=exp(eij)∑k=1Txexp(eik)

eij=a(sj−1,hi)" role="presentation" style="position: relative;">eij=a(sj−1,hi)eij=a(sj−1,hi)

  • 注:hj" role="presentation" style="position: relative;">hjhj为encoder的隐状态,sj" role="presentation" style="position: relative;">sjsj为decoder的隐状态
  • aij" role="presentation" style="position: relative;">aijaij的值越高,表示第i个输出在第j个输入上分配的注意力越多,在生成第i个输出的时候受第j个输入的影响也就越大。

  • eij" role="presentation" style="position: relative;">eijeij :encoder i处隐状态和decoder j-1 处的隐状态的匹配 match,此处的 alignment model a 是和其他神经网络一起去训练(即 joint learning),其反映了hj" role="presentation" style="position: relative;">hjhj的重要性

1.2.2 其余部分

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

p(y)=∏t=1Tp(yt|{y1,...,yt},ci)=q(yt−1,st,ci)" role="presentation">p(y)=∏t=1Tp(yt|{y1,...,yt},ci)=q(yt−1,st,ci)p(y)=∏t=1Tp(yt|{y1,...,yt},ci)=q(yt−1,st,ci)
  • 在RNN中(如上图所示),t时刻隐藏状态st" role="presentation" style="position: relative;">stst为:

    st=f(st−1,yt−1,ci)" role="presentation" style="position: relative;">st=f(st−1,yt−1,ci)st=f(st−1,yt−1,ci)

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的计算方法效果是最好的。

at(s)=align(ht,hs)=exp(score(ht,hs))∑s′exp(score(ht,hs′))" role="presentation">at(s)=align(ht,hs)=exp(score(ht,hs))∑s′exp(score(ht,h′s))at(s)=align(ht,hs)=exp(score(ht,hs))∑s′exp(score(ht,hs′))



对比论文一:

aij=exp(eij)∑k=1Txexp(eik)" role="presentation" style="position: relative;">aij=exp(eij)∑Txk=1exp(eik)aij=exp(eij)∑k=1Txexp(eik)

eij=a(sj−1,hi)=vaTtanh(Wasi−1+Uahj)" role="presentation" style="position: relative;">eij=a(sj−1,hi)=vTatanh(Wasi−1+Uahj)eij=a(sj−1,hi)=vaTtanh(Wasi−1+Uahj)

2.local attention

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

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

此处使用了两种方法去选择pt" role="presentation" style="position: relative;">ptpt:

  • 1.单调对应(Monotonic alignment): 设定pt=t" role="presentation" style="position: relative;">pt=tpt=t
  • 2.Predictive alignment:
    • 使用ht" role="presentation" style="position: relative;">htht去预测pt" role="presentation" style="position: relative;">ptpt所在位置:

      S为输入序列长度,此处保证了pt" role="presentation" style="position: relative;">ptpt一定落在输入序列内

      vp,Wp" role="presentation" style="position: relative;">vp,Wpvp,Wp为权重矩阵

      pt=S ∗sigmoid(vpTtanh(Wpht))" role="presentation" style="position: relative;">pt=S ∗sigmoid(vTptanh(Wpht))pt=S ∗sigmoid(vpTtanh(Wpht))
    • 为了使得最后的求和更加的偏好靠近位置pt" role="presentation" style="position: relative;">ptpt 附近的向量,又在求和时加入了一个高斯函数,该函数u =pt" role="presentation" style="position: relative;">ptpt,使得pt" role="presentation" style="position: relative;">ptpt周围的向量得到的权重更大,(s即为一般公式中的x,pt" role="presentation" style="position: relative;">ptpt为u,pt" role="presentation" style="position: relative;">ptpt为高斯分布峰值)

      at(s)=align(ht,hs′)exp(−(s−pt)22σ)" role="presentation" style="position: relative;">at(s)=align(ht,h′s)exp(−(s−pt)22σ)at(s)=align(ht,hs′)exp(−(s−pt)22σ)

      此处依据经验σ=D2" role="presentation" style="position: relative;">σ=D2σ=D2

3.模型具体实现



将隐状态ht" role="presentation" style="position: relative;">htht与ct" role="presentation" style="position: relative;">ctct进行拼接,产生输出

ht′=tanh(Wc[ct;ht])" role="presentation" style="position: relative;">h′t=tanh(Wc[ct;ht])ht′=tanh(Wc[ct;ht])

最后t时刻的输出

p(yt|y&lt;t,x)=softmax(Wch′t)" role="presentation" style="position: relative;">p(yt|y<t,x)=softmax(Wch′t)p(yt|y<t,x)=softmax(Wch′t)

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

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

  • 论文一中使用的是ci" role="presentation" style="position: relative;">cici,其和上一个输出yi−1" role="presentation" style="position: relative;">yi−1yi−1,隐状态si−1" role="presentation" style="position: relative;">si−1si−1一起作为时间t的输入
  • 本文中使用ht′" role="presentation" style="position: relative;">h′tht′作为输入,但是此处并未做对比试验比较两者的差别

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



两个句子的向量表示s0,s1" role="presentation" style="position: relative;">s0,s1s0,s1进行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语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快。

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

  1. NLP学习(5)----attention/ self-attention/ seq2seq/ transformer

    目录: 1. 前提 2. attention (1)为什么使用attention (2)attention的定义以及四种相似度计算方式 (3)attention类型(scaled dot-produc ...

  2. NLP入门(十一)从文本中提取时间

      在我们的日常生活和工作中,从文本中提取时间是一项非常基础却重要的工作,因此,本文将介绍如何从文本中有效地提取时间.   举个简单的例子,我们需要从下面的文本中提取时间: 6月28日,杭州市统计局权 ...

  3. Spring 属性注入(一)JavaBean 内省机制在 BeanWrapper 中的应用

    Spring 属性注入(一)JavaBean 内省机制在 BeanWrapper 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/101174 ...

  4. Nginx多进程高并发、低时延、高可靠机制缓存代理中的应用

    1. 开发背景 现有开源缓存代理中间件有twemproxy.codis等,其中twemproxy为单进程单线程模型,只支持memcache单机版和redis单机版,都不支持集群版功能. 由于twemp ...

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

    红茶一杯话Binder (传输机制篇_中) 侯 亮 1 谈谈底层IPC机制吧 在上一篇文章的最后,我们说到BpBinder将数据发到了Binder驱动.然而在驱动层,这部分数据又是如何传递到BBind ...

  6. Java之通过反射机制选择servlet中的对应的方法

    此方法用于在对Javaee开发中的通过对应的名称而选择servlet中的对应的方法 注:主要代码如下 protected void doGet(HttpServletRequest req, Http ...

  7. OO的片段,继承与组合,继承的优点与目的,虚机制在构造函数中不工作

    摘自C++编程思想: ------------------------------ 继承与组合:接口的重用 ------------------------------- 继承和组合都允许由已存在的类 ...

  8. 浅议Grpc传输机制和WCF中的回调机制的代码迁移

    浅议Grpc传输机制和WCF中的回调机制的代码迁移 一.引子 如您所知,gRPC是目前比较常见的rpc框架,可以方便的作为服务与服务之间的通信基础设施,为构建微服务体系提供非常强有力的支持. 而基于. ...

  9. 【技术博客】JWT的认证机制Django项目中应用

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...

随机推荐

  1. 前端 HTML 常用标签 head标签相关内容

    HTML常用标签 head标签 我们首先来介绍一下head标签的主要内容和作用,文档的头部描述了文档的各种属性和信息,包括文档的标题.编码方式及URL等信息,这些信息大部分是用于提供索引,辩认或其他方 ...

  2. VUX

    1.mapState 2.mapGetters 3. 4. 当你的操作行为中含有异步操作,比如向后台发送请求获取数据,就需要使用action的dispatch去完成.其他使用commit即可. 举个例 ...

  3. CSS 基础知识

    CSS 实例(CSS声明总是以分号(;)结束,声明组以大括号({})括起来:) CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素. 每条声明 ...

  4. myeclipse maven工程调试调试

    1:使用了maven带的tomca插件进行启动.下面讲一下如何进行调试程序 2:在程序中打断点 3:选择>debug>debug configuration 在goals处添加启动命令 4 ...

  5. (转)es进行聚合操作时提示Fielddata is disabled on text fields by default

    根据es官网的文档执行 GET /megacorp/employee/_search { "aggs": { "all_interests": { " ...

  6. [LeetCode] 133. Clone Graph_ Medium tag: BFS, DFS

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

  7. 在Win7系统下, 使用VS2015 打开带有日文注释程序出现乱码的解决方案

    在Win7系统下, 使用VS2015 打开带有日文注释程序出现乱码的解决方案 下载: apploc.msi (下载地址:http://microsoft-applocale.software.info ...

  8. VS中出现“链接器工具错误,XXX工具模块对于SAFESEH映像是不安全的”的解决方法

    1.“调试”菜单->“属性”->“配置属性”->“链接器”->“命令行” 2.在“其它选项”的输入框里输入 /SAFESEH:NO ,点击“应用”

  9. SQL Server 运行状况监控SQL语句

    Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...

  10. 【转】Linux进程绑CPU核

    1. 什么是绑核? 所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity).设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行.但并不是说该进程/线程就独占 ...