您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页Transformer从零详细解读

Transformer从零详细解读

来源:爱go旅游网

1.从全局角度概括Transformer

对Transformer进行细化:

TRM结果可以分文两部分 一部分是Encoders(编码器) 一部分是Decoders(解码器) 简单的流程就是 "我爱你"输入到Encoders中处理后作为Decoders的输入 处理后输出"I LOVE YOU"

进一步细化:

 

需要注意 Encoder有6个结构完全相同的小Encoder,Decoder也是由6个结构完全相同的小Decoder组成,数字可以是自己定  这6个解码器和编码器在结构上完全相同 但是在参数上是不同的 也就是说 在训练的过程中 不是训练了一个Encoder然后复制6个 而是6个Encoder一同训练

论文中的结构:

Nx = 6,Encoder block由6个encoder堆叠而成,图中的一个框代表的是一个encoder的内部结构,一个Encoder是由Multi-Head Attention和全连接神经网络Feed Forward Network构成。如下图所示

Nx:是编码器或者解码器的个数为N个 数量可以由自己定

 

 

2.Encoder编码器

 

  1.输入部分

   1.Embedding

     Embedding属于NLP(自然语言处理)的入门知识 我们之前学习的RNN与语言处理有关 所以在这篇博客上发布了一些关于自然语言处理的知识 

比如说我们输入的数据是:我爱你... 12个汉字 我们按字切分 每个字对应一个512维的字向量(可以使用Word2vec 或者是初始化)

 

   2.位置编码

为什么需要:

在RNN当中需要注意的是 每一次循环使用的W U V都是一样的 使用的是一套的参数 在后续更新的过程中 更新的也是这共享的一套参数

(插一个小的知识点:RNN的梯度消失有什么不同?

或许会说是由于连乘效应 所以导致了梯度消失 这个原因放在RNN中不太准确 因为RNN的梯度消失和普通网络消失的原因不一样

RNN的梯度是一个总的梯度和 他的梯度消失并不是变为0 而是说 总梯度被近梯度主导 远距离梯度忽略不计) 

在RNN中 输入完"我" 需要等处理完"我" 再输入"爱" 是逐个逐个的输入处理

在Transformer中 是一起处理的 

这样做增快了速度 但是忽略了单词之间的序列关系或者说是先后关系

所以Transformer对于RNN来说 缺少了某些东西 来告诉"我"是在"爱"之前的 "你"是在后面的 所以说需要一个位置编码

位置编码的公式:

pos:是单词或字的位置

2i:在偶数的位置使用sin

2i+1:在奇数的位置使用cos

比如"爱":

有512个维度 在每一个维度中 根据奇偶性分别进行cos和sin的计算

之后我们将位置编码512个维度和原本词向量的512个维度的值分别进行相加得到一个新的512的维度向量 作为整个的Transformer的输入

 

引申一下为什么位置嵌入会有用

 

2.注意力机制

   1.基本的注意力机制

颜色越深表示越关注

我们想去判断 通过公式或者某种方式得到这个结果 "婴儿在干嘛"这句话 和图片中哪些区域更相似

公式:

Q,K,V是三个矩阵

 

 

2.在TRM中怎么操作

K1代表左上部分代表的某种向量

Q是婴儿代表的某种向量

V1是左上部分对应的某种值向量

Q值先和四个K值进行点乘得到一个结果 结果越大表示越关注越相似

最后再和V矩阵相乘 得到一个加权和

从公式的角度:

如何获取QKV:

比如说两个长度为四维向量单词Thinking和Machines

q1:x1乘以一个Wq的参数矩阵得到q1

k1:x1乘以一个Wk的参数矩阵得到k1

v1:x1乘以一个Wv的参数矩阵得到v1

 

得到attention的值:

为什么要除以根号dk:
q1 * k1如果结果值很大 就是Softmax输出值非常接近1 那么在反向传播过程中 在Attention公式中外层softmax梯度会小  容易造成梯度消失

 

单头:

多头:

 

实际上 参数会有很多套 分别得到各自的Q K V

可以捕捉到更多信息

 

将多头计算后的多个Z合在一起进行输出乘以一个矩阵 就得到了多头注意力的输出

 

 

3.残差详解

在经过多头注意力机制得到矩阵Z之后,并没有直接传入全连接神经网络,而是经过了一步Add&Normalize。

模型会进行残差连接(即输入直接加到输出上),然后进行层归一化(Layer Normalization)。这种结构有助于稳定训练过程,并允许梯度更有效地流动。具体来说是:

x词向量与位置编码对位相加得到新的x 经过注意力层 得到输出结果z 把原始新的x与结果z进行对位相加之后作为残差的结果 经过一个LayerNorm层归一化作为一个输出


Add & Norm 层由 Add 和 Norm 两部分组成:

Add:
Add,就是在z的基础上加了一个残差块X,加入残差块的目的是为了防止在深度神经网络的训练过程中发生退化的问题,退化的意思就是深度神经网络通过增加网络的层数,Loss逐渐减小,然后趋于稳定达到饱和,然后再继续增加网络层数,Loss反而增大

