zoukankan      html  css  js  c++  java
  • 浅谈Transformer 及Attention网络

    1 Transformer 模型结构
    处理自然语言序列的模型有 rnn, cnn(textcnn),但是现在介绍一种新的模型,transformer。与RNN不同的是,Transformer直接把一句话当做一个矩阵进行处理,要知道,RNN是把每一个字的Embedding Vector输入进行,隐层节点的信息传递来完成编码的工作。简而言之,Transformer 直接粗暴(后面Attention也就是矩阵的内积运算等)。

    Attention 的编码,把一个输入序列(x1,...,xn) (x_1,...,x_n)(x
    1

    ,...,x
    n

    )表示为连续序列z=(z1,...,zn) mathbf {z} = (z_1,...,z_n)z=(z
    1

    ,...,z
    n

    ).给定z mathbf {z}z, 解码生成一个输出序列 (y1,...,ym) (y_1,..., y_m)(y
    1

    ,...,y
    m

    ). 模型每一步都是自回归的(?),即假设之前生成的结果都是作为生成下一个符号的额外输入。
    TransFormer 模型使用堆叠的自注意力
    (self-attention)、逐点(point-wise)、全连接层(fully connected layers).

    1.1 堆叠的编码和解码
    编码:编码器由 N=6 个相同的层堆叠成,每层有两个减层(sub-layers)和标准化层。
    解码: 有6个相同层堆叠而成,此外,在解码堆叠中,增加自注意力减层,防止 位置出现偏差。

    1.2 Attention
    NLP领域中,Attention网络基本成为了标配,是Seq2Seq的创新。Attention网络是为了解决编码器-解码器结构存在的长输入序列问题。
    Attention功能可以被描述为将查询和一组键值对映射到输出,其中查询,键,值和输出都是向量。输出可以通过对查血的值加权来计算。


    1.2.1 压缩的点乘注意力机制
    输入:查询(query)、键(维度dk d_kd
    k

    )、值(维度 dv d_vd
    v

    ).
    查询矩阵Q、键矩阵K、值矩阵V
    输出:
    Attention(Q,K,V)=softmax(QKT(dk)√)V Attention(Q,K,V)= softmax(frac{QK^T}{sqrt{(d_k)}})VAttention(Q,K,V)=softmax(
    (d
    k

    )


    QK
    T


    )V

    Attention与RNN/CNN不同,在于Attention,直接将xt x_tx
    t

    与原来的每个词进行比较,最后算出yt y_ty
    t

    ;即
    yt=f(xt,A,B) y_t = f(x_t, Alpha, Beta)y
    t

    =f(x
    t

    ,A,B)
    其中,A,B为另外一个序列或矩阵;如果A=B=X,那么称为 Self Attention.

    举例:


    embedding在进入到Attention之前,有3个分叉,那表示说从1个向量,变成了3个向量Q,K,V,它是通过定义一个WQ矩阵(这个矩阵随机初始化,通过前向反馈网络训练得到),将embedding和WQ矩阵做乘法,得到查询向量q,假设输入embedding是512维,在上图中我们用4个小方格表示,输出的查询向量是64维,上图中用3个小方格以示不同。然后类似地,定义WK和WV矩阵,将embedding和WK做矩阵乘法,得到键向量k;将embeding和WV做矩阵乘法,得到值向量v。对每一个embedding做同样的操作,那么每个输入就得到了3个向量,查询向量,键向量和值向量。需要注意的是,查询向量和键向量要有相同的维度,值向量的维度可以相同,也可以不同,但一般也是相同的。

    至于将获得的Q,K,V矩阵具体操作,总的来说,就是以下这幅图。

    获得的Z和目标值进行比较,获得的损失反向传播,优化的参数是,WQ,WK,WV W_Q, W_K, W_VW
    Q

    ,W
    K

    ,W
    V

    .

    1.2.2 Multi-Head Attention
    MultiHead(Q,K,V)=Concat(head1,...,headh) MultiHead(Q, K, V) = Concat(head_1,...,head_h)MultiHead(Q,K,V)=Concat(head
    1

    ,...,head
    h

    )
    多头注意力机制,只是多做几次同样的事,然后把结果拼接。

    1.3 Position Embedding
    Position Embedding,将每个位置编号,每个编号对应一个向量,这样,Attention可以分辨出不同位置的词了。

    Position Embedding:
    ⎧⎩⎨⎪⎪PE2i(p)=sin(p/100002i/dpos),PE2i+1(p)=cos(p/100002i/dpos) left{egin{array}{lr}PE_{2i}(p) = sin(p/10000^{2i/d_{pos}}), & \PE_{2i+1}(p) = cos(p/10000^{2i/d_{pos}}) & end{array} ight.{
    PE
    2i

    (p)=sin(p/10000
    2i/d
    pos


    ),
    PE
    2i+1

    (p)=cos(p/10000
    2i/d
    pos


    )



    p,代表位置; i,代表维度;
    使用这个公式,在于这个能更好表示相对位置。

    sin(α+β)=sinαcosβ+sinβcosα sin({alpha} + {eta}) = sin{alpha} cos{eta} + sin{eta} cos{alpha}sin(α+β)=sinαcosβ+sinβcosα ,
    cos(α+β)=cosαcosβ−sinαsinβ cos(alpha + eta) = cos{alpha}cos{eta} - sin{alpha}sin{eta}cos(α+β)=cosαcosβ−sinαsinβ
    位置可以由两个位置之间的线性变换得到。

    2 实践
    import numpy as np
    encoder = np.transpose([[3,12,45], [59,2,5], [1,43,5], [4,3,45.3]])
    decoder = np.array([0.5, 0.1, 2])

    #Score Matrix
    def score(encoder, decoder):
    return np.dot(np.transpose(encoder),decoder)

    scoreMatrix = score(encoder, decoder)

    #softmax score matrix
    def softmax(x):
    # x = np.array(x, dtype = np.float128)
    print(np.exp(x))
    print(np.sum(np.exp(x)))
    return np.exp(x)/np.sum(np.exp(x), axis = 0)
    scoreSoftmax = softmax(scoreMatrix)

    #multiply with encoder matrix
    def multiply(x, weight):
    return np.multiply(x, weight)

    weightEncoder = multiply(encoder, scoreSoftmax)

    #get Attention Vector
    def attentionVec(x):
    return np.sum(x, axis = 1)
    att_vec = attentionVec(weightEncoder)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    reference:

    Attention is all you need;
    bojone Attentionn;
    RNN 中的Attention;
    attention kaggle;
    公众号大数据文摘 transformer介绍;
    英文blog,非常详细,5是其译文;
    ---------------------
    作者:rosefun96
    来源:CSDN
    原文:https://blog.csdn.net/rosefun96/article/details/84930540
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    python调试代码好的方法
    Java保留两位小数的几种写法总结
    SPRING BOOT 项目中使用<SCOPE>PROVIDED</SCOPE>打包成WAR到TOMCAT运行出现的问题总结
    Spring Boot整合Thrift RPC
    Thrift语法参考
    Thrift中enum的一些探究
    Thrift入门及Java实例演示
    xcrun: error: unable to find utility "xctest", not a developer tool or in PATH
    Composer: Command Not Found
    Mac安装thrift因bison报错的解决办法
  • 原文地址:https://www.cnblogs.com/jfdwd/p/11202411.html
Copyright © 2011-2022 走看看