zoukankan      html  css  js  c++  java
  • AAAI2018中的自注意力机制(Self-attention Mechanism)

    近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中。随着注意力机制的深入研究,各式各样的attention被研究者们提出,如单个、多个、交互式等等。去年6月,google机器翻译团队在arXiv上的《Attention is all you need》论文受到了大家广泛关注,其中,他们提出的自注意力(self-attention)机制和多头(multi-head)机制也开始成为神经网络attention的研究热点,在各个任务上也取得了不错的效果。在AAAI2018的接收论文中,有30余篇都使用了attention机制,其中有3篇使用到了self-attention。本人就这篇论文中的self-attention以及一些相关工作进行了学习总结(其中也参考借鉴了张俊林博士的博客“深度学习中的注意力机制(2017版)”和苏剑林的“《Attention is All You Need》浅读(简介+代码)”),和大家一起分享。

    一、引言

       Attention机制由视觉图像领域提出来,在2014年,Bahdanau在《Neural Machine Translation by Jointly Learning to Align and Translate》上将其应用到机器翻译任务上,这是第一个应用到NLP领域的论文。之后,15、16、17乃至今年,都有各式各样的attention机制结合深度学习网络模型被用于处理各种NLP的任务。在2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力机制(self-attention)来学习文本表示,脱离传统的RNN/CNN,同时也使用了新颖的multi-head机制。自注意力机制也成为了大家近期研究的热点,可以应用到各种NLP任务上。

      对于传统的机器翻译,我们可以使用sequence to sequence(encoder-decoder)模型来进行翻译,如下图所示。

        这里,我们可以把上图抽象出来得到下图。输入序列{x1, x2, x3, x4},传入编码器(encoder)中进行编码,得到语义编码c,然后通过解码器(decoder)进行解码,得到输出序列{y1, y2, y3},输入与输出的个数可以不相等。

       但是,这种方式会有一个问题:对于长句子的翻译会造成一定的困难,而attention机制的引入可以解决这个问题。如下图所示:

    这里,我们可以看到,decoder中有几个输出序列,对应的语义编码c则有相同的数量,即一个语义编码ci对应一个输出yi。而每个ci就是由attention机制得到,具体公式如下:

    回顾了传统的attention模型之后,我们看一下google翻译团队对attention模型的高度抽取概况。他们将其映射为一个query和一系列<key, value>,最终得到输出attention value的过程。这里的query相当于decoder中的si-1,key与value都来自于encoder的hj,区别在于前后状态的hj。然后计算query与keyi的相似度,并与valuei进行相乘,然后求和。

    上面提到的query与key之间计算相似度有许多方法,如dot、general、concat和MLP等方式,具体公式如下所示。而attention模型抽象为query、key和value之间的相似度计算,总共有3个阶段。第一阶段:query与keyi使用特定的相似度函数计算相似度,得到si;第二阶段:对si进行softmax()归一化得到ai;第三阶段,将ai与valuei对应相乘再求和,得到最终的attention value。其实对比传统的attention公式,我们可以看出,这两套公式还是很像的。

    二、自注意力机制

    下面主要介绍《Attention is all you need》这篇论文,发表在NIPS2017上。这篇论文的创新性在于:(1)不同于以往基于RNN的seq2seq模型框架,该论文使用了attention机制代替了RNN搭建模型;(2)提出了多头注意力机制(multi-head self-attention);(3)在WMT2014语料中,取得了先进结果,并且训练速度要快很多。

    该模型的架构如图所示,依然符合seq2seq的架构,由encoder和decoder组成。在编码器中由许多重复的网络块组成,一个网络块由一个多头attention层和一个前向神经网络组成(而非单独使用attention模型),整个编码器栈式搭建了N个块。Decoder与encoder类似,除了编码器到解码器的学习外,还有解码器到解码器的学习。同时,为了能够更深层次的搭建网络结构,该模型使用了残差结构(Add)和对层的规范化(Norm)。

                    

    本文对基本的attention模型进行了少许改进,提出了缩放点积attention(scaled dot-Product attention)。在使用点积运算进行相似度计算的基础上,缩小了倍(dk为词向量的维度)。其目的在于调节的作用,使得内积不易过大。

    多头attention(Multi-head attention)的结构贺公式如图所示。首先,需要对query、key和value进行一个线性变换;然后输入到缩放点积attention机制,重复做h次,每次的输入为线性变换后的原始输入,这里,多头就是指做多次attention之后进行拼接,每一次算一个头,每次Q、K和V的线性变换参数W是不一样的;最后,将拼接后的模型做一次线性变换,得到的值为多头attention的结果。可以看出,多头attention与传统的attention区别在于计算了h次,这样可以从不同的维度和表示子空间里学习到相关的信息,可通过attention可视化机制来验证。

    在整个模型中,从编码器到解码器的地方中使用了多头attention进行连接,K、V和Q分别是编码器的层输出(这里K=V)和解码器中多头attention的输入,这其实跟主流的机器翻译模型中的attention一样,进行传统的翻译对齐任务。然后,在编码器和解码器中都使用了多头自注意力self-attention来学习文本的表示,K=V=Q,即里面的每个词都要和该句子中的所有词进行attention计算,其主要目的是学习句子内部的词依赖关系,捕获句子中的内部结构。

    这里,要着重说一下位置编码。因为该模型没有使用RNN等序列模型,不能考虑到时序信息,因此,这里拟合了一个位置编码函数,来模拟词语的顺序。实验结果表明,这种方式是合理有效的。

    三、AAAI2018中的self-attention

       在新放出来的AAAI2018的论文中,共计有30余篇使用attention模型处理各种NLP任务,这里,主要介绍使用self-attention机制的三篇论文。

    1、DiSAN: Directional Self-Attention Network for RNN/CNN-Free Language Understanding

       这篇论文是悉尼科技大学UTS的张成奇教授发表的论文,发表在AAAI2018上。该论文旨在提出一种通用框架,在自然语言推理(natural language inference)、情感分析、语义关系(semantic relatedness)、句子分类(sentence classifications)等任务中均取得较好的效果。

    创新点主要有两点:第一,多维度:这里的attention被用于计算每个特征上;第二,方向性:使用一个或多个位置mask对attention进行建模。

      这里,输入序列为x = [x1, x2, ..., xn],词向量维度为de

      首先,对embedding层经过全连接层,得到hidden state:h = [h1, h2, ..., hn],公式如下:

      然后,计算hi与hj之间的相似度函数f(hi, hj),公式如下所示。其中c=5。

    公式里的M为位置编码mask。本文共提出三种位置mask方式,分别为前向(fw)、后向(bw)和对角(diag),公式如下:

              

     然后,对得到的相似度函数f(hi, hj)进行softmax归一化操作,得到(0, 1)之间的数P。接着,对应与输入向量x进行相乘,求和,最终得到输出向量s。

     同时,本文引入门机制。对向量s和隐层状态h进行线性变换后再求和,并进行sigmoid操作,得到F。用门F控制h和s的比例,得到最终的输出向量u。

    本文,在输入向量上,分别使用前向自注意力机制和后向自注意力机制,将两部分的结果进行拼接,并使用多维度的self-attention,最后输出。实验表明,该模型在很多任务中均取得了很好的结果。

    2、Deep Semantic Role Labeling with Self-Attention

       这篇论文来自AAAI2018,厦门大学的工作。将self-attention应用到了语义角色标注任务(SRL)上,看作一个序列标注问题,使用BIO标签进行标注。然后提出使用深度注意力网络(Deep Attentional Neural Network)进行标注,网络结构如下。在每一个网络块中,有一个RNN/CNN/FNN子层和一个self-attention子层组成。最后直接利用softmax当成标签分类进行序列标注。该论文在网络块数为10的时候,取得了较好的结果。

      

    3、Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction

        这篇论文是AndrewMcCallum团队应用self-attention在生物医学关系抽取任务上的一个工作,应该是已经被NAACL2018接收。这篇论文作者提出了一个文档级别的生物关系抽取模型,里面做了不少工作,感兴趣的读者可以更深入阅读原文。我们这里只简单提一下他们self-attention的应用部分。论文模型的整体结构如下图。

    四、总结

        Google提出的self-attention是attention模型的一种特殊形式,是自己学习自己的过程,Q=K=V;提出的multi-head attention是通过计算多次来捕获不同维度不同子空间上的相关信息。Self-attention可以不考虑词与词之间的距离而直接计算依赖关系,能够学习到一个句子的内部结构,能够简单并行的计算,可以脱离CNN和RNN,但是需要合理的考虑和设置位置函数。当然,从AAAI2018年的论文可以看出,self-attention也可以当作一个层,与RNN、CNN和FNN等配合使用,能够更好的解决NLP领域的任务。

    参考文献:

    [1] Vaswani, Ashish, et al. Attention is all you need. Advances in Neural Information Processing Systems. 2017.

    [2] Shen, T.; Zhou, T.; Long, G.; Jiang, J.; Pan, S.; and Zhang, C. Disan: Directional self-attention network for rnn/cnn-free language understanding. AAAI 2018.

    [3] Verga P, Strubell E, McCallum A. Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction. AAAI 2018.

    [4] Tan Z, Wang M, Xie J, et al. Deep Semantic Role Labeling with Self-Attention. AAAI 2018.

     

    参考博客:

    张俊林,深度学习中的注意力机制(2017版),https://blog.csdn.net/malefactor/article/details/78767781

    苏剑林,《Attention is All You Need》浅读(简介+代码),https://kexue.fm/archives/4765

  • 相关阅读:
    Eclipse Clojure 开发插件
    leiningen安装记录
    XX-NET史上最详细完整教程
    使用Chrome浏览器设置XX-net的方法
    Sublime text 3搭建Python开发环境及常用插件安装
    python集合(set)类型的操作
    python编码问题在此终结
    新版的 selenium已经放弃PhantomJS改用Chorme headless
    python爬虫积累(一)--------selenium+python+PhantomJS的使用(转)
    Pyinstaller打包selenium去除chromedriver黑框问题解决!!!
  • 原文地址:https://www.cnblogs.com/demo-deng/p/10716018.html
Copyright © 2011-2022 走看看