Transformer学习


  一个月之后,要学习Bert模型了,发现学过的transformer已经忘光了,所以又回来重新学习,参考了好多的资料,并且做了下面的学习笔记供之后再回来温习,欢迎大家一起交流学习。

一、前言

  Google于2017年6月发布在arxiv上的一篇文章《Attention is all you need》,提出解决seq2seq问题的transformer模型,用全attention的结构代替了LSTM,抛弃了之前传统的encoder-decoder模型必须结合CNN或者RNN的固有模式,只用Attention,可谓大道至简。该模型可以高度并行地工作,所以在提升翻译性能的同时训练速度也特别快。

  论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。

二、模型结构

模型的整体结构如下图所示:
在这里插入图片描述
  这个结构看起来很复杂,简化之后,其实也就是一个seq2seq模型的。如下图所示:左边一个encoders,右边一个decoders。
在这里插入图片描述
  文中提到了encoder和decoder都是由6个相同的层组成的。所以,又可以表示成下面的结构,每一个encoder的输出会和每一个decoder进行结合。
在这里插入图片描述
  我们取出其中的一层,进行详细的展示。得到了下图所示的结构:
在这里插入图片描述
  Encoder的每一层有两个操作,分别是Self-Attention和Feed Forward;而Decoder的每一层有三个操作,分别是Self-Attention、Encoder-Decoder Attention以及Feed Forward操作。

二、Self-Attention Mechanism

  Attention是用于计算"相关程度",例如在翻译过程中,不同的英文对中文的依赖程度不同,根据依赖程度大小Attention会将不同的权重分配给各个词,一般是通过query(Q)、key和value 的方式来计算权重映射到输出上的,其中query、每个key、每个value都是向量,其中权重是由Query和每个key计算出来的。论文中使用了Scaled Dot-Product Attention,结构图如下:
在这里插入图片描述
Self-Attention计算方法分为四步:

  • 第一步:每个输入x,进入self-attention后,先生成embedding向量a,向量a再分别乘以不同的权重向量w,产生三个向量:q、k和v。
    在这里插入图片描述
    在这里插入图片描述

  • 第二步:计算 q 1 q^{1} q1和每个 k ( k 1 , k 2 , k 3 , k 4 ) k(k^{1},k^{2},k^{3},k^{4}) kk1,k2,k3,k4的相似度,得到 α 1 , 1 , α 1 , 2 , α 1 , 3 , α 1 , 4 \alpha_{1,1}, \alpha_{1,2}, \alpha_{1,3}, \alpha_{1,4} α1,1,α1,2,α1,3,α1,4
    在这里插入图片描述
    在这里q,k的相似度计算用到的是缩放的点乘
    α 1 , i = q 1 . k i / d \alpha_{1,i}=q^{1}.k^{i}/\sqrt{d} α1,i=q1.ki/d
    其中 d d d q q q k k k的维度

  • 第三步:将得到的相似度进行softmax操作,进行归一化

α ^ 1 , i = e x p ( α 1 , i ) / ∑ j e x p ( α 1 , j ) \hat{\alpha}_{1,i}=exp(\alpha_{1,i})/\sum _{j}exp(\alpha_{1,j}) α^1,i=exp(α1,i)/jexp(α1,j)

在这里插入图片描述

  • 第四步:针对计算出来的权重,对所有的 v v v进行加权求和计算,如下图。
    在这里插入图片描述
    b 1 = ∑ i α ^ 1 , i v i b^{1}=\sum _{i}\hat{\alpha}_{1,i}v^{i} b1=iα^1,ivi
    类似的,可以得到 b 2 b^{2} b2, b 3 b^{3} b3, b 4 b^{4} b4
    在这里插入图片描述
    其实,上面的第三步和第四步可以表示成下面的公式:
    在这里插入图片描述

三、为什么计算可并行

  上述的整个过程,可以简化为下面的操作,且计算过程是可以并行的。
在这里插入图片描述
为什么计算过程是可以并行的?下面我们来看看解释:
1、矩阵Q可以表示为 [ q 1 , q 2 , q 3 , q 4 ] [q^{1},q^{2},q^{3},q^{4}] [q1,q2,q3,q4]
  矩阵K可以表示为 [ k 1 , k 2 , k 3 , k 4 ] [k^{1},k^{2},k^{3},k^{4}] [k1,k2,k3,k4]
  矩阵V可以表示为 [ v 1 , v 2 , v 3 , v 4 ] [v^{1},v^{2},v^{3},v^{4}] [v1,v2,v3,v4]
在这里插入图片描述
2、 K K K Q Q Q的相似度计算可以表示为矩阵点乘的形式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、权重向量 α ^ \hat\alpha α^ V V V相乘亦可以表示为下面的形式。
在这里插入图片描述
那么经过上面的介绍,我们就可以把整个self-attention表示成下图所示的形式,其实就是一堆矩阵乘法,用GPU是可以并行计算的。
在这里插入图片描述

四、Mult-head Attention

  Multi-Head Attention就是把Scaled Dot-Product Attention的过程做 h h h次,然后把输出拼接起来。论文中,它的结构图如下:
在这里插入图片描述
  下面以2-head Attention为例来进行介绍:对于每个词向量 a i a^{i} ai会生成两个 q i , 1 q^{i,1} qi,1, q i , 2 q^{i,2} qi,2, k i , 1 k^{i,1} ki,1, k i , 2 k^{i,2} ki,2, v i , 1 v^{i,1} vi,1, v i , 2 v^{i,2} vi,2,经过上面的self-attention之后,同样也是会得到两个输出: b i , 1 b^{i,1} bi,1, b i , 2 b^{i,2} bi,2
在这里插入图片描述
  得到的两个结果向量 b i , 1 b^{i,1} bi,1, b i , 2 b^{i,2} bi,2进行concatenate,得到一个向量 b i b^{i} bi。也可以让 b i b^{i} bi乘上一个权重向量 W 0 W_{0} W0进行降维。如下图所示:
在这里插入图片描述
  做mult-head attention有什么好处呢?论文中这样说:
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.
  也就是说,不同的head关注的点是不一样的。mult-head的话,可以让每个head去做自己的事情,各司其职。具体用多少个head,这个参数是可以调试的。

  下图展示的就是多头自注意力的全部,这样可以一眼看清。
在这里插入图片描述

五、positional Encoding

  因为模型不包括Recurrence/Convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。

  这里每个分词的position embedding向量维度也是 d d d, 然后将原本的input embedding和position embedding加起来组成最终的embedding作为encoder/decoder的输入。具体来说,采用正弦和余弦函数进行编码,其中position embedding计算公式如下:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) PE(pos,2i)=sin(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)
P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}}) PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中, p o s pos pos表示位置, i i i表示维度。

六、残差连接和层归一化

  残差连接(residual connection)是将multi-head attention的输入和输出进行add操作。

  层归一化(Layer Normalization):https://arxiv.org/abs/1607.06450

  层规范化就是针对 Batch Normalization (BN)的不足而提出的。与 BN 不同,LN 是一种横向的规范化,如图所示。它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
在这里插入图片描述
在这里插入图片描述
  其中 i 枚举了该层所有的输入神经元。对应到标准公式中,四大参数 μ, σ 均为标量(BN中是向量),所有输入共享一个规范化变换。

  LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。

七、position-wise Feed-Forward Networks

  在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前馈网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:

F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0, xW_{1}+b_{1})W_{2}+b_{2} FFN(x)=max(0,xW1+b1)W2+b2

其中每一层的参数都不同。

参考资料:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值