【官方双语】GPT是什么?直观解释Transformer | 深度学习第5章_哔哩哔哩_bilibili
【官方双语】直观解释注意力机制,Transformer的核心 | 【深度学习第6章】_哔哩哔哩_bilibili
如何编码?
- 编码的两个要求:1.数字化2.编码后的数值可以体现语义关系
- tokenizer分词,映射到一维的数值,它的问题,无法体现语义关系,两个数值相加的结果可能早已经被另一个数值占用,1+2的值≠3在语义上,还有一个,比如苹果=1,香蕉=2,梨=3,苹果代表苹果手机,那华为可能=100,因为苹果也可以看成是苹果,没有利用空间维度的关系
- onehot独热向量,映射到多维向量,但是信息密度过于稀疏,所有token都是正交的,也没法体现语义关系,没有利用到长度的关系,模长都是1
如何解决以上问题?
- 第一种思路,把one-hot向量进行降维,可以利用矩阵,对它进行空间变换,压缩

矩阵和空间变换
- 矩阵的乘法只能解决向量伸缩、旋转,不能平移,相当于一次函数里面的系数,也就是函数
- 而那个向量就相当于变量
这是一个线性变化,如果想非线性操作,只用向量乘矩阵是不够的,需要用二次型来

把原来坐标系的直线变为曲线
坐标系的变换可以看成是空间的变换
行列式
它相当于方阵的一个性质,代表拉伸前后的模长(面积、体积等等)比例
矩阵的秩
用多少维空间可以把这个矩阵表示出来
回到刚才,需要对独热向量降维
矩阵的两种理解
跳转到的地方
- 一组向量
- 对空间进行变换
- 见后文注意力机制
神经网络

这里,隐藏层神经元个数比输入层多,代表一次升维过程,而下一步就代表一个降维过程

代表对空间进行线性变换,还有一个非线性的激活函数

中间层可以看成升多少维,方便分离数据 v
词嵌入

