transformer架构详解由浅入深-大模型入坑笔记真的很详细

2025-04-21  本文已影响0人  Feel_狗焕

1、transformer架构
2、transformer架构解析

3、transformer核心解析

4、transformer整体执行流程


1、transformer架构:

Transformer是一种深度学习模型,这种模型在自然语言处理(NLP)领域特别流行,它引入了一种新的机制——自注意力(self-attention),使得模型能够更加高效和有效地处理序列数据(序列数据可以简单的理解为我们说的一句语意连贯的话)。

Transformer完全基于注意力机制,没有使用循环神经网络(RNN)或卷积神经网络(CNN)。核心概念是:

transformer的架构如下:
transformer的本质就是由编码器(encoder)和解码器(decoder)组成。每个编码器可以叠加多个编码器一起使用老的transformer架构里面叠加了6个,解码器也是一样。编码器和解码器里面又有对应功能层来处理对应的业务数据。


tf-ModalNet-21.png

2、transformer架构解析

这里对transformer的架构做一个简单分析,主要是按照输入和输出的方向对transformer的架构做一个简单的理解。先让我们看到transfomer架构里面的这些模块大致都在做什么。

2.1、Tokenization分词

Tokenization就是把一段文字,变成一组Token,也就是词元化。子词词元化,比如:“subword”这个词可以拆分为“sub”和“word”两个子词。比如说1000Token大概对应为750个英文单词,对应汉字大概为500个。

下面以OpenAI开源的tiktoken工具为例对输入的中文进行分词处理:
可以看到输入的“海南麒麟瓜”5个汉字被转换为右边的11个token,这些token同时也组成了大模型的字典表。

image.png

2.2、词嵌入和位置嵌入:

1)、词嵌入:

词嵌入就是把输入的token转化为一个向量(即数学空间坐标系),向量可以简单的理解为一个坐标点,一维向量理解为一个坐标点[1],二维向量理解为两个坐标点[1,2]即x和y轴上的点,三维坐标理解为3个坐标点[1,2,3]即一个空间的x和y和z坐标上的一个点,四维、五维。。。512维都可以简单的这样理解。


词嵌入和位置嵌入_副本.png

经过这样转换后我们可以用这些向量来计算,就可以算出不同词之间的距离等关系,从而实现我们人类中的语意关系。

2017年transformer的词嵌入计算转化后返回是一个token对应的512维的向量。2018年的GPT向量的维度是768,2019年的GPT-2的向量维度是1600,2020年的GPT-3的向量维度是12288维度,2024年的Llama 3的向量维度是16384.

2)、位置嵌入:

transformer在输入的时候做完词嵌入处理后,还需要在对词嵌入后的向量做这个词的位置嵌入处理。因为一句话的语意除了文字外还有该文字(词)在语句中的位置。

整个过程就是transformer将每个词的位置信息转换为一个向量,然后将该词的位置向量和上一步骤处理的词本身的向量进行相加得出一个新的向量。然后这个新的向量就包含了这个词的意义信息、位置信息等多维度的信息。例如,下面的示例只是用于理解:


image.png
3)、词表映射:

注意:这里的词表中的词表大小乘于向量维度大小(vocab_size × d_model)的值就是大模型的参数的一部分。
上面所说的token化->词嵌入->向量化这些内容其实都在一个训练好的大模型中的词表映射中。一个完整的 Transformer 词表映射(Vocabulary)通常包括以下几部分:

(1)、Token ↔ ID 对照表:

Token-to-ID 列表:将每个子词或标记(例如 "apple", "##s", "un", …)对应唯一的整数 ID,从0到词表大总数减1(vocab_size-1)。模型使用这些 ID 进行后续的向量查表;

(2)、嵌入矩阵(Embedding Matrix):

训练好的参数矩阵:大小为词表大小乘于向量维度大小(vocab_size × d_model),其中 d_model 是隐藏层维度(常见如 512、768、1024 等)。矩阵的第 i 行就是 ID 为 i 的 token 的初始向量表示,训练过程中该矩阵元素会被更新;

