初识Transformer

参考:【NLP】Transformer模型原理详解 - 知乎

             从RNN到“只要注意力”——Transformer模型 - 知乎

        Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合RNN和attention的模型。之后google又提出了解决Seq2Seq问题的Transformer模型,用全attention的结构代替了lstm,在翻译任务上取得了更好的成绩。

Attention原理:

NLP中的Attention原理和源码解析 - 知乎

从RNN到“只要注意力”——Transformer模型 - 知乎

1. 模型结构

 和大多数seq2seq模型一样,transformer也是由encoder和decoder组成。

        其中,解码器的输入output(shifted right)是指目标句子,但被mask掉未来的token,也就是mask矩阵的右上角都不可见。(这个结构是做翻译任务,目标句子相当于ground truth)。

        在训练时,解码器的输入是按照目标词进行监督的,这里是有问题的,叫exposure bias,有不少研究是解决这块。

        output的embedding与input一样,是两个向量(词/字向量+位置向量)的和,看了一下文章词/字embedding是自己学来的,在训练时更新,而且output和input的embedding权重是一样的,也就是在input中如果把“我”embedding成(0,1)向量,那output中的“我”也是(0,1)。

        encoder的output是source sentence的编码,不需要再经过embedding,直接输入的decoder,需要过embedding的是target sentence,只在训练时有,因为在训练decoder时,0到t-1步都需要用ground truth,而预测时不需要ground truth。

1.1 Encoder

        Encoder由6个相同的layer组成(上图左侧的单元),即“Nx”为6。每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalisation,因此可以将sub-layer的输出表示为:

subLayerOutput=LayerNorm(x+(SubLayer(x)))

        关于Nx的问题,encoder和decoder都包括6个相同的layer,6个layer应该是串行的关系,前一层的输出作为下一层输入,最后一层的输出是整个encoder的输出,decoder也类似。并且每个block之间有shortcut 有利于构建深层网络,可以参考ResNet。

1.1.1 Multi-head self-attention

        attention可表示为:attentionOutput=Attention(Q,K,V),而multi-head attention则是通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来:

 self-attention则是取Q,K,V相同。

另外,文章中attention的计算采用了scaled dot-product,即:

       其中d_{k}是隐层的纬度,中间除了intermediate,其他的线性变换都是768到768(比如BERT-base都是768)。

        也可采用additive attention,两者复杂度相似。在 d_{k} 很小的时候两者结果相似;d_{k}大的时候,如果不进行缩放则表现更好,(此时dot-product的计算速度更快),进行缩放后可减少影响(由于softmax使梯度过小)。

  

1.1.2 Position-wise feed-forward networks

        这层主要是提供非线性变换。

        Attention输出的维度是[bsz*seq_len, num_heads*head_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。

1.2 Decoder

        参考:图解Transformer(完整版)_龙心尘-CSDN博客_transformer

        Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,下面是decoder的输入输出和解码过程:

  • 输出:对应i位置的输出词的概率分布;
  • 输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出;
  • 解码:注意 训练和预测是不一样的。在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token);而预测时,因为没有ground truth了,需要一个个预测。
  • 注意inference时,decoder是把1到t-1时刻的输出序列作为t时刻的输入。这里和training时不同,因为没有ground truth作为输入,用自己的输出作为输入(会有bias,就是讲的训练用教师,预测没教师的问题)。

        预测 t 时刻的词时 decoder 最底层输入是 1到t-1 时刻的词,外加一个“起始标志” 一共 t 个词。训练的时候,linear 层是对所有时刻的输出都做变换,成为t个vocab长度的vector,然后对这所有t个vector分别softmax(代码实现上可以指定softmax的纬度,不用for循环去解决,用matrix的思想看问题),同时生成t个probability vector,各个取最大得到t个真正的输出。

        有些decoder预测的代码实现是这样的,假设预测最长5,到达长度或者输出<eos>停止预测:

t0 input : <sos>00000 -> output 'I'

t1 input : <sos> I 0000 -> output "love"

t2 input : <sos> I love 000 -> output "you"

t3 input: <sos> I love you 00 -> output <eos> -> 停止

        这里新加的attention多加了一个mask,因为训练时的output都是ground truth,这样可以确保预测第i个位置时不会接触到未来的信息。下图是加了mask的attention和multi-head attention。

1.3 Positional Encoding

        在数据预处理部分,Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。

这里作者提到了两种方法:

  1. 用不同频率的sin()和cos()直接计算;
  2. 学习出一份positional embedding。(参考文献

经过实验发现两者的结果一样,所以最后选择了第一种方法,公式如下:

 作者提到,方法1的好处有两点:

  1. 任意位置的 PE_{pos+k}都可以被PE_{pos}的线性函数表示,三角函数特性复习下:

      位置编码主要是让encoder区分不同的位置,通过三角函数这种方式就可以很好的区分开,而且能保留不同的相对位置信息(比如pos-k和pos+k的表示是不一样的)。

     2. 如果是学习到的positional embedding,会像词向量一样受限于词典大小(个人观点)。也就是只能学习到“位置2对应的向量是(1,1,1,2)”这样的表示。所以用三角公式明显不受序列长度的限制,也就是可以对 比所遇到序列的更长的序列 进行表示。

2. 优点

作者主要讲了以下三点:

  1. Total computational complexity per layer .(每层计算复杂度)
  2. Amount of computation that can be parallelized, as mesured by the minimum number of sequential operations required.

       作者用最小的序列化运算来测量可以被并行化的计算。也就是说对于某个序列x_{1},x_{2},...,x_{n} ,self-attention可以直接计算 x_{i},x_{j} 的点乘结果,而RNN就必须按照顺序从 x_{1}计算到 x_{n}

    3. Path length between long-range dependencies in the network.

        Path length指计算一个序列长度为n的信息要经过的路径长度。CNN需要增加卷积层数来扩大视野,RNN需要从1到n逐个进行计算,而self-attention只需要一步矩阵计算就可以。所以也可以看出,self-attention可以比RNN更好地解决长时依赖问题。当然如果计算量太大,比如序列长度n>序列维度d这种情况,也可以用窗口限制self-attention的计算数量。

        另外,self-attention模型解释性更强,attention结果的分布表明了该模型学习到了一些语法和语义信息。

3. 缺点

1. 实践上:有些RNN轻易可以解决的问题Transformer没做到,比如复制string,或者推理时碰到的sequence长度比训练时更长(因为碰到了没见过的position embedding)。

        copying strings or even simple logical inference when the string or formula lengths exceed those observed at training time。

        本人理解是transformer需要position encoding,而RNN不需要,如果训练时是128,但推理时是129,那transformer就没有见过129的position embedding,会对最后的结果造成影响。

2. 理论上:Transformers非computationally universal(图灵完备),(个人认为)因为无法实现“while”循环。

4. 总结

        Transformer是第一个用纯Attention搭建的模型,不仅计算速度更快,在翻译任务上获得了更好的结果,也为后续的BERT模型做了铺垫。

        没预训练的Transformer需要几十万数据,预训练过的几千条也ok,数据质量有保证的话肯定越多越好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值