你是不是曾经看了不下几十篇关于Transformer的视频和教程,但最后对于Q、K、V(查询、键、值)依然感到一头雾水?简历中写的精通Transformer,又害怕面试官问到,别担心,这是很多AI学习者的共同困惑。原来我搞了半年只搞懂前面五步,确实比较难,但是只要肯钻研,迟早能一点一点理解。今天,我不会给你晦涩的数学公式堆砌,而是用一个步骤清晰例子,帮你真正掌握Transformer的工作流程,尤其是那个让人困惑的自注意力机制。
一、为什么Transformer这么重要?
在ChatGPT和各种大语言模型风靡全球的今天,Transformer已经成为了自然语言处理的基石。从2017年提出至今,Transformer架构已经彻底改变了NLP领域的格局:
-
GPT(生成式预训练Transformer)系列模型基于Transformer的解码器
-
BERT(双向编码表示Transformer)基于Transformer的编码器
-
Claude、LLaMA、DeepSeek等各种顶尖模型都以Transformer为基础架构
为什么Transformer能取得如此巨大的成功?核心在于它能有效处理序列数据中的长距离依赖关系,而这主要依靠的就是其创新的注意力机制。然而,即使是许多AI从业者,也往往对注意力机制的数学原理感到困惑。
二、从头开始:构建迷你数据集
真实的语言模型通常使用海量数据训练——以ChatGPT为例,其训练数据高达570GB。但为了讲清原理,我们将使用一个极小的数据集进行可视化计算演示。通过这种方式,我们可以亲手追踪数据在Transformer架构中的流动过程。
第1步:计算词汇量(Vocabulary Size)
首先,我们需要确定数据集中独特单词的总数,这就是所谓的"词汇量"。这个概念很好理解:假设我们有一段文本"我喜欢机器学习,机器学习很有趣",分词后得到["我","喜欢","机器","学习",",","机器","学习","很","有趣"],去重后得到["我","喜欢","机器","学习",",","很","有趣"],所以词汇量为7。
计算词汇量的步骤:
-
将整个数据集分割成单个token(通常是单词或子词)
-
去除重复的token,得到唯一token集合
-
计算这个集合的大小,即为词汇量
在我们的迷你例子中,经过上述步骤计算,词汇量为23个独特单词。这个词汇表将用于后续的编码过程。
第2步:编码(Encoding)—— 将文本转化为数字
神经网络无法直接处理文本,我们需要将文本转换为数字表示。编码就是为每个独特单词分配一个唯一的数字ID的过程。
例如,我们可以这样编码:
-
"when" → 1
-
"you" → 2
-
"play" → 3
-
...以此类推
现代大语言模型通常不会将整个单词作为一个token,而是将单词拆分为更小的部分(子词或字符)。例如,"learning"可能会被拆分为"learn"和"ing"两个token。ChatGPT使用的分词规则大约是:1个token ≈ 0.75个单词。这种分词方式有几个明显优势:
-
更有效地处理稀有词和未知词
-
减少词汇表大小,降低模型复杂度
-
更好地处理多语言文本
-
捕捉词缀和词根的语义信息
编码完成后,我们就可以开始处理这些数字化的文本了。
第3步:词嵌入(Word Embedding)—— 将ID转化为向量
单纯的数字ID并不能反映单词之间的语义关系,例如"国王"和"皇后"的关系与"男人"和"女人"的关系是相似的,但从ID上看不出这一点。因此,我们需要将这些ID转换为多维向量,即词嵌入。
假设我们选取了一个句子:"when you play the game of thrones"作为输入。首先需要对这个句子中的每个单词生成词嵌入向量。
原始的Transformer论文使用了512维的嵌入向量,这意味着每个单词被表示为一个包含512个数字的向量。但为了便于我们可视化和理解,本例中我们只使用6维向量。
具体来说,对于句子中的每个单词,我们都会生成一个6维向量:
-
"when":[0.23, 0.56, 0.12, 0.87, 0.41, 0.33]
-
"you":[0.71, 0.28, 0.59, 0.12, 0.65, 0.92]
-
以此类推...
这些词嵌入向量的初始值设置为0到1之间的随机数。随着模型的训练,这些向量会不断更新,逐渐捕捉到单词之间的语义关系。例如,语义相近的单词,如"狗"和"猫",它们的嵌入向量在高维空间中的距离会变得相对较近。
第4步:位置嵌入(Positional Embedding)—— 保留位置信息
Transformer架构的一个独特之处在于它能够并行处理序列中的所有单词,这大大提高了训练效率。但这也带来了一个问题:模型会"忘记"单词在序列中的位置信息。比如"猫追狗"和"狗追猫"包含相同的单词,但意思完全不同。
为了解决这个问题,Transformer引入了位置嵌入,为每个位置生成一个独特的向量,然后将其与词嵌入相加。
位置嵌入的计算公式为:
-
对于偶数维度:PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
-
对于奇数维度:PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
其中:
-
pos是单词在序列中的位置(从0开始)
-
i是向量中的维度索引
-
d_model是嵌入向量的维度(在我们的例子中是6)
以句子"when you play the game of thrones"为例,第一个词"when"的位置索引为0。我们需要计算它在6维空间中的位置嵌入:
-
维度0(偶数):sin(0 / 10000^(0/6)) = sin(0) = 0
-
维度1(奇数):cos(0 / 10000^(0/6)) = cos(0) = 1
-
维度2(偶数):sin(0 / 10000^(2/6)) = sin(0) = 0
-
维度3(奇数):cos(0 / 10000^(2/6)) = cos(0) = 1
-
维度4(偶数):sin(0 / 10000^(4/6)) = sin(0) = 0
-
维度5(奇数):cos(0 / 10000^(4/6)) = cos(0) = 1
因此,"when"的位置嵌入为[0, 1, 0, 1, 0, 1]。
同理,我们可以计算句子中每个单词的位置嵌入。这种设计非常巧妙,它使得位置嵌入具有以下特性:
-
每个位置都有唯一的编码
-
不同位置之间的相对距离可以通过位置嵌入之间的函数关系来衡量
-
位置嵌入的值域有界,不会随着序列长度的增加而爆炸
-
可以处理任意长度的序列,即使是训练数据中未见过的长度
第5步:合并词嵌入和位置嵌入 —— 输入表示的完整形式
将词嵌入和位置嵌入相加,我们得到了每个单词的完整表示。以"when"为例:
词嵌入:[0.23, 0.56, 0.12, 0.87, 0.41, 0.33] 位置嵌入:[0, 1, 0, 1, 0, 1] 相加后:[0.23, 1.56, 0.12, 1.87, 0.41, 1.33]
这样,每个单词不仅包含了其语义信息,还包含了位置信息。这个合并后的向量矩阵将作为编码器部分的输入。
假设我们的句子有7个单词,每个单词用6维向量表示,那么输入矩阵的形状为7×6。这个矩阵中的每一行对应一个单词,每一列对应嵌入向量的一个维度。
第6步:多头注意力机制(Multi-Head Attention)—— Transformer的核心创新
现在,我们终于来到了Transformer的精髓部分——多头注意力机制。这是理解Q、K、V(查询、键、值)概念的关键环节。
1、单头注意力机制的工作原理
首先,让我们理解什么是单头注意力机制。它有三个关键输入:查询(Query)、键(Key)和值(Value)。这三个概念源自信息检索系统:
-
查询(Query):你想要查找的信息
-
键(Key):用于索引的信息标签
-
值(Value):与键关联的实际内容
在Transformer中,这三个矩阵是通过将输入矩阵(词嵌入+位置嵌入)乘以三个不同的权重矩阵得到的:
-
查询矩阵Q = 输入矩阵 × W^Q
-
键矩阵K = 输入矩阵 × W^K
-
值矩阵V = 输入矩阵 × W^V
其中WQ、WK、W^V是需要学习的权重矩阵。
以计算查询矩阵为例,假设:
-
输入矩阵大小为7×6(7个单词,每个用6维向量表示)
-
权重矩阵W^Q大小为6×4(将6维降为4维)
那么:
-
查询矩阵Q的大小为7×4(7个单词,每个用4维向量表示)
计算过程中,权重矩阵的初始值为0到1之间的随机数,随着训练过程会不断优化调整。
同理,我们可以计算出键矩阵K和值矩阵V,它们与查询矩阵的维度相同(在本例中都是7×4),但由于使用了不同的权重矩阵,所以值不同。
2、注意力权重的计算 —— "注意力"的含义
有了Q、K、V三个矩阵,接下来我们计算注意力权重。注意力权重决定了模型在处理某个位置的单词时,应该"关注"序列中其他哪些位置的单词,以及关注的程度。
计算注意力权重的步骤:
-
计算注意力分数:将查询矩阵Q与键矩阵K的转置相乘,得到一个7×7的矩阵(因为我们有7个单词)。这个矩阵中的每个元素表示对应位置单词之间的关联强度。 注意力分数 = Q × K^T
-
缩放:为了避免梯度消失问题,将注意力分数除以键向量维度的平方根(在我们的例子中是√4 = 2)。 缩放后的注意力分数 = 注意力分数 / √d_k
-
Softmax归一化:对缩放后的注意力分数矩阵的每一行应用softmax函数,将每行转换为概率分布(所有元素都非负且和为1)。这就是最终的注意力权重矩阵。 注意力权重 = softmax(缩放后的注意力分数)
-
加权求和:将注意力权重矩阵与值矩阵V相乘,得到加权后的值矩阵,也就是注意力层的输出。 输出 = 注意力权重 × V
这个过程的数学表达式为:
Attention(Q, K, V) = softmax(QK^T / √d_k) × V
通过这个计算过程,每个位置的输出都是所有位置的值的加权和,权重由该位置的查询与所有位置的键的相似度决定。这就是"注意力"的本质——模型能够根据上下文动态地决定应该关注序列中的哪些部分。
3、多头注意力的组合 —— 多角度观察信息
单头注意力只能捕捉一种特定类型的关系模式。为了增强模型的表达能力,Transformer使用了多头注意力机制,即并行运行多个单头注意力,然后将它们的输出拼接起来。
多头注意力的步骤:
-
使用不同的权重矩阵W^Q_i、W^K_i、W^V_i(i=1,2,...,h,h为头数)生成多组Q、K、V
-
对每组Q、K、V独立计算注意力输出
-
将所有头的输出拼接起来
-
通过一个线性变换将拼接后的矩阵映射回原始维度
在原始Transformer论文中,作者使用了8个注意力头。在我们的简化例子中,假设我们使用2个头,每个头的输出维度为2(总共4维,与单头保持一致)。
多头注意力的数学表达式为:
MultiHead(Q, K, V) = Concat(head_1, head_2, ..., head_h) × W^O
其中:
-
head_i = Attention(Q × W^Q_i, K × W^K_i, V × W^V_i)
-
W^O是将拼接后的矩阵映射回原始维度的权重矩阵
这种设计使模型能够同时关注不同子空间中的信息,大大增强了模型的表达能力。例如,一个注意力头可能关注句法关系,另一个可能关注语义关联,从而使模型能够全面理解文本。
第7步:残差连接与层归一化(Add & Norm)—— 稳定训练的关键
多头注意力的输出经过两个重要处理:残差连接和层归一化。
1、残差连接(Residual Connection)
残差连接的思想来自ResNet,它将多头注意力的输入直接加到其输出上:
输出 = 多头注意力(输入) + 输入
这种设计有几个关键优势:
-
缓解梯度消失问题,使深层网络更容易训练
-
允许信息无损地流过网络层
-
使网络能够更容易地学习恒等映射,保留已经学到的特征
2、层归一化(Layer Normalization)
残差连接后,应用层归一化进一步稳定训练:
归一化 = LayerNorm(输出)
层归一化的步骤:
-
计算每一行(对应一个单词)的均值和标准差
-
将每个元素减去均值,再除以标准差
-
应用可学习的缩放和偏移参数
数学表达式:
LayerNorm(x) = γ × ((x - μ) / (σ + ε)) + β
其中:
-
μ是行均值
-
σ是行标准差
-
ε是一个小常数(通常为10^-8),防止除零错误
-
γ和β是可学习的参数
层归一化有几个重要作用:
-
减少内部协变量偏移(internal covariate shift)
-
加速训练收敛
-
提高模型泛化能力
-
降低对参数初始化的敏感性
第8步:前馈神经网络(Feed-Forward Network)—— 增强非线性表达
归一化后的矩阵通过一个前馈神经网络(FFN)处理,这是一个包含两个线性变换和一个ReLU激活函数的简单网络:
FFN(x) = max(0, xW_1 + b_1)W_2 + b_2
具体步骤:
-
第一个线性变换:将输入从d_model维(我们的例子中是6维)映射到d_ff维(通常是d_model的4倍,但在我们的简化例子中可以使用相同维度)
-
ReLU激活:将所有负值置为0
-
第二个线性变换:将特征映射回d_model维
以我们的例子来说:
-
输入矩阵大小为7×6
-
第一个权重矩阵大小为6×6,得到7×6的输出
-
应用ReLU激活
-
第二个权重矩阵大小也为6×6,最终输出大小为7×6
前馈网络的主要作用是增强模型的非线性表达能力,让模型能够学习更复杂的特征变换。每个位置的前馈网络是独立的,所以可以看作是对每个位置进行独立的特征处理。
第9步:再次进行残差连接与层归一化 —— 深层网络的稳定器
前馈网络的输出再次与其输入(即上一步的归一化输出)相加,然后再次进行层归一化:
输出 = LayerNorm(FFN(归一化) + 归一化)
这个连续的残差连接和层归一化过程对于构建深层Transformer至关重要,它能够有效防止梯度消失和梯度爆炸问题,使得网络可以轻松堆叠多层而不影响训练稳定性。
完成这一步后,我们得到了编码器的最终输出。这个输出将作为解码器中跨注意力层的键和值输入。
第10步:解码器部分 —— 从理解到生成
解码器的结构与编码器类似,但有两个关键区别:
-
解码器包含一个额外的跨注意力层,用于处理编码器的输出
-
解码器中的自注意力层是带掩码的,确保预测位置i只能访问位置0到i-1的信息
解码器有两个主要输入:
-
来自编码器的输出(作为跨注意力层的键K和值V)
-
目标序列的嵌入(作为自注意力层的输入和跨注意力层的查询Q)
1、训练阶段与推理阶段的区别
在训练阶段,目标序列是已知的目标文本。例如,如果编码器的输入是"when you play the game of thrones",解码器的目标可能是"you win or you die"。
而在推理(生成)阶段,解码器是逐步生成文本的:
-
首先输入起始标记<start>
-
生成第一个词(如"you")
-
将<start> you作为新的输入
-
生成第二个词(如"win")
-
将<start> you win作为新的输入
-
依此类推,直到生成结束标记<end>或达到最大长度限制
2、掩码多头注意力的工作原理 —— 防止"作弊"
掩码多头注意力是解码器的一个关键组件,它确保模型在预测第i个词时,只能看到前i-1个词的信息,而不能"偷看"未来的信息。
比如在预测"you win or you die"中的"or"时,模型只能看到"you win",而不能看到后面的"you die"。
具体实现方法是在注意力分数矩阵中应用掩码:
-
创建一个上三角全为负无穷的掩码矩阵
-
将此掩码加到注意力分数矩阵上
-
应用softmax函数
由于exp(-∞) ≈ 0,所以经过softmax后,未来位置的注意力权重接近0,从而实现了"看不到未来"的效果。
掩码多头注意力的数学表达式为:
MaskedAttention(Q, K, V) = softmax((QK^T / √d_k) + Mask) × V
这种机制对于序列生成任务至关重要,因为它符合人类自然语言生成的顺序特性——我们写一个句子时也是一个词一个词地写,而不是一次性写出整个句子。
第11步:预测单词 —— 从特征到词汇
解码器的最终输出通过一个线性层和softmax函数转换为词汇表中各个单词的概率分布:
-
线性变换:将解码器输出从d_model维(6维)映射到词汇量大小(23维)
-
应用softmax函数,得到每个单词的生成概率
-
选择概率最高的单词作为预测结果
例如,如果经过计算,"you"的概率为0.85,其他单词的概率都小于0.05,那么模型会选择"you"作为当前步的预测结果。
这个预测的单词将作为下一步解码器的输入,整个过程不断重复,直到生成特殊的结束标记<end>或达到最大长度限制。
三、总结
至此,我们已经详细拆解了Transformer的每一个组件和工作步骤。Transformer的强大之处主要体现在以下几点:
-
并行计算:与RNN不同,Transformer能够并行处理整个序列,大大提高了训练效率。
-
长距离依赖:通过自注意力机制,Transformer能够直接建立序列中任意两个位置之间的联系,有效捕捉长距离依赖关系,克服了RNN中的梯度消失问题。
-
多头机制:多头注意力允许模型同时关注不同子空间的信息,增强了模型的表达能力。
-
残差连接:残差连接和层归一化的组合使得Transformer能够轻松堆叠多层,构建深层网络。
虽然现代的大语言模型(如GPT、LLaMA、Claude、DeepSeek等)在Transformer的基础上做了很多改进和优化,但核心的注意力机制原理仍然不变。理解了Transformer的工作原理,你就掌握了理解现代大语言模型的基础。
希望这篇文章能帮助你真正理解Transformer中那些让人困惑的Q、K、V到底是什么,以及它们如何协同工作,构建出如此强大的模型架构。
大模型&AI产品经理如何学习
求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。
1.学习路线图
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方图片前往获取
3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集***
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
发布评论