(3)、子词单元(Subword Tokens):

Transformer 常用的子词算法(WordPiece、BPE、SentencePiece)能将少见或新词拆分成更小单元(例如 "transform" → ["trans", "##form"]),从而减少未登录词(OOV)问题并提高泛化能力;

(4)、特殊标记(Special Tokens):

词表中会预留若干特殊标记:

(5)、词频或排序信息:

在构建词表时,子词算法一般会输出每个 token 的出现频率或基于频率的排序信息,但在模型加载后,这些统计信息不直接参与计算,模型只关心 ID 与向量;

初始化与预训练:嵌入矩阵可以随机初始化,也可以用预训练好的词向量(如 GloVe、fastText 或从大型语料上预训练得到的 Transformer 嵌入)进行 warm start,使模型更快收敛。
与位置编码结合:在查表拿到 token 向量后,Transformer 还会加上对应的位置编码(Positional Encoding)以注入序列顺序信息,再送入后续多头自注意力层。

2.3、编码器&解码器:

2.3.1、编码器:

编码器核心的处理流程,就是把上面处理好的所有的词向量并行计算,生成新的向量信息,但是新向量的数量和维度信息都不变,唯一改变的是新向量的值这些值包含了更多的语意信息,每一个向量都直接或间接包含了所有的语意,所以编码器一般用来做分析。

2.3.2、解码器:

解码器根据编码器的分析内容来预测回答的内容,所以解码器一般用来做生成。解码器接收两个输入:

至于解码器什么时候开始输出内容和结束输出是由两个特殊的Token来决定的,这两个特殊的Token存在大模型的Token字典表里面。比如上面输入的"今天是疯狂星期四吃点啥",解码器开始输出的时候设置一个特殊的Token作为输出的标识符,解码器一个字一个字往外吐到最后,如解码器生成的最终内容为"今天应该吃葡式蛋挞"解码器预测该句子差不多结束了就会在"挞"后面添加结束符的Token。

1)、Decoder Only模式:

传统的transformer架构中左边的编码器可以看作是用来存放外部输入(即问题)右边解码器存输出(即回答),那么在这样的架构上做简化只保留右边解码器部分,然后对这个解码器进行优化后,解码器的输入只来自一个方向的输入,那么这一个方向的输入包含了用户的问题和大模型给出的回答内容,这部分我们称为“Prompt”,然后将“Prompt”作为输入到解码器中解码器根据这部已有的文字的上下问去预测后续的回答内容,这样的架构称为Decoder-Only架构(如下图所示),也被称为生成式架构,仅包含解码器部分,没有编码器。这种架构通常用于生成任务,如文本生成、对话系统等。其代表模型是GPT(Generative Pre-trained Transformer),它通过预测下一个单词来生成文本,具有自回归生成的特点。


decoder-only-1.png

GPT基于transformer简化后的decorder-only整体架构的处理流程如下:


transformer-3.png

2.4、linear & softmax:

大模型中有个称为隐藏层和隐藏状态的术语:

2.4.1、linear层(线性层):

linear层不仅仅出现在上面transformer的架构图的解码器部分,还出现在编码器和解码器的内部。许多架构图可能未明确标注这些组件,因为它们隐藏在自注意力机制和前馈网络(FFN)的内部结构中。

1)、编码器&解码器:

编码器的每个子层(自注意力、前馈网络)都包含 Linear 层,主要用途如下:

2)、独立Linear层:

因为经过FFN的升维操作后丰富了向量的包含的信息含义,然后又降维,就会导致升维后的那些更深层的信息被隐藏到了降维后的向量值当中。当我们拿着这些向量到词汇表中对应的时候发现。这些升维处理后的向量仍然是“隐藏状态”,无法直接对应到词汇表中的具体 token。所以需要在解码器输出后在经过Linear层进行处理。Linear层将FFN(前馈神经网络)输出的向量和自己的一个权重矩阵进行计算得到词汇表中每个token对应的得分,最后在经过“softmax归一化”得到每个token的概率。

