《手撕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. 处理负数
      2. 归一化:分母是所有项的总和,保证所有输出的结果相加等于1。
      3. 拉大差距:指数函数会把大的值变得更大,让概率高的选项更加突出。

总结:大模型推理五步法

  1. 吃 Input
  2. 算 Logits
  3. 转 Softmax
  4. 抽 Sampling:根据概率分页,抽样选出一个字(一般为概率最大的)
  5. 接 Loop
思考:
1. 计算机只认识二进制,怎么转换和理解呢
2. (个人)如果都是一个字一个字拼接的话,那怎么这么快的速度呢?并且有时候讲的上下文可能是关联的,大模型是怎么回答呢?

EP3 分词器和词嵌入

引言:如何让计算机读懂“我喜欢你”?

即将“我喜欢你”转换为计算机能够运算的数字(0和1)

  • 赛博字典:数据表格

    这个表格中,我们会给每一个汉字或单词分配一个唯一的数字编号。

    编码原则:为节省计算机的内存,根据使用频率来分配数字

    • 频率越高的词,分配的数字越小(占用空间少)
    • 频率越低的词,分配的数字越大
  • 分词器 Tonkenizer

    1. 切整为单:将输入的一整串字符切割成一个个独立的单位,这些被切分出来的单位,被称为Token(代币)
    2. 字转数:拿着切分好的Token,去查阅预先建好的赛博字典,将它们转换为对应的数字。
思考:
如果赛博字典:
	苹果 -> 5
	香蕉 -> 10
在数学运算中,苹果(5)+苹果(5)=香蕉(10)
在语义上是完全荒废的。这种简单的数字编号无法表达词语之间真实的含义和关系,直接训练会导致AI逻辑混乱。
  • 词嵌入 Embedding

    为了避免上述事故,不再用一个数字来代表一个词,而是用一组数据(坐标/向量)来代表一个词。

    例如:把小猫、小狗、老虎放入一个平面直角坐标系中,横轴:萌度,纵轴:凶猛度

    ​ 把词语变成坐标之后,用空间距离代表语义关系

    从一维到多维,拓宽了语义的表达能力

  • 真实的大模型:从二维到高维

总结:

  1. 分词器是大模型的翻译官,将自然语言切分为Token并根据字典映射为基础数字
  2. 单一的数字编号无法表达主义,甚至会引发逻辑错误。
  3. 词嵌入将词语转化为高维空间中的向量,在这个空间中,向量之间的距离代表了词语语义的相似度。

EP4 矩阵乘法和詡嵌入

场景设定:南方巴比馒头、北方庆丰包子铺,需要计算商业利润。已知每种点心的成品成本如下:

表1:点心原材料配方表(单位:克/份)

点心类型 猪肉(g) 面粉(g) 食用油(g)
肉包子 10 6 4
小笼包 9 2 1
生煎包 13 3 2

表2:商家原材料价格表(单位:元/克)

原材料 巴比馒头(元) 庆丰包子(元)
猪肉 1 0.6
面粉 3 4
食用油 2 2

矩阵乘法:行乘以列的线性组合求和。

image-20261017154757595

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

      关键结论:

      1. 运算本质:One-Hot 向量与矩阵相乘,本质上就是从矩阵中“挑出”了对应的某一行。
      2. 维度扩充:原本只有一个 ID 信息(稀疏的),经过变换后,变成了一个包含丰富语义信息的密集向量(Dense Vector)。
      3. 信息承载:这些参数(矩阵中的 w)就是模型通过海量数据训练出来的“语义知识”。
思考:
矩阵乘法成功将文字转化为具备语义的向量,但“我爱你”和“你爱我”在模型眼里,输入成分是一模一样,但实际语义不同。怎么解决顺序问题呢?

总结

  • 矩阵乘法不仅仅是数字运算,更是一种线性变换,它能将一种维度的信息(如原材料)变换为另一种维度的信息(如成本)。
  • 词嵌入 (Embedding) 的数学本质,就是通过矩阵乘法,将离散的文字 ID 映射(Lookup)到连续的高维语义空间中。

EP5 位置编码

​ 引言:目前已经完成分词、词嵌入步骤,使得当前词嵌入模型能表示词义,但它丢失了位置关系。对于大模型而言,如果没有位置信息,“我爱你”和“你爱我”完全一样,因为它包含的词向量集合相同。为解决这个问题,我们需要引入位置编码 (Positonal Encoding,简称 PE)。

公式定义如下:image-20261018164420316

我们将一个词的向量维度分为偶数位和奇数位:

  • 当维度索引为偶数 (2i) 时,使用 正弦函数 (sin⁡sin)。
  • 当维度索引为奇数 (2i+1) 时,使用 余弦函数 (cos⁡cos)。

公式中的分母部分ω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 来说,都是常数。

image-20261018165251526

