美文网首页
NLP中的Attention机制

NLP中的Attention机制

作者: 骆旺达 | 来源:发表于2020-04-16 18:25 被阅读0次

    Attention机制的通用定义

    如下图所示,Attention从数学角度来形容是一个变量Query到一系列Key-Value对的映射,从公式上描述是根据Query和Key计算Values的加权求和的机制。


    attention解释

    attention计算主要分为三步:
    第一步,是将Query和每个Key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
    第二步,一般是使用一个softmax函数对这些权重进行归一化;
    最后,将权重和相应的键值Value进行加权求和得到最后的attention。
    目前在NLP研究中,key和value常常都是同一个,即key=value。单纯的文字描述很难理解attention,以下从实际算法角度来理解。

    Seq2Seq简要介绍

    接下来,我们以Seq2Seq中的attention作为例子,讲述attention在seq2seq的计算流程。
    (1)什么是Seq2seq模型(常用语翻译的RNN模型)
    Seq2Seq又叫Encoder-Decoder模型,常见于机器翻译。下图是它的基本结构,以一个RNN作为编码器,获得句子的语义向量,以另外一个RNN作为解码器,进行翻译。如图中所展示,我们要翻译“知识就是力量。”这句话。Encoder是一个RNN,将要翻译的话转换成向量特征,输入到Decoder中。


    RNN翻译的基础结构

    (2)语义向量C

    RNN中编码器
    这是Encoder,一个RNN,C是RNN从输入中提取的向量,或者说对 进行一个编码,得到C(上下文向量)。得到C有多种方式,最简单的方法就是把Encoder的最后一个隐状态赋值给C[如图中(1)所示],还可以对最后的隐状态做一个变换得到C[如图中(2)所示],也可以对所有的隐状态做变换得到C[如图中(3)所示]。
    语义向量C的输入方式:作为解码器第一层的输入
    语义向量C的输入方式:作为解码器每一层的输入
    获得C以后,就使用另一个RNN,Decoder解码器,来对编码C进行解码,或者说根据向量C来学习获得正确的输出。上面两图中是两种输入方式,将C当做之前的初始状态h0输入到Decoder中和将C当做每一步的输入。

    attention在seq2seq中的应用

    首先,先进行数学符号的描述。
    (1)在Encoder编码器中,保留每一个RNN单元的隐藏状态(hidden state)h_1,h_2,...,h_N
    (2)在Decoder解码器中,每个一个RNN单元的隐藏状态是由输入和上一步的隐藏状态决定的,假设第t步的隐藏状态记为S_t(下图中的START)

    i)计算attention的第一步:点乘,获得Attention Scores

    dot点积得到图中的Attention Scores
    那么如图所示,在每个第t步利用和(i=1 to N)进行dot点积得到图中的Attention Scores,记为(i=1 to N)。从Attention的通用定义来说,此时就是Query,(i=1 to N)就是一系列Values。

    ii)计算attention的第二步:归一化,求attention distribution

    获得每一个key的权重
    将(i=1 to N)通过Softmax函数来计算每个Encoder的RNN单元所对应Decoder第t步的权重

    iii)计算attention的第三步:获得上下文向量

    上下文向量
    利用来对Encoder的hidden states (i=1 to N)加权求和得到对应Decoder第t步的attention向量

    到这里其实attention的计算就结束了,得到的这个a^t就已经是decoder的第t时刻的注意力向量了(在后面的文章中,这也称作是上下文向量,context vector,符号表示也可能是用c^t来表示的)

    iiii)计算attention的第四步:后续计算

    image.png

    最后将注意力向量a^t,以及decoder的t时刻的hidden state S_t,并联起来,然后做后续的步骤(比如,加个dense全连接层做标签预测之类的)

    Attention的常见结构

    (1)Soft-attention结构


    Soft-attention

    Soft attention也就是上面Seq2Seq讲过的那种最常见的attention,是在求注意力分配概率分布的时候,对于输入句子X中任意一个单词都给出个概率,是个概率分布,把attention变量(context vecor)用c^t表示,attention得分在经过了softmax过后的权值用α_i表示.
    简单来说
    (1)计算attention scores 通过h_iS_t
    (2)获得attention distribution 通过 a_i = softmax(h_iS_t)
    (3)计算S_t对应的上下文向量c_t

    Self-attention

    了解了模型大致原理,我们可以详细的看一下究竟Self-Attention结构是怎样的。其基本结构如下

    Self-attention结构
    对于self-attention来讲,Q(Query), K(Key), V(Value)三个矩阵均来自同一输入。
    (1)首先我们要计算Q与K之间的点乘,得到
    (2)然后,为了防止其结果过大,会除以一个尺度标度。
    (3)再利用Softmax操作将其结果归一化为概率分布。
    (4)然后再乘以矩阵V就得到权重求和的表示。
    该操作可以表示为:

    参考文献

    1、NLP实践九:Attention原理与文本分类代码实践
    2、Attention机制详解(二)——Self-Attention与Transformer

    相关文章

      网友评论

          本文标题:NLP中的Attention机制

          本文链接:https://www.haomeiwen.com/subject/vtddvhtx.html