Transformer笔记

简介: Transformer笔记

前言


Transformer改进了RNN训练比较慢的缺点,利用self-attention机制实现了快速的并行运算。并且最早,Transformer是用于翻译任务的。


一、Transformer是什么?


1-1、 Transformer的结构:


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


5d74c1e4fd7c435a914778542258b1de.png



简略结构(每一个编码器都对应上图的一个encoder结构):


05cb46864afb474c951b0dc9a883b2d5.png


Transformer的编码组件是由6个编码器叠加在一起组成的,解码器同样如此。

所有的编码器在结构上是相同的,但是它们之间并没有共享参数。

编码器的简略结构如下:


352a82d75c6447d984ad6981a9fc0121.png


从编码器输入的句子首先会经过一个自注意力层,这一层帮助编码器在对每个单词编码的时候时刻关注句子的其它单词。

解码器中的解码注意力层的作用是关注输入句子的相关部分,类似于seq2seq的注意力。

原结构中使用到的是多头注意力机制(Multi-Head Attention),我们先从基础——自注意力机制开始讲起:


1-2、 自注意力机制


自注意力的作用:随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。在处理过程中,自注意力机制会将对所有相关单词的理解融入到我们正在处理的单词中。自注意力的结构如下所示:


f146c2a912a148bba6b3edd0175e7f48.png

自注意力的计算:从每个编码器的输入向量(每个单词的词向量,可以是任意形式的词向量,比如说word2vec,GloVe,one-hot编码)

942529fd19c94f98842a9e894cec1b95.png


中生成三个向量,即查询向量、键向量和一个值向量。(这三个向量是通过词嵌入与三个权重矩阵相乘后创建出来的)新向量在维度上往往比词嵌入向量更低。(512->64)

比如说X1与WQ权重矩阵相乘得到q1,就是这个单词相关的查询向量。


e467256fba4243c596bf9f5f44f7a050.png


将以上所得到的查询向量、键向量、值向量组合起来就可以得到三个向量矩阵Query、Keys、Values。


8d0e57df41fb4637a450815bff7cbc25.png


查询向量、键向量和值向量


计算自注意力的第二步是计算得分,假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数是通过所有输入句子的单词的键向量与“Thinking”的查询向量相点积来计算的。


a44b6e89e60448d6a156369fd06150ca.png



第三步和第四步是将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值,这样做是为了防止内积过大。),然后通过softmax传递结果。随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。



b5302a3a6d9e40ad886a9dd8b85a1319.png



这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,

第五步是将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。

第六步是对加权值向量求和,然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。


e95ac9c512cf477daf401f67a3b860ff.png


整体的计算图如图所示:

853cd18e6baa48dcb2dc7cd41b0e03d7.png


最终得到了自注意力,并将得到的向量传递给前馈神经网络。以上二到六步合为一个公式计算自注意力层的输出。


自注意力层的完善——“多头”注意力机制:


对应整体结构图中的Multi——Head Attention

1、扩展了模型专注于不同位置的能力。

2、有多个查询/键/值权重矩阵集合,(Transformer使用八个注意力头)并且每一个都是随机初始化的。和上边一样,用矩阵X乘以WQ、WK、WV来产生查询、键、值矩阵。

3、self-attention只是使用了一组WQ、WK、WV来进行变换得到查询、键、值矩阵,而Multi-Head Attention使用多组WQ,WK,WV得到多组查询、键、值矩阵,然后每组分别计算得到一个Z矩阵。


c1c8be1dc1d24540a0768c29a3f84cbf.png



前馈层只需要一个矩阵,则把得到的8个矩阵拼接在一起,然后用一个附加的权重矩阵WO与它们相乘。


bbe81d33b5ca41b2924d945c51f79a30.png


总结整个流程:


4df6e2a75eb946f48f6b438eeb11a1c5.png


编码it一词时,不同注意力的头集中在哪里:(图中只列举出了两个注意力)


306bb647e8f04bb8b1375b7a54f6135d.png


即it是animal和tired的代表。


1-3、使用位置编码表示序列的顺序


即整体结构图中的positional encoding。

为了理解单词顺序,Transformer为每个输入的词嵌入添加了一个向量,这样能够更好的表达词与词之间的关系。词嵌入与位置编码相加,而不是拼接,他们的效率差不多,但是拼接的话维度会变大,所以不考虑。(这里位置向量如何得到,以哪种计算方法得到,以及词嵌入与位置编码如何结合是可以尝试实验的点,可以看以下链接思考这个问题)。如何理解Transformer论文中的positional encoding,和三角函数有什么关系?.



578561177d94426690f824e78998e0dc.png

为了让模型理解单词的顺序,我们添加了位置编码向量,这些向量的值遵循特定的模式。


2e5d443ca33f40baa56a89f5dbe2dae5.png


1-4、Add&Normalize


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


c238f918d7ab4472b4413b0c1c76624f.png


Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:

d1d4df487b594c5e8188e5052dae12d3.png


其中 X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。


Add

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




6212a68f358b4e4faf65e7601a131ce4.png


ResNet残差神经网络


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


d5095f8e4743451185a2fc6bdbb220ca.png


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


