zoukankan      html  css  js  c++  java
  • Tranformer模型学习

    Word Embedding


    • Word2Vec
    • Glove

    RNN改进与拓展


    • Seq2Seq
    • LSTM/GRU
    • attention/self-attention

    Tranformer模型学习


    全部采用self-attention 层进行编码,引入三个变换矩阵,得到Q K V向量,然后利用词与词之间Q K相乘的结构进行注意力计算,将权重系数乘以V就是新的词向量表示。

    位置向量

    • self-attention计算并没有考虑位置信息,如果将K,V的顺序打乱,获得的Attention的结果还是一样的, 因此要引入位置嵌入
    • 位置嵌入的维度和字向量的维度一致,将每个位置编号,然后每个编号对应这一向量,最后将该向量和词向量相加(注意是相加而不是拼接),这样就给每个词引入了一定的位置信息。

    Multi-head Attention 计算过程

      • 插入最新理解(不一定对)首先词向量经过变换矩阵变成(QKV) ,然后把QKV等分h份,然后经过不同的权重(W_i)变换,得到新的(Q_i,K_i,V_i)
      1. 假设现在头数是(h),首先将向量长度等分为(h)

      2. 然后将等分后的数据通过不同的权重((W_i^Q),(W_i^K),(W_i^V),)映射得到新的(Q,K,W)值,

      3. 将上述映射的h分数据计算相应的attention的值

      4. 按照之前分割的形式重新拼接起来,再映射到原始的向量维度。就可以得到Multi-head-Attention的值

        其实认真来看Multi-Head Attention的机制有点类似与卷积中的多个卷积核,在卷积网络中,我们认为不同的卷积核会捕获不同的局部信息,在这里也是一样,我们认为Multi-Head Attention主要有两个作用

        1)增加了模型捕获不同位置信息的能力,如果你直接用映射前的Q, K, V计算,只能得到一个固定的权重概率分布,而这个概率分布会重点关注一个位置或个几个位置的信息,但是基于Multi-Head Attention的话,可以和更多的位置上的词关联起来。

        2)因为在进行映射时不共享权值,因此映射后的子空间是不同的,认为不同的子空间涵盖的信息是不一样的,这样最后拼接的向量涵盖的信息会更广。

          有实验证明,增加Mult-Head Attention的头数,是可以提高模型的长距离信息捕捉能力的。

    Attention Mask

    • 由于有的句子padding后部分为0,当进行(Softmax)计算时,0会使计算产生偏差,因此采用mask方法进行补偿 即把0的位置改成很大的负数

    残差连接

    • 我们在上一步得到了经过注意力矩阵加权之后的(V​), 也就是(Attention(Q, K, V)​), 我们对它进行一下转置, 使其和(X_{embedding}​)的维度一致, 也就是([batch size, sequence length, embedding dimension]​), 然后把他们加起来做残差连接, 直接进行元素相加, 因为他们的维度一致

    layer normalization

    • 作用是吧神经网络中的隐藏层归一化为标准正太分布,也就是(i.i.d)独立同分布 ,以起到加快训练速度,加速收敛的过程,

    • [mu_{i}=frac{1}{m} sum^{m}_{i=1}x_{ij}$$ 上式中以矩阵的行$(row)$为单位求均值 ]

      (x_{ij}-mu_{j})^{2}​$$ 上式中以矩阵的行((row)​)为单位求方差; $$LayerNorm(x)=alpha odot frac{x_{ij}-mu_{i}}
      {sqrt{sigma^{2}_{i}+epsilon}} + eta ag{eq.6}​$$ 然后用每一行的每一个元素减去这行的均值, 再除以这行的标准差, 从而得到归一化后的数值, (epsilon​)是为了防止除(0​);
      之后引入两个可训练参数(alpha, eta​)来弥补归一化的过程中损失掉的信息, 注意(odot​)表示元素相乘而不是点积, 我们一般初始化(alpha​)为全(1​), 而(eta​)为全(0​). 

    • [X_{attention} = X + X_{attention} ]

    • [X_{attention} = LayerNorm(X_{attention}) ]

    FeedForward

    • [X_{hidden} = Activate(Linear(Linear(X_{attention}))) ag{eq. 7}​$$ 5). ]

    [X_{hidden} = X_{attention} + X_{hidden} ]

    [X_{hidden} = LayerNorm(X_{hidden}) ]

    [X_{hidden} in mathbb{R}^{batch size * seq. len. * embed. dim.} ​ ]

    Bert


    • elmo+transformer
    • 训练的时候会随机遮蔽掉某些单词 mask

    xlnet


    代码与实战


  • 相关阅读:
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 133 克隆图
  • 原文地址:https://www.cnblogs.com/rise0111/p/11320683.html
Copyright © 2011-2022 走看看