大模型与交叉熵

阅读 ≈ 1~2h · 推荐使用 Mac 阅读 · powered by ecznlai · 2026-05-10

我在过去的三篇文章介绍了大模型的许多内容:

# 标题 简介
1 什么是大模型的「推理」?
浅谈神经网络的训练和推理
从线性映射出发,讲神经网络的训练与推理、Transformer 的原始认知
2 Tool Use 具体是如何实现的?
Special Token、Chat Template 与 Token Parser
从词表 Special Token 起手,讲 Chat TemplateToken Parser 如何托起 Tool Use
3 实现 GPT-2 的推理
纯 TypeScript 从零实现
纯 TypeScript 实现 GPT-2 的推理,只用原生 Float32Array 进行推理计算
先前的三篇前作, 没读过也没关系可以试着读一下本文

今天一篇关于训练的,介绍大模型损失函数内最重要的一个数学对象:交叉熵。

从概率到 nextToken 预测:贯穿全文的五步主线 P 概率 probability P(xᵢ) 1 0 1 1 信息量 self-info 单位 bit 信息熵 entropy H(X) 交叉熵 cross-entropy H(P, Q) nextToken argmax over the vocab

本文目标说明

交叉熵这个概念来源于信息论,在大模型中应用广泛,可以说是除了注意力机制之外最核心的数学建模了。然而市面上关于交叉熵的文章多数在堆砌概念,看了只会让我感到不安,靠比喻是没有形成自洽且体系化理解的。

我将从几个基本直觉出发,逐步推导信息论里的基础命题和结论,给出信息量和信息熵的定义,最后引出交叉熵并解释为什么它是针对大模型 nextToken 预测任务最理想的损失函数。

本文目标:阐释损失函数的构造和解释,本文推导路线为直觉 → 概率 → 信息量 → 信息熵 → 交叉熵 → KL 散度 → 分类即分布逼近 → softmax + 交叉熵 → 方案对比和梯度 → 反向传播。

信息论与信息量

克劳德·香农 (Claude Shannon) 在 1948 年发表《A Mathematical Theory of Communication》奠定了信息论,其核心命题是:为信息的表达做精确的数学建模,以便于分析和优化信息传输。

TIPS 顺带一提,Anthropic 的 Claude 普遍被认为正是致敬这位信息论之父。

信息量这个词,大多数人(包括我)第一次听到还以为说的是 "这条消息有几个字",但其实不是这样的,信息量是描述事件所蕴含的信息的度量,直观的来说对比以下两个事件其蕴含的信息量并不同:

事件 A 日常 · 习以为常

明天太阳会从东边升起

概率 P 几乎为 1
信息量 极小
事件 B 罕见 · 令人震惊

明天太阳会从西边升起

概率 P 几乎为 0
信息量 极大
DIRECT 同样是一句话,"太阳东升" 是废话,几乎不传递任何新信息;而 "太阳西升" 一旦发生,足以颠覆已有认知,信息量并非由字数决定,而是由事件发生的概率决定,概率越小的事件发生蕴含的信息量越大,对于概率趋于 0 的事件来说其信息量趋于无穷大

为了计算信息量,不妨假设有个 I 函数能依据概率算出信息量,那么我们可以这样来定义信息量:

\begin{aligned} 令 \, I_1 &= 抛硬币得到正面的信息量 = I( \, \frac{1}{2} \, ) \\ 令 \, I_2 &= 抛骰子得到 1 点的信息量 = I( \, \frac{1}{6} \, ) \end{aligned}

当两个独立事件同时发生时所产生信息量应该是两者独立发生时的信息量之和,比如 "抛硬币得到正面" 和 "抛骰子得到 1 点" 同时发生时,我们会认为两个信息叠加在一起,即我们认为信息量是可加的

I_1 + I_2 = I( \, \frac{1}{2} \,) + I( \, \frac{1}{6}\,)

很自然的,当两个独立事件同时发生时,其信息量应该也可以用两个独立事件同时发生的概率配合 I 函数计算得到,独立事件发生的概率为各个事件概率之乘积 (独立事件的乘法法则),可得:

I_1 + I_2 = I(\underbrace{ \frac{1}{2} \,\, \cdot \,\, \frac{1}{6} }_{ \text{同时发生的概率} })

联立上面的方程,可以得到 I 的重要性质:

\begin{aligned} I( \, \frac{1}{2} \, ) + I( \, \frac{1}{6} \, ) &= I( \, \frac{1}{2} \, \cdot \, \frac{1}{6} \, ) \\ \\ 即 \qquad I(p_1) + I(p_2) &= I(p_1 \cdot p_2) \end{aligned}

想想看谁有这种乘法转加法的性质,答案呼之欲出,I 就是对数函数:

I(p) = \log_b ( p )
DeepSeek 在更严肃的证明中我们还需要证明这是唯一解,这本质上是柯西函数方程的一种形式。在合理的连续性或单调性假设下,满足这个关系的函数只能是对数函数

其中对数的底将决定信息量的量纲单位,通常取 2,对应单位就是 bit,不同的底计算得到的信息量本质上也就是换一个常数项系数而已,可以通过对数函数的换底公式证明:

\begin{aligned} \text{引入换底公式} \quad \log_b (x) &= \frac{1}{\log_a (b)} \cdot \log_a (x) \\ \\ \text{所以给信息量计算换底可得} \quad \log_b ( p ) &= \frac{1}{\log_a b} \cdot \log_a p \\ \\ \text{显然 a 和 b 是确定的常数, 所以} \quad K &= \frac{1}{\log_a b} \quad \text{是一个常数项} \\ \\ 即 \quad \log_b(p) &= K \,\, \cdot \,\, \log_a (p) \\ \\ \text{也就是说换底只是换个系数、} & \text{或者说换个单位量纲而已} \end{aligned}

注意到当概率 p < 1 时,对数函数的值是负数,为了让信息量是一个正数量纲以符合我们对信息的认知,引入一个负号即可,至此我们得到了信息论的第一条公式,自信息的定义式(self-information),可堪优雅:

\begin{aligned} I(p) &= - \log_2 ( p ) = \log_2 ( \frac{1}{p} ) \quad \text{单位为 bit} \end{aligned}

基于自信息定义,带入之前给的几个例子事件,计算它们的信息量:

抛硬币, 正面和反面 等概率分布

概率各为 0.5

计算 I(0.5) = \log_2(2)
信息量 = \, 1 \,\, bit
抛骰子,1 ~ 6 点数 等概率分布

1 ~ 6 点,概率各为 1/6