矩阵乘法即矩阵第i行第j列 = 左矩阵第i行 与 右矩阵第j列 对应相乘(行乘列)再相加

PE(pos,2i)与PE(pos+k,2i)之间是线性变换。

这个推导证明了: 任意位置的编码,都可以由另一个位置的编码通过一个线性的矩阵乘法得到。

***这意味着***
模型不需要记住每个绝对位置的特征,它只需要学习这个线性变换矩阵,就能轻松理解字与字之间的相对距离和上下文关系。这让模型在处理长序列时非常高效。

总结:

最终输入向量=词嵌入向量 (语义)+位置编码向量 (语序)

image-20261018171300551

思考:
我以为用位置编码正余弦公式推导,能解释为什么大模型能一次性读懂那么多字,其实不对,不全是。
位置编码的作用是:
给每个位置的 token 向量注入“它在序列中的位置信息”,使模型能利用顺序和相对距离来理解语义。
正余弦编码的优点是无需学习、有明确的相对位置线性结构、理论可外推;它不是因为“确认位置更快”而胜出。
语义正确不是位置编码单独保证的,而是词嵌入 + 位置编码 + 后续注意力/前馈共同作用的结果。

还要再学习再学习

小节

通过以上学习,完成自然语言到可训练数字的惊险训练!

EP6 键、值、查询——构建“字”的社会

引言:为什么要构建“字”社会?

当前我们有了包含语义和位置信息的词向量,但它们是孤立的、静态的。它们尚不知道彼此之间的关系,在自然语言处理中。孤立的词往往存在歧义。

例如:“吃苹果”和“苹果公司“中的”苹果“含义不同

如果没有上下文,我们无法确定”苹果“的确切含义。只有将字放入上下文中,建立字与字之间的联系,才能消除歧义。因此,我们需要打破孤立,构建一个字与字之间相互关联的”社会“。

核心概念:Q、K、V的社会学类比

人类社会三大基本属性与本质属性:

  • 基本信息与本质属性
  • 主体信息
  • 客体信息

eg:我是一个28岁的女生(基本信息与本质属性),我希望近期我的事业和学业能有所突破(主体信息),我的家人希望我能够在家边上找到一份稳定的工作(客体信息)。

类比模型:

  • Value:基本信息与本质属性

    模型对应V(Value),存储了输入的本质特征(语义+位置的融合,即前期的学习)

  • Query:我关注什么(主体信息)

    模型对应Q(Query),代表当前词作为搜索发起者(主体),去寻找上下文中其他相关词的信息。

  • Key:谁关注我(客体信息)

    模型对应K(Key),代表当前词作为被搜索对象(客体),暴露给其他词用来进行匹配的特征。

数学实现:线性变换

前情提要:之前学习得到的静态输入词向量X(包含了语义和位置信息的混合体),如下:

image-20261025135701213

转化为三个新的向量:

假设我们的输入矩阵为 X(例如“我喜欢你”四个字组成的 4×d 矩阵),我们通过乘以三个不同的可训练权重矩阵(Weight Matrices)来实现这一转换:

  • 计算值(Value):V=X⋅WV

    WV是值变换矩阵。V 代表了融合了语义和位置的本质信息,是模型最终要提取的内容。

  • 计算查询(Query):Q=X·WQ

    WQ 是查询变换矩阵。

  • 计算键(Key):K=X⋅WK

    WK是键变换矩阵。

以V为例:把之前粗暴的语义+位置信息组合的向量,融合成了一个行向量。

image-20261025141207526

初始化的状态

刚开始训练,或者数学推导的起点时,即模型初始化的阶段,输入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转置)

image-20261025142954466

注意,这个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,变成概率:

image-20261025154157307

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
  • 且为独立随机变量。

根据概率论:

  1. 期望的可加性: E(A+B)=E(A)+E(B)=0
  2. 方差的可加性(独立时): D(A+B)=D(A)+D(B)

image-20261025173055421

波动范围由方差表示,在假设条件下可以算出Var(q*k) = dk

缩放$ \sqrt{dk} $时:

image-20261025173055421

故:假设向量维度 dk=4(四维空间),两个向量做点积相当于 4 个元素乘积之和。

  • 点积后的方差会变成:1+1+1+1=4
  • 标准差(Standard Deviation)变为$ \sqrt{4} $=2

结论: 如果不处理,随着维度增加,方差会变大,数据分布会变散。 为了把方差拉回 1,我们需要除以 $ \sqrt{dk} $(在例子中即除以 2)。这样可以确保数值分布在合理的范围内(如 -1 到 1 之间),避免 Softmax 进入饱和区。

第三步:归一化与加权(Softmax & Value)

从上,得出:

image-20261025173727942

注意力矩阵的作用是:决定每个 token 从哪些 token 那里聚合信息、聚合多少。

最终加权(乘以V)

最后补齐拼图的最后一块:Value矩阵(V).

