LLM知识随笔(一)
文章目录
- LLM知识随笔(一)
- 一、Embed(Embedding)
- 二、预训练
- 三、统计语言模型
- 四、神经网络语言模型
- 五、Word2Vec模型
-
- 1.CBOW
- 2.Skip-gram
- [3.NNLM 和 Word2Vec 的区别](#3.NNLM 和 Word2Vec 的区别)
- 4.Word2Vec的缺点
- 5.如何使用词向量
- 六、ELMO模型
- 七、注意力机制
- 八、自注意力机制(Attention范围更大,Self-Attention更具体了)
- [Masked Self-Attention](#Masked Self-Attention)
- [九、Masked Self-Attention](#九、Masked Self-Attention)
- [十、Positional Encoding](#十、Positional Encoding)
-
- 1.Transformer的「天生缺陷」:
- 2.位置编码的本质:给每个词一个「时空坐标」
- [3.🎨 Transformer的解决方案:正弦波编码](#3.🎨 Transformer的解决方案:正弦波编码)
- 4.具体怎么「编码」?
- 5.为什么用正弦余弦?------「相对位置」的魔法
- 6.为什么这么设计?
- 7.位置编码公式
- 十一、Transformer
-
- 1.整体框架
- 2.编码器ENCODER
-
- [2.1 编码器概略图](#2.1 编码器概略图)
- [2.2 编码器详细图](#2.2 编码器详细图)
- 3.解码器Decoder
-
- [3.1 解码器概述图](#3.1 解码器概述图)
- [4.问题一:🎭 Transformer解码器为什么需要Mask:防止「偷看答案」的考试规则](#4.问题一:🎭 Transformer解码器为什么需要Mask:防止「偷看答案」的考试规则)
- [5.🎭问题二:为什么 Encoder 给予 Decoders 的是 K、V 矩阵?](#5.🎭问题二:为什么 Encoder 给予 Decoders 的是 K、V 矩阵?)
- [💡 Q、K、V的语义分工](#💡 Q、K、V的语义分工)
- [比喻1:考试场景 📝](#比喻1:考试场景 📝)
- 总结
一、Embed(Embedding)
1.定义
可以理解为向量化,将物理世界实体转成数学空间的向量,以便进行计算
官方版:将离散的、高维的、稀疏的数据(如文字、图片ID、商品ID)转换为连续的、低维的、稠密的向量表示的过程,这个转换后的向量就称为嵌入向量 或 Embedding
2.核心思想:从"符号"到"有意义的空间坐标"
想象一个图书馆:
• 传统方式(One-hot):每本书只用唯一的"书架编号"表示(例如,[0,0,1,0,0])。这个编号除了"是这本书"外,不包含任何其他信息(比如内容、作者、主题)。
• Embedding方式:每本书被映射到一个"主题空间"中。例如,书的向量可能是 [0.2, -0.5, 0.8]。
⭕ 第一个维度代表"科幻程度"
⭕ 第二个维度代表"浪漫程度"
⭕ 第三个维度代表"哲学深度"
关键点:在这个空间里,语义相似的物体,其向量在空间中的位置也相近。
3.Embedding需要有什么样的效果
目标效果:相同物理意义的实体,向量化后的数学距离也越接近
距离定义:一般用余弦相似度比较语义相似程度,余弦相似度越高,距离越近
4.如何得到Embedding?
① 专门训练:使用特定任务和数据训练嵌入模型,如Word2Vec训练词向量。
② 从大型模型中获取:现代大语言模型(如BERT, GPT)的输入层或某一隐藏层,本质上就是一个强大的、上下文相关的嵌入层。我们可以直接提取这些模型产生的向量作为Embedding。
③ 端到端学习:在完成主任务(如文本分类、推荐)的同时,让模型自己学习出最优的Embedding。
二、预训练
1.有什么用?
机器学习:偏数学
深度学习(人工智能)的项目:大数据支持(主流)
BUT
很多项目没有大数据支持(小数据)
比如:
目标任务:
猫狗分类任务:100张猫和狗的图片--->给一张图片,分出是猫还是狗(无法解决的一个问题:精度很低)
已有:
鹅鸭分类任务:100000张鹅和鸭的图片(已知有人做过的,通过这10W张图片做了一个模型A)

有人发现,上图中浅层是通用的(横竖撇捺)
我通过10w个鹅和鸭训练了一个模型A,100层的CNN
任务B:100张猫和狗的图片,分类--->出现问题:训练出100层CNN不可能实现
尝试使用A的前50层(浅层)或者使用100层完成任务B,即预训练的思想
怎么做?
方法:
| 名称 | 说明 |
|---|---|
| 冻结 | 浅层参数不变 |
| 微调 | 浅层参数会跟着任务B训练而改变(常用) |

对图像的预训练可以总结如下:对一个具有少量数据的任务A,首先通过一个现有的大量数据搭建一个CNN模型A,由于CNN的浅层学到的特征通用性很强,因此在搭建一个CNN模型B,其中B的浅层参数使用A的浅层参数,模型B的高层参数随机初始化,然后通过冻结或微调的方式利用任务A的数据训练模型B,模型B就是对应任务A的模型。
2.预训练是什么?
通过一个已经训练好的模型A,去完成一个小数据量的任务B(使用了模型A的浅层参数)
注意:并非什么任务都能使用,必须任务A和任务B极其相似
3.预训练的思想
任务A对应的模型A的参数不再是随机初始化的,而是通过任务B进行预先训练得到模型B,然后利用模型B的参数对模型A进行初始化,再通过任务A的数据对模型A进行训练。
注意:模型B的参数是随机初始化的
三、统计语言模型
1.一句话定义
统计语言模型 是一个用于计算一个自然语言序列(如一句话、一个词序列)出现概率的数学模型。它的核心任务就是回答:"这个句子在人类语言中通顺、合理的可能性有多大?"
2.核心思想与直观例子
它的基本思想来源于一个简单直觉:语言中词汇的出现不是随机的,而是有规律的、概率性的。
-
反例(低概率): "我 吃 汽车" 这个序列虽然语法上可能成立,但语义上很奇怪,概率应该很低。
-
正例(高概率): "我 吃 苹果" 这个序列则非常通顺合理,概率应该很高。
统计语言模型的目标就是量化这种"合理度",用一个概率值 P(句子) 来表示。
3.核心原理:链式法则和N-gram模型
链式法则
一个句子 S 由一系列词按顺序构成:S = w1, w2, w3, ..., wm
计算整个句子的概率,最直接的方法是使用概率的链式法则:
P(S) = P(w1) * P(w2|w1) * P(w3|w1, w2) * ... * P(wm|w1, w2, ..., wm-1)
这里:
- P(w1) 是第一个词 w1 出现的概率。
- P(w2|w1) 是在第一个词是 w1 的前提下,第二个词是 w2 的概率(即条件概率)。
以此类推,最后一个词的概率依赖于前面所有词。
关键挑战:随着句子变长,P(wm|w1, w2, ..., wm-1) 这种依赖于长长上下文的概率几乎无法从有限的数据中准确估计(数据稀疏问题)。
N-gram
为了简化计算,N-gram模型做出了一个强有力的假设:一个词出现的概率只依赖于它前面有限的 n-1 个词,而不是整个历史。这就是 "马尔可夫假设"。
Unigram (1-gram): 每个词独立出现。P(S) ≈ P(w1) * P(w2) * P(w3) * ... * P(wm)。这完全忽略了词序("吃我苹果"和"我吃苹果"概率一样),是最弱的模型。
Bigram (2-gram): 每个词只依赖于它前面一个词。P(S) ≈ P(w1) * P(w2|w1) * P(w3|w2) * ... * P(wm|wm-1)。这能捕捉一些局部依赖。
Trigram (3-gram): 每个词依赖于前面两个词。
N-gram: 依赖前面 N-1 个词。
总结:统计语言模型 是基于大规模文本统计,用数学(特别是概率论)来量化语言序列合理性的模型。它以N-gram模型为代表,通过"数数"和马尔可夫假设来估计句子概率。它是自然语言处理领域的基石,曾推动了语音识别、机器翻译等关键应用的发展。虽然其核心地位已被更强大的神经语言模型取代,但其基本思想和许多概念(如困惑度评估、平滑技术)至今仍有重要影响。
四、神经网络语言模型
回顾上一节的统计语言模型:
统计+语言模型--》用统计的方法去完成以下两个和人说的话相关的任务
语言模型 = 语言(人说的话) + 模型(去完成两个任务)
有两个任务:
① 比较,"词性","磁性"
② 预测下一个单词(填空)
由于统计语言模型只能完成第②个任务,不能完成第一个的缺陷,由此神经网络语言模型的出现弥补了其不足
1.神经网络语言模型
神经网络+语言模型--->用神经网络的方法去完成以下两个和人说的话相关的任务。
第二个任务:
"判断","一个","词","的","___"
假设词库里有"词性"和"火星"
P(__|"判断","一个","词","的")
词性

w1,w2,w3,w4(上述 4 个单词的独热编码)
python
w1*Q=c1,
w2*Q=c2,
w3*Q=c3,
w4*Q=c4,
C=[c1,c2,c3,c4]
Q就是一个随机矩阵,是一个参数(可学习)
"判断","这个","词","的","词性"
softmax(U[tanh(WC+b1)]+b2)== [0.1, 0.1, 0.2, 0.2, 0.4] ∈[1,VL]
2.独热编码(one-hot编码)
独热编码:让计算机认识单词

基本思想:对于有N个不同取值的分类特征,创建N个新的二进制特征(0或1),每个特征对应一个原始类别。对于每个样本,只有对应类别的特征为1,其他都为0。
举例子:
词典 V(新华字典里面把所有词集合成一个集合 V)
假设词典里面只有 8 个单词
计算机不认识单词的
但是我们想让计算机认识单词
"fruit"
独热编码:给出一个 8*8 的矩阵
"time" --> 10000000
"fruit" --> 01000000
"banana" --> 00000001
...
使用余弦相似度 去计算两者的相似度(0)--词向量(矩阵乘法)
3.词向量(神经网络语言模型的副产品Q)
给出任何一个词,
比如:
"判断" --> 独热编码w1 [1,0,0,0,0]
w1*Q =c1 ("判断"这个词的词向量)
词向量:就是用一个向量来表示一个单词
可以控制词向量的维度(大小)
如果我们得到的词向量,第一个问题也被解决了(下游任务)
总结:
神经网络语言模型:通过神经网络解决两个人说的话的问题
有一个副产品:Q 矩阵--》新的词向量(词向量可以选择词向量的维度,可以求两个词之间的相似程度)
Q矩阵,对于任何一个独热编码的词向量都可以通过Q矩阵得到新的词向量
作用:
1.可以转换维度
2.相似词之间的词向量之间也有了关系
五、Word2Vec模型
Word2Vec模型只是一个统称,其分为有CBOW和Skip-gram两种模型

上一节的NNLM 和 Word2Vec 基本一致(一模一样),不考虑细节,网络架构就是一模一样
1.CBOW
给出一个词的上下文,得到这个词
"我是最_的男人" (上下文)
↓
w t \\w_t wt "帅" (词)
2.Skip-gram
给出一个词,得到这个词的上下文
"帅" (词)
↓
"我是_的Nick" (上下文)
3.NNLM 和 Word2Vec 的区别
NNNL --> 重点是预测下一词,双层感知机softmax(w2(tanh((w1(xQ)+b1)))+b2)
Word2Vec --> CBOW 和 Skip-gram 的两种架构的重点都是得到一个 Q 矩阵,softmax(w1 (xQ) +b1)
1.CBOW:一个老师告诉多个学生,Q 矩阵怎么变
2.Skip:多个老师告诉一个学生,Q 矩阵怎么变
4.Word2Vec的缺点
Q矩阵的设计

apple ---[0 0 0 1 0]
上述式子代表: apple × Q = [10 12 19]
apple有两种意思:🍎或者iphone
假设数据集里面的apple只有🍎这个意思,没有iphone这个意思(训练)
(测试,应用) apple---》表示iphone这个意思
问题是:词向量不能多意表示------>引出ELMO
5.如何使用词向量
Word2Vec是预训练模型
给你一个NLP里面的任务,给一个问题X(帅+哥),给出一个回答Y(Handsome)

这里使用的是预训练语言模型(之前是图片的):我们先使用独热编码(一一对应的一种表查询)----->Word2Vec 预训练好的 Q 矩阵直接得到词向量---->进行接下来的任务
① 冻结:可以不改变 Q 矩阵
② 微调:随着任务的改变,改变 Q 矩阵
六、ELMO模型
目的:解决多义词问题,使用双向LSTM模型

ELMO---->通过预训练专门做词向量任务
因为在one-hot编码中,比如apple这个词的编码是固定的,没有考虑一词多义问题
而ELMO模型考虑了该问题,
如图:
E1关注单词特征,E2关注语法特征,E3关注语义特征,E1原来是个词,在经过E2,E3后,形成专属于这个词在这两种特征之下的向量。这就解决了同一个词只关注单词特征不考虑其他特征所造成的一词多义问题。
apple --> 我吃了一个 苹果 -- > [1,20,10]
apple -->我在用苹果手机 -->[1,10,20]
到这里,这种方式已经研究到头了,没有其他科进步空间,于是有了下面注意力机制,新的起点。
七、注意力机制
1.概念
注意力机制 是一种模仿人类视觉和认知注意力的计算技术
核心思想 是:在处理海量信息时,系统能够动态地、有选择性地关注与当前任务最相关的部分信息,并忽略或弱化不重要的信息。
简单来说,它是一种让模型学会"聚焦"的机制。
2.怎么做注意力
我(查询对象Q),这张图(被查询对象V)
我看这张图,第一眼会判断哪些东西对我更重要,哪些不重要(计算Q和V里的事物的重要性)
重要度计算 ,接近相似度计算
点乘,其实就是求内积
Q
K =k1,k2,...,kn
①点乘
一般使用点乘的方式计算Q和K里的每一个事物的相似度,这样可以拿到Q和k1的相似值s1,Q和k2的相似值s2,Q和kn的相似值sn。
②softmax
做一层softmax(s1,s2,...,sn)
进而可以找出哪个对Q更重要
③汇总
当使用Q查询结束后,Q失去了它的使用价值,我们最终还是要拿到这张图片的,只不过现在的这张图片。多了一些信息(哪些更重要,那些不重要,类似热力图里的红色和绿色)
V=(v1,v2,...,vn)
(a1,a2,...,an)+(v1,v2,...,vn)=(a1v1+a2v2+...+anvn)=V'
这样的得到了一个新的V',这些新的V'包含了那些更重要,哪些更不重要的信息在里面
④替代
用V'代替V
一般而言,K=V,在Transformer里,K可以!=V,但K,V之间一定有某种联系。这样QK点乘才能指导V哪些重要,哪些不重要
如下图👇



3.Q,K,V区分(形象化)
让我用一个超级形象的「相亲大会」来比喻Q、K、V,保证你一下就懂!
🏠整体场景设定
想象一个大型相亲大会:
你 = 一个寻找伴侣的人
其他所有人 = 相亲大会的参与者
每个人都有自己的资料卡
现在把这个场景映射到注意力机制:

👨角色详解
① Query (Q) - 「你的择偶标准」
python
# 你想找什么样的人?
Q = [身高175+, 喜欢运动, 幽默风趣, 有稳定工作]
# 在NLP中:
Q = 当前词想知道:"我需要关注哪些信息?"
特点:
- 主动方,发起查询
- 代表「我想要什么」
- 决定了关注的方向
②Key (K) - 「别人的名片/标签」
python
# 别人的简短自我介绍:
K_张三 = [身高180, 篮球爱好者, 程序员]
K_李四 = [身高170, 书虫, 教师]
K_王五 = [身高178, 健身达人, 销售]
# 在NLP中:
K = 每个词的身份标签:"我是谁?我能提供什么?"
特点:
- 被动方,被查询
- 代表「我是什么」
- 用于快速匹配筛选
③Value (V) - 「别人的详细档案」
python
# 别人的完整信息(更丰富):
V_张三 = [详细经历、性格测试、家庭背景、收入细节...]
V_李四 = [同上,但内容完全不同]
V_王五 = [同上]
# 在NLP中:
V = 每个词的实际内容:"我的完整信息"
特点:
- 实际被获取的信息
- 比Key更丰富、更详细
- 真正贡献给最终结果
💑相亲流程(注意力计算)
第1步:交换标准与名片(Q·K)
python
# 你拿出择偶标准(Q),对比每个人的名片(K)
匹配度_张三 = Q · K_张三
= [175+,运动,幽默,稳定]·[180,篮球,?,程序员]
= 高分数 ✓ (身高匹配,运动相关)
匹配度_李四 = Q · K_李四
= [175+,运动,幽默,稳定]·[170,书虫,?,教师]
= 低分数 ✗ (身高不够,不运动)
匹配度_王五 = Q · K_王五
= 中等分数
第二步:计算关注权重(Softmax)
python
# 把匹配度转化为概率分布
分数 = [高, 低, 中]
权重 = softmax(分数) = [0.7, 0.1, 0.2]
# 意味着:
# 70%关注张三,10%关注李四,20%关注王五
第3步:获取详细信息(加权求和)
python
# 根据权重,获取每个人的详细档案(V)
最终伴侣信息 = 0.7×V_张三 + 0.1×V_李四 + 0.2×V_王五
# 得到:一个综合了三人优点的「理想伴侣画像」
总结
自注意力机制
优点:
- 解决了长序列依赖问题
- 可以并行
缺点:
- 开销变大了
2.既然可以并行,也就是说,词与词之间不存在顺序关系(打乱一句话,这里的每个词的词向量依然不会变),即无位置关系(通过Position Embedding给其位置信息)
八、自注意力机制(Attention范围更大,Self-Attention更具体了)
1.区别(一句话)
注意力机制:查询者在外部信息库中寻找相关项("我看你")比喻:像学生查字典 词向量QKV不一定同源
自注意力机制:序列内部元素互相查询关联("我们互相看")比喻:像团队内部讨论 QKV同源
核心区别对比表

自注意力是注意力机制的一种特殊形式,当注意力机制的源序列和目标序列是同一个序列时,就变成了自注意力!
2.自-注意力机制
Self-Attention 的关键点再于,不仅仅是 K≈V≈Q
来源于同一个 X,这三者是同源的
通过 X 找到 X 里面的关键点
并不是 K=V=Q=X,而是通过三个参数 WQ,WK,WV
接下来的步骤和注意力机制一模一样👇
1.Q,K,V的获取

2.Matmul:

3.Scale+Softmax:

4.Matmul:
z1表示的就是 thinking 的新的向量表示
对于 thinking,初始词向量为x1
现在通过 thinking machines 这句话去查询这句话里的每一个单词和 thinking 之间的相似度
新的z1依然是 thinking 的词向量表示,只不过这个词向量的表示蕴含了 thinking machines 这句话对于 thinking 而言哪个更重要的信息

如果不做注意力,its 的词向量就是单纯的 its,没有任何附加信息。也就是说 its 有 law 这层意思,而通过自注意力机制得到新的 its 的词向量,则会包含一定的 laws 和 application 的信息
总结:注意力机制只是单方面关注,自注意力机制是双向的
| 名字 | 说明 |
|---|---|
| 注意力机制 | Q,K,V不一定同源 |
| 自注意力机制 | Q,K,V同源 |
| 交叉注意力机制 | Q和K不同源,但是K和V同源 |
| cyd注意力机制 | Q和K同源,但是Q和K不同源 |
| xxx注意力机制 | Q必须为1,K和V不同源 |
RNNs有长序列依赖问题,无法做并行
Self-Attention得到的新的词向量具有句法特征和语义特征(表征更完善)解决了,并行计算和长距离依赖问题
Masked Self-Attention 解决了自回归生成的信息泄露问题
Masked Self-Attention
自注意力机制明确的知道这句话有多少个单词,并且一次性给足,而掩码是分批次给,最后一次才给足
想象你在写日记:
- 你写「今天天气很好,」
- 停下来想:接下来写什么?
- 你不能翻到明天看明天写什么
- 只能基于「今天天气很好,」来推理
- 最终写下「我去公园玩了。」
← 这就是Masked Self-Attention!
例子:当我们做生成任务的时候,我们也想对生成的这个单词做注意力计算,但是,生成的句子是一个一个单词生成的
I have a dream
-
I 第一次注意力计算,只有 I
-
I have 第二次,只有 I 和 have
-
I have a
-
I have a dream
-
I have a dream
掩码自注意力机制应运而生
掩码后 1:

掩码后2:

九、Masked Self-Attention
①

对于 X,我们不是说,直接拿 X 去得到 Z,而是把 X 分成了 8 块(8 头),得到 Z0-Z7
②
然后把 Z0-Z7 拼接起来,再做一次线性变换(改变维度)得到 Z
多头流程图

有什么作用?
机器学习的本质是什么:y=σ(wx+b),在做一件什么事情,非线性变换(把一个看起来不合理的东西,通过某个手段(训练模型),让这个东西变得合理)
非线性变换的本质又是什么?改变空间上的位置坐标,任何一个点都可以在维度空间上找到,通过某个手段,让一个不合理的点(位置不合理),变得合理
这就是词向量的本质
one-hot 编码(0101010)
word2vec(11,222,33)
emlo(15,3,2)
attention(124,2,32)
multi-head attention(1231,23,3),把 X 切分成 8 块(8 个子空间),这样一个原先在一个位置上的 X,去了空间上 8 个位置,通过对 8 个点进行寻找,找到更合适的位置
词向量的大小是 512(默认)
假设你的任务,视频向量是 5120,80,对计算机的性能提出了更高的要求
十、Positional Encoding
位置编码是Transformer中最巧妙的设计之一------因为Transformer没有RNN的顺序记忆,它需要一种方式来记住词语的顺序!
🎯 核心问题:为什么需要位置编码?
1.Transformer的「天生缺陷」:
python
# 假设句子A:「猫吃鱼」
句子A向量 = [猫, 吃, 鱼]
# 句子B:「鱼吃猫」
句子B向量 = [鱼, 吃, 猫]
# 在Transformer看来(无位置编码时):
[猫, 吃, 鱼] == [鱼, 吃, 猫]
# 因为自注意力是「无序集合」操作!
# 它不知道谁在前谁在后!
就像玩扑克洗牌后:
python
给你一副洗乱的扑克牌:[K, 3, A, 7, J]
另一副不同顺序:[3, J, A, 7, K]
如果只看牌面值:两副牌「差不多」
但打牌时:顺序决定一切!
位置编码就是「给每张牌加上座位号」!
2.位置编码的本质:给每个词一个「时空坐标」
传统方法 vs Transformer方法:
python
# 传统RNN:天然有序
时间点1:处理「猫」→ 记住位置1
时间点2:处理「吃」→ 记住位置2
时间点3:处理「鱼」→ 记住位置3
# 像串珠子,自然有序
# Transformer:并行处理所有词
同时处理:[猫, 吃, 鱼]
需要:人工添加位置信息!
# 像散落的珠子,需要编号
3.🎨 Transformer的解决方案:正弦波编码
想象每个词坐上「旋转木马」 🎠
python
# 每个词有两个属性:
1. 词义(本身内容):我是「猫」
2. 位置(坐在哪里):我坐在第1个位置
# 位置编码就像给每个座位一个「旋转角度」:
位置1:旋转0度
位置2:旋转30度
位置3:旋转60度
...
位置n:旋转(n-1)×30度
4.具体怎么「编码」?
python
# 假设词向量是512维
词向量 = [0.1, 0.2, 0.3, ..., 0.512] # 词义信息
# 位置编码也是512维
位置编码 = [sin(位置/10000^(0/512)),
cos(位置/10000^(0/512)),
sin(位置/10000^(2/512)),
cos(位置/10000^(2/512)),
...] # 位置信息
# 最终输入 = 词向量 + 位置编码
# 就像:词义 + 时空坐标
5.为什么用正弦余弦?------「相对位置」的魔法
关键洞察:
python
用固定数值(如[1,2,3,...])的问题:
位置10和位置11差距=1
位置100和位置101差距=1
但实际语言中:相邻词在开头更重要!
正弦波的妙处:能编码「相对位置」!
正弦波的相对性:
python
# 正弦函数的性质:
sin(x + k) 可以用 sin(x) 和 cos(x) 表示
cos(x + k) 可以用 sin(x) 和 cos(x) 表示
# 这意味着:
知道位置p的编码
可以推算出位置p+k的编码!
→ 模型能学会「相对位置」关系!
直观例子:
python
句子:「我 昨天 吃 了 苹果」
对于「吃」这个词:
绝对位置:3
但更重要的是相对位置:
距离「我」:2个位置(主语)
距离「昨天」:1个位置(时间)
距离「苹果」:2个位置(宾语)
正弦波编码能捕捉这些相对关系!
比喻:跳舞的编排 💃
python
一群舞者:
词嵌入:每个人的舞蹈动作
位置编码:在舞台上的位置
如果不知道位置:
所有人跳得很好,但撞在一起!
加上位置:整齐的舞蹈队形!
6.为什么这么设计?
python
语言事实:词间距离影响关系强度
例子:
近距离:「猫 吃 鱼」(吃-鱼距离1)→ 强关联
中距离:「昨天 我 吃 了 苹果」(我-苹果距离3)→ 中关联
远距离:「虽然...但是...」(虽然-但是可能距离10+)→ 弱但重要
正弦波编码能编码这种「衰减的关注」!
7.位置编码公式
①公式

比如:"我爱你"

②怎么用

位置编码底层解释

十一、Transformer
采用的seq2seq框架 (编码器)->(解码器)
1.整体框架

举例:翻译器
通过机器翻译来做解释
给一个输入,给出一个输出(输出是输入的翻译的结果)
"我是一个学生" -->(通过 Transformer) I am a student
2.编码器ENCODER
2.1 编码器概略图

编码器包括两个子层,Self-Attention、Feed Forward
每一个子层的传输过程中都会有一个(残差网络+归一化)
2.2 编码器详细图

流程:
Thinking
👇
绿色的x1(词向量:可通过one-hot、word2vec得到)+叠加位置编码(⊕,给x1赋予位置属性)-->黄色x1
👇
输入到 Self-Attention 子层中,做注意力机制(x1、x2 拼接起来成一句),得到 z1(x1 与 x1,x2拼接起来的句子做了自注意力机制的词向量,表征的仍然是 thinking),也就是说 z1 拥有了位置特征、句法特征、语义特征的词向量
👇
进入残差网络(避免梯度消失,w3(w2(w1x+b1)+b2)+b3,如果 w1,w2,w3 特别小,0.0000000000000000......1,x 就没了,【w3(w2(w1x+b1)+b2)+b3+x】),归一化(LayerNorm),做标准化(避免梯度爆炸),得到了深粉色的 z1
👇
进入Feed Forward:Relu(w2(w1x+b1)+b2),(前面每一步都在做线性变换,wx+b,线性变化的叠加永远都是线性变化(线性变化就是空间中平移和扩大缩小),通过 Feed Forward中的 Relu 做一次非线性变换,这样的空间变换可以无限拟合任何一种状态了),得到 r1(是 thinking 的新的表征)
重要:做词向量,只不过这个词向量更加优秀,让这个词向量能够更加精准的表示这个单词
3.解码器Decoder
解码器会接收编码器生成的词向量,然后通过这个词向量去生成翻译的结果。
3.1 解码器概述图

这里的Self-Attention其实是Masked Self-Attention
解码器的 Self-Attention 在编码已经生成的单词
假如目标词"我是一个学生"---》masked Self-Attention
训练阶段:目标词"我是一个学生"是已知的,然后 Self-Attention 是对"我是一个学生" 做计算
如果不做 masked,每次训练阶段,都会获得全部的信息
如果做 masked,Self-Attention 第一次对"我"做计算
Self-Attention 第二次对"我是"做计算
......
测试阶段:
- 目标词未知,假设目标词是"我是一个学生"(未知),Self-Attention 第一次对"我"做计算
- 第二次对"我是"做计算
- ......
而测试阶段,没生成一点,获得一点
Linear 层转换成词表的维度
softmax 得到最大词的概率
softmax 细化

4.问题一:🎭 Transformer解码器为什么需要Mask:防止「偷看答案」的考试规则
机器翻译:源语句(我爱中国),目标语句(I love China)
为了解决训练阶段和测试阶段的 gap(不匹配)
**训练阶段:**解码器会有输入,这个输入是目标语句,就是 I love China,通过已经生成的词,去让解码器更好的生成(每一次都会把所有信息告诉解码器)
**测试阶段:**解码器也会有输入,但是此时,测试的时候是不知道目标语句是什么的,这个时候,你每生成一个词,就会有多一个词放入目标语句中,每次生成的时候,都是已经生成的词(测试阶段只会把已经生成的词告诉解码器)
为了匹配,为了解决这个 gap,masked Self-Attention 就登场了,我在训练阶段,我就做一个 masked,当你生成第一个词,我啥也不告诉你,当你生成第二个词,我告诉第一个词

比喻:拼图游戏 🧩
python
没有Mask:看着完整图片拼(太简单)
有Mask:只能看已拼好的部分推理(真实难度)
Decoder需要Mask是为了防止训练时「偷看未来答案」,确保学到的生成能力在推理时真实可用!
5.🎭问题二:为什么 Encoder 给予 Decoders 的是 K、V 矩阵?
Q来源解码器,K=V来源于编码器
Q是查询变量,Q 是已经生成的词
K=V 是源语句
当我们生成这个词的时候,通过已经生成的词和源语句做自注意力,就是确定源语句中哪些词对接下来的词的生成更有作用,首先他就能找到当前生成词
我爱中国
通过部分(生成的词)去全部(源语句)的里面挑重点
Q 是源语句,K,V 是已经生成的词,源语句去已经生成的词里找重点 ,找信息,已经生成的词里面压根就没有下一个词
解决了以前的 seq2seq 框架的问题
lstm 做编码器(得到词向量 C),再用 lstm 做解码器做生成
用这种方法去生成词,每一次生成词,都是通过 C 的全部信息去生成
很多信息对于当前生成词而言都是没有意义的
💡 Q、K、V的语义分工
Q(Query):「我想要什么?」
python
# 来自解码器,代表:
1. 当前已生成的部分
2. 接下来需要什么信息
3. 当前的「注意力焦点」
# 例子:生成中文翻译时
已生成:"我"
Q = "我需要知道:对应的英文动词是什么?"
K(Key):「我是什么?」
python
# 来自编码器,代表:
1. 源语言词的「身份标签」
2. 可被查询的「索引特征」
3. 与其他词的区分特征
# 例子:英文句子"I love you"
K_love = [动词、情感、及物、现在时...]
V(Value):「我的完整信息」
python
# 来自编码器,代表:
1. 词的完整语义理解
2. 上下文增强后的表示
3. 实际要传递的知识
# V比K更丰富:
K_love可能只是[动词、情感]
V_love包含:[爱、喜欢、情感强度、上下文...]
比喻1:考试场景 📝
python
编码器 = 出题老师(准备考题和答案)
K = 考题的「知识点标签」
V = 考题的「完整内容」
解码器 = 学生(答题)
Q = 学生的「解题思路」
学生(Q)对照知识点标签(K)找到相关题目(V)
然后综合这些信息写出答案
💎 总结精华
一句话回答:
编码器给解码器K、V而不是Q,是因为编码器是「知识库」,解码器是「查询者」------知识库提供索引(K)和内容(V),查询者提出动态问题(Q)。
三个核心原因:
- 角色分工:编码器=知识提供者,解码器=知识使用者
- 效率优化:K、V静态可缓存,Q动态需实时计算
- 语义清晰:K是「索引」,V是「内容」,Q是「问题」
总结
参考:B站水论文的程序猿
个人理解