计算 I(1/6) = \log_2(6)
信息量 \approx \, 2.585 \,\, bit
独立事件 · 抛硬币然后抛骰子 联合独立事件

抛硬币出现正面 抛骰子出现 1 点

联合概率计算 P = \frac{1}{2} \cdot \frac{1}{6} = \frac{1}{12}
由可加性计算 \begin{aligned} I &= \log_2(2) + \log_2(6) \\ &\approx 1 + 2.585 \end{aligned}
由自信息定义计算 \begin{aligned} I &= \log_2(12) \\ &\approx 3.585 \,\, bit \end{aligned}
联合事件的信息量恰好等于两个独立事件信息量之和(1 + 2.585),这正是我们在假设的可加性 I(p_1) + I(p_2) = I(p_1 \cdot p_2) 说明对信息量的定义是自洽的。

但是我很不安,因为出现了小数 bit,这与平时开发的直觉完全不同,信息论里的 bit 比计算机存储中的 bit 的含义要更为深刻。

信息熵 (香农熵)

信息熵即事件发生时的平均信息量。

在我们前面讨论抛骰子中:每次抛骰子得到点数的概率是均匀分布的,6 种点数的概率都是 1/6,因此对于连续的若干次抛骰子试验中,单次事件的信息量就等于平均信息量,为 \log_2(6) \approx 2.585 \, bit,此时可以说抛掷骰子的信息熵为 2.585 bit。

但是对于非等概率的分布来说,就必须考虑不同事件发生的概率了,以抛掷一个不均匀的硬币为例,引入这几个概念辨析:

