Transformer
一、研究背景与动机
- 在Transformer出现之前,自然语言处理领域中,循环神经网络(RNN)及其变体如长短期记忆网络(LSTM)、门控循环单元(GRU)等是处理序列数据的主要方法,但它们存在一些局限性,如难以并行计算、长序列中的信息遗忘问题等.
- 当时机器翻译等自然语言处理任务的性能提升遇到瓶颈,研究人员希望找到一种更有效的架构来处理语言序列,以提高模型对长序列数据的建模能力和并行计算效率.
下面是一个机器翻译情景下,transformer基本结构的例子:

Transformer 的经典论文是 2017 年发表的《Attention Is All You Need》,由 Google Brain、Google Research 和多伦多大学的研究人员共同撰写 。
下面是摘自论文中的transformer的基本结构:

二、循环神经网络
1.介绍
循环神经网络(Recurrent Neural Network,RNN)是一类用于处理序列数据的神经网络。与传统的前馈神经网络不同,RNN 具有循环的结构,能够对序列中的元素顺序敏感,并且可以利用历史信息来处理当前的输入。
2.例子
“手机坏了,好想要256g的苹果呀”
上面这段话如果不结合前面“手机坏了”的语境,最后可能会理解成要一个256克的苹果(水果)。
循环神经网络就是在时序上反复迭代的一个网络,从而可以理解到前后语境。
结合前面“手机”,就可以推断出256g指的是手机存储容量,苹果指的是手机品牌apple。
3.原理
下面是rnn模型的简化原理图:


4.rnn存在的问题
梯度消失:
传统的神经网络的梯度消失问题值得是网络层数太深,导致梯度特别小,导致学习变慢甚至无效。
rnn的梯度消失问题有所不同:当时间序列较长时,在反向传播过程中,梯度会随着时间步的增加呈指数级衰减,导致较早时间步的权重更新几乎没有影响,使得网络难以学习到长距离的依赖关系。
三、位置编码
1.是什么
位置编码(Positional Encoding)是在处理序列数据(如自然语言处理中的句子、时间序列数据等)时,用于为序列中的每个元素提供位置信息的一种技术。
2.作用
弥补位置信息缺失
- 在 Transformer 架构中,输入序列的每个元素是并行处理的。与 RNN 不同,Transformer 没有通过顺序处理来自然地获取位置信息。位置编码能够将位置信息添加到输入特征中,使得模型可以区分序列中不同位置的元素。
- 例如,在自然语言处理中,句子 “我喜欢他” 和 “他喜欢我”,单词相同但顺序不同,语义不同。位置编码有助于模型理解这种顺序差异带来的语义变化。
3.位置编码方式
正弦 - 余弦位置编码(Sinusoidal Positional Encoding)
这是Transformer架构中原始使用的位置编码方式。对于一个序列长度为,特征维度为的输入序列,位置编码和(其中表示位置,表示特征维度的索引)的计算公式如下:
这种编码方式的优点是能够为模型提供明确的绝对位置信息,并且可以通过三角函数的周期性来处理较长的序列。同时,它可以方便地与输入特征相加,不需要额外的可学习参数。
4.举例
现有一个句子”我爱你“
词嵌入:
将句子中的每个单词通过词嵌入(Word Embedding)转换为向量表示:
设词嵌入的维度为(这里假设是512),句子长度为n(这里是3)
添加位置编码:
对每一个特征都添加位置编码,以第二个单词“爱”(pos从1开始,所以是2)为例子,对其索引为奇数和偶数的数据按照公式分别添加位置编码,从而得到带有位置信息的特征:

比如上图向量的第1、512个位置相加以后的结果分别是:
送入模型:
所有的特征都经过位置编码以后,就带有了位置信息,之后再并行的送入transformer,transformer就可以直接从特征数据了解到特征以及特征之间的位置关系。
5.位置信息:
绝对位置信息:
绝对位置信息是指元素在序列中的固定位置标识,比如刚刚提到的“我爱你”的例子当中,“我”的绝对位置为1,“爱”的绝对位置为2。
相对位置信息:
相对位置信息是指元素之间的位置关系,重点在于元素之间的距离和顺序,而不是它们在序列中的绝对位置编号。它描述了一个元素相对于其他元素是在前还是在后,以及相隔的距离。比如“你”字就在“爱”字的后一个位置。
三角函数有如下性质:
两角和与差公式
正弦:.
余弦:.
我们就可以得到:

的特征,就可以由和位置的特征得到,就比如位置10的特征,可以由位置1和9得到,也可以由位置3和7得到。
这样所有的特征之间就相互蕴含了相对位置信息。
四、注意力机制
1.注意力机制是什么
注意力机制的本质是一种权重分配机制,它通过对不同重要程度的信息赋予不同的权重,让系统能够聚焦于关键信息,同时忽略无关信息,从而更高效地处理和理解数据。
2.线性变换得到Q、K、V向量
在Transformer架构中,Q(Query)、K(Key)、V(Value)向量是通过对输入的词向量(或其他特征向量)进行线性变换得到的。
假设输入的词向量序列为,其中是第个词对应的向量,维度为。
有三个可学习的权重矩阵 、和。
通过矩阵乘法来生成Q、K、V向量:
- ,得到形状为的Query向量矩阵,其中是序列长度,是Query向量的维度。
- ,得到形状为的Key向量矩阵。
- ,得到形状为的Value向量矩阵。
这些线性变换是Transformer架构中的关键操作,后续的注意力机制(如Scaled - Dot Product Attention)会基于Q、K、V来计算每个词对于其他词的注意力权重,从而实现对输入序列的有效信息提取和编码。
查询向量(Q - Query)的作用
- 信息检索与关注引导:在注意力机制中,查询向量就像是一个“检索线索”。以自然语言处理为例,假设要翻译一个句子,对于目标句子中的某个单词(或生成过程中的某个位置),其对应的查询向量会去“询问”源句子(通过键向量和值向量表示)中的哪些部分与之相关。
- 确定关注焦点:它用于和键向量计算注意力得分,通过这些得分可以确定在整个输入信息(由键向量和值向量代表)中需要重点关注的部分。例如,在文本生成任务中,当前要生成的单词的查询向量会帮助模型找到输入文本中对这个生成过程最有价值的信息,可能是语义相关的单词或者语法结构相关的部分。
键向量(K - Key)的作用
- 提供信息索引:键向量为输入信息提供了一种索引方式。它们与查询向量相互作用来衡量相关性。可以把键向量看作是一系列的“标签”,用于和查询向量进行匹配,以确定输入信息中的各个部分(由值向量表示)与查询的关联程度。
- 参与注意力计算:在计算注意力得分(如Scaled - Dot Product Attention中的)时,键向量起到关键作用。通过与查询向量的内积运算,能够反映出不同部分信息之间的相似性或者关联性,进而为注意力权重的分配提供基础。
值向量(V - Value)的作用
- 信息载体:值向量是实际的信息载体,包含了输入序列中的语义、语法等各种内容。例如在处理文本时,值向量可能包含单词的词向量以及它们在句子中的语义和语法信息。
- 输出贡献者:在计算注意力输出时,根据注意力权重(由查询向量和键向量计算得到)对值向量进行加权求和,从而得到最终的注意力输出。也就是说,值向量提供了原始的信息素材,这些素材经过注意力权重的筛选和组合,生成最终的、经过关注和筛选后的信息。
下面是一个从输入到转换成QKV向量的过程的例子:

3.向量点乘与向量间相似性的关系
- 首先明确向量点积(点乘)的计算公式:
对于两个向量和
它们的点积
其中是与的夹角。
- 然后分析点积与向量相似性的关系:
当的值越大时,在和固定的情况下,的值越大。
因为,在这个区间是单调递减的,越大,则越小。
当时,与同向,此时达到最大值,两个向量最相似。
但是,仅看点积的大小来判断向量是否相似是不准确的,因为点积大小还与向量的模长有关。例如,当和很大时,也会很大,但向量夹角可能并不小。所以,在判断向量相似性时,一般会结合向量的夹角(通过来计算)来综合判断,而不是仅仅看点积的值。
4.Scaled Dot-Product Attention
- 下面这个图就是这个注意力得分的计算流程,MatMul就是矩阵相乘,Scale就是缩放(也就是公式里的除以)
- 首先计算注意力得分(Attention Scores),其中是查询向量(Query Vector),是键向量(Key Vector)的转置(一个矩阵乘另一个矩阵的转置,也就是求内积,用来求他们的相似度,,),是键向量的维度。这里除以是为了防止注意力得分过大导致梯度消失或梯度爆炸等问题,起到缩放作用。
- 然后对缩放后的内容进行操作,用于信息对齐以及防止信息泄漏。
- 然后对注意力得分进行softmax操作,得到注意力权重(Attention Weights),,这里是对所有进行求和,即对于每个查询向量,会得到一组关于所有键向量的注意力权重。
- 最后计算输出向量(Output Vector),其中是值向量(Value Vector),这个输出向量就是通过注意力机制加权求和得到的最终结果。 这些公式组合起来构成了Scaled Dot - Product Attention的计算流程,它能够让模型根据查询向量和键向量之间的关系,动态地从值向量中提取信息。

5.操作
Mask的目的
在Scaled Dot - Product Attention中,Mask(掩码)操作主要用于处理序列中的信息对齐和防止信息泄露,一般用于解码器的第一个多头注意力当中。在自然语言处理等任务中,例如在机器翻译或文本生成场景下,模型不能利用未来的信息来预测当前的输出。Mask操作可以确保注意力机制在计算过程中遵循这些约束条件。

类型及应用场景
- Padding Mask(填充掩码)
- 应用场景:在处理序列数据时,为了使不同长度的序列能够在同一批次中进行处理,通常会对较短的序列进行填充(一般用一个特定的符号,如0),使它们的长度与批次中最长的序列相同。但是在计算注意力时,这些填充的位置不应该参与计算,否则会引入错误的信息。
- 操作方式:创建一个与注意力得分矩阵()形状相同的掩码矩阵,对于填充位置,将其对应的掩码矩阵中的元素设置为一个非常小的值(如负无穷),在进行softmax操作时,这些位置对应的概率就会趋近于0,从而有效地排除了填充位置在后续计算中的影响。
- Sequence Mask(序列掩码)
- 应用场景:在自回归任务(如生成式语言模型)中,模型不能看到未来的信息。例如,在预测句子中的下一个单词时,不能利用后面单词的信息。
- 操作方式:通过创建一个上三角矩阵作为掩码矩阵(主对角线及其下方元素为0,上方元素为负无穷),这个掩码矩阵与注意力得分矩阵相加。这样在计算softmax时,就会使得注意力机制忽略未来位置的信息,因为未来位置对应的得分在经过与掩码矩阵相加后变为负无穷,softmax后概率为0。
6.多头注意力
基本概念
多头注意力机制(Multi - Head Attention)是Transformer架构中的核心组件。它通过并行地使用多个独立的注意力头(Attention Heads)来捕捉输入序列中不同位置之间的多种关联关系。
计算过程
-
线性变换生成多个头的参数:假设输入序列对应的嵌入向量为,首先通过线性变换(全连接层)生成查询向量、键向量和值向量,对于多头注意力,会为每个头分别生成对应的、、。即,,,这里、、是可学习的权重矩阵。如果有个头(为超参数),那么会生成,,。
-
每个头对应的Q、K、V矩阵分别进行线性变换:在多头注意力中,我们希望每个头能够独立地从不同角度对输入信息进行关注和处理。通过线性变换,可以将 Q、K、V 矩阵的维度调整到适合每个头计算的形式。例如,假设原始的 Q 矩阵维度为(这是模型设定的一个维度参数),如果我们有个注意力头,经过线性变换可以将 Q 矩阵拆分为个维度为的子矩阵,使得每个头都能在合适的维度空间中进行后续的注意力计算。
-
每个头独立进行注意力计算:对于每个头(),按照Scaled - Dot Product Attention机制进行计算。首先计算注意力得分(其中是第个头的键向量维度),然后进行softmax操作得到注意力权重,最后计算输出向量。
-
拼接和线性变换得到最终输出:将各个头的输出向量进行拼接(concatenate),得到一个拼接后的向量。然后通过一个线性变换(全连接层)得到多头注意力机制的最终输出,其中是可学习的权重矩阵。
拼接公式:
优势
捕捉多种语义关系:不同的注意力头可以学习到输入序列中不同类型的语义关系。例如,在自然语言处理中,一个头可能关注句子中的语法结构关系,另一个头可能关注单词之间的语义相似性等,从而能够更全面地理解输入文本的信息。
增加模型的表示能力:通过并行地使用多个注意力头,多头注意力机制可以有效地增加模型的表示能力。相比于单头注意力,它可以从多个角度处理信息,为模型提供更丰富的特征表示,有助于提高模型在各种自然语言处理任务(如机器翻译、文本生成等)中的性能。

