《手撕AI大模型》
EP1 为什么要构建
- 输入(Input): 你的五感(视觉、听觉、嗅觉、味觉、触觉)。
- 处理(Function): 你这个人本身。
- 输出(Output): 下一时刻的反应。
Hinton 大师相信:我们不必预先设定好函数的参数值,而是用数据去反向训练。
因此,大模型出现了
深度学习的三要素(核心框架)
-
模型Model——是什么
一堆参数及参数之前的关系
-
损失函数Loss Function——为什么/目标是什么
利用损失函数,让函数尽可能的小或者逼近某一个小的标准。是训练的目的。
-
优化器Optimizer——怎么做
将告诉模型如何调整参数让Loss变小
规模效应 Scaling Law:参数量越大,模型越强大。
EP2 大模型本质
-
以“Deepseek 豆包”为例:
问 -> 豆包 DS -> 给出答案
看似感觉问什么就直接答出来
实际它本质是在进行 文字接龙:在当前这些字的情况下,下一个字是XX的概率有多大?
(ps: 也体现了大模型需要数据训练的需求)
-
举个例子:
- 第一次输入:
床前明月光 - 疯狂计算:下一个字的概率
P(疑)=0.95 - 第一次输出:
疑 - 关键步骤——拼接
- 第二次输入:
床前明月光,疑 - 再次疯狂计算:下一个字的概率
P(是)最高 - 第二次输出:
是
input_text = "床前明月光" while 下半句未写完: # 预测下一个字 next_word = 大模型.predict(input_text) # 更新输入,将新生成的字加回去 input_text = input_text + next_word # 打印当前结果 print(input_text)即 一次生成一个字,并将这个字喂给自己,再生成下一个字。
- 第一次输入:
-
-
从上引出
-
数学本质——条件概率
P(wt|wt-1,wt-2,...,w1)
-
wt:表示下一个词
-
|:Given, 表示在....条件下,考虑到
-
wt-1,wt-2,...,w1:代表历史所有的上文
-
-
归一化:Softmax函数
对于模型来说,内部的实际计算中,输出的并不是直接的概率,而是一堆原始数值,称之为Logits。(eg: "疑":5.2,"饭":-1.5)
为了让这些数值变成合法的概率,引入一个到头重要的函数——Softmax
![image-20261017125219022]()
作用:
- 处理负数
- 归一化:分母是所有项的总和,保证所有输出的结果相加等于1。
- 拉大差距:指数函数会把大的值变得更大,让概率高的选项更加突出。
-
总结:大模型推理五步法
- 吃 Input
- 算 Logits
- 转 Softmax
- 抽 Sampling:根据概率分页,抽样选出一个字(一般为概率最大的)
- 接 Loop
思考:
1. 计算机只认识二进制,怎么转换和理解呢
2. (个人)如果都是一个字一个字拼接的话,那怎么这么快的速度呢?并且有时候讲的上下文可能是关联的,大模型是怎么回答呢?
EP3 分词器和词嵌入
引言:如何让计算机读懂“我喜欢你”?
即将“我喜欢你”转换为计算机能够运算的数字(0和1)
-
赛博字典:数据表格
这个表格中,我们会给每一个汉字或单词分配一个唯一的数字编号。
编码原则:为节省计算机的内存,根据使用频率来分配数字
- 频率越高的词,分配的数字越小(占用空间少)
- 频率越低的词,分配的数字越大
-
分词器 Tonkenizer
- 切整为单:将输入的一整串字符切割成一个个独立的单位,这些被切分出来的单位,被称为Token(代币)
- 字转数:拿着切分好的Token,去查阅预先建好的赛博字典,将它们转换为对应的数字。
思考:
如果赛博字典:
苹果 -> 5
香蕉 -> 10
在数学运算中,苹果(5)+苹果(5)=香蕉(10)
在语义上是完全荒废的。这种简单的数字编号无法表达词语之间真实的含义和关系,直接训练会导致AI逻辑混乱。
-
词嵌入 Embedding
为了避免上述事故,不再用一个数字来代表一个词,而是用一组数据(坐标/向量)来代表一个词。
例如:把小猫、小狗、老虎放入一个平面直角坐标系中,横轴:萌度,纵轴:凶猛度
把词语变成坐标之后,用空间距离代表语义关系
从一维到多维,拓宽了语义的表达能力
-
真实的大模型:从二维到高维
总结:
分词器是大模型的翻译官,将自然语言切分为Token并根据字典映射为基础数字- 单一的数字编号无法表达主义,甚至会引发逻辑错误。
词嵌入将词语转化为高维空间中的向量,在这个空间中,向量之间的距离代表了词语语义的相似度。
EP4 矩阵乘法和詡嵌入
场景设定:南方巴比馒头、北方庆丰包子铺,需要计算商业利润。已知每种点心的成品成本如下:
表1:点心原材料配方表(单位:克/份)
| 点心类型 | 猪肉(g) | 面粉(g) | 食用油(g) |
|---|---|---|---|
| 肉包子 | 10 | 6 | 4 |
| 小笼包 | 9 | 2 | 1 |
| 生煎包 | 13 | 3 | 2 |
表2:商家原材料价格表(单位:元/克)
| 原材料 | 巴比馒头(元) | 庆丰包子(元) |
|---|---|---|
| 猪肉 | 1 | 0.6 |
| 面粉 | 3 | 4 |
| 食用油 | 2 | 2 |
矩阵乘法:行乘以列的线性组合求和。