概念 含义
试验 抛一枚不公平硬币(正面概率 0.1,反面概率 0.9
基本事件 两个:
随机变量 X P(\text{正}) = 0.1, \quad P(\text{反}) = 0.9
描述的是事件的概率分布,对所有事件发生的概率求和为 1
自信息 单个特定的事件 x 发生时,所蕴含的信息量,比如此处正面和反面:
正面: I(\text{正}) = -\log_2(0.1) \approx 3.322 \, bit
反面: I(\text{反}) = -\log_2(0.9) \approx 0.152 \, bit
信息熵 (香农熵) 试验若干次后,单次试验结果的平均蕴含的信息量(数学期望)
抛掷不公平硬币试验中的核心概念辨析

很显然,比如抛掷 1000 次时,以数学期望来说,其中会有 100 次正面和 900 次反面,所以平均每次抛掷的信息量就是:

\begin{aligned} I_\text{正面} &= -\log_2(0.1) \approx 3.322 \quad bit \\ I_\text{反面} &= -\log_2(0.9) \approx 0.152 \quad bit \\ \\ 平均每次抛掷的信息量 &= \frac{100 \cdot 3.322 + 900 \cdot 0.152}{1000} = 0.469 \quad bit \end{aligned}

信息熵就是此处平均抛掷的信息量,用于衡量随机变量 X 的平均信息量,上述是一次具体的计算,显然可以注意到平均信息量的计算就是对所有事件信息量按概率的加权平均,至此可以得到信息论的第二条核心公式信息熵 (Entropy)

\begin{aligned} H(X) &= \quad \sum_{i=1}^{n} p_i \cdot I(p_i) \\ &= - \sum_{i=1}^{n} p_i \cdot \log_2(p_i) \end{aligned}

熵这个词代表 "混乱",而信息熵则表示随机变量 X 的平均信息量,也就是说信息熵越小,随机变量 X 的不确定性就越小,反之则说明随机变量 X 的不确定性越大,即更混乱。

想象一下对于前面抛掷硬币的例子来说,如果是一个均匀硬币,每次正反都是对半 1/2,抛一千次可以得到一个序列 正反正反正反正反正反正反正.... 一个正反两个字极度混乱的序列,但是对于前的那个正面概率是 0.1 反面是 0.9 的概率来说,它的序列明显就有序的多 反反反反反反反正反反反反反反反反反正反反反...,大部分是反 —— 信息熵则以加权平均计算每个事件自信息的方式,给出了这种 "混乱程度" 的统计学表征,故得名信息熵。

至此,可以给出信息熵 H(X) 的定义:对随机变量 X 混乱程度,或者说不确定性的度量,其计算方式是将所有事件信息量按概率进行加权平均,继续带入对比几个例子来感受一下:

公平硬币 最不确定

P(\text{正}) = P(\text{反}) = 0.5

计算 H = -(0.5\log_2 0.5 + 0.5\log_2 0.5)
= \, 1 \,\, bit
不公平硬币 分布偏斜

P(\text{正}) = 0.1, P(\text{反}) = 0.9

计算 H = -(0.1\log_2 0.1 + 0.9\log_2 0.9)
\approx \, 0.469 \,\, bit
投掷猫 完全确定

P(\text{正}) = 1, P(\text{反}) = 0

计算 H = -(1 \cdot \log_2 1 + 0 \cdot \log_2 0)
= \, 0 \,\, bit
DIRECT 这里投掷猫是玩猫总能四脚着地的梗,意思是如果一个试验只有一种结果,那么其信息熵为 0,对应每次试验的信息量为 0,也就是毫无悬念根本不需要解释。

讨论:等概率分布的信息熵

我们已经知道了信息熵的概念,现在回过来考察一下前面频繁提到的抛骰子这类等概率分布的信息熵,对于这类分布只有一个唯一特征那就是 "有多少个 case",比如均匀骰子就是 6 个 case,均匀硬币就是 2 case,此时试验一次命中某个子 case 的概率为 1/n,对应信息量 I(1/n) 为:

\begin{aligned} I(1/n) &= -\log_2(\frac{1}{n}) = \log_2(n) \quad 某个子 \, case \, 的信息量 \end{aligned}

特别地、当把 1/n 带入信息熵 H(X) 进行计算,可以发现信息熵退化为单次的抛掷的信息量了,完整推导:

\begin{aligned} H(X) &= \quad \sum_{i=1}^{n} p_i \cdot I(p_i) \\ &= - \sum_{i=1}^{n} p_i \cdot \log_2(p_i) \quad 等概率分布 \, p_i \, 就是 \frac{1}{n} \\ &= \quad \sum_{i=1}^{n} \frac{1}{n} \cdot I(\frac{1}{n}) \\ &= \quad \frac{1}{n} \cdot I(\frac{1}{n}) + \frac{1}{n} \cdot I(\frac{1}{n}) + ... \quad 展开求和 \, n \, 个 \\ &= \quad I(\frac{1}{n}) \cdot ( \underbrace{ \frac{1}{n} + \frac{1}{n} + \frac{1}{n} + ... }_{ \text{注意到一共 n 个} } ) \quad 提取公因子 \\ &= \quad I(\frac{1}{n}) \cdot 1 = -\log_2(\frac{1}{n}) \\ \\ &= \quad \log_2(n) \end{aligned}

讨论:均匀程度

到目前为止本文对概率分布用了很多修辞方式,最主要的就是 "混乱程度" 和 "不确定性",这里给出一个更全局的视角:信息熵表征了概率分布的均匀程度,配合信息熵的定义:

H(X) = - \sum_{i=1}^{n} p_i \cdot \log_2(p_i)

在这个定义的基础上我们就能回答为什么两种不同硬币抛掷的序列所得到的 正反正反正反正反正反正反正.... 会比 反反反反反反反正反反反反反反反反反正反反反... 更混乱,因为前者的信息熵更大,因为熵表征了其中概率分布的均匀性:

分布越均匀,熵越大

数学上可以证明当且仅当所有 p_i 取 1/n 时,H(X) 达到唯一最大值,意味着对于一个概率分布来说最混乱最难以预料的情况就是平均分布,不确定性最高难以预测。

分布越尖锐,熵越小

从前面的讨论也可以轻易得到,H(X) 的定义就是平均信息量,那么什么时候毫无悬念呢?那就是对应某个事件 p_i 概率为 1,其他均为 0 的情况,此时说明不确定性消失,即完全确定。

Claude: 关于这里平均分布对应信息熵的极大值的证明可搜拉格朗日乘子法证明信息熵极大值获取,不展开
信息熵 H(X) 表征了分布的均匀程度:从尖锐 → 均匀 以抛掷不同质地的骰子为例,都是 6 面,仅改变概率分布 尖锐分布 毫无悬念 1.0 p = [0, 0, 1, 0, 0, 0] H(X) = 0 bit 这还是骰子吗 偏态分布 某些类别更可能出现 0.5 p ≈ [0.5, 0.2, 0.15, 0.08, 0.05, 0.02] H(X) ≈ 1.85 bit 你这骰子有吸铁石 均匀分布 公平骰子 · 最混乱 各为 1/6 ≈ 0.167 p = [1/6, 1/6, 1/6, 1/6, 1/6, 1/6] H(X) ≈ 2.585 bit 标准 6 面均匀骰 熵最大
分布越接近均匀,信息熵越大;分布越尖锐,信息熵越小;
Direct 像这里 [0, 0, 1, 0, 0, 0] 这样的没有悬念的分布,通常还称作 one-hot 分布

交叉熵

然而,有一个悬而未决的问题:

信息熵理论上要求我们明确给出 P 的分布的情况下才能算出其信息熵,然而世界上你很难知道某个先验 P 的概率分布(比方说某支股票上涨的概率);

那么必然的,当你只能给出一个猜的、近似的分布 Q 那么此时,用它去计算信息熵时,得到的东西是什么? 答:你得到了交叉熵。

对于给定的两个分布 P_\text{真实}Q_\text{猜的} 来说,交叉熵 H(P, Q) 衡量的是:

\begin{aligned} H(P, Q) \quad &= \quad 使用分布 \, Q \, 来计算分布 \, P \, 的平均信息量 \\ \\ \quad &= \quad \,\, ? \end{aligned}

要如何展开这里问号里的具体式子呢?先来回顾下依据给定分布信息熵的计算方式:

\quad H(P) = - \sum_{i=1}^{n} p_i \cdot \log_2(p_i)

H(P, P)

从特例入手,注意到,当 P = QH(P, Q) 可以表述为 H(P, P),可得:

\begin{aligned} H(P, P) \quad &= \quad 使用分布 \, P \, 来计算分布 \, P \, 的平均信息量 \\ \\ 显然 \quad H (P, P) \quad &= \quad H(P) \\ \\ 即 \quad H(P, P) \quad &= \underbrace{ - \sum_{i=1}^{n} p_i \cdot \log_2(p_i) }_{\substack{ 其中一个 \, p \, 换成 \, q \, 就成了 \, ? \\ 是前面那个还是后面那个? }} \end{aligned}

我们还没得到具体的 H(P, Q) 公式,但我这里通过构造特例能得到他的一个重要性质即当 P = Q 时他必须能完成退化,使得 H(P, P) = H(P)

从 H(P, P) 到 H(P, Q)

然而,这立即引起了我的不安,H(P, P) 展开如下,其中两个 p_i 值得玩味,可以肯定的是把其中一个换成 q_i 我们就能给出 H(P, Q) 的完整定义:

\begin{aligned} H(P, P) \quad &= \quad - \sum_{i=1}^{n} \underbrace{p_i}_{\substack{\text{位置 A} \\ \text{事件概率}}} \cdot \log_2( \, \underbrace{p_i}_{\substack{\text{位置 B} \\ \text{事件信息量}}} \, ) \\ \\ H(P, Q) \quad &= \quad - \sum_{i=1}^{n} \quad A \quad \cdot \log_2( \, B \, ) \end{aligned}

然而在我们前面的讨论中,P 和 Q 代表着 P_\text{真实}Q_\text{猜的}:

位置 A · 事件发生概率 由真实分布 P 决定

事件实际发生的概率,只能由真实分布 P 决定,所以外层加权权重仍是 p_i 不能变,我们无法改变真实世界的概率发生

位置 B · 信息量算法 由我们猜的 Q 决定

用什么去估算每个事件的信息量,只能用猜测分布 Q\log 里的 p_i 替换为 q_i,猜错时就会带来额外的信息量增加

位置 A 是不能变的,只有改变位置 B 的时候,我们猜错时才能带来额外的信息量增加,对应就是我们成功使用分布 Q 来计算分布 P 的平均信息量出现增加,至此,我的不安解除了,得到:

\begin{aligned} H(P, Q) \quad &= \quad 使用分布 \, Q \, 来计算分布 \, P \, 的平均信息量 \\ \\ \quad &= \quad - \sum_{i=1}^{n} p_i \cdot \log_2(q_i) \quad \checkmark \end{aligned}

最后,我们就得到了信息论的第三条核心公式 —— 交叉熵 (Cross-Entropy)

H(P, Q) = - \sum_{i=1}^{n} p_i \cdot \log_2(q_i)
Claude: 交叉熵之"交叉",正在于此:外层权重来自真实分布 P\log 里却来自猜测分布 Q,两个分布在同一条公式里彼此交错。当 Q 越接近 P,交叉熵就越接近 P 自己的信息熵 H(P);当 Q 偏离 P,交叉熵就比 H(P) 更大,多出来的那部分恰好刻画了"猜错"的代价。
交叉熵的「交叉」:两条分布在同一个求和里彼此错位 外层权重 pᵢ 来自真实分布 P(蓝),log 里的 qᵢ 来自猜测分布 Q(橙) 两个分布的柱状对比(4 个类别) 类 1 类 2 类 3 类 4 P 真实分布(决定权重) Q 猜测分布(决定 log 里的值) 交叉熵按项累加 H(P, Q) = -∑ pᵢ · log₂ qᵢ 类别 i pᵢ qᵢ -log₂ qᵢ pᵢ·(-log₂ qᵢ) 10.500.301.7370.868 20.250.301.7370.434 30.150.252.0000.300 40.100.152.7370.274 H(P, Q) = 1.876 bit H(P) = 1.743 bit 多出 D_KL(P‖Q) = 0.133 bit 多出来的部分就是「猜错的代价」
蓝柱决定加权权重(真实),橙柱决定 log 里的值(猜测);当 Q 偏离 P 时,交叉熵就大于 H(P)
公式 含义 是否合理
-\sum p_i \log_2 q_i 事件按真实 P 发生,但我们只能用猜的 Q 来估算信息量 ✅ 符合现实场景
-\sum q_i \log_2 p_i 事件按我们猜的 Q 发生,但用上帝视角的 P 算信息量 ❌ 现实里不存在这种情况
两种公式形态的物理含义对比,后者的构造不具备物理意义

KL 散度

当得到交叉熵公式后,一个很自然的想法是,在分布 P 上用分布 Q 猜错的代价就可以表达为计算 H(P, Q)H(P) 的差值:

\begin{aligned} 差值 \quad &= \quad H(P, Q) \,\, - \,\, H(P) \\ \\ &= \quad \underbrace{- \sum_{i=1}^{n} p_i \cdot \log_2(q_i)}_{\text{交叉熵}} \,\, - \,\, \underbrace{\bigg( - \sum_{i=1}^{n} p_i \cdot \log_2(p_i) \bigg)}_{\text{真实信息熵}} \\ \\ &= \quad \sum_{i=1}^{n} \left( \, p_i \cdot \log_2(p_i) - p_i \cdot \log_2(q_i) \, \right) \qquad 合并求和 \\ \\ &= \quad \sum_{i=1}^{n} p_i \cdot \log_2 \frac{p_i}{q_i} \end{aligned}

在数学上这称为 KL 散度,其中的 K 和 L 分别是两位提出者的姓氏首字母 Kullback-Leibler Divergence,用来衡量 PQ 的差异程度,完整记作 D_{KL}(P \, \| \, Q) 可以直接缩写为 D_{KL}

\begin{aligned} D_{KL}(P \, \| \, Q) = \sum_{i=1}^{n} p_i \cdot \log_2 \frac{p_i}{q_i} \end{aligned}

我们把这个 KL 散度的计算交换一下顺序,把交叉熵放在等式的左边,可以展示出其实际意义:

\underbrace{H(P, Q)}_{\text{交叉熵}} \quad = \, \underbrace{H(P)}_{\substack{\text{真实分布 P 的熵} \\ \text{与猜的分布 Q 无关}}} \, + \, \underbrace{D_{KL}(P \, \| \, Q)}_{\substack{\text{猜错的代价} \\ \text{或者说距离} \\ \text{由分布 Q 决定}}}
交叉熵的结构分解:固定底座 + 距离 横轴按 bit 累加:H(P, Q) = H(P) + D_KL 情形 A · Q 接近 P H(P) = 1.74 0.05 H(P, Q) ≈ 1.79 bit 0 H(P) bits 情形 B · Q 偏离 P H(P) = 1.74 D_KL = 1.50 H(P, Q) ≈ 3.24 bit 0 H(P) H(P, Q) H(P) · 与 Q 无关 D_KL · 猜错的代价(≥ 0)
后文里将展开:训练模型就是在压缩粉色部分,让模型输出的概率分布逐步逼近原始数据的概率分布(蓝色分布)
DeepSeek 这里还需要严格证明 D_{KL}(P \, \| \, Q) \ge 0 才完整,可以用 Jensen 不等式配合对数不等式 \ln x \le x - 1 来证明,不展开

分类问题与概率分布

分类问题是神经网络最擅长的问题种类之一,前面提到过一个简单的动物分类模型,判断是猫、狗还是兔子,一个最朴素的设计是模型直接输出单个标签 '猫'|'狗'|'兔',但现代深度学习最佳实践是让模型输出所有类别的概率分布

朴素做法 硬分类

模型直接输出: "猫" | "狗" | "兔" 中的一个

问题:表达是离散的、绝对的、或者说取值空间是不连续的,是一个三值空间、无法体现连续差距、无法求梯度做反向传播(只有连续函数才能求导求梯度)

最佳实践 输出概率分布

模型输出: { 猫: 0.7, 狗: 0.2, 兔: 0.1 }

可以表达置信度、可以与真实分布做差异度量、连续可导,完美契合梯度下降,模型要解决的问题是依据给定图片映射到 [0,1]^3 空间内的一个点上(概率分布)可以说算是神经网络最甜点的问题域了

关键来了,训练时我们能明确知道这张图是猫/狗/兔的那一种,因此我们可以通过人工标注,为猫的图片设定 "真实概率分布 P",这里再放一个模型输出的预测分布 Q 作为对比,模型的任务就是让它输出的 Q 逼近真实分布 P:

P_{原图标签} \,\, = \,\, [\, \underbrace{1}_{\text{猫}}, \, \underbrace{0}_{\text{狗}}, \, \underbrace{0}_{\text{兔}} \,] \qquad Q_{模型猜的} \,\, = \,\, [\, \underbrace{0.7}_{\text{猫}}, \, \underbrace{0.2}_{\text{狗}}, \, \underbrace{0.1}_{\text{兔}} \,]
Tips 类似这里的 P 这种只有一个 1 的概率分布模式称为 one-hot 分布,100% 确定性的表述由训练数据提供,其信息熵为 0 (这句话请务必仔细品味)

此时,模型的效果好不好就是在问 P 和 Q 的概率分布的差异度,如果差异度越小则说明模型效果越好,而在前面我们已完整推出关于交叉熵和 KL 散度公式,并确信这是衡量这种差异度绝佳数学工具,引用前面的结论可得:

D_{KL}(P \, \| \, Q) = \sum_{i=1}^{n} p_i \cdot \log_2 \frac{p_i}{q_i}

模型最后一层会输出 n 个原始数值 (logits),再通过 Softmax 函数压成一个合法的概率分布 Q —— 各分量在 [0,1] 之间且总和为 1:

q_i \,\, = \,\, \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}} \quad , \qquad \sum_{i=1}^{n} q_i = 1