五、LayerNorm

1.Feature Scaling(特征缩放)/Normalization(归一化)
特征缩放是一种数据预处理技术,主要目的是使不同特征在数值上具有相似的尺度,以便在机器学习和数据分析中提高算法的性能和稳定性。
主要有两种方法:
- Normalization(归一化)/ 最小 - 最大归一化(Min - Max Normalizatio)
- Standardization(标准化)/ Z - 分数归一化(Z - Score Normalization)
为什么需要特征缩放?
在使用梯度下降法时,特征尺度不一致会使得等高线变得非常扁平或狭长,导致梯度下降的路径变得曲折,从而增加了找到最优解所需的迭代次数。使用特征缩放,可以使得等高线变得匀称,减少找到最优解所需的迭代次数。

常用的归一化方法
最小 - 最大归一化(Min - Max Normalization)
公式为,其中是原始数据,和是数据集中该特征的最小值和最大值,是归一化后的数据。这种方法将数据映射到区间。
优点是简单直观,能够将数据很好地限制在特定区间内。缺点是对异常值比较敏感,如果数据集中存在极端的最大值或最小值,会影响归一化后的数据分布。
Z - 分数归一化(Z - Score Normalization)
也称为标准化,公式为,其中是原始数据,是数据的均值,是数据的标准差。归一化后的数据均值为,标准差为。
优点是对数据的分布有一定的归一化效果,并且对异常值相对更鲁棒,因为它考虑了数据的整体分布情况。缺点是数据可能会被映射到一个较宽的区间,而不是像最小 - 最大归一化那样限制在一个较小的、确定的区间。
假设我们现在有几组文本数据,seq表示其序列(长度为n,即为有n个字),feature为其特征(即词向量的特征,维度为d),最后batch表示这样的文本数据的组数(有k组)。batchNorm就是从不同序列当中的同一批次的词上做归一化(也就是下图中蓝色的切法),layerNorm就是在一个序列上做归一化(也就是下图中黄色的切法)。

例如我们有下面几条文本:
今天天气真好
我爱你
中国欢迎你
按照batchNorm的切法就会切成下面这样(缺少的地方用0补):
| 序列 | 第一刀 | 第二刀 | 第三刀 | 第四刀 | 第五刀 | 第六刀 |
|---|---|---|---|---|---|---|
| Seq1 | 今 | 天 | 天 | 气 | 真 | 好 |
| Seq2 | 我 | 爱 | 你 | 0 | 0 | 0 |
| Seq3 | 中 | 国 | 欢 | 迎 | 你 | 0 |
如果不同的句子之间的长度波动比较大的话,针对同一个特征,不同批次下,算出来的均值和方差就会抖动很大。

按照layerNorm的切法就是:
| 序列 | |
|---|---|
| Seq1(第一刀) | 今天天气真好 |
| Seq2(第二刀) | 我爱你 |
| Seq3(第三刀) | 中国欢迎你 |
这样计算的均值和方差就是在自己这一句子当中计算,不需要全局的均值方差

2.batchNorm
Batch Normalization(批归一化)是一种深度学习中的归一化技术。它是在神经网络的训练过程中,对**每一层的输入(或者说是每一个小批次数据的激活值)**进行归一化处理(其实就是在),使得输入数据的分布更加稳定。
工作原理
- 在神经网络的训练阶段,对于一个小批次(batch)的数据,假设批次大小为。以一个全连接层为例,设输入数据为。
- 首先计算这个小批次数据的均值和方差(也就是计算该批次的所有样本的同一特征的均值和方差)。
- 然后对每个数据进行归一化(这里用到的是标准化方法),,其中是一个很小的数(如),用于防止分母为零,最后计算结果太大。