ResNet残差神经网络
为了了解残差块,我们引入ResNet残差神经网络,神经网络退化指的是在达到最优网络层数之后,神经网络还在继续训练导致Loss增大,对于多余的层,我们需要保证多出来的网络进行恒等映射。只有进行了恒等映射之后才能保证这多出来的神经网络不会影响到模型的效果。残差连接主要是为了防止网络退化。

上图就是构造的一个残差块,X是输入值,F(X)是经过第一层线性变换后并且激活的输出,在第二层线性变化之后,激活之前,F(X)加入了这一层输入值X,然后再进行激活后输出。

 

残差还可以缓解梯度消失的出现:

 

一般情况下 因为连乘所以会出现梯度消失 但是在残差网络结构中 连乘再多也不会出现梯度消失

 

4.Layer Normal

在学习LN(layer normal)之前可以了解一下BN(batch normal)

BN是针对整个样本在同一纬度特征再做处理

如上图所示,每一列可以表示不同的人 也就是样本 每一行可以表示每一个特征(身高,体重,年龄...)

在BN中 是针对整个batch也就是所有人 的每一个特征进行BN 绿色框住的可以理解BN是在对同一纬度的特征处理

因为我们知道这一行是身高这个特征的数据 所以可以用BN

为什么在小批次中BN效果差?

如上图 加入有10个句子 前9个句子有5个单词 第10个句子有20个单词 

在BN的过程中 前9个只有5个单词 但是第10个句子长度大于5 所以在前9个句子进行BN的结果会对第10个句子超出5个单词的部分造成影响

 

使用LN:

BN是对于相同的维度进行归一化(BN是对列进行均值方差)

而LN是在同一个样本中不同神经元之间进行归一化(LN是对行进行均值方差)

但是咱们NLP中输入的都是词向量,一个300维的词向量,单独去分析它的每一维是没有意义地,在每一维上进行归一化也是适合地,因此这里选用的是LN。

 

3.前馈神经网络

输入的Z1,Z2都会通过一个Feed Forward(前馈神经网络)。前馈网络通常包含一个或多个全连接层,可以进行非线性变换,以提取更高级的特征。

Transformer的全连接层是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。

4.Encoder小结

 

1.输入部分:
输入时Inputs 得到Input的Embedding 与位置嵌入的矩阵对位相加 作为整体的输入 

2.注意力机制:

然后经过一个多头注意力机制计算之后 先进行残差 就是把原始的输入和多头注意力机制的输出相加 得到残差的结果 然后在进行LN 作为输出结果

3.前馈神经网络:
然后经过双层的全连接(Deed Forward) 得到一个值 再把原始输入的值与经过双层全连接后的输出相加 进行残差 然后再进行LN输出结果

 

3.Decoder

 

和Encoder Block一样,Decoder也是由6个decoder堆叠而成的,Nx=6。包含两个 Multi-Head Attention 层。第一个 Multi-Head Attention 层采用了 Masked 操作。第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵进行计算,而Q使用上一个 Decoder block 的输出计算。

Masked Multi-Head Attention
与Encoder的Multi-Head Attention计算原理一样,只是多加了一个mask码。mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。为什么需要添加这两种mask码呢?

1.padding mask
什么是 padding mask 呢?因为每个批次输入序列长度是不一样的也就是说,我们要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充 0。但是如果输入的序列太长,则是截取左边的内容,把多余的直接舍弃。因为这些填充的位置,其实是没什么意义的,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。
具体的做法是,把这些位置的值加上一个非常大的负数(负无穷),这样的话,经过 softmax,这些位置的概率就会接近0!

2.sequence mask
sequence mask 是为了使得 decoder 不能看见未来的信息。对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。这在训练的时候有效,因为训练的时候每次我们是将target数据完整输入进decoder中地,预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
那么具体怎么做呢?也很简单:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。

上三角矩阵创建在哪里?

上三角矩阵通常在模型训练或预测前的预处理阶段创建。

如何使用上三角矩阵?

在decoder的输入或自注意力机制中,将上三角矩阵与权重矩阵相乘,可以实现对未来信息的屏蔽。具体来说,将上三角矩阵作用于decoder的输入序列或自注意力机制的得分矩阵上,可以使得decoder在解码时只能关注到当前time_step之前的输出。

注意:
1、在Encoder中的Multi-Head Attention也是需要进行mask的,只不过Encoder中只需要padding mask即可,而Decoder中需要padding mask和sequence mask。
2、Encoder中的Multi-Head Attention是基于Self-Attention地,Decoder中的第二个Multi-Head Attention就只是基于Attention,它的输入Quer来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。

 

 

4.输出

Output如图中所示,首先经过一次线性变换(线性变换层是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大得多的,被称为对数几率的向量里),然后Softmax得到输出的概率分布(softmax层会把向量变成概率),然后通过词典,输出概率最大的对应的单词作为我们的预测输出。

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务