在此之前,我们已经通过信息论拿到了足够强大的数学工具去衡量两个概率分布的差异度,也就是 KL 散度,它可以用来衡量概率分布之间的差异度:

\begin{aligned} D_{KL} = \sum_{i=1}^{n} p_i \cdot \log_2 \frac{p_i}{q_i} \end{aligned}

模型最后输出的 logits 会过一次 softmax,在这个基础上配合 KL 散度用来衡量模型的输出和真实分布之间的差异度或许是一个不错的选择,写在一起看看:

\begin{aligned} D_{KL} = \sum_{i=1}^{n} p_i \cdot \log_2 \frac{p_i}{q_i} \quad , \qquad q_i \,\, = \,\, \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}} \end{aligned}

此时分类问题被巧妙地转化为"两个概率分布之间的逼近问题",打通了信息论和机器学习,可以说是呼之欲出了,但在此之前,我们先看看大模型 nextToken 预测是一个什么样的任务、以及训练过程中的损失函数指的是什么。

大模型 nextToken 预测也是一个分类问题

大模型 (LLM) 的训练任务用一句话概括就是 文字接龙 (next-token prediction):给定一段上文,预测下一个 token 是什么,看起来这好像是一个"生成"问题,但预测这件事需要一个概率分布,实际上就是在一张巨大的词表里告诉我哪个词是最有可能的,返回的是 { "hello": 0.1, "world": 0.6, ... } 这样的跟完整词表一样长的概率分布:

nextToken 预测:在词表上输出一条超长的概率分布 上文 → 模型 → 词表上的 Q(这里以 50257 词表为例,每根柱子代表一个 token) 给定上下文 token 序列让模型预测 nextToken 今天 天气 → ? 大模型 LLM 输出 logits 并通过 softmax 得到概率分布 输出 Q · 在词表上的概率分布(GPT-2 词表共 50257 项,仅示意) 好 / 0.6 冷 / 0.2 热 / 0.1 token #0 token #50256 通过采样从这个概率分布中挑选 token 比如 argmax 代表选最大的「好」
「下一个 token」本质是在词表上做 50257 维的分类,结构与猫狗兔分类完全同构,只是输出维度极大
概念 含义
上下文序列 上文 token 序列,如 "今天 天气 真"
大模型给出预测 词表上的概率分布 Q,比如 \{\text{好}: 0.6, \, \text{冷}: 0.2, \, \text{热}: 0.1, \, \dots\} 注意这个分布极长
动物判断分类模型 输出的也是概率分布 { 猫: 0.7, 狗: 0.2, 兔: 0.1 } 与大模型输出同构
nextToken 预测本质是分类问题,通过拟合预测概率分布可以解决

损失函数、偏导数、权重

模型就是神经网络,是用来拟合输出结果的,而损失函数 (Loss) 就是用来衡量模型输出与预期输出的差异度,如何选择合适的损失函数具体得看任务类型。

模型训练的目标是让损失函数尽可能小,通常记作 \mathcal{L} 或者单个 L 也行,它越小说明模型对数据的拟合程度越高。

所以训练的第一个问题就是函数极小值搜索问题,工程上通常采用梯度下降法来寻找损失函数极小值,这是一个基于偏导数的方法,先回顾下二元函数偏导数的定义,从一般走向通用:

\frac{\partial f(x,y)}{\partial x} \quad , \quad 固定 \; y \; 时 \; f \; 随 \; x \; 变化的速率

x 的偏导数越大则表示函数对 x 的变化越敏感,即 x 微小的变化也会导致函数值的剧烈变化,在这个基础上就可以配合偏导数找极小值:

\begin{aligned} \frac{\partial f(x,y)}{\partial x} > 0 \quad , \quad &固定 \; y \; 时 \; f \; 随 \; x \; 的增加而增加 \\ 此时让 \; x \; 变小一点点则 \; f \; & 也会变小一点点 \to 即我们离极小值更近了 \\ \\ \frac{\partial f(x,y)}{\partial x} < 0 \quad , \quad &固定 \; y \; 时 \; f \; 随 \; x \; 的增加而减少 \\ 此时让 \; x \; 变大一点点则 \; f \; & 也会变小一点点 \to 即我们离极小值更近了 \end{aligned}
Direct 这里还需要再强调一次为什么是 "一点点":为了保证函数是连续的,不能一次性跳过太多,否则导数就没意义了,只有连续函数才能求导

从以上讨论中,我们可以得知只要让 x 朝着偏导数的反方向进行调整,就可以让损失函数慢慢变小,从而找到极小值,上述是对 x 而言的,对于 y 来说也是对称成立的,不展开,下图以 f(x, y) = x + y 为例子说明这个变小的过程:

梯度下降法:偏导的反方向可以让函数值变小 以二元函数 f(x, y) = x + y 为例,将函数值拆成 x、y 两段长度,观察微调 dx dy 前后的变化 f(x, y) = x + y x y 函数值随 dx dy 变化 f(x + dx, y + dy) = x + dx + y + dy x dx y dy -dx -dy 呢 ? f(x − dx, y − dy) = x − dx + y − dy x −dx y −dy 函数值 f 变小 -dy -dx
图中偏导数的反方向就是 -dx 和 -dy,沿着偏导反方向调整就可以让函数值变小

以上配合偏导数的反方向搜索极小值的工程化实现就是就是所谓的梯度下降法,梯度是函数的所有偏导数所构成的向量,或者说 n 元组、数组啥的、只要是能装东西的容器都行,这是一个复合值,代表了函数的所有偏导数。

为了使用方便,通常把梯度记作 \nabla f 这个倒三角符号代表 f 所有的偏导数构成的向量,对于二元函数的梯度:

\nabla f = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y})

现在来讨论下更一般的场景,把结论推广到 N 元函数,可以直接给出 N 元函数偏导数的定义:

\frac{\partial f(x_1, x_2, ..., x_n)}{\partial x_i} \quad , \quad 固定其他变量时 \; f \; 随 \; x_i \; 变化的速率

此时,它的梯度的定义也可以给出:

\nabla f = (\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n})