- 最后,还会进行一个线性变换,其中和是可学习的参数。这一步的目的是让模型能够恢复原始数据的分布特性,如果且,就可以近似恢复到原始数据的分布。

作用
- 加速收敛:和普通的归一化类似,batchNorm使得每一层的输入数据分布更加稳定,**避免了因为数据分布变化而导致的梯度消失或梯度爆炸问题。**例如,在深层神经网络中,如果某一层的输入数据分布发生较大变化,可能会导致后续层的梯度变得很小或很大,从而影响模型的训练速度。batchNorm能够使模型的训练过程更加平稳,加快收敛速度。
- 提高泛化能力:它可以起到一定的正则化作用。由于在训练过程中,每个批次的数据都有一定的差异,batchNorm的操作使得模型对不同的数据分布有更好的适应性,从而提高了模型的泛化能力,减少过拟合现象。
- 允许更高的学习率:因为数据分布更加稳定,在训练过程中可以使用更高的学习率,而不用担心模型因为学习率过大而无法收敛。
3.LayerNorm
Layer Normalization(层归一化)是一种神经网络中的归一化技术。它主要是针对神经网络中某一层的所有神经元的输入进行归一化操作。
计算过程
- 假设在神经网络的某一层有个神经元,输入为。
- 首先计算该层输入的均值和方差。
- 然后进行归一化,得到,其中是一个很小的数(例如),用于防止分母为零。

- 最后,通常还会有一个线性变换,即,其中和是可学习的参数。这一步的目的是能够让模型在一定程度上恢复原始数据的分布特征,增加模型的表达能力。
应用场景和优势
- 序列数据处理优势:在自然语言处理(NLP)等领域处理序列数据(如句子)时非常有用。因为序列的长度可能不同,或者在小批次训练时批次大小可能变化,Layer Normalization不受批次大小的影响。例如在循环神经网络(RNN)和Transformer架构中,它可以有效地对每一层的输入进行归一化,帮助模型更好地学习序列的模式。
- 独立于批次大小:与Batch Normalization不同,它不依赖于批次大小来进行归一化。Batch Normalization在批次大小变化或者非常小的批次情况下,可能会出现不稳定的情况,而Layer Normalization可以提供更稳定的归一化效果,更适合于一些对批次大小敏感的应用场景或者动态网络架构。
每个特征的所有样本(同一个批次)
每个样本的所有特征
在2维上

六、残差链接
残差连接的基本原理
在Transformer架构中,残差连接(Residual Connection)的基本思想是将某一层的输入直接加到该层的输出上。这种连接方式有助于解决深层神经网络中的梯度消失和梯度爆炸问题,同时能够让网络更容易地学习到恒等映射,使得网络可以更专注于学习输入和输出之间的差异。
在Transformer中的具体应用
- 编码器部分:在Transformer的编码器(Encoder)中,每个多头注意力层(Multi - Head Attention)和前馈神经网络层(Feed - Forward Network)之后都有残差连接。
- 以多头注意力层为例,假设输入为,经过多头注意力层后的输出为,那么残差连接后的输出为。这个结果随后会经过一个层归一化(Layer Normalization)操作,即。
- 对于前馈神经网络层,同样如此。假设经过多头注意力层和层归一化后的输出为,前馈神经网络层的输出为,残差连接后的输出为,然后再进行层归一化。
- 解码器部分:在Transformer的解码器(Decoder)中,残差连接的应用方式与编码器类似。在自注意力层(Self - Attention)、多头注意力层(用于关注编码器的输出)和前馈神经网络层之后都有残差连接,并且在残差连接后也会进行层归一化操作。这样可以确保在解码器的每一个关键处理步骤中,信息能够有效地流动,避免信息丢失和梯度问题。

七、三个多头注意力的区别
在transformer架构当中,存在三个多头注意力机制,他们的结构、输入不太相同,作用也不同。其中编码器中有一个多头自注意力,解码器中有一个掩码多头自注意力和一个多头注意力

