Transformer

transformer是一个seq2seq模型(即输入一个序列,输出一个序列),最早被用于机器翻译,如下图:

transformer中patch embedding的作用_权重


而transfomer模型的结构则主要由encoderdecoder构成,如下图:

transformer中patch embedding的作用_自然语言处理_02


其中encoder与decoder的参数是独立训练的; 单个encoder和decoder内部的具体结构如下图:

transformer中patch embedding的作用_深度学习_03

Encoder

单个encoder主要由3部分组成:输入层,注意力机制层,前馈神经网络层

transformer中patch embedding的作用_权重_04

输入层

该层做的事情:

  1. 对输入的原始数据做embedding
  2. 进行位置编码,transformer中的位置编码使用的是正余弦函数;

    之所以RNN不用位置编码而Transformer引入了位置编码,是因为RNN的模型结构天然的利用了位置信息,这同时也带来了难以并行化的痛点,而Transformer引入了注意力机制来代替RNN,所以就使得位置信息缺失,需要对位置进行编码(Bert中的位置编码信息是通过学习得到的)
    为什么进行位置编码

注意力机制层

在进行训练/预测的时候,尽管我们的目标是希望模型能够预测出正确的结果,但在预测正确结果的基础上,我们更希望使用有用的信息来预测正确的结果,而不是使用了很多噪声预测出正确的结果。 因此,正确找出有用的信息,让结果很大程度是使用有用的信息来预测得到的,这就是注意力机制要做的事情,也是模型需要学习的东西。

Attention机制的具体计算过程,如果对目前大多数方法进行抽象的话,可以将其归纳为两个过程:

  1. 根据Query和Key计算权重系数:
    a. 根据Query和Key计算两者的相似性或者相关性
    b. 归一化处理
  2. 根据权重系数对Value进行加权求和

最终体现在公示上如下图所示:

transformer中patch embedding的作用_自然语言处理_05


其中Q、K、V的含义:

attention机制中的Q,K,V分别是从哪来的?

注意力机制详解

关于计算权重(softmax(Q*K/根号dk))这一部分,其中有个回答更为通俗的评论:

transformer中patch embedding的作用_网络层_06


小总结:注意力机制,以中文句子为例子,就是当前字在预测下一个字的时候,根据自己对句子中每一个字的关注程度(或是相似度),重新计算出自己的embedding,作为下一层的输出。

而多头注意力机制,则是由多组这样的Q、K、V来输出结果。

残差 + LayNorm

残差层做的事情就是:输出 = 输出 + 输入,残差能够有效的防住梯度消失,因为在链式求导的时候,会变成(1+dx)

这里的normalization使用的是LayNorm,而不是BatchNorm

前馈神经网络层

就是加了一层全联接层 + 残差 + LayNorm

transformer中patch embedding的作用_自然语言处理_07

Decoder

transformer中patch embedding的作用_自然语言处理_08


decoder的结构和encoder类似,但主要有两点不同:

  1. 多了mask层;
  2. 多了交互层;

mask层

多头注意力机制需要进行mask,因为在decode输出的时候,如果没有mask则会在预测的时候使用所有的词或字来预测下一个词或字,但这是不合理的,因为在进行真正的预测的时候,是不知道当前字或词之后的字或词的。

如下图,在Love预测You的时候,是不应该使用You和Now的信息的。

transformer中patch embedding的作用_transformer_09

交互层

transformer中patch embedding的作用_transformer_10


交互层实际上也是一个多头注意力机制,只不过这里使用的K和V,使用的是最后一个Encoder的K和V,而只有Q是decoder自己生成的:

transformer中patch embedding的作用_自然语言处理_11


transformer中patch embedding的作用_权重_12