套入机器学习的语境,上述的变量 x_1, x_2, ..., x_n 就是模型的权重,而 f 就是损失函数,而 \nabla f 就是损失函数的梯度。

最后,串起来之前谈过的术语:模型训练就是通过梯度下降法不断调整权重来寻找损失函数极小值,配合损失函数的梯度表示进行:

\nabla \mathcal{L}(\theta) = (\frac{\partial L}{\partial \theta_1}, \frac{\partial L}{\partial \theta_2}, ..., \frac{\partial L}{\partial \theta_n})
Direct 本文会混用梯度和偏导这两个术语,通常指的是同一个东西,依据上下文决定指代完整的梯度向量,或仅仅只是单个偏导标量

但是理论是美好的,现实很残酷,训练过程中梯度下降法并不总是能够找到极小值,这主要是因为梯度下降法是局部优化算法,也就是说,它只能找到局部极小值,而不是全局极小值,这会导致模型训练失败。(这又是一个比较大的问题,不展开)

另外还有梯度的数值问题,比如你发现某个偏导数求出来是 0 这意味着不论怎么训都没办法更新权重参数了,训练过程停滞了,这称为梯度消失,此时模型学不到东西了:

\frac{\partial f}{\partial x_i} = 0 \quad \Rightarrow \quad \text{梯度消失}

还有一种则是梯度爆炸,指的是偏导数的绝对值非常大,这会导致模型训练失败,这称为梯度爆炸,此时学一次会导致权重更新极度剧烈,同样会让模型学不到东西:

\frac{\partial f}{\partial x_i} \rightarrow \infty \quad \Rightarrow \quad \text{梯度爆炸}

后文将会揭示,交叉熵很好了避免了梯度消失和爆炸的问题,成为大模型训练的最佳实践。

回到交叉熵:为什么是它?

大模型训练时,我们有大量的数据,对于给定的一段文字其下一个 token 是确定的,通过将其编码为 one-hot 分布作为 P,而不断训练模型的输出 Q,为了衡量 QP 的差异度,前面提出通过 D_{KL} 来衡量差异度或许是一个不错的选择:

\underbrace{H(P, Q)}_{\text{交叉熵}} \qquad = \, \underbrace{H(P)}_{\substack{\text{[1, 0, 0, ...]} \\ 来自训练数据 \, one\text{-}hot }} \, + \quad D_{KL}

此处的 P 由训练数据提供,编码成 one-hot 分布 代表一种 100% 确定性的表述,因此其信息熵为 0,即 H(P) 为 0,证明这个过程也就是逐项展开,相当优雅,下面证明了 one-hot 编码的信息熵为 0:

\begin{aligned} H(P) = - \sum_{i=1}^{n} p_i \log p_i &= \underbrace{ 1 \cdot \log 1 + 0 \cdot \log 0 + 0 \cdot \log 0 \,\, + \,\, ... }_{ \substack{\text{[1, 0, 0, ...]} \\ 来自训练数据 \, one\text{-}hot \\ 总长度 = 词表长度 } } \\ \\ &= 1 \cdot \log 1 = 0 \end{aligned}
Claude: 这里对 0 \cdot \log 0 的处理略有偷懒因为这里 log 0 是未定义的,作者的直觉是有个 0 系数所以是 0,但严格来说,信息论中通常约定 0 \cdot \log 0 := 0,其依据是极限 \lim_{p \to 0^+} p \log p = 0(用洛必达法则即可证明)

因此在 one-hot 场景下,交叉熵计算出来的数值跟 D_{KL} 一样,两者都可以衡量两个分布之间的差异度:

\begin{aligned} \underbrace{H(P, Q)}_{\text{交叉熵}} \qquad = \, 0 \, + \quad \underbrace{D_{KL}}_{\text{KL 散度}} \end{aligned}

也就是说,我们面临一个分歧点,对于大模型损失函数的设计,这两个都可以:

\begin{aligned} \mathcal{L}(P, Q) &= \underbrace{H(P, Q)}_{\text{交叉熵}} \\ &= \underbrace{D_{KL}}_{\text{KL 散度}} \end{aligned}

另外我又萌生出了新的不安:一方面是交叉熵和 KL 散度都可以作为损失函数,另外是没别的方案了?为什么不直接对着概率做加减直接扭成 MSE 作为损失函数呢?这几个看上去都能跑,后文将逐步展开:

方案 1

MSE 均方差

\frac{1}{n}\sum(q_i - p_i)^2

几何视角、不涉及信息论;配合 softmax 求导后含 q_k(1-q_k) 项,两端梯度消失

方案 2

MAE 绝对误差

\sum|q_i - p_i|

绝对值在 0 处不可导,梯度只有 ±1 无法自适应;优化时来回跳动难以收敛

方案 3 ⚠️

KL 散度

\sum p_i \log \frac{p_i}{q_i}

理论可行但含分母 q_i;当 q_i \to 0 时损失与梯度双双爆炸

方案 4

交叉熵

-\sum p_i \log q_i

梯度 = q_k - p_k,数值稳定、自适应强度、无发散风险,最佳实践

MSE 线性拟合

首先介绍 MSE 对应公式如下即线性回归拟合,计算均方差作为损失,配合这份损失的直觉是:衡量所有事件之间的均方差用于逼近概率分布:

\begin{aligned} MSE_\text{(均方差)} &= \frac{1}{n} \sum_{i=1}^{n} ( \hat{y}_i - y_i )^2 \\ \\ 分布 \, Q \, 带入 \, \hat{y}_i \, 代表 &预测 ; \, 分布 \, P \, 带入 \, y_i \, 代表真实概率 \\ \\ \mathcal{L} &= \dfrac{1}{n} \sum_{i=1}^{n} (q_i - p_i)^2 \\ \\ 特别地,对于 \, one&\text{-}hot \, 编码的 \, p_t \, 而言,展开可得 \\ \\ \mathcal{L} &= \frac{1}{n} \cdot \left( \quad \underbrace{(q_k - 1)^2}_{第一个惩罚项} + \underbrace{\sum_{i \neq k} q_i^2}_{第二个惩罚项} \quad \right) \end{aligned}

训练的目标是让 \mathcal{L} 达到极小值,而其中由两项构成,在深度学习理论中称为惩罚项,刚好这里两个惩罚项都是带平方的,也就是他们非负,性质很好讨论:

  1. 第一个惩罚项 (q_k - 1)^2:比如给定的标签独热编码是 {world:1, ...} 这里惩罚的意思是只会对 world 有梯度调整
  2. 第二个惩罚项 \sum_{i \neq k} q_i^2:比如给定的标签独热编码是 {world:1, ...} 这里惩罚的意思是会对所有错误类别都均匀的惩罚