eg:巴比馒头一份肉包子成本 = 10 * 1 + 6 * 3 + 4 * 2 =36元/份
-
数学本质:线性变换
表1单位:克/份
表2单位:元/克
运算过程:(克/份) * (元/克) =(元/份)
发现
表2 商家价格表扮演了一个“变换矩阵”的角色。它并不关心你是肉包子还是小笼包,它只负责把“原材料维度的信息”变换为“金钱维度的信息”。用数学公式表示,即线性函数:f(x)=xW
- x是输入向量
- W是权重/变换矩阵
- 计算过程是ax1+bx2+……,即线性相加
-
独热编码与embedding的实现
-
独热编码:每个字在特定位置标记为1,其余为0的编码方式:
- 我:
[1, 0, 0, 0] - 喜:
[0, 1, 0, 0] - 欢:
[0, 0, 1, 0] - 你:
[0, 0, 0, 1]
- 我:
-
Embedding的本质:查表
引入一个
Embedding矩阵,相当于变换矩阵W(联系包子铺的例子)![image-20261017160539091]()
关键结论:
- 运算本质:One-Hot 向量与矩阵相乘,本质上就是从矩阵中“挑出”了对应的某一行。
- 维度扩充:原本只有一个 ID 信息(稀疏的),经过变换后,变成了一个包含丰富语义信息的密集向量(Dense Vector)。
- 信息承载:这些参数(矩阵中的 w)就是模型通过海量数据训练出来的“语义知识”。
-
思考:
矩阵乘法成功将文字转化为具备语义的向量,但“我爱你”和“你爱我”在模型眼里,输入成分是一模一样,但实际语义不同。怎么解决顺序问题呢?
总结
- 矩阵乘法不仅仅是数字运算,更是一种线性变换,它能将一种维度的信息(如原材料)变换为另一种维度的信息(如成本)。
- 词嵌入 (Embedding) 的数学本质,就是通过矩阵乘法,将离散的文字 ID 映射(Lookup)到连续的高维语义空间中。
EP5 位置编码
引言:目前已经完成分词、词嵌入步骤,使得当前词嵌入模型能表示词义,但它丢失了位置关系。对于大模型而言,如果没有位置信息,“我爱你”和“你爱我”完全一样,因为它包含的词向量集合相同。为解决这个问题,我们需要引入位置编码 (Positonal Encoding,简称 PE)。
公式定义如下:
我们将一个词的向量维度分为偶数位和奇数位:
- 当维度索引为偶数 (2i) 时,使用 正弦函数 (sinsin)。
- 当维度索引为奇数 (2i+1) 时,使用 余弦函数 (coscos)。
公式中的分母部分ωi=1/(10000^2i/*d) 实际上代表了角频率。
实例演算
以“喜”为例,即pos=1,推算公式
“喜”字在这个语境下的位置编码向量为:PE(喜)=[sin(1),cos(1),sin(0.01),cos(0.01)]
通过三角函数的和差化积公式得出,
偶数时,PE(pos+k,2i)=sin(ω⋅pos+ω⋅k)=sin(ω⋅pos)cos(ω⋅k)+cos(ω⋅pos)sin(ω⋅k)
奇数时,PE(pos+k,2i+1)=cos(ω⋅pos)cos(ω⋅k)−sin(ω⋅pos)sin(ω⋅k)
注意观察上面的展开式,cos(ω⋅k)cos(ω⋅k) 和 sin(ω⋅k)sin(ω⋅k) 对于固定的偏移量 k 来说,都是常数。

矩阵乘法即矩阵第i行第j列 = 左矩阵第i行 与 右矩阵第j列 对应相乘(行乘列)再相加
PE(pos,2i)与PE(pos+k,2i)之间是线性变换。
这个推导证明了: 任意位置的编码,都可以由另一个位置的编码通过一个线性的矩阵乘法得到。
***这意味着***
模型不需要记住每个绝对位置的特征,它只需要学习这个线性变换矩阵,就能轻松理解字与字之间的相对距离和上下文关系。这让模型在处理长序列时非常高效。
总结:
最终输入向量=词嵌入向量 (语义)+位置编码向量 (语序)

思考:
我以为用位置编码正余弦公式推导,能解释为什么大模型能一次性读懂那么多字,其实不对,不全是。
位置编码的作用是:
给每个位置的 token 向量注入“它在序列中的位置信息”,使模型能利用顺序和相对距离来理解语义。
正余弦编码的优点是无需学习、有明确的相对位置线性结构、理论可外推;它不是因为“确认位置更快”而胜出。
语义正确不是位置编码单独保证的,而是词嵌入 + 位置编码 + 后续注意力/前馈共同作用的结果。
还要再学习再学习
小节
通过以上学习,完成自然语言到可训练数字的惊险训练!
EP6 键、值、查询——构建“字”的社会
引言:为什么要构建“字”社会?
当前我们有了包含语义和位置信息的词向量,但它们是孤立的、静态的。它们尚不知道彼此之间的关系,在自然语言处理中。孤立的词往往存在歧义。
例如:“吃苹果”和“苹果公司“中的”苹果“含义不同
如果没有上下文,我们无法确定”苹果“的确切含义。只有将字放入上下文中,建立字与字之间的联系,才能消除歧义。因此,我们需要打破孤立,构建一个字与字之间相互关联的”社会“。
核心概念:Q、K、V的社会学类比
人类社会三大基本属性与本质属性:
- 基本信息与本质属性
- 主体信息
- 客体信息
eg:我是一个28岁的女生(基本信息与本质属性),我希望近期我的事业和学业能有所突破(主体信息),我的家人希望我能够在家边上找到一份稳定的工作(客体信息)。
类比模型:
-
Value:基本信息与本质属性
模型对应V(Value),存储了输入的本质特征(语义+位置的融合,即前期的学习)
-
Query:我关注什么(主体信息)
模型对应Q(Query),代表当前词作为搜索发起者(主体),去寻找上下文中其他相关词的信息。
-
Key:谁关注我(客体信息)
模型对应K(Key),代表当前词作为被搜索对象(客体),暴露给其他词用来进行匹配的特征。
数学实现:线性变换
前情提要:之前学习得到的静态输入词向量X(包含了语义和位置信息的混合体),如下:

转化为三个新的向量:
假设我们的输入矩阵为 X(例如“我喜欢你”四个字组成的 4×d 矩阵),我们通过乘以三个不同的可训练权重矩阵(Weight Matrices)来实现这一转换:
-
计算值(Value):V=X⋅WV
WV是值变换矩阵。V 代表了融合了语义和位置的本质信息,是模型最终要提取的内容。
-
计算查询(Query):Q=X·WQ
WQ 是查询变换矩阵。
-
计算键(Key):K=X⋅WK
WK是键变换矩阵。
以V为例:把之前粗暴的语义+位置信息组合的向量,融合成了一个行向量。

初始化的状态
刚开始训练,或者数学推导的起点时,即模型初始化的阶段,输入X 乘以这三个矩阵WV, WX, WQ可能看起来是随机的或者类似。此时Q, K, V三个矩阵在数值上没有本质区别。
真正的区别在于后续的训练和它们在注意力公式中的位置。通过大量数据的训练,这些参数矩阵会逐渐分化,学会分别提取“主体需求”、“客体特征”和“内容本质”。
总结:
本章我们完成了构建“字”的社会的重要一步。我们不再将词向量视为单一的数组,而是将其拆解为三个功能各异的向量:
- V (Value):我是谁(本质属性);
- Q (Query):我在找谁(主体意愿);
- K (Key):谁在找我(客体标签)。
这种拆分让模型能够模拟人类社会中复杂的交互关系,为下一章揭开自注意力机制Self-Attention的神秘面纱奠定了基础。
EP7 注意力机制——Transformer的灵魂
如果不加修饰的写出注意力机制的数学核心公式,其实非常简洁:Score = Q*KT
以“我喜欢你”的词向量,拆解机制:
回顾:上一节将普通词义与位置相加的词向量,通过矩阵变换成新的Q, K, V 词向量
第一步:计算相关性(Score的由来)
利用注意力机制,进行Q(K转置)

注意,这个T,表示是转置(transpose),不是变量,也不是幂。KT 读作“K 的转置”。
转置就是把矩阵的行与列互换。即“转置的第 t 行第 j 列 = 原矩阵的第 j 行第 t 列”。
(KT)t,j = Kj,t
为什么要转置?
矩阵乘法的维度规则。核心一句话:左矩阵的列数必须等于右矩阵的行数;结果取左矩阵的行数和右矩阵的列数。
如果直接写 QK 是 (n×dk)(m×dK)(n×dK)(m×dK),中间维度 dk≠m,通常不能乘。
综上总结,T 是转置:把 K 的行变成列,使得 Q 的每一行能和 K 的每一行做点积,结果矩阵 Sij=qi⋅kj。没有这个转置,矩阵维度对不上,也不能一次性算出所有 query-key 分数。
其它运用点积与相似度的特性
* 矩阵的乘法,即Q乘以K,本质上是行向量与列向量的点积(内积)
* cosθ = 向量a和向量b的乘积 除以 它们模的乘积。
即 向量a和向量b的乘积 等于它们模的乘积 乘以 cosθ
当两个向量的夹角θ越小(越接近重合),cosθ越接近1,点积越大,两个向量的相关度即越高(可以想象平面向量的图理解)
通过第一步,就可以得到一张全员两两相互关注的得分表,即logits得分
第二步:缩放(Scaling)的必要性
* 为什么不能直接用原始 Score?这里涉及到一个关键的统计学问题。
在得出logits得分之后,我们需要转换为概率,即进行归一化。
对分数矩阵S的每一行做Softmax,变成概率:

Softmax 的目标是:把一组任意实数分数变成正数且和为 1 的概率分布。即保证在[0,1]
数值爆炸问题
有的词向量极其渴望被别人找到(K值很大),或者极度想找别人(Q值很大),这会导致它们的点积结果非常大。 如果点积结果是 100,经过 Softmax(指数运算)后,e100会变成一个天文数字;而如果点积是 0,e0=1。 e100≫e0 这会导致概率分布极度尖锐:所有注意力都集中在那个大值上,其他维度的梯度几近于 0,导致模型难以训练(梯度消失)。
举个例子
假设某个query对3个key的分数是:s = [0,1,100]
则Softmax分子分别为:e0 = 1, e1 ≈ 2.718, e100 ≈ 2.688 * 1043
分母:1+2.718+2.688*1043 ≈ 2.688 * 1043
则 p0 = 1/2.688 * 1043 ≈3.7*10-44
p1 ≈ 1.0 ^ 10-43
p2 ≈ 1
训练时,模型通过梯度更新参数。Softmax 的梯度里含有 pi(1−pi) 这类因子。
如果 p ≈ [0,0,1]
- 对高分项:p(1−p)≈1×0=0p(1−p)≈1×0=0;
- 对低分项:p≈0p≈0,梯度也接近 0。
于是大部分位置的梯度都接近 0,参数几乎不更新,模型难以学习。这就是“梯度消失/训练困难”的直观含义。这就是“概率分布极度尖锐”。
因此,需要缩放因子$ \sqrt{dk} $
至于dk怎么得出的,是假设query与key的每个分量独立(这样的话,和的方差就等于方差之和),且均值为0,方差为1。
即假设初始化的 QQ 和 KK 满足标准正态分布假设:
- 均值 μ=0
- 方差 σ2=1
- 且为独立随机变量。
根据概率论:
- 期望的可加性: E(A+B)=E(A)+E(B)=0
- 方差的可加性(独立时): D(A+B)=D(A)+D(B)

波动范围由方差表示,在假设条件下可以算出Var(q*k) = dk
缩放$ \sqrt{dk} $时:

故:假设向量维度 dk=4(四维空间),两个向量做点积相当于 4 个元素乘积之和。
- 点积后的方差会变成:1+1+1+1=4
- 标准差(Standard Deviation)变为$ \sqrt{4} $=2
结论: 如果不处理,随着维度增加,方差会变大,数据分布会变散。 为了把方差拉回 1,我们需要除以 $ \sqrt{dk} $(在例子中即除以 2)。这样可以确保数值分布在合理的范围内(如 -1 到 1 之间),避免 Softmax 进入饱和区。
第三步:归一化与加权(Softmax & Value)
从上,得出:

注意力矩阵的作用是:决定每个 token 从哪些 token 那里聚合信息、聚合多少。
最终加权(乘以V)
最后补齐拼图的最后一块:Value矩阵(V).

- 注意力矩阵 * 词义信息矩阵 得出社会化矩阵

- 注意力输出/上下文表示,表示每个 token 按注意力权重聚合 value 后得到的新向量
此时的矩阵输出的每一行,都是一个社会化后的新词义
总结:
从之前原本孤立的词向量,通过两两交互(点积)、评估权重(softmax)(归一化)、吸收特征(V),最终变成了融合了上下文信息的全新表达。
EP8 多头注意力
回顾与引入:
之前学习 注意力机制(Attention Mechanism)。定义了三个核心矩阵:Q, K, V

从上,我们得到了对应汉字在当前语境下的新理解。
如果我们的模型只初始化一组Q, K, V(即单头),它在学习过程中往往只能捕捉到语言的一个侧面,可能导致模型只学会了关注“语法”,而忽略了“情感“。这对于理解自然语言是致命的。
解决方案,我们需要多头注意力(Multi-Head Attention)。即对数据进行多次、独立的初始化,形成多个”头“。
多头机制的直观理解:专家分工
通过独立初始化,让不同的”头”在模型进化(训练)过程中,能够朝着不同的方向优化,关注语言的不同层面。
以“我喜欢你”为例,我们将模型分为两个头(Head1 和 Head2):
- Head1(语法专家):这部分参数专门负责捕捉兔子的语法结构(例如主谓宾关系)
- Head2(情感专家):这部分参数专门负责捕捉句子的情感倾向(例如“喜欢”所蕴含的积极情绪)。
数学原理与推导
**1 输入向量与线性投影 **
假设输入词向量的矩阵X(已包含了词嵌入与位置编码)的维度为4*4
若想形成2头,则要定义2组独立的参数矩阵
注意:多头注意力的常见约定是每个头的dk' = dv = dmodel / H(人为设定)
这样每个头在低维子空间里算注意力,最后拼接后维度正好回到dmodel
-
Head1:用X乘以一个 4*2 的权重矩阵 W1Q:Q1 = X · W1Q
同理,K1 = X · W1K, V1 = X · W1V
-
Head2:Q2 = X · W2Q, K2 = X · W2K, V2 = X · W2V
(两个头各输出n * 2,拼起来是n*4)
W1与W2系列矩阵的唯一区别在于初始化的随机值不同。这种初始化的差异,是引导它们在后续训练中走向“语法”或“情感”不同进化方向的关键。
2 独立计算注意力(Scaled Dot-Product Attention)
在得到分头的Q, K, V,我们利用之前注意力公式分别计算注意力:
H1 = Attention(Q1, K1, V1 )
H2 = Attention(Q2, K2, V2 )
注意:缩放因子 $ \sqrt{dk} $ 为在单头为维度4的开方,在多头由于将维度从4切分成2(dmodel/h),为了保证点积后的结果仍然满足均值为0、方差为1(以便梯度传播),缩放因子需要调整为$ \sqrt{2}$
即 公式:新的分母是$\sqrt{dmodel/head}$
3 拼接(Concatenate)
通过分头,现在我们有两个独立的矩阵,需要将它们合并。这个操作称为Concatenate。
**A = Concat(H1, H2) **
从几何上看,就是将 H1和 H2 进行“首尾相接”或“左右拼合”。
- H1(4×2) 拼上 H2 (4×2) → 得到矩阵 A (4×4)。 此时,矩阵的每一行再次变回了长度为4的向量,但前半部分包含了语法信息,后半部分包含了情感信息。
4 输出变换(Output Linear Transformation)
拼接后的矩阵A虽然包含了所有信息,但它是分块独立的。我们需要最后一步操作:融合。
Output = A × WO
其中WO是输出变换参数矩阵(Output Weights)。这一步乘法有两个至关重要的功能:
- 混合各方面信息(Mix):将原本独立的“语法”和“情感“特征平滑地揉合在一起,形成一个统一的语义表示(Mixed Matrix)。
- 决定权重(Weighing):模型会通过学习WO里的参数,自动决定在当前语境下,是”语法“更重要,还是”情感“更重要,从而赋予不同的关注度。
总结
多头注意力机制的核心流程可以概括为三个阶段:
- 分治(Branch & Initialize):
- 将输入通过不同的线性变换矩阵(WQ, WK, WK)映射到多个子空间。
- 利用独立的初始化,使各个头关注语言的不同侧面(如语法、情感)
- 注意缩放因子的变化($\sqrt{dk} $ → $ \sqrt{dk/h} $)
- 拼接(Concatenate):将各头计算得到的注意力结果(H1, H2, ……)进行拼接,恢复原始维度大小。
- 融合(Fusion):通过WO矩阵进行一次线性变换。这不仅融合了各头的信息,还根据上下文需要对不同特征进行了加权。
通过这一套”分工——合作——融合“的机制,Transformer模型得以极其细腻地理解人类自然语言的复杂含义。
EP9 前馈神经网络FFN ——让直线”学会拐弯“
引言:打破线性的枷锁
虽然通过多头注意力机制得到混合矩阵,但无论多么复杂,本质仍是一系列的线性变换。
核心痛点:线性变换的叠加依然是线性的。如果不引入新的机制,模型只能似合直线。然而真实世界的数据分布是复杂的、弯曲的。
因此,本章的任务就是引入非线性,让模型具备”拐弯“的能力。我们将这一模块拆解为六个关键步骤。
核心步骤详解
第一步:层归一化(Layer Normalization)
需要对刚才得到的混合矩阵进行归归一化,防止数值过大或过小导致梯度爆炸或消失。

D老师处补课:

用个小例子看:
设某个token的4维向量:x = [2,4,6,8]

γ,β 是 LayerNorm 的可学习部分,不是后面另一层。
FFN为后面部分:升维 W1 → ReLU → 降维 W*2;改变中间维度,引入非线性。
第二步:膨胀(Expansion) —— 提升模型上限
为容纳更多的知识和可变参数,我们需要对数据进行升维。
- 操作:将归一化后的矩阵乘上一个巨大的参数矩阵WE
- 示例:假设输入是4×4的矩阵,以4倍扩展为例,将其乘以一个4×16的矩阵,输出变成4 × 16.
- 目的:增加参数量(如这里增加了64个变量——指WE)
第三步:非线性函数(激活函数)——赋予”拐弯“能力
-
ReLU(修正线性单元)
- 公式:ReLU(x)= max(0, x)
- 口诀:非正抹零,正保持
- 特点:暴力、粗犷。小于0的全部变成0,大于0的保持不变。虽然计算速度快,但信息损失较大(负区间完全丢失)。
-
GELU(高斯误差线性单元)
-
核心概念:正态分页概率保留
-
背景:基于标准正态分布函数,该分布下曲线与X轴转成的总面积为1
-
原理:
- 在 1σ(标准差)处,累积概率分布约为 84.13%。
- GELU 利用积分(即面积占比)作为一个平滑的系数乘在输入上。
- 它不像 ReLU 那样在0点剧烈折断,而是一个平滑的曲线。
-
特点:中庸之道。相比 ReLU 保留了更多信息,通过概率进行门控,但计算稍慢。
-
-
SwiGLU (Swish-Gated Linear Unit) —— 激活函数的“王者”
这是目前大模型(如 LLaMA 等)的主流选择。它由两部分组成:
- 基础模型:
-
SwiGLU结构:SwiGLU = Swish(Input⋅WGate) ⊗ (Input⋅WContent)
它包含两个分支:
- 门控分支(Gate):决定多少信息可以通过
- 内容分支(Content):决定哪些信息是有用的。
两者通过点积(Element-wise product) 结合。虽然参数量最大,计算最复杂,但效果最好。
第四步:压缩(Compression)——降维
经过膨胀和激活后,数据维度过高(如4×16),需要将其还原回原本的维度以便后续处理。
- 操作:乘以一个降维矩阵WO(如16×4)
- 结果:矩阵回到4×4,完成了一次从”现实“到”高维空间“再回到”现实“的旅程。
开始没懂起来了 O.O……
第五步:残差连接(Residual Connection)
- 公式:Result = Mixed + FFN_Output
- 操作:将一系列操作(归一化 + 膨胀 + 激活 + 压缩)得到的结果C,与最开始输入的Mixed矩阵直接相加。
- 目的:保证即使经过剧烈的非线性变换,底层的数值依然稳定,避免梯度消失,让模型更容易训练。
第六步:再次层归一化
为保险起见,在输出给下一个模块之前,再次进行一次层归一化(同第一步)。这确保了数据分页的稳定性,为下一层的计算做好准备。
本节总结与展望:Transformer Unit
至此,我们完整拆解了一个标准的Transformer Unit(单元)。
这个单元包含了两大核心板块:
- 多头注意力机制(EP8):负责提取语义关联(Q, K, V)
- 前馈神经网络(EP9):负责升维、非线性变换、理解复杂特征
宏观视角:真实的模型(如GPT-3)并非只做一次这样的计算,而是将这个Unit层层嵌套。
- 输出的结果会被重新作为输入,再次进入多头注意力机制,再次生成Q、K、V
- 这个过程不断循环(例如GPT-3循环了96次)
如果把这个架构比作可塑橡皮泥,我们现在已经制造出了这块橡皮泥。而接下来”训练过程“,就是如何通过数据,将这块橡皮泥捏成我们要的理想形状。


浙公网安备 33010602011771号