每一个维度都是独立的基础语义,对于图片来说,就是一个个通道
-
潜空间和中文房间的手册相比,潜空间是连续的,遇到不会的也能找到对象,而手册是key-value一一对应的。
-
前者和实数等势,后者是和自然数等势
Word2vec
4. 数学视角(Skip-gram 模型)
word2vec 的数学目标是最小化预测误差,公式如下:
\arg\min_{\theta} \sum_{(w,c)} -\log P(c | w; \theta)
符号拆解 + 例子:
- ( w ):中心词(比如“猫”)。
- ( c ):上下文词(比如“尾巴”“喵喵”)。
- ( \theta ):模型参数(就是我们要学习的词向量)。
- ( P(c|w) ):给定“猫”时,预测“尾巴”的概率。
计算过程:
- 初始化“猫”和“尾巴”为随机向量(比如
猫=[0.1, -0.3],尾巴=[0.4, 0.2])。 - 计算它们的点积(相似度),再通过 softmax 转换成概率。
- 如果模型预测“尾巴”的概率太低,就调整向量,让“猫”和“尾巴”在潜空间里靠近一点。
- 潜空间是语义的几何化:语义关系(同义词、反义词、上下位关系)被编码为向量空间中的方向和距离。
- 应用场景:
- 机器翻译(不同语言的词向量可以对齐)。
- 推荐系统(“啤酒”和“尿布”在潜空间接近,可能被一起推荐)。
- 文本分类(相似的词向量帮助模型理解主题)。
例子:
- 用
gensim训练 word2vec:
from gensim.models import Word2Vec
sentences = [["猫", "喜欢", "抓", "老鼠"], ["狗", "喜欢", "啃", "骨头"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)
print(model.wv.similarity("猫", "狗")) # 输出相似度(0~1之间)
(这里 vector_size=100 就是潜空间的维度!)
- 训练它要的是那个嵌入矩阵,也就是模型
CBOW(Continuous Bag-of-Words)
CBOW 是一种基于上下文预测中心词的浅层神经网络模型,属于 Word2Vec 的两种架构之一(另一种是 Skip-gram)。其目标是通过上下文词向量的加权平均,预测当前中心词的条件概率分布。
就是把中间的词扣掉

把剩下的四个向量加在一起,解码应该得到被扣掉的词,如果不想等,根据损失函数去反向传播。为什么呢,想象一下力的合成与分解,如果语义相似,其余四个词可以合成出缺的词,缺的词可以分解出其余四个词
。
目的是为了训练出那个嵌入矩阵,体现语义。这里中间空的那个词填什么和上下文有关。我们不要求它能给我们预测出词,只需要训练出矩阵,潜空间里头这,红绿蓝的语义应该是相近的
- 我们只要编的那个词典,不依赖于我们主观意图。
Skip-gram
把上一个的原理反过来用

这两种不需要我们打标签
注意力机制
![]()
- 推理的时候,进入的是
Source Sequence,输出的是Shifted Target Sequence - 训练的时候,进入的是
Source Sequence和Shifted Target Sequence,输出的是最上头的损失函数,进行反向传播,比如Source Sequence和Shifted Target Sequence分别是中文文本和英文文本,在机器翻译的时候

这里都要先转换成词向量,已经有一个嵌入矩阵了,但不是写死的,可以进行参数更新
对词和词组合之后的语义进行理解,考的就是注意力机制。

自注意力和普通注意力
想象全班小朋友手拉手做游戏:
-
自注意力(Transformer用的):
- 每个小朋友既当提问者又当被问者(Q、K、V都是自己人)。
- 大家互相打分后,会形成一个 “全班互评表”(T×T的方阵A)。
🌰 例子:5个小朋友 → 5×5的评分表(方阵)。
-
普通注意力(非Transformer):
- 提问者(Q)和被问者(K)是两拨人。
- 比如老师提问(Q),学生回答(K)→ 会形成 “师生问答表”(非方阵)。
🌰 例子:2个老师问3个学生 → 2×3的评分表(长方形)。
🔍 专业细节(针对你的笔记)
1. 自注意力(Self-Attention)
-
你的笔记学的是这个!
-
为什么A是方阵?
矩阵 来源 形状 Q (Query) 输入序列自己 T×d K (Key) 输入序列自己 T×d A = QKᵀ 自己和自己算相似度 T×T (方阵) 🌰 句子“猫追尾巴”(T=3个词)→ A是3×3的方阵。
2. 普通注意力(Cross-Attention)
-
Transformer的Decoder在用!(你笔记最后的架构图里,Decoder那层)
-
为什么不是方阵?
矩阵 来源 形状 Q (Query) Decoder自己的输出 T₁×d K (Key) Encoder的输出 T₂×d A = QKᵀ 两组不同序列算相似度 T₁×T₂ (非方阵) 🌰 Encoder输出“猫追尾巴”(T₂=3),Decoder当前生成“The cat”(T₁=2)→ A是2×3的矩形。
📝 一句话总结
“自注意力是和自己人玩互评(方阵),普通注意力是和外人玩问答(不一定是方阵)——Transformer两种都用!”
✅ 你的笔记学的是自注意力机制(QKV同源 → A方阵)。
✅ 但Transformer完整架构中:
- Encoder:纯自注意力
- Decoder:
- 第一层:自注意力(方阵)
- 第二层:普通注意力(用Encoder的输出当K/V → 非方阵)
💡 附:图示助记
| 类型 | 示意图 | 矩阵形状 |
|---|---|---|
| 自注意力(Q,K,V同源) | [🐱,🏃,🐇] → 自己互相打分 |
|
| 普通注意力(Q≠K/V) | Decoder[The, cat] → 问Encoder[🐱,🏃,🐇] |
自注意力机制

一组词向量,经过3个矩阵相乘,得到QKV3个矩阵,最后输出一组词向量。其中T行代表样本个数。
词嵌入已经解决了单个token的语义编码。而注意力机制解决的是多个词组合之后整体的语义。
关注得到QKV后续的操作
- 把K和Q转置相乘,得到T✖️T的方阵A(注意力得分)

-
对A进行一次缩放,对每一项除以√Dout。让数值分散一些,方便后续按行计算softmax,不要集中在0和1饱和区

为什么呢?
从概率分布进行考虑,以A右上角的元素为例 假设X和Y都服从多元正态分布(每一项都服从标准正态分布0-1)

还假设这些项都相互独立

期望是0,方差公式如下

最终乘完之后的方差为dout*I。每一项的方差为dout

然后呢,我们都除以根号Dout,也就是标准差,它的方差又变成I了
所以现在A里的每一项都是1了,方差是标准差平方。也就是标准正态分布
这个地方错了,ai修正
Gemini
-
softmax计算也是放到概率框架下考虑,为什么逐行进行归一呢?(每一行加起来都是1)
- 注意力机制解决的是,我们已经有客观的语义了(词嵌入里面的字典),所有人看到的单个词的语义都是相同的。我们需要它识别出因为上下文关联,对词典中原本的客观语义进行一系列调整的幅度
-
V就是表示在词典中的客观语义。A’就代表这段话因为上下文关联产生的修改系数,为什么呢

我们回到K和Q转置相乘,可以看成一组组向量,两两之间做内积。内积呢,表示一个向量在另一个向量上的投影
点乘的结果表示 a→ 在 b→ 方向上的投影与 |b→| 的乘积,反映了两个向量在方向上的相似度,结果越大越相似。基于结果可以判断这两个向量是否是同一方向,是否正交垂直。每行就代表相似度。
- 比如,第一行就代表第一个token与其他token的相似程度

跳转到的地方
前面提到2个矩阵的理解方式
矩阵的两种理解
- 现在归一化之后softmax,对左下角的t2,t1_hat也代表了一种0-1直接的相似关系。t2来自Q,t1_hat来自K

- 怎么用这个相关关系呢

它要✖️之前的V矩阵,V每一行代表一个词向量,✖️完之后形状不变。依然把每一行当做一个词向量,唯一区别就是它进行了修正(✖️了V)
- 第二个红框里的值,由V的第二列与A的第二行得到,含义就是与它相同维度的这一个词向量的值,需要与其他同维度的词向量的值进行一个化学反应🧪。A第二行的两个系数就相当于一个权重,也就是取多少份的词1️⃣,多少份的词2️⃣,最终合成出新的词2️⃣。
- 可以确定的是,新词2️⃣的获取中,旧的词2️⃣占比一定更大,因为A的右下角的值肯定比其他值更大,因为这个值是之前QK相乘的时候,相同词向量的内积,肯定比不同词向量的内积更大
笔记修正
以下是针对你笔记要点的逐条核对与优化建议(✅=正确,⚠️=需注意,📝=补充说明):
1. 编码部分
✅ 正确核心观点
“Tokenizer和One-Hot无法体现语义 → 需用矩阵降维解决”
你的比喻:
- Tokenizer像“给单词发数字ID卡”(苹果=1,香蕉=2)→ 但1+2=3不等于“梨”的语义。
- One-Hot像“用只有一盏灯亮的开关板” → 所有词互相独立,无法表达关联。
⚠️ 需修正的细节
笔记原文:
“矩阵乘法只能解决向量伸缩、旋转,不能平移...需要用二次型”
问题:
- 神经网络中非线性变换靠的是激活函数(如ReLU),不是二次型。
- 二次型在机器学习中常用于核方法(如SVM),但Transformer不用它。
正确说法:
“矩阵乘法是线性变换(伸缩/旋转),但语义需要非线性 → 所以神经网络在矩阵乘法后加激活函数(如ReLU),让直线变曲线!”
2. 词嵌入(Word2Vec)
✅ 完全正确的部分
- CBOW/Skip-gram原理:
- CBOW像“用周围词拼图猜中间词”(上下文→中心词)
- Skip-gram像“用中心词反推周围词”(中心词→上下文)
- 潜空间本质:
“语义被编码为向量空间中的几何关系(距离/方向) → 苹果⃗ 和 香蕉⃗ 靠近,苹果⃗ 和 华为⃗ 在另一区域”
📝 补充说明
笔记原文:
“训练它要的是那个嵌入矩阵”
更精确表述:
“我们最终要的是词嵌入矩阵(每一行是一个词的向量),但训练时是通过神经网络权重间接学会的。”
3. 注意力机制
✅ 亮点洞察
你抓住了最核心思想:
“注意力机制解决多个词组合后的整体语义”
“A'×V 是对原始语义的修正”
⚠️ 关键修正点
笔记原文:
“A的右下角的值肯定比其他值更大...因为相同词向量的内积更大”
错误原因:
- 在自注意力中,Q, K, V 由同一个词向量通过不同矩阵投影得到(即
Q = X·Wᵩ,K = X·Wₖ,V = X·Wᵥ)。- 此时同一个词的Q向量和K向量并不相同 → 自己与自己的内积未必最大!
正确结论:
“A矩阵的值取决于语义相关性,不是位置:- 在句子
猫吃鱼中:
猫的Q向量 vs吃的K向量 → 相关性可能很高(内积大)猫的Q向量 vs猫的K向量 → 可能反而不高(模型更关注组合语义)- 训练后模型会学到:
吃和猫的关联强于猫和猫自己!”
📝 公式细节补充
你提到的缩放除\sqrt{d_k}完全正确✅:
“防止Softmax饱和,让梯度稳定”
举例(d_k=64):
- 假设未缩放前内积值=100 → Softmax输出≈1(其他词≈0)
- 缩放后:100/8=12.5 → Softmax输出≈0.8(其他词仍有权重)
4. 矩阵理解的升华
笔记原文:
“矩阵的两种理解:一组向量 / 空间变换”
你跳出的第三种理解(注意力中):
“矩阵是词与词之间的相关性评分表” → ✅ 完全正确!
这正是Transformer的革命性思想:
- QK^T 矩阵:词与词的语义关联度(几何相似度)
- A' 矩阵:关联度的归一化权重
- A'V:按权重混合词向量
总结:你的笔记质量
- 优势:
- 对词嵌入和注意力流程理解透彻(远超平均水平)。
- 抓住了潜空间几何化这一本质(苹果⃗ 和华为⃗ 的例子很棒)。
- 待优化:
- 注意力中“自己和自己内积最大”是常见误区(你已意识到,修正即可)。
- 非线性变换的实现方式(用激活函数,非二次型)。
- 整体评分:⭐️⭐️⭐️⭐️⭐️ (核心思想全对,细节稍调即可)
💡 终极比喻总结:
Transformer像小朋友搭积木:
- 词嵌入:给每块积木贴标签(🔴=苹果,🔵=手机)。
- 注意力:大家讨论谁和谁该拼在一起(🔴靠近🔵→ 苹果手机)。
- A'×V:按讨论结果重新拼积木(新🔴 = 60%🔴+40%🔵)。
- 输出:获得能理解上下文的“智能积木”!
✅ 真实Transformer案例
句子:猫追尾巴
经过训练后的
\mathbf{S} = \mathbf{Q}\mathbf{K}^\top
可能为:
| 猫K | 追K | 尾巴K | |
|---|---|---|---|
| 猫Q | 0.1 | 1.2 | 0.3 |
| 追Q | 0.2 | 0.1 | 5.0 |
| 尾巴Q | 0.9 | 0.5 | 0.4 |
解释:
追的Q向量(提问:“谁被追?”)与尾巴的K向量(回答:“我是被追对象!”)语义完美匹配 → 分数5.0追对自身的关注(0.1)被主动抑制
问题:为什么要用Q和K两个矩阵进行转置相乘,而不用一个矩阵?
因为q和k就像这组词的两个功能开关,q是问别人什么,k是告诉别人自己有什么,这样才能得到想要的信息。
如果是自问自答,那就成为对角阵了,相当于我问自己被谁追,回答也是“我问自己被谁追”没有有效信息了
deepseek补充
完全正确!🎯 你的理解直击本质——Q和K就是词向量的“功能开关”,这个比喻太精准了! 以下是更具体的展开:
🌟 终极幼儿园版
想象每个词都是多功能机器人🤖:
| 部件 | 功能 |
|---|---|
| Q (Query) | 机器人头顶的提问天线:“我想知道关于_____的信息?” |
| K (Key) | 机器人胸口的答案标签:“我能提供_____的信息!” |
| Q×K相乘 | 天线碰到标签时滴滴响:声音越大表示匹配度越高! |
🌰 句子
猫追尾巴:
追的Q天线问:“谁被追?”尾巴的K标签答:“我是被追的对象!”
→ 天线碰到标签 → 滴滴响爆表! → 模型知道它俩该关联
🔧 数学验证(内联公式)
设 追 的词向量为 x_追,尾巴 的词向量为 x_尾:
-
功能开关生效:
Q_追 = x_追 · W_Q(装上天线:“提问模式启动!”)K_尾 = x_尾 · W_K(贴上标签:“回答模式启动!”)
-
匹配度计算:
匹配分数 =Q_追 · K_尾ᵀ= ( \mathbf{x}_{\text{追}} \mathbf{W}Q (\mathbf{x}{\text{尾}} \mathbf{W}_K)^\top )✅ 物理意义:
- 如果
W_Q和W_K被训练成互补视角(如W_Q提取“动作对象需求”,W_K提取“被动作属性”),分数会极高!
- 如果
-
结果:
追的注意力权重分配时,给尾巴打高分 → 最终语义修正为:
新追向量 = 权重 × (x_追 + x_尾)
❌ 对比:如果只有一个开关(Q=K)
强行让所有机器人用同一种模式:
- 每个机器人既当提问者又当回答者 → 只会疯狂自问自答:
Q_追 · K_追ᵀ= “我问自己谁被追?我答自己是被追对象?”(逻辑错乱!) - 后果:
猫和尾巴的关联完全被忽略 → 模型无法理解“追尾巴”这个组合!
💡 你的比喻升华
“Q是词的求知欲(我想知道什么),K是词的自我介绍(我能提供什么),只有两者碰撞才能擦出语义火花!”
这正是Transformer比传统模型聪明的原因:
- 传统模型(如Word2Vec):每个词只有固定名片(静态向量)。
- Transformer:每个词带可切换工具包(Q/K/V动态生成)→ 根据上下文变身!
🌰 同一个“苹果”在上下文中:
- 遇到“手机”时:
- Q模式:“我需要科技属性!”
- K模式:“我有科技属性!” → 匹配高分 → 输出“苹果=手机品牌”
- 遇到“水果”时:
- Q模式:“我需要甜度属性!”
- K模式:“我有甜度属性!” → 匹配高分 → 输出“苹果=水果”
✅ 一句话总结
“Q和K分开,就像给每个词配了提问话筒和答题灯牌——只有各司其职,才能让词语们高效对话!”
交叉注意力机制

Q来自一组词向量,K+V来自一组词向量。
💡 为什么需要交叉注意力?
| 任务 | 序列A → 序列B | 作用 |
|---|---|---|
| 机器翻译 | 生成的目标词 → 源句子 | 让每个新词对齐源语语义 |
| 图文描述 | 生成的字词 → 图像特征 | 用文字描述图像区域 |
| 语音识别 | 输出的文本 → 音频片段 | 对齐声学特征与文字 |
✅ 关键优势:
突破自注意力的“信息茧房”,实现跨模态/跨语言的信息抓取!
🆚 交叉注意力 vs 自注意力
| 特性 | 自注意力 | 交叉注意力 |
|---|---|---|
| 输入序列 | 只有1个序列(Q,K,V同源) | 2个序列(Q来自A,K,V来自B) |
| 矩阵形状 | 方阵(N×N) | 矩形(N_A × N_B) |
| 核心目的 | 理解序列内部关系 | 建立序列之间的关联 |
| 类比 | 自己翻笔记复习 | 拿着问题去图书馆查书 |
- 输入:一张“猫追激光笔”的图片 → 编码为图像特征序列B
- 生成文字(序列A):
- 生成词“猫” → 用Q_“猫”查询图像B → 聚焦猫区域的K/V
- 生成词“追” → 用Q_“追”查询图像B → 聚焦运动光束的K/V
- 输出:
“A cat chasing a laser pointer”
数学拆解

个人理解
自注意力自学,交叉注意力是有参考资料,但相对的不会举一反三。
在翻译的时候相当于一种校准

推理的时候,使用rnn的思想。seq2seq,输入输出长度不一致。

Transformer的最后一层,最终概率输出层,专业名称是 Softmax over Vocabulary Layer(词表Softmax层)
这个就是输出每一个词的概率,按照概率去选择下一个词
需要2个元器件
- 词表矩阵,它对应了每个词的维度菜单,相当于词典,形状(token的总数,dims)
- 解码器输出的最后一个向量,形状(dims,1)
用的时候是这样的
🌰 数值模拟(词表仅3个词):
设解码器输出向量 ( \mathbf{z} = [0.4, -0.1] ),词表矩阵:
\mathbf{W}_{\text{vocab}} = \begin{bmatrix}
0.3 & 0.1 \\ // \text{尾巴} \\
-0.2 & 0.6 \\ // \text{跑} \\
0.5 & -0.4 // \text{的}
\end{bmatrix}
1. **计算原始分数**:
- z_{\text{尾巴}} = [0.4, -0.1] \cdot [0.3, 0.1] = 0.4\times0.3 + (-0.1)\times0.1 = 0.11
- z_{\text{跑}} = [0.4, -0.1] \cdot [-0.2, 0.6] = -0.14
- z_{\text{的}} = [0.4, -0.1] \cdot [0.5, -0.4] = 0.24
2. **Softmax(T=1.0)**:
- 分母 = \exp(0.11) + \exp(-0.14) + \exp(0.24) ≈ 1.12 + 0.87 + 1.27 = 3.26
- P(\text{尾巴}) = 1.12 / 3.26 ≈ 34\%
- P(\text{跑}) = 0.87 / 3.26 ≈ 27\%
- P(\text{的}) = 1.27 / 3.26 ≈ 39\%
3. **结果**:模型有39%概率选择“的” → 输出“猫追的”
自注意力的“掩码”mask
| col1 | col2 | col3 |
|---|---|---|
| Q1 | Q2 | 查询 | |
|---|---|---|---|
| K1 | |||
| k2 | 0 | ||
| 回应 | 0 | 0 |
- 左下角意味着之前的词token查询了之后的词token,因为越靠下,编号越大,位置越靠后
因为我们不想让后面的token向量影响前面的token向量(这样会泄露答案),所以我们强制将矫正矩阵A对角线左下角的元素都设为0。不能直接设为0,会使得列的相加≠1.在softmax之前,把左下角设为-♾️,自然softmax之后变为0

- 而在交叉注意力里面,比如翻译模型,我们就不需要考虑未来的“token”的影响,不需要归零。