image-20261025173823281

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

image-20261025174208735

  • 注意力输出/上下文表示,表示每个 token 按注意力权重聚合 value 后得到的新向量

此时的矩阵输出的每一行,都是一个社会化后的新词义

总结:

从之前原本孤立的词向量,通过两两交互(点积)、评估权重(softmax)(归一化)、吸收特征(V),最终变成了融合了上下文信息的全新表达。

EP8 多头注意力

回顾与引入:

之前学习 注意力机制(Attention Mechanism)。定义了三个核心矩阵:Q, K, V

image-20261025191305603

从上,我们得到了对应汉字在当前语境下的新理解。

如果我们的模型只初始化一组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)。这一步乘法有两个至关重要的功能:

  1. 混合各方面信息(Mix):将原本独立的“语法”和“情感“特征平滑地揉合在一起,形成一个统一的语义表示(Mixed Matrix)。
  2. 决定权重(Weighing):模型会通过学习WO里的参数,自动决定在当前语境下,是”语法“更重要,还是”情感“更重要,从而赋予不同的关注度。

总结

多头注意力机制的核心流程可以概括为三个阶段:

  1. 分治(Branch & Initialize):
    • 将输入通过不同的线性变换矩阵(WQ, WK, WK)映射到多个子空间。
    • 利用独立的初始化,使各个头关注语言的不同侧面(如语法、情感)
    • 注意缩放因子的变化($\sqrt{dk} $ → $ \sqrt{dk/h} $)
  2. 拼接(Concatenate):将各头计算得到的注意力结果(H1, H2, ……)进行拼接,恢复原始维度大小。
  3. 融合(Fusion):通过WO矩阵进行一次线性变换。这不仅融合了各头的信息,还根据上下文需要对不同特征进行了加权。

通过这一套”分工——合作——融合“的机制,Transformer模型得以极其细腻地理解人类自然语言的复杂含义。

EP9 前馈神经网络FFN ——让直线”学会拐弯“

引言:打破线性的枷锁

虽然通过多头注意力机制得到混合矩阵,但无论多么复杂,本质仍是一系列的线性变换。

核心痛点:线性变换的叠加依然是线性的。如果不引入新的机制,模型只能似合直线。然而真实世界的数据分布是复杂的、弯曲的。

因此,本章的任务就是引入非线性,让模型具备”拐弯“的能力。我们将这一模块拆解为六个关键步骤。

核心步骤详解

第一步:层归一化(Layer Normalization)

需要对刚才得到的混合矩阵进行归归一化,防止数值过大或过小导致梯度爆炸或消失。

image-20261025202525070


D老师处补课:

image-20261025212654476

用个小例子看:

设某个token的4维向量:x = [2,4,6,8]

image-20261025212756234

γ,β 是 LayerNorm 的可学习部分,不是后面另一层。

FFN为后面部分:升维 W1 → ReLU → 降维 W*2;改变中间维度,引入非线性。

第二步:膨胀(Expansion) —— 提升模型上限

为容纳更多的知识和可变参数,我们需要对数据进行升维。

  • 操作:将归一化后的矩阵乘上一个巨大的参数矩阵WE
  • 示例:假设输入是4×4的矩阵,以4倍扩展为例,将其乘以一个4×16的矩阵,输出变成4 × 16.
  • 目的:增加参数量(如这里增加了64个变量——指WE)

第三步:非线性函数(激活函数)——赋予”拐弯“能力

  1. ReLU(修正线性单元)

    • 公式:ReLU(x)= max(0, x)
    • 口诀:非正抹零,正保持
    • 特点:暴力、粗犷。小于0的全部变成0,大于0的保持不变。虽然计算速度快,但信息损失较大(负区间完全丢失)。
  2. GELU(高斯误差线性单元)

    • 核心概念:正态分页概率保留

    • 背景:基于标准正态分布函数,该分布下曲线与X轴转成的总面积为1

    • 原理:

      • 在 1σ(标准差)处,累积概率分布约为 84.13%。
      • GELU 利用积分(即面积占比)作为一个平滑的系数乘在输入上。
      • 它不像 ReLU 那样在0点剧烈折断,而是一个平滑的曲线。
    • 特点:中庸之道。相比 ReLU 保留了更多信息,通过概率进行门控,但计算稍慢。

  3. SwiGLU (Swish-Gated Linear Unit) —— 激活函数的“王者”

    这是目前大模型(如 LLaMA 等)的主流选择。它由两部分组成:

    • 基础模型:

    image-20261025203839336

    • 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次)

如果把这个架构比作可塑橡皮泥,我们现在已经制造出了这块橡皮泥。而接下来”训练过程“,就是如何通过数据,将这块橡皮泥捏成我们要的理想形状。

posted on 2026-11-09 15:53  学习code想长头发U  阅读(5)  评论(0)    收藏  举报