AIGC-GPT科普(四):Transformer深入介绍

969 阅读6分钟

1. Transformer介绍

Transformer就是标准的编码器-解码器架构(encoder-decoder),一个输入x=(x(1), ... , x(n))进入编码器,会被编码器编码为z=(z(1), ... , z(n) )(比如x为一个句子,每个x(i) 表示一个词,则z(i) 表示对应的词x(i) 的向量表示,即将句子翻译成模型可以理解的向量)。此时,z成为了解码器的输入,解码器根据z生成一串序列y=(y(1), ... , y(m) )。值得注意的是,编码器-解码器架构是一个自回归模型(auto-regressive),因为序列 y 不是一次性生成的,解码器一次只能生成一个 y (i) ,此时 y(i-1)已经作为了编码器的输入(模型的输出成为了模型的输入称作自回归)

Transformer主要包括Input Embedding, Position Encoding, Encoder, Decoder等部分,除了自身的多头注意力机制,也使用了残差连接和前馈神经网络。

  • Input Embeding
  • Output Embedding
  • Position Encoding
  • Encoder 编码器
    • Multi-Head Attention
    • Add 残差连接
    • Norm 层归一化
    • Feed Forward 前馈神经网络
  • Decoder
    • Masked Multi-Head Attention
    • Multi-Head Attention
    • Add 残差连接
    • Norm 层归一化
    • Feed Forward 前馈神经网络

每一个encoder和decoder的内部简版结构如下图,

对于encoder,包含两层,一个self-attention层和一个前馈神经网络,self-attention能帮助当前节点不仅仅只关注当前的词,从而能获取到上下文的语义。

decoder也包含encoder提到的两层网络,但是在这两层中间还有一层attention层,帮助当前节点获取到当前需要关注的重点内容。

首先,模型需要对输入的数据进行一个embedding操作,enmbedding结束之后,输入到encoder层,self-attention处理完数据后把数据送给前馈神经网络,前馈神经网络的计算可以并行,得到的输出会输入到下一个encoder。

每个部分具体作用

2. Input Embedding

可以将Input Embedding看作是一个 lookup table,对于每个 word,进行 word embedding 就相当于一个lookup操作,查出一个对应结果。通俗讲就是将每一个词转化成一个向量来表示。

3. Position Encoding

Attention虽然可以提取出关注的信息,但是没有顺序信息的,因此需要添加进时序信息进入网络。

Positional Encoding维度和embedding的维度一样,主要作用是让模型学习到序列中单词顺序,编码向量能决定当前词的位置,或者说在一个句子中不同的词之间的距离。

4. Encoder

1. 多头注意力

这里就是多头自注意力机制,可以通过输入信息并行计算出查询-键-值Query-Key-Value),来让后续的网络使用context来知道当前运算需要关注哪些信息。注意这里的计算QKV的矩阵也是网络参数的一部分,通过训练可以让网络的注意力更有效且集中。

2. 残差连接

多头注意力和层归一化,前馈神经网络和层归一化,两部分均采用了残差连接,这里主要残差连接的主要作用是利用恒等映射来训练更深层的网络(输入和输出恒等)。

3. 层归一化 Layer Normalization

Layer Normalization 的作用是把神经网络中以样本维度为一层来进行归一化运算,以起到加快训练速度,加速收敛的作用。(这里的layer主要是相比于Batch Norm来说的,Batch Norm是以样本特征为维度来进行归一化,Layer Norm会以样本序列为维度计算,更稳定)

4. 前馈神经网络

通过了注意力层之后通过加权机制已经将所关注的信息提取出来了,剩下的就是根据关注的信息在语义空间中做转换。

因此MLP将Multi-Head Attention得到的向量再投影到一个更大的空间(论文里将空间放大了4倍)在那个大空间里可以更方便地提取需要的信息(使用Relu激活函数),最后再投影回token向量原来的空间。

4. Decoder

Decoder和 Encoder基本一样,有三个部分:掩码多头注意力,掩码编码器解码器注意力和前馈神经网络,三个部分的每一个部分,都有一个残差连接,后接一个Layer Normalization。下面介绍Decoder的Masked Self-Attention和Encoder-Decoder Attention两部分,

1. 掩码多头注意力

Self-Attention的机制有一个问题,在训练过程中的完整标注数据都会暴露在 Decoder 中,这显然是不对的,我们需要对 Decoder 的输入进行一些处理,该处理被称为 Mask,将数据有选择的暴露给Decoder(在GPT中相当于遮住了后面的所有数据,由网络依次生成),从而保证跟最终应用推理的时候保持一致(翻译的时候是不知道后续的刺的)。

2. 掩码编码器解码器注意力 Masked Encoder-Decoder Attention

这一层就是连接编码器和解码器的注意力层,后续由于GPT只用了编码器,因此删除了这一层。

5. 线性层和Softmax

经过编码器和解码器最后是一层全连接层和SoftMax。

线性层是一个简单的全连接的神经网络,它将解码器堆栈生成的向量投影到一个更大的向量,称为logits向量。Softmax层(Softmax 是用于多类分类问题的激活函数)将向量转换为概率(全部为正值,总和为1.0)。选择概率最高的单元,并生成与其关联的单词作为此时间步的输出。

6. 计算量比较

n代表序列长度(比如输入Hello World n=2),d代表向量长度(使用512代表词)

  1. 单层计算复杂度

自注意力:Key和Query的矩阵运算,纬度都是nxd(所以Transformer是没办法处理太长的输入的,运算量会平方增加),因此是n2·d

RNN:dense layer的运算,是n·d2

  1. 序列运算

自注意力:整句话一起输入,只需要一次运算

RNN: 这里需要每一个词依次输入,需要n次循环

  1. 最大长度

自注意力:两个输入单词间最长的运算距离都通过Key和Query矩阵进行关联

RNN:依次输入,最长距离为N

总结,计算量并没有差太多(n和d很多时候差不多),但Transformer的并行度更高,可以并行输入一整个序列。