核心功能:从解码器输出的向量到词汇表的映射,计算出每个词的得分logits。简单的说就是将FFN输出的特征向量经过Linear层的权重矩阵来学习如何将抽象特征(如:“动作”、“对象”)映射到具体词汇表(如:“吃”、“鱼”等)。

(1)、维度转换:

FFN 的输出是隐藏空间中的向量(就是模型默认的维度如 512 维)专注于向量更深层的特征提取,同时远小于词汇表大小(如 50,000),无法直接生成每个 token 的得分,而linear层需要生成一个与词汇表大小(如 50,000)相同的 logits 向量,表示每个 token 的得分,用于最终判断选择词汇表中那个词。计算公式如下:


linear-1.png

公式中的偏置量:
它的核心作用是为每个词汇表中的词(token)提供一个基准得分,允许模型在计算 logits 时动态调整每个词的“天然倾向性”。(例如,某些词即使特征不匹配,也可能因高频出现而被默认加分)。偏置项的实际影响如下:
调整词频偏差:

补偿特征不足,场景示例:
假设生成句子时,隐藏状态的特征未明确指向“苹果”,但上下文需要生成水果名称。

控制生成倾向:

(2)、类比解释:
(3)、计算示例:

假设我们大模型的向量维度为512维,词汇表大小vocab_size=50000。那么Linear层就会有一个形状为[512, 50000]的权重矩阵。然后FFN输入的是512维的向量,如h = [h₁, h₂, ..., h₅₁₂],使用如下矩阵乘法计算:

linear-2.png

Wj,i是权重矩阵中第“j”行第 “i”列的值,bi是偏置项(可选)

现在假设词汇表为 ["猫", "狗", "苹果"](vocab_size=3),猫的词向量为[0.1,0.3]、狗的词向量为[0.2,-0.4]、苹果的词向量为[-05,0.6],隐藏向量为 2 维(这里是简化示例),那么公式展示如下:

输出的结果“猫”得分最高(0.23),模型倾向于选择“猫”作为下一个词,然后在将这个logits带入softmax中计算概率。

2.4.2、softmax层:

softmax层接收linear输出的值,这个值的数量是和大模型中的词表数量一致,比如GPT3是5w多个词表,那么就会输出5w个logits值,然后计算这5w个相关度对应的概率,比如第一个值我们命名为a1,第二个命名为a2等,然后利用类似这样的公式计算每个相关度的概率2.7a1/2.7a1+2.7a2+2.7a3+..2.7^a50000,经过类似这样的计算后就可以预测出对应向量后续要输出的具体内容是那个。softmax这层处理的方式就叫"归一化"。

Softmax 是一种归一化函数,将任意实数向量转换为概率分布,所有值在 [0,1] 范围内且和为 1。给定 logits 向量z=[z1,z 2,...,zK],计算公式如下:


注意力-函数-3.png

e^Zi:对 logits 逐个元素取指数(确保结果为正);
分母:所有指数值的和,用于归一化;

1)、计算示例:

假设词汇表为 ["猫", "狗", "苹果"],经过 Linear 层后得到 logits 为 [5.2, 3.8, -1.0],以下是计算步骤:

(1)、计算指数:

logits向量([5.2, 3.8, -1.0])中的每个元素的指数值为:e5.2≈181.27,e3.8≈44.70,e^−1.0≈0.368

(2)、求指数和:

Sum=181.27+44.70+0.368≈226.34

(3)、归一化为概率:

为输入的logits向量中的每一个元素计算分布概率。
P(猫)= 181.27/226.34≈0.80
P(狗)= 44.70/226.34≈0.20
P(苹果)= 0.368/226.34≈0.00

最终概率分布为[0.80,0.20,0.00],模型有 80% 的概率选择“猫”,20% 选择“狗”,几乎不选“苹果”。

3、transformer核心解析:

上面我们理解了transformer架构中的各个模块大致都是干什么。这里我们在稍微深入一点看下编码器和解码器当中的注意力机制、自注意力机制、多头注意力机制、前馈网络等。

3.1、注意力机制:

定义:注意力机制是一种让模型动态关注输入中不同部分的机制,通过权重分配决定哪些信息更重要。主要是处理两个不同序列的内容(文本内容)。
核心思想:模拟人类注意力,在大量信息中聚焦关键内容。
典型应用:最初用于处理输入序列与输出序列(seq2seq)之间的关系(如机器翻译中的源语言和目标语言对齐)。

工作原理:
假设有一个查询(Query)和一组键值对(Key-Value):

类比翻译时:

译员根据自己当前要讲的那句话(Query),回头在演讲稿里扫一眼(计算哪个部分最重要),把相关信息挑出来(加权汇总),然后把它融入自己的翻译里。
这就是注意力机制在两个不同序列之间,根据一个序列(Query)去“回头看”另一个序列(Key/Value)中最相关的信息。

注意力机制关注两个不同序列之间的交互(如编码器输出与解码器输入)。注意力机制计算公式(跨序列)如下:


注意力-函数-1.png
1)、计算示例:

注意力机制计算公式中的Q、K、V理解。比如我们一个班级里面有很多同学了,然后我们有每个同学的身高、体重、胸围、腿长等信息,这里我们把每个同学我们都有身高、胸围、腿长这样3个值看作一个3维向量(这里就是对应公式里面的K),而体重对应公式里面的V。最后我们需要对新同学来预测他的体重是多少。

注意力计算示例-1.png

3.2、自注意力机制:

定义:自注意力机制是注意力机制的一种特殊形式,输入序列中的每个元素创建出 Query、Key 和 Value,这三个向量,用于捕捉序列内部的长距离依赖关系(简单的说对比注意力机制,自注意力机制主要关注输入内容之间的每个元素与元素之间的关系、意义等,即Q、K、V都来自同一个输入的文本内容之间的向量计算)。
核心思想:让序列中的每个词与其他所有词交互,动态学习词与词之间的关联。
典型应用:Transformer 模型中处理单一序列(如文本编码或解码)。

工作原理:
输入序列中的每个词生成三个向量:

类比
假设你在整理会议纪要:

自注意力机制关注同一序列内部的交互(如文本中词与词的关系)。自注意力机制(同一序列)的计算公式如下:

注意力-函数-2.png
1)、自注意力Wq、Wk、Wv三个矩阵:

从自注意力机制的定义可以发现Q、K、V的创建来源同一个数据源即通过Embedding处理的向量数据,而自注意力机制的运算是在输入序列中做每个词之间的相关度计算,同时Q、K、V差别都不大都只包含词和位置信息且都是在做一个固定的数学公式的计算,那么整个模型向量计算对输入的Embedding处理的依赖性越大,最后输出的误差也可能受到影响。所以在这方面上引入一个Wq、Wk、Wv的三个神经网络(维度和输入的Embedding处理后的词向量维度一致),然后对词嵌入和位置嵌入处理好后的向量分别和这三个神经网络做一次计算得到同样数量和维度大小的三个Q、K、V新向量,然后在用这三个新的向量去做输入序列(如:文本内容)之间的自注意力的计算,从而减少模型整体输出的误差。(注意这里引入的Wq、Wk、Wv三个矩阵也是大模型的参数的一部分)

作用:引入的Wq、Wk、Wv三个矩是我们在模型训练的时候得到的,核心作用就是用于提取输入的初始向量的特征,从而减少模型在做自注意力计算的时候的误差。

示例:


自注意力-1.png
2)、计算示例:

注意力机制的计算公流程如下,比如我们输入一段序列文本为“Action gets results”。为了计算第一个单词“Action”的自注意力,我们将计算短语中与“Action”相关的所有单词的得分。我们先获取“Action”单词的初始向量,然后将该向量和Wq、Wk、Wv三个特征提取的向量做一次计算得到Q1、K1、V1。通过将查询向量(q1)的与所有单词的键向量(k1,k2,k3) 的点积来计算第一个单词的得分:


注意力-1.png

然后,将这些得分除以 8(或者其它值也就是大模型中一个向量维数的平方根):


