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

1、transformer架构

2、transformer架构解析

  • 2.1、Tokenization分词器
  • 2.2、词嵌入和位置嵌入
  • 2.3、编码器&解码器
    • 2.3.1、编码器
    • 2.3.2、解码器
  • 2.4、linear & softmax

3、transformer核心解析

  • 3.1、注意力机制
  • 3.2、自注意力机制
  • 3.3、多头自注意力机制和掩码多头自注意力机制
  • 3.4、交叉注意力层
  • 3.5、前馈网络

4、transformer整体执行流程


1、transformer架构:

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

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

  • 自注意力机制:这允许模型在序列内的任意位置间直接建立依赖,从而更好地理解数据的上下文关系。自注意力机制可以并行处理所有位置的数据,这提高了计算效率。
  • 多头注意力:模型会同时学习数据的不同表示,每个"头"关注序列的不同部分。这种机制可以捕获序列中多种不同级别的依赖关系。
  • 位置编码:由于Transformer不使用基于顺序的结构,因此需要通过位置编码来给模型提供关于单词在序列中位置的信息。

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


2、transformer架构解析

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

2.1、Tokenization分词

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

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

2.2、词嵌入和位置嵌入:
1)、词嵌入:

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

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

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

2)、位置嵌入:

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

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

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):

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

  • PAD\]:填充短句以对齐长度。

  • SEP\]:句间分隔符,用于下游任务或双句输入。

  • MASK\]:在 Masked Language Modeling 任务中使用。 这些标记同样拥有固定的 ID,并参与嵌入查表

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

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

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

  1. 比如一段文本"今天是疯狂星期四吃点啥"这个11个汉字,在经过输入层(Input Embedding)和位置编码(Positional Embedding)后生成11个512维度的向量。
  2. 编码器接收11个向量信息,然后通过内部并行计算,每个向量(词)以自己为中心开始计算其余10个词和自己的关系最后生成该词的新向量(这里是自注意力机制后面会解析)。所以经过编码器编码输出后的11个向量信息已经和输入的不一样了,具备了更完善的语意信息(简单的说在没编码之前这11个向量的每一个向量就是代表每一个词的意义和位置,经过编码输出后每一个向量包含了其余10的词的内容特征,或者说可以代表一个短句子或者一个词组或者一个段落)。
2.3.2、解码器:

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

  • 一个是编码器输出的所有向量(可以理解为外部输入的问题);
  • 另一个是解码器已经输出的一部分内容预测概率(位于"Output Probabilities"即解码器生成的文字内容)这部分已经解码的内容会"右移"被添加到"Outputs(shifted right)"做为输入,重新进行词嵌入和位置嵌入处理,然后同时和还没处理的输入向量一起处理,这样做是因为要根据编码器输入的分析和解码器生成的回答做上下文关联去跟精准的预测下一个输出的词、句;

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

1)、Decoder Only模式:

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

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

2.4、linear & softmax:

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

  • 隐藏层:该术语指的是神经网络中不直接接触输入或输出的中间层,在transformer中每个编码器或解码器层的自注意力层和FFN(前馈神经网络)都属于隐藏层。
  • 隐藏状态:指隐藏层输出的结果,通常是大模型默认的高维向量,FFN层输出的向量就是隐藏状态的一种。
2.4.1、linear层(线性层):

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

1)、编码器&解码器:

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

  • 多头自注意力层:将输入向量拆分为 Q/K/V 向量(通过三个独立的 Linear 投影)。如:输入的向量是512 维 然后将其拆分为 8个Q、K、V的 64 维向量,这样处理是为了从8个方面提取输入信息的特征(也称为多头)下文会有解释;
  • 前馈网络(FFN):通过两个 Linear 层(通常中间加激活函数)实现非线性变换,获取向量更深层的信息,对多头自注意力计算后的向量先做升维然后在降维度,如:第一个线性层将维度从d_model(例如512)升到更高的维度(例如2048),第二个线性层再降回d_model;(下文也会有解释)
2)、独立Linear层:

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

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

