Attention Is All You Need简记(多头注意

作者: madeirak | 来源:发表于2019-02-22 13:25 被阅读0次

    首先注意力模型可以宏观上理解为一个查询(query)到一系列(键key-值value)对的映射。

    将Source(源)中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target(目标)中的某个元素Query(查询),通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,通过softmax归一化后,对权重和相应Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。目前在NLP研究中,key和value常常都是同一个,即key=value。

    注意力模型可以宏观上理解为一个查询(Query)到一系列(键key-值value)对的映射

    Attention Is All You Need(2017.6)

    放缩点积attention层图示定义式 逐向量来看上图结构

    其中 Z 是归一化因子。K、V 是一一对应的,它们就像是 key-value 的关系,那么上式的意思就是通过 q_t这个 query,通过与各个k_s内积的并 softmax 的方式,来得到 q_t 与各个v_s 的相似度,然后加权求和,得到一个 d_v维的向量。此处在进行q_tv_s相似度计算时,使用点积,除此之外还有拼接,感知机等方式。

    其中因子\sqrt{d_k} 起到调节作用,使得上方内积不至于太大(太大的话 softmax 后就非 0 即 1 了,不够“soft”了)

    多头attention(Multi-head attention)

    多头attention允许模型同时注意来自不同位置的不同表示子空间的信息

    多头attention(Multi-head attention)结构如上图,Query,Key,Value首先进过一个线性变换,然后输入到放缩点积attention,注意这里要做h次,也就是所谓的多头,每一次算一个头,头之间参数不共享,每次Q,K,V进行线性变换的参数W是不一样的。然后将h次的放缩点积attention结果进行拼接,再进行一次线性变换得到的值作为多头attention的结果。

    可以看到,google提出来的多头attention的不同之处在于进行了h次计算而不仅仅算一次,论文中说到这样的好处是可以允许模型在不同的表示子空间里学习到相关的信息。

    自注意力(Self Attention)

    所谓 Self Attention,其实就是 Attention(X,X,X),X 就是前面说的输入序列。Self-attention即K=V=Q,例如输入一个句子,那么里面的每个词都要和该句子中的所有词进行attention计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构。更准确来说,Google 所用的是 Self Multi-Head Attention。

    对于使用自注意力机制的原因,论文中提到主要从三个方面考虑(每一层的复杂度,是否可以并行,长距离依赖学习),并给出了和RNN,CNN计算复杂度的比较。

    1、可以看到,如果输入序列n小于表示维度d的话,每一层的时间复杂度self-attention是比较有优势的。当n比较大时,作者也给出了一种解决方案self-attention(restricted)即每个词不是和所有词计算attention,而是只与限制的r个词去计算attention。

    2、在并行方面,多头attention和CNN一样不依赖于前一时刻的计算,可以很好的并行,优于RNN。

    3、在长距离依赖上,由于self-attention是每个词和所有词都要计算attention,所以不管他们中间有多长距离,最大的路径长度也都只是1。能够无视词之间的距离直接计算依赖关系,能够学习一个句子的内部结构。

    位置嵌入(Position Embedding)

    上述模型并不能学习序列的顺序。换句话说,如果将 K,V 按行打乱顺序(相当于句子中的词序打乱),那么 Attention 的结果还是一样的。学习不到顺序信息,那么效果将会大打折扣(比如机器翻译中,有可能只把每个词都翻译出来了,但是不能组织成合理的句子)。这就引出了位置向量(Position Embedding)。

    将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样 Attention 就可以分辨出不同位置的词了,进而学习位置信息了。

    在Attention Is All You Need一文中,Google直接给出了位置向量构造公式:

    这里的意思是将 id 为 p的位置映射为一个 d_{pos}维的位置向量,这个向量的第i个元素的数值就是 PE_i(p)

    位置向量是绝对位置信息,相对位置信息也很重要。Google 选择前述的位置向量公式的一个重要原因如下:由于我们有 sin(α+β)=sinα·cosβ+cosα·sinβ 以及 cos(α+β)=cosα·cosβ−sinα·sinβ,这表明位置 p+k 的向量可以表示成位置 p、k 的向量的线性变换,这提供了表达相对位置信息的可能性。

    结合位置向量和词向量有几个可选方案,可以把它们拼接起来作为一个新向量,也可以把位置向量定义为跟词向量一样大小,然后两者加起来,Attention Is All You Need使用的是后者。

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

    相关文章

      网友评论

        本文标题:Attention Is All You Need简记(多头注意

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