Encoder中的多头自注意力
在自注意力机制(Self - Attention)中,“自” 表示注意力的计算是基于序列自身元素之间的关联。也就是说,它是一种在单个序列内部进行注意力分配的机制。
在编码器中的注意力机制,其输入的Q、K、V矩阵都是通过“自身”(同一个序列)得到的,关注的是序列自身元素之间的关联。
通过这个自注意力机制来让模型了解输入序列元素之间的关联。
Decoder中的掩码多头自注意力
在解码器中的掩码自注意力,也是一个自注意力机制。其输入Q、K、V矩阵都来自于目标序列,通过该自注意力机制,可以更好的了解目标序列元素之间的关联。其中还采用了前面提到的Mask的技术。
Decoder中的第二个多头注意力
在解码器的第二个多头注意力,其输入分别来自编码器和解码器的第一个多头注意力,其中,编码器的输出作为其K、V矩阵,解码器的第一个多头注意力的输出作为其Q矩阵。
这样的设计使得解码器能够利用编码器对输入序列的编码信息(通过 K 和 V),结合解码器自身对目标序列已生成部分的关注(通过 Q),从而在生成目标序列时有效地利用输入序列的语义和结构信息,实现高质量的翻译、生成等任务。
比如在机器翻译当中,我们要将 中文:我爱你 =》英文:I Love You
Encoder的输入就是 通过将输入序列:“我爱你”转换成的Q、K、V矩阵,其作用就是要了解这句中文语句中的元素之间的关联。
Decoder的第一个多头注意力机制的输入就是 通过将目标序列:“I Love You”转换成的Q、K、V矩阵,其作用就是要了解这句英文语句的元素之间的关联。
最后,通过Decoder的第二个多头注意力的输入,就是由编码器的输出生成的K、V矩阵和解码器的第一个多头注意力生成的Q矩阵。其作用在于通过前面得到的信息,得到两个序列之间的语义、结构和关联。这个例子里就比如学习到,爱和Love之间的关联,会将强两者之间的权重。
八、前馈神经网络
定义
在Transformer架构中,Feed - Forward(前馈神经网络)是编码器和解码器中的一个重要组件。它是一个全连接的神经网络,用于对经过多头注意力机制处理后的信息进行进一步的转换和特征提取。

结构与计算过程
- 通常包含两层全连接层。以编码器为例,假设经过多头注意力机制和残差连接、层归一化后的输入为。
- 首先,它会经过第一个全连接层,该层的输出一般使用ReLU(Rectified Linear Unit)激活函数进行激活。例如,如果第一个全连接层的权重矩阵为,偏置为,那么经过第一个全连接层后的输出。
- 然后,会进入第二个全连接层,得到最终的输出,这个输出会再经过残差连接和层归一化,然后传递到下一层(如果是编码器的最后一层则输出最终编码后的结果;如果是解码器的最后一层则输出最终生成的目标序列)。
作用
- 特征提取与转换:前馈神经网络能够对输入的特征进行非线性变换,挖掘出不同维度之间的复杂关系。它可以将经过多头注意力机制处理后的信息进行进一步的抽象和组合,从而生成更适合于下一层处理或者最终输出的特征表示。
- 增加模型复杂度和表达能力:通过两层全连接层的设计,前馈神经网络增加了模型的非线性特性,使得模型能够学习到更复杂的函数映射关系。这有助于Transformer模型在处理自然语言处理等任务时,更好地应对各种复杂的语义和语法结构,提高模型的性能和泛化能力。
九、为什么用自注意力机制
下面分别是 层运算的复杂度 顺序操作 信息传递深度
自注意力
循环
卷积
受限自注意力

注意力机制对比rnn的优秀的点就在于,在两者复杂度差不多的情况下,自注意力可以并行计算,所以效率高很多。
自注意力机制一次把所有的信息提取出来,然后用一个MLP把数据整合起来,所以信息只需要传递常数级。
rnn需要迭代的传递信息,所以最远的信息要传n次。
卷积就是可以一次把大小为k的窗口的信息往下传,信息之间最后要汇聚到一起,就需要进行次
transformer因为要抓取更加一般化的信息,要捕捉长距离依赖关系,总结更一般化的规律,所以需要大量的数据才能更好的进行总结。