(1)、维度转换:

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

  • h是FFN输出的向量;
  • Woutput是形状为[d_hidden,vocab_size] 的权重矩阵,d_hidden是隐藏层输出的向量维度(即大模型默认的向量维度),vocab_size是词汇表的大小。这里的权重矩阵在transformer架构中就是共享输入层Embedding词嵌入的参数(简单的理解为权重矩阵中每一列就是一个词向量);
  • boutput是偏置项,是一个可学习的参数;
  • logits是vocab_size 维向量(如 50,000 维);

公式中的偏置量:

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

调整词频偏差:

  • 高频词偏置:如果某些词(如"的""是")在训练数据中频繁出现,模型可以通过学习较大的 bi值,提高它们的基准得分;
  • 低频词惩罚:罕见词可能被赋予较低的 bi,避免模型过度生成它们;

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

  • 若"苹果"的bi较高,即使特征匹配度一般,也可能被选中;
  • 若"榴莲"的bi较低(假设训练数据中较少出现),即使特征匹配,得分也可能偏低;

控制生成倾向:

  • 抑制无关词:若希望模型避免生成某些词(如敏感词),可以固定其bi为极低值(甚至负无穷);
  • 鼓励特定词:在微调时,增大某些词(如领域术语的bi,使其更易被生成;
(2)、类比解释:
  • FFN 的输出像一份"加密报告",包含所有关键信息,但需要翻译成人类可读的语言(词汇表 token)。
  • Linear 层的作用是将这份报告"解码"成具体的词汇选择。
(3)、计算示例:

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

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

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

  • 权重矩阵形状为[2, 3]:
  • FFN输入的向量为:h=[0.8,0.5]
  • 计算logits:logits=h⋅W=[0.8×0.1+0.5×0.3, 0.8×0.2+0.5×(−0.4), 0.8×(−0.5)+0.5×0.6]=[0.23,−0.04,−0.1]

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

2.4.2、softmax层:

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

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

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

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

(1)、计算指数:

logits向量([5.2, 3.8, -1.0])中的每个元素的指数值为:e^5.2≈181.27,e^3.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 与每个 Key 计算相关性(通常用点积或其他相似度函数)。
  • 归一化权重:通过 Softmax 将相似度转换为注意力权重(和为1)。
  • 加权求和:用权重对 Value 加权求和,得到最终注意力输出。

类比翻译时:

  • Query:译员当前要说的内容(目标语言)。
  • Key:演讲者的话(源语言)可以理解为大模型中的已经训练好的内容答案。
  • Value:演讲者的话,源语言里面的每个句子意思。
  • 注意力权重:决定哪些句子与你的问题最相关。

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

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

1)、计算示例:

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

  • 这时候新来一位身高为178、胸围为36、腿长为90(可以看作一个3维向量,对应公式中的Q)的同学让我们来预测他的体重是多少,我们首先需要将该同学的身体数值和班级里每个同学做一个相关度的计算再用softmax进行归一化计算得到的值用于表示可参考度意义(即用新同学的Q和每个同学的K进行点积计算即公式中的QK^T得到相关度系数,然后除以一个维度的平方根来保持梯度的稳定性,最后对该值进行softmax进行归一化计算得到一个相关度概率/权值)。
  • 然后将获取到的每个权值和每个V向量里面的每个值进行相乘的结果进行汇总加合。这样就大概能预测新来同学的体重是多少了。

3.2、自注意力机制:

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

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

  • Query(Q):当前词关注的"问题"。
  • Key(K):其他词作为被匹配的"标识"。
  • Value(V):其他词的实际信息。 通过计算每个词与其他所有词的 Q-K 相关性,加权聚合 V 得到输出。

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

  • Query:"当前讨论的议题是什么?"
  • Key:会议中每个人的发言主题。
  • Value:发言的具体内容。 自注意力权重:自动发现议题之间的关联(如"A提到的预算问题"与"B提到的成本控制"高度相关)。

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

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三个矩是我们在模型训练的时候得到的,核心作用就是用于提取输入的初始向量的特征,从而减少模型在做自注意力计算的时候的误差。

示例:

2)、计算示例:

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

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

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

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

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

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

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