要恒等映射,我们只需要让F(X)=0就可以了。x经过线性变换(随机初始化权重一般偏向于0),输出值明显会偏向于0,而且经过激活函数Relu会将负数变为0,过滤了负数的影响。

这样当网络自己决定哪些网络层为冗余层时,使用ResNet的网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新该冗余层的参数来代替学习h(x)=x更新冗余层的参数。

Normalize

归一化目的:

1、加快训练速度

2、提高训练的稳定性

使用到的归一化方法是Layer Normalization。

9307ed0609204a1894e13d8f49017334.png

LN是在同一个样本中不同神经元之间进行归一化,而BN是在同一个batch中不同样本之间的同一位置的神经元之间进行归一化。

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


7bf8f750231f473eb58ae403a58f8c56.png


1-5、全连接层Feed Forward


cca240d1446a46588a206b8d565d9897.png

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

这两层网络就是为了将输入的Z映射到更加高维的空间中然后通过非线性函数ReLU进行筛选,筛选完后再变回原来的维度。

经过6个encoder后输入到decoder中。


1-6、Decoder整体结构



c4acf2cb36244254a2cd83588e1f5a16.png

和Encoder Block一样,Encoder也是由6个decoder堆叠而成的,Nx=6。相比于Encoder,多了一个Masked Multi-Head Attention。


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。把这个矩阵作用在每一个序列上,就可以达到我们的目的。

注意:

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中最后一层的输出。


1-7、输出


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


4d05fcb7048f4a24ae3e176bfda8dd38.png



1-8、transformer的优缺点:


优点:

1、效果好

2、可以并行训练,速度快

3、很好的解决了长距离依赖的问题


缺点:

完全基于self-attention,对于词语位置之间的信息有一定的丢失,虽然加入了positional encoding来解决这个问题,但也还存在着可以优化的地方。


图解Transformer(完整版).

史上最小白之Transformer详解.

一文读懂BERT(原理篇).

Transformer模型详解(图解最完整版).

【从 0 开始学习 Transformer】 上篇:Transformer 搭建与理解.


总结


以上就是我总结(照抄)其它优秀博主的全部transformer内容了。

相关文章
|
机器学习/深度学习 自然语言处理 算法
Transformer 模型:入门详解(1)
动动发财的小手,点个赞吧!
13282 1
Transformer 模型:入门详解(1)
|
机器学习/深度学习 存储 编解码
高效神经网络架构的正确打开方式! | EMO:结合 CNN 和 Transformer
高效神经网络架构的正确打开方式! | EMO:结合 CNN 和 Transformer
1234 0
|
机器学习/深度学习 编解码 并行计算
论文阅读笔记 | Transformer系列——CSWin Transformer
论文阅读笔记 | Transformer系列——CSWin Transformer
731 0
论文阅读笔记 | Transformer系列——CSWin Transformer
|
3月前
|
机器学习/深度学习 自然语言处理 并行计算
一文快速读懂Transformer
Transformer模型近年来成为自然语言处理(NLP)领域的焦点,其强大的特征提取能力和并行计算优势在众多任务中取得显著效果。本文详细解读Transformer的原理,包括自注意力机制和编码器-解码器结构,并提供基于PyTorch的代码演示,展示了其在文本分类等任务中的应用。
|
6月前
|
机器学习/深度学习 编解码 算法
【YOLOv8改进】Polarized Self-Attention: 极化自注意力 (论文笔记+引入代码)
该专栏专注于YOLO目标检测算法的创新改进和实战应用,包括卷积、主干网络、注意力机制和检测头的改进。作者提出了一种名为极化自注意(PSA)块,结合极化过滤和增强功能,提高像素级回归任务的性能,如关键点估计和分割。PSA通过保持高分辨率和利用通道及空间注意力,减少了信息损失并适应非线性输出分布。实验证明,PSA能提升标准基线和最新技术1-4个百分点。代码示例展示了如何在YOLOv8中实现PSA模块。更多详细信息和配置可在提供的链接中找到。
|
机器学习/深度学习 自然语言处理 并行计算
【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)
【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)
1499 0
【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)
|
7月前
|
机器学习/深度学习 编解码 自然语言处理
【VIT】小白入门篇:从各个角度认识Vision Transformer
【VIT】小白入门篇:从各个角度认识Vision Transformer
469 0
【VIT】小白入门篇:从各个角度认识Vision Transformer
|
计算机视觉
论文阅读笔记 | Transformer系列——Transformer in Transformer
论文阅读笔记 | Transformer系列——Transformer in Transformer
313 0
论文阅读笔记 | Transformer系列——Transformer in Transformer
|
机器学习/深度学习 编解码 自然语言处理
论文阅读笔记 | Transformer系列——Swin Transformer
论文阅读笔记 | Transformer系列——Swin Transformer
1251 0
论文阅读笔记 | Transformer系列——Swin Transformer
|
机器学习/深度学习 编解码 自然语言处理
【18】Vision Transformer:笔记总结与pytorch实现
【18】Vision Transformer:笔记总结与pytorch实现
891 0
【18】Vision Transformer:笔记总结与pytorch实现