注意力-2.png
接下来,使用 softmax 激活函数对这些得分进行归一化的到一个相关概率值或者称为权值: 注意力-3.png

然后将这些经过归一化的得分乘以值向量(v1,v2,v3),并将得到的向量求和,得到最终向量(z1)。这是自注意力层的输出。然后将其作为输入传递给前馈网络:


注意力-4.png

因此,z1 是输入序列“Action gets results”的第一个单词的自注意力向量。我们可以用同样的方式得到输入序列中其余单词的向量:


注意力-5.png

我们看到自注意力机制核心是做输入序列的信息聚合,输入序列信息越多那么计算的量就越大。

3.3、多头自注意力机制和掩码多头自注意力机制:

3.3.1、多头自注意力机制:

把上面的自注意力机制计算过程重复经过96层,我们发现越往后面计算的时候Q、K的相关度系数就越疏远。因为越往后面的层数比如第30层中的向量,每个向量基本上可以包含了当前段落的信息,这时候再在第30层做每个向量的自注意力计算的时候,就会出现比如第一个向量(是一个大段落中的一个小段落)应该和第二个向量(是一个大段落中的另一个小段落)的语意上有关系那么相关度系数因该是较大值,但实际计算发现这个值比较小。

什么是多头:
为了解决上面的问题,transformer通过引入多组不同的Wq、Wk、Wv矩阵,通过多组不同三个矩阵对每个层级向量做细化特征提取。至于引入多少组看模型决定,这个“组”就就称为“多头”,比如在GPT-3中引入了96组也称为“96头”。

作用:
多头自注意力机制(Multi-Head Self-Attention)。这是自注意力的扩展,通过将输入分成多个头(head),每个头在不同的子空间学习不同的注意力模式,最后将结果合并。这样可以让模型同时关注来自不同位置的不同信息,增强模型的表达能力。例如,一个头可能关注句法结构,另一个头关注语义关系。

工作原理:

多头自注意力-1.png

3.3.2、掩码多头自注意力机制:

掩码自注意力层或者说因果自注意力层(Causal attention layer)可以在解码阶段捕获当前词与已经解码的词之间的关联。在解码器中的掩码多头自注意力层对输入序列执行类似多头自注意力层的处理方式,但是又有不同之处。

Transformer是自回归模型,即模型它是逐个生成文本,在推理阶段的时候将当前输出文本附加到之前输入上变成新的输入,后续的输出依赖于前面的输出词,具备因果关系。但是在训练阶段的时候解码器的输入是一个完整的预测的目标序列(如翻译结果“我爱机器学习”),那么就会导致模型在训练阶段已经看到未来要输出的结果最终会导致模型训练好后在推理的时候出现偏差。所以引入了掩码多头自注意力机制,在训练阶段的时候掩盖住不需要知道的内容。

下面以“我爱机器学习”为例简单介绍:

1)、推理阶段:

编码器输入方式:逐步生成,每次只能看到已生成的词。

2)、训练阶段:

所以模型在训练阶段的时候对于解码器输入的一次性目标序列内容采用掩盖的方式来模拟真实推理使用的过程,虽然输入的是完成的目标序列,但是掩码矩阵会屏蔽位置2之后的所有词,如只关注"<sos>我”的词向量的注意力计算,忽略后面剩余的词向量的相关度系数计算。示例如下:

(1)、掩码在数学上的表示:

实现方式:
1.在注意力得分矩阵中,将未来位置(上三角区域)的值替换为一个极小的负数(如−∞);
2.经过 Softmax 后,这些位置的权重趋近于 0,模型无法关注未来词;

假设目标序列长度为 4(“我”、“爱”、“机”、“器”)这四个词:
掩码矩阵(4x4,0 表示允许关注,-∞ 表示屏蔽),并不是词向量或词向量的相关度系数,而是一个固定的二进制矩阵(或由 0 和 −∞ 组成的矩阵),用于控制自注意力机制中每个词能关注到哪些位置。它的核心作用是 限制模型在生成当前词时仅关注已生成的词,避免“偷看”未来词。矩阵中行表示当前正在生成的第i个词的位置,列表示可以关注到的第j个词的位置:


掩码自注意力-1.png

第 1 行:生成第 1 个词时,只能关注位置 1(自身)也就是"我"这个词。计算流程大致如下:
1.将"我"这个词向量通过掩码自注意力层当中的linear投影到 Query、Key、Value 向量;
2.计算注意力得分,将Q和K进行点积计算得到输入序列的一个相关度系数矩阵(也是每个向量的相关度得分):


掩码自注意力-2.png

3.应用掩码遮盖:将 Scores 矩阵的上三角区域(未来位置)设为 −∞(注意:这里是给相关度系数矩阵用−∞掩盖,和上面给出的掩码矩阵不是同一个);
4.Softmax 归一化:在进行归一化计算概率的时候,由于未来位置的权重趋近于 0(即公式中的QK^T值越小导致经过softmax计算后的权重越小),所以就会让模型仅关注历史词即当前位置之前的词;

3.4、交叉注意力层:

交叉注意力层也称为"encoder-decoder attention",主要用于处理两个不同序列之间的关系。看transformer架构图中就是位于编码器的输出->解码器的输入的交互地方。对于交叉注意力层来说它的输入的Q、K、V来自如下:

这使得解码器中的每个位置都能关注输入序列中的所有位置。另外,编码器并非只传递最后一步的隐状态,而是把所有时刻(对应每个位置)产生的所有隐状态都传给解码器,这就解决了中间语义编码上下文的长度是固定的问题。我们日常说的对齐指的就是这里。


交叉注意力层.jpg

通过编码器内部多头自注意力、交叉层注意力等方式实现了输入序列内部之间和不同序列之间的关联关系。

3.5、前馈神经网络:

前馈神经网络也称为MLP全连接神经网络。FNN网络主要是通过两个 Linear 层(通常中间加激活函数)实现非线性变换,增强整个向量的表达能力。对多头自注意力计算后的向量先做升维然后在降维度,如:第一个线性层将维度从d_model(例如512)升到更高的维度(例如2048),第二个线性层再降回d_model(如 512维度);

前馈神经网络的数学表示如下:
其中,Linear₁ 是升维层,Linear₂ 是降维层。注意这里使用的两个变化也涉及到神经网络的参数,这些参数也是组成大模型的参数之一。


Fnn计算.png

为什么要先升维再降维?

1)、 核心目的:增强非线性表达能力

存在的问题:自注意力机制本质是线性变换(矩阵乘法)的加权和,缺乏对复杂非线性关系的建模能力。
解决方案:通过 FFN 的升维和非线性激活函数,引入更强的非线性变换。假设输入向量是“吃”的 512 维表示:

2)、 数学视角:扩展模型的假设空间

假设输入是 512 维向量,直接使用单层线性变换(512 → 512)的表达能力有限。通过升维到 2048 维:

3)、类比解释:

想象你要画一幅复杂的画:


4、transformer整体执行流程:

我们再来结合模型结构图来简述推理阶段的计算流程,具体如下图所示。


transformer推理流程-1.jpg

假设我们进行机器翻译工作,把中文”我吃了一个苹果“翻译成英文”I ate an apple“,在假设模型只有一层,执行步骤如下:

针对本例,解码器的每一步输入和输出具体如下表所示。


transformer推理流程-2.jpg

参考:

一文理解 Transformer 的工作原理

https://www.infoq.cn/article/qbloqm0rf*sv6v0jmulf

吴恩达《深度学习专项》笔记(十七):Transformer

https://zhouyifan.net/2022/09/21/DLS-note-17/

探秘Transformer系列之(2)---总体架构

https://www.cnblogs.com/rossiXYZ/p/18706134

视频讲解

https://www.bilibili.com/video/BV12bfPY1E1S?spm_id_from=333.788.videopod.episodes&vd_source=37c6700871cf1a87e4ccd372081f0956

</article>

上一篇 下一篇

猜你喜欢

热点阅读