3.3.1、多头自注意力机制:

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

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

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

  • 细化一个向量特征提取:引入多组不同的Wq、Wk、Wv矩阵,替换掉上面自注意力学习中提到的三个单一特征的矩阵,主要就是为了更加细化的特征提取,比如在GPT-3中引入了96组也称为"96头"那么就可以对一个向量进行提取96个特征,即创建96组Q、K、V向量;
  • 对向量进行降维减少计算量:如果我们引入的多组特征提取矩阵维度还是模型默认的维度,如GPT3的12288维度,那么一个向量在面对多组矩阵计算的时候将会非常消耗计算量。所以这里引入的多组矩阵的维度要小于模型默认的向量维度。如GPT3是12288维度,那么引入的多组的Wq、Wk、Wv矩阵的维度为128维(12288/96=128,GPT3中引入了96组特征矩阵),最后是需要把这96组特征矩阵重新合并为一个向量12288的矩阵。

工作原理:

  • 降维:引入96组也就是说每个向量要和这96组128维的Wq、Wk、Wv矩阵做计算得到该向量的96组不同特征的Q、K、V向量,这里新创建的Q、K、V向量属于低维的向量(128维)。;
  • 计算相似度:然后对这96组Q、K进行计算相似度,计算出每组Q与每个 Key 计算相关性;
  • 归一化权重:通过 Softmax 将每一组的相似度转换为注意力权重;
  • 加权求和:用权重对每一组的 Value 加权求和,得到该组的注意力值;
  • 升维:最后将新得到的96组128维的向量首尾相接,输入神经网络W0(注意该W0也是大模型的参数之一)升维到12288维的向量(GPT3模型的一个向量大小);
3.3.2、掩码多头自注意力机制:

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

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

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

1)、推理阶段:

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

  • 生成"我"时,输入只有 (起始符)。
  • 生成"爱"时,输入是 我。
  • 生成"机器"时,输入是 我 爱,依此类推。 无需掩码:因为模型自然看不到未来词(未来词尚未生成)。
2)、训练阶段:
  • 输入方式:一次性输入完整目标序列(如 我 爱 机器 学习 ),但需要模拟逐步生成的过程。模型需要从 "" 预测"我",从" 我" 预测"爱",依此类推。
  • 核心问题:如果直接输入完整序列且不加掩码,模型在预测第 t个词时,会看到第 t+1到 TT 个词(未来词),导致训练与推理不一致。

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

  • 输入序列: 我 爱 机器 学习 (完整序列);
  • 掩码处理后的有效输入: 我 [MASK] [MASK] [MASK];
  • 模型行为:只能基于 我 预测"爱",无法利用"机器""学习"的信息;
(1)、掩码在数学上的表示:

实现方式:

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

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

第 1 行:生成第 1 个词时,只能关注位置 1(自身)也就是"我"这个词。计算流程大致如下:

  • 1.将"我"这个词向量通过掩码自注意力层当中的linear投影到 Query、Key、Value 向量;
  • 2.计算注意力得分,将Q和K进行点积计算得到输入序列的一个相关度系数矩阵(也是每个向量的相关度得分):
  • 3.应用掩码遮盖:将 Scores 矩阵的上三角区域(未来位置)设为 −∞(注意:这里是给相关度系数矩阵用−∞掩盖,和上面给出的掩码矩阵不是同一个);
  • 4.Softmax 归一化:在进行归一化计算概率的时候,由于未来位置的权重趋近于 0(即公式中的QK^T值越小导致经过softmax计算后的权重越小),所以就会让模型仅关注历史词即当前位置之前的词;

3.4、交叉注意力层:

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

  • Q来自前一个解码器层,是因果注意力层(或者说是掩码多头自注意力层)的输出向量,这些向量包含了之前预测出的token对应的向量信息;
  • K和V来自编码器输出的注意力向量;

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

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

3.5、前馈神经网络:

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

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

为什么要先升维再降维?

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

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

  • 升维(如 512 → 2048):通过 Linear₁ 将其映射到 2048 维,在高维空间中,模型可以学习更复杂的特征组合。这相当于将"吃"的语义拆解成 2048 种更细粒度的特征(如"动作强度""涉及的身体部位""时间持续性"等);
  • 非线性激活(如 ReLU):打破线性限制,使模型能拟合更复杂的函数;
  • 降维(如 2048 → 512):通过 Linear₂ 将 2048 维重新压缩回 512 维,但此时的特征已融合了更复杂的语义,除此之外降维的意义还能节省后续的计算量以及保持输入输出维度一致,这是因为多个编码器的堆叠的时候前一个编码器的输出是下一个编码器的输入;