单看上述两点似乎没啥毛病,但有一个问题是:猜的越好的和猜的很差的情况,惩罚项是一样的。当然这不是最主要的问题

更关键的是把 MSE 套上 softmax 求导后会拖着 q_k(1 - q_k) 这样的项,这意味着在 q_k \to 1q_k \to 0 时趋于 0,最该给梯度的点位反而消失了,作为反向传播的起点来说这非常不好。

MAE 绝对值误差

MAE 是对两个概率分布直接求差值绝对值求和,公式如下

\mathcal{L}_{MAE} \,\, = \,\, \sum_{i=1}^{n} |q_i - p_i|

看起来似乎挺好的,但是跟均方差是一个毛病,也是几何视角,并不涉及概率的信息论本质,而且绝对值函数在 0 处不连续不可导,梯度只有 \pm 1,在数值优化里非常粗糙,这会导致梯度下降时来回跳动,因为我们期望越靠近极小值时梯度能越来越小以方便更好的逼近极小值。

KL 散度

前面已经说明了,KL 散度确实是一个诱人的方向,理论上是完全可行的但其数学构造会导致梯度消失和爆炸:

\begin{aligned} \mathcal{L}(P, Q) = D_{KL} = \sum_{i=1}^{n} p_i \cdot \log_2 \underbrace{ \frac{p_i}{q_i} }_{\text{分母项}} \end{aligned}
\begin{aligned} p_i \to 0 \; , \;\; p_i \cdot \log_2 \frac{p_i}{q_i} \to \; ? \qquad 情况一 \\ \\ q_i \to 0 \; , \;\; p_i \cdot \log_2 \frac{p_i}{q_i} \to \; ? \qquad 情况二 \end{aligned}

对于情况一,其实是在问 \lim_{x \to 0^+} x \cdot \log_2 x = 0 发不发散,配合洛必达洛一下能得知其不会发散(相关过程省略);关于在于情况二,那是真的标准的发散,当模型预测的概率 q_i 趋近于 0 而 p_i > 0 时:

\begin{aligned} \frac{p_i}{q_i} \;\; &\to \;\; +\infty \\ \\ \log_2 \frac{p_i}{q_i} \;\; &\to \;\; +\infty \\ \\ p_i \cdot \log_2 \frac{p_i}{q_i} \;\; &\to \;\; +\infty \end{aligned}

损失函数直接飞了,更难受的是反向传播时对 q_i 求梯度会出现 \frac{p_i}{q_i} 这一项,q_i \to 0 时梯度直接爆炸,参数更新一步就把网络打飞。当然对于这种带分母项的问题,工程上也有一些解决办法,但总的来说会让整体训练过程变得更加复杂,那就只剩下交叉熵了。

✅ 交叉熵

现在只剩下交叉熵方案,对于大模型来说最后输出的是 logits 然后通过 softmax 的方式将其压成一个概率分布,因此计算其偏导时,需要把前面构造的基于交叉熵损失函数完全展开:

\begin{aligned} \mathcal{L} &= - \sum_{i=1}^{n} p_i \log q_i \quad , \qquad q_i = \frac{e^{z_i}}{\sum_{j} e^{z_j}} \\ \\ &= - \sum_{i=1}^{n} p_i \log \frac{e^{z_i}}{\sum_{j} e^{z_j}} \qquad 带入 \, q_i \\ \\ &= - \sum_{i=1}^{n} p_i \left( \log e^{z_i} \,\, - \,\, \log \sum_{j=1}^{n} e^{z_j} \right) \qquad 按分母拆开 \log \\ \\ &= - \sum_{i=1}^{n} p_i \, z_i \,\, + \,\, \underbrace{\left( \sum_{i=1}^{n} p_i \right)}_{ \substack{对所有事件\\概率求和 \, = \, 1} } \cdot \log \sum_{j=1}^{n} e^{z_j} \qquad 展开求和 \\ \\ \mathcal{L} &= - \sum_{i=1}^{n} p_i \, z_i \,\, + \,\, \log \sum_{j=1}^{n} e^{z_j} \qquad \mathcal{L} \; 最终化简为两个加和项 \end{aligned}

接下来对 \mathcal{L}z_k 的偏导 \frac{\partial \mathcal{L}}{\partial z_k},分别求导刚刚化简的 \mathcal{L} 里的两个加和项就行:

\begin{aligned} \text{第一项} \quad \frac{\partial}{\partial z_k} \left( - \sum_{i=1}^{n} p_i \, z_i \right) &= \underbrace{ - \frac{\partial (p_1 z_1) }{\partial z_k} - \cdots - \frac{\partial (p_k z_k) }{\partial z_k} - \cdots + \frac{\partial (p_n z_n) }{\partial z_k} }_{ 只有 \, i \, = \, k \, 项保留, 因为其他的项对于求偏导来说完全不相关 } \\ \\ &= - \frac{\partial (p_k z_k) }{\partial z_k} = - p_k \\ \\ \\ \text{第二项} \quad \frac{\partial}{\partial z_k} \log \sum_{j=1}^{n} e^{z_j} &= \frac{1}{\sum_{j} e^{z_j}} \cdot \frac{\partial}{\partial z_k} \sum_{j=1}^{n} e^{z_j} \qquad \text{链式法则} \\ \\ &= \frac{e^{z_k}}{\sum_{j=1}^{n} e^{z_j}} \,\, = \,\, q_k \qquad \text{恰好是 softmax 定义} \end{aligned}

这里求第二项用到了链式法则这个结论,直接拿来用就行; 最后可以得到一个极度简洁的偏导结果:

Softmax + 交叉熵 的梯度

\dfrac{\partial \mathcal{L}}{\partial z_k} \,\, = \,\, q_k - p_k

独热码 + 交叉熵的梯度定义: 对应就是分类预测的偏差
特性 含义
数值稳定 这个梯度定义极度简洁,你懂的求导最喜欢的就是求出来这么简洁的东西,没有 \log、没有除法、没有指数项残留,q_k - p_k 永远落在 [-1, 1],不会发散也不会消失
梯度强度自适应 这个计算就是在描述预测偏差越大时给出越重的惩罚,接近预测时梯度自动变小,自带防止过拟合的效果
简洁的工程实现 框架内通常把 softmax 与 cross-entropy 融合成一个 fused kernel(如 PyTorch 的 cross_entropy),既省了一次显存读写,又顺手用 log-sum-exp 解决了数值溢出。
语义自洽 梯度本身就是对应事件概率的差,它告诉模型该把哪一维概率往上抬、把哪一维往下压,配合这份梯度就是在做逼近分布
Softmax + 交叉熵梯度 q_k - p_k 的四个核心优势
交叉熵损失 + softmax 输出层,损失对 logits 的梯度 = 模型预测概率 - 真实概率 以 4 类 one-hot(真实 = 类 2)为例,梯度直接告诉每一维该抬还是该压 ① 预测概率 softmax 输出 0.30 0.15 0.40 0.15 类 1类 2类 3类 4 ② 真实概率 P(one-hot) 只有类 2 为 1,其他为 0 类 1 1.00 类 2 类 3 类 4 = ③ 梯度 = Q - P 正值「压低」,负值「抬升」 +0.30 -0.85 +0.40 +0.15 类 1类 2类 3类 4 0 蓝色柱「往上抬」真实类的概率,橙色柱「往下压」其他类的概率 所有梯度落在 [-1, 1],幅度自适应 — 偏差越大梯度越强,靠近时自动收敛
梯度 q_k - p_k 的意义就是「各项概率偏差」

大模型的反向传播

从前面的讨论中,我们已经确认了交叉熵配合 softmax 作为损失函数的方式是分类任务的最佳实践,本节进一步展开具体的反向传播过程。

损失函数对 logits z_k 的偏导 \frac{\partial \mathcal{L}}{\partial z_k} = q_k - p_k 是链条的起点,z_k 本身来自最后一层的线性变换 z_k = \mathbf{w}_k^\top \mathbf{h} + b_k,所以梯度要继续沿链式法则向下游传递,最终落在真正可训练的参数上:

\underbrace{\frac{\partial \mathcal{L}}{\partial z_k}}_{q_k - p_k} \;\;\xrightarrow{\;z_k = \mathbf{w}_k^\top \mathbf{h} + b_k\;}\;\; \begin{aligned} \\ 对 \, \mathbf{w}_k \, 求偏导 : \quad &\frac{\partial \mathcal{L}}{\partial \mathbf{w}_k} = (q_k - p_k)\,\mathbf{h} \\[4pt] 对 \, b_k \, 求偏导 : \quad &\frac{\partial \mathcal{L}}{\partial b_k} = (q_k - p_k) \\[4pt] 对 \, \mathbf{h} \, 求偏导 : &\frac{\partial \mathcal{L}}{\partial \mathbf{h}} = \sum_{k}(q_k - p_k)\,\mathbf{w}_k \\ & \;\;\longrightarrow\;\; \text{继续链式法则处理前一层} \end{aligned}

然后利用梯度对权重直接进行原地更新赋值,这一步称为梯度下降,由训练过程中的优化器来做:

\theta_{updated} = \theta_{current} - \eta \cdot \frac{\partial \mathcal{L}}{\partial \theta}

其中 \eta 是学习率,是一个极小的数值,比如 0.000001; 此处的偏导数 \frac{\partial \mathcal{L}}{\partial \theta} 代表的是 \theta 的变化对损失函数 \mathcal{L} 的影响,如果我们期望损失函数变小,那么将 \theta 朝着偏导数的反方向调整,就可以让损失函数变小,在上面的公式中把这个过程表达为一条赋值语句。

DIRECT 所以 q_k - p_k 的真正身份是「反向传播的起点信号」它不直接修改参数,而是以链式法则为渠道,沿着网络从最后一层一路灌到最前面计算损失函数对每一个权重参数的偏导,再由优化器统一施加到参数上。

当然实践中处理的粒度不会这么细,而是向量化的处理全套偏导,推广成梯度张量这个概念,可以简单理解为就是偏导构成的向量,技术性的来说就是梯度是跟权重张量同形状的张量、代表每个权重 \theta 都可以算出一个 \frac{\partial \mathcal{L}}{\partial \theta}

\nabla \mathcal{L} \;=\; \begin{pmatrix} \frac{\partial \mathcal{L}}{\partial w_{11}} & \cdots & \frac{\partial \mathcal{L}}{\partial w_{1n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial \mathcal{L}}{\partial w_{m1}} & \cdots & \frac{\partial \mathcal{L}}{\partial w_{mn}} \end{pmatrix} \;\in\; \mathbb{R}^{m \times n} \quad \text{与权重矩阵 } W \text{ 同形}

综合已有的几个候选方案来看,针对大模型 nextToken 预测任务最理想的损失函数显然是交叉熵 (Cross Entropy),当任务被建模为分布逼近、输出层用 softmax 时,交叉熵是唯一能让"信息论意义"与"工程梯度"同时优雅的损失函数

梯度更新:从损失到权重调整的完整链路 θ_new = θ_old − η · ∂L/∂θ,每一步都朝着损失减小的方向微调 前向传播 输入 → logits → softmax 得到预测分布 Q 计算损失 L = −Σ pᵢ log qᵢ 交叉熵衡量 P 与 Q 差异 反向传播 ∂L/∂z_k = q_k − p_k 链式法则逐层回传梯度 原地更新权重 θ ← θ − η · ∇L 优化器执行参数更新 持续迭代:用更新后的权重再来一次 数值示例:单步梯度更新(学习率 η = 0.01) θ_old 0.5230 η 0.01 × ∂L/∂θ 0.6000 = θ_new 0.5170 0.5230 − 0.01 × 0.6000 = 0.5170 梯度为正 → 权重减小 → 损失降低;每步只动一点点(η 极小),确保稳定收敛 实际训练中会对模型内所有权重参数同时执行这一步,需要保存一个巨大的梯度张量
训练: 不断循环上述「前向 → 损失 → 反向 → 原地更新」过程,每一轮让模型输出的分布更接近真实分布

结语

一开始还感觉交叉熵会是很重的构造,大模型选它准是有过人的想法,结果求导出来才发现这种模式下的梯度就是预测概率和真实概率的差值,这一下子撞到对概率分布的直觉上:你不是想知道两个分布之间的差异吗?直接减法不就行了,可以很符合我对机器学习的想象,有种好像绕了一圈回来发现哦原来就这样的感觉。

通过大量的推导,至此我所有的不安都已解除,整体推导路线 review:
直觉 → 概率 → 信息量 → 信息熵 → 交叉熵 → KL 散度 → 分类即分布逼近 → softmax + 交叉熵 → 方案对比和梯度 → 反向传播

<|endoftext|>