配套视频

⭐ 重点

  • 大模型的本质是概率模型:它输出的不是"答案",而是"下一个词的概率分布"

  • 条件概率 P(A|B):给定上下文 B,下一个词是 A 的概率——这就是语言模型的定义

  • 最大似然估计(MLE):训练目标"让真实数据的概率最大",推导到最后就是交叉熵损失

  • temperature / top-p:都是在"概率分布"上做文章,理解了分布就理解了采样参数

  • 期望与方差:方差分析解释了为什么注意力要除以 \sqrt{ \mathrm{d} }

3.1 语言模型 = 条件概率的乘积

一个语言模型做的事,用一句话说就是:给定前面的词,预测下一个词的概率分布。

语言模型的定义

P(w_1, w_2, \ldots, w_n) = P(w_1)\, P(w_2 \mid w_1)\, P(w_3 \mid w_1, w_2) \cdots P(w_n \mid w_1 \ldots w_{n-1})

也就是说:一句话的概率 = 每个位置"预测下一个词"概率的连乘。这就是自回归生成的全部数学。

3.2 条件概率与贝叶斯公式

条件概率

P(A \mid B) = \frac{P(A \cap B)}{P(B)}

(B 发生的前提下,A 发生的概率)

贝叶斯公式

P(A \mid B) = \frac{P(B \mid A)\, P(A)}{P(B)}

后验 = 似然 × 先验 / 证据

术语

含义

大模型里的对应

先验 P(A)

看到数据前的信念

预训练模型的知识(base model)

似然 P(B|A)

假设成立时,观察到数据的概率

模型对训练样本的预测概率

后验 P(A|B)

看到数据后更新的信念

微调后的模型

💡 一句话理解:P(A|B) 和 P(B|A) 完全不是一回事。"下雨 → 地面湿"概率很高,但"地面湿 → 下雨"概率不高(可能是洒水车)。在大模型里,这个区别体现为:我们要建模的是 P(下一个词 | 上下文),而不是反过来。

3.3 三个必须认识的分布

分布

描述什么

大模型里用在哪

伯努利分布 Bernoulli

一次试验,成功/失败(0 或 1)

二分类任务;注意力 mask

类别分布 Categorical

K 个类别上的概率分布,和为 1

大模型的输出层就是它(词表大小 K)

高斯分布 Gaussian / 正态

钟形曲线,由均值 μ 和方差 σ² 决定

参数初始化;VAE / Diffusion 的噪声建模

3.4 期望与方差

定义

\mathbb{E}[X] = \sum_i x_i\, P(x_i)
\mathrm{Var}(X) = \mathbb{E}\big[(X - \mathbb{E}[X])^2\big] = \mathbb{E}[X^2] - \big(\mathbb{E}[X]\big)^2

(期望 = 加权平均;方差 = 波动程度)

💎 方差的两条关键性质(后面推 \sqrt{ \mathrm{d} } 要用):

① 独立变量和的方差 = 方差的和:Var(X + Y) = Var(X) + Var(Y)(X、Y 独立) ② 常数倍的方差 = 常数平方倍:Var(cX) = c² Var(X)

3.5 最大似然估计:训练目标从哪来

模型参数 θ 该怎么学?最大似然的思想很朴素:让"训练数据出现的概率"尽可能大。

第 1 步 · 写出似然函数(假设样本独立)

L(\theta) = \prod_i P(x_i \mid \theta)

第 2 步 · 取对数(连乘变连加,避免数值下溢)

\log L(\theta) = \sum_i \log P(x_i \mid \theta)

第 3 步 · 取负号,变成"最小化"问题

\theta^* = \arg\min_\theta \big(-\sum_i \log P(x_i \mid \theta)\big)

第 4 步 · 关键发现:这就是负对数似然(NLL)——也正是一个样本上的交叉熵!

L = -\sum_i y_i \log \hat{p}_i \qquad \text{(交叉熵损失)}

⭐ 结论(必须记住):对固定训练数据的 categorical 条件分布,最大化似然等价于最小化负对数似然,也就是经验交叉熵:把数据看作来自固定分布 p 时,最小化 H(p,q) 又等价于最小化正向 KL:D_KL(p‖q)。

这些等价关系依赖"目标与分布固定"等条件。交叉熵是自回归预训练的自然选择,但现代训练还可能加入正则项、辅助损失或偏好优化目标。

3.6 temperature 与 top-p:在分布上做手脚

模型输出 logits(未归一化的分数),先除以 temperature 再 softmax:

带温度的 softmax

p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}

T 的取值

分布形状

生成效果

T → 0

趋向 one-hot(最可能词概率 → 1)

确定性输出,稳定但死板、易重复

T = 1

原始分布

模型本来的样子

T > 1(如 1.5)

分布被"压平",小概率词被抬升

更发散、更有创意,也更容易胡说

top-p(核采样):先把词按概率从大到小排序,累加到累计概率超过 p(如 0.9)就截断,只在这个"核"里采样。这样能砍掉长尾里的垃圾词,又保留多样性。

代码:亲手观察 temperature 如何改变分布

import numpy as np

# 假设模型对下一个词给出了 5 个候选的 logits
logits = np.array([3.0, 2.0, 1.0, 0.5, 0.1])
words  = ["好", "不错", "棒", "可以", "还行"]

def softmax(z, T=1.0):
    z = z / T
    e = np.exp(z - z.max())        # 减去 max 防止溢出(工程惯例)
    return e / e.sum()

for T in [0.2, 1.0, 2.0]:
    p = softmax(logits, T)
    dist = "  ".join(f"{w}={pi:.3f}" for w, pi in zip(words, p))
    print(f"T={T}: {dist}")

# T=0.2: 好=0.993  不错=0.007  棒=0.000 ...   ← 几乎只选"好"
# T=1.0: 好=0.610  不错=0.224  棒=0.083 ...   ← 原始分布
# T=2.0: 好=0.401  不错=0.243  棒=0.147 ...   ← 明显被压平

# 结论:T 越小越确定,T 越大越随机。本质是在调整分布的"熵"。