2)、 数学视角:扩展模型的假设空间

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

  • 参数矩阵从 512×512 增加到 512×2048,大幅扩展了模型的假设空间。
  • 结合 ReLU 的稀疏激活特性,模型可以更灵活地组合特征。
3)、类比解释:

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

  • 自注意力机制:确定画中不同元素的位置关系(如"猫在左边,鱼在右边,猫准备想吃鱼");
  • FFN 的升维:将上面自注意力机制运算后的向量投射到更大的维度空间,即可以用更丰富的颜料和笔触细化猫咪、鱼以及猫想吃鱼时候表情等元素的细节(如"猫的毛发纹理""鱼的光泽");
  • 降维:将细节整合回原画尺寸,保持画面整体协调;

4、transformer整体执行流程:

我们再来结合模型结构图来简述推理阶段的计算流程,具体如下图所示。 假设我们进行机器翻译工作,把中文"我吃了一个苹果"翻译成英文"I ate an apple",在假设模型只有一层,执行步骤如下:

  • 1.处理输入。用户输入自然语言句子"我吃了一个苹果";tokenizer先把序列转换成token序列;然后Input Embedding层对每个token进行embedding编码,再加入Positional Encoding(位置编码),最终形成带有位置信息的embedding编码矩阵。编码矩阵用 Xn∗d 表示, n 是句子中单词个数,d 是表示向量的维度(论文中 d=512)。注:原论文图上的输入是token,本篇为了更好的说明,把输入设置为自然语言句子。
  • 2.编码器进行编码。编码矩阵首先进入MHA(Multi-Head Attention,多头注意力)模块,在这里每个token会依据一定权重把自己的信息和其它token的信息进行交换融合;融合结果会进入FFN(Feed Forward Network)模块做进一步处理,最终得到整个句子的数学表示,句子中每个字都会带上其它字的信息。整个句子的数学表示就是Encoder的输出。
  • 3.通过输入翻译开始符来启动解码器。
  • 4.解码器进行解码。解码器首先进入Masked Multi-Head Attention模块,在这里解码器的输入序列会进行内部信息交换;然后在Multi-Head Attention模块中,解码器把自己的输入序列和编码器的输出进行融合转换,最终输出一个概率分布,表示词表中每个单词作为下一个输出单词的概率;最终依据某种策略输出一个最可能的单词。这里会预测出第一个单词"I"。
  • 5.把预测出的第一个单词"I"和一起作为解码器开始特殊字符输入,进行再次解码。
  • 6.解码器预测出第二个单词"ate"。

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


参考:

一文理解 Transformer 的工作原理

www.infoq.cn/article/qbl...*sv6v0jmulf

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

zhouyifan.net/2022/09/21/...

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

www.cnblogs.com/rossiXYZ/p/...

视频讲解

www.bilibili.com/video/BV12b...

相关推荐
文火冰糖的硅基工坊1 天前
[创业之路-666]:第四次工业革命(智能革命)未来将创造大量的财富,普通人通过哪些方式参与这些财富的创造与分享?
人工智能·chatgpt·系统架构·产品运营·产业链
低调小一1 天前
iPhone美区账号登录指南:轻松下载ChatGPT应用
ios·chatgpt·iphone
夫子3961 天前
【深度干货】Transformer推理优化完全指南:模型压缩、推理加速与硬件调优
人工智能·llm
智泊AI1 天前
终于有人把AI大模型训练过程讲明白了!!!
llm
媒体人8881 天前
中国顶级 GEO 优化专家孟庆涛:用 15 年积淀定义 2025 年 GEO 优化新标准
人工智能·搜索引擎·chatgpt·生成式引擎优化·geo优化
数据智能老司机1 天前
建构 AI Agent 应用——Agentic 系统的学习机制
架构·llm·agent
数据智能老司机1 天前
建构 AI Agent 应用——编排
架构·llm·agent
镰刀韭菜2 天前
【AI4S】大语言模型与化学的未来,以及整合外部工具和聊天机器人的潜力
llm·transformer·大语言模型·药物设计·分子发现·chemchat·smiles
数据智能老司机2 天前
建构 AI Agent 应用——工具调用
架构·llm·agent
aopstudio2 天前
llms.txt:为大模型打造的“网站说明书”
人工智能·python·llm·开发者工具