直觉理解
模型面对的世界充满不确定性。分类模型输出的不是「这就是猫」,而是「是猫的概率 0.9」;语言模型每一步输出的,是下一个 token 在整个词表上的概率分布。训练就是让模型给出的分布尽量接近数据的真实分布。所以要读懂模型在做什么,需要会用概率的语言。
定义与公式
随机变量与分布
- 离散分布:随机变量取有限个或可数无穷个值,每个值有一个概率,所有概率之和为 1。语言模型的词表是有限情形;泊松分布则可取任意非负整数。
- 连续分布:用概率密度函数描述,密度在整个取值范围上的积分为 1。最常见的是正态(高斯)分布:
权重初始化、扩散模型加的噪声,常常都用正态分布。
条件概率与链式法则
表示已知 发生时 的概率,这里要求 。联合概率可以拆成条件概率的乘积:
这正是自回归语言模型的出发点:一句话的概率,等于逐个预测每个 token 条件概率的乘积。
贝叶斯公式
它把「先验」 与观测到的证据结合起来,得到「后验」。
期望与方差
- 期望 是加权平均值。
- 方差 衡量波动大小,标准差是它的平方根。
训练用的损失,通常就是对数据分布求期望,实际中用一个批次的样本平均来估计。
最大似然估计
假设样本 独立同分布,选择使观测数据的似然最大的参数;连续变量使用概率密度:
取对数是为了把连乘变成求和,避免数值下溢。最大化对数似然等价于最小化负对数似然,也就是分类和语言模型里的交叉熵损失。
Softmax:把分数变成分布
模型最后一层输出的是任意实数(logits),用 Softmax 变成概率分布:
在指数之前把 logits 除以温度 : 分布更尖锐, 更平缓。这就是生成时「温度」参数的含义。
代码示例
import torch
logits = torch.tensor([2.0, 1.0, 0.1])
for T in (0.5, 1.0, 2.0):
p = torch.softmax(logits / T, dim=-1)
print(T, p.numpy().round(3), float(p.sum())) # 温度越低,分布越集中;总和始终为 1
# 从分布中采样,模拟语言模型生成下一个 token
torch.manual_seed(0)
p = torch.softmax(logits, dim=-1)
samples = torch.multinomial(p, num_samples=1000, replacement=True)
print(torch.bincount(samples) / 1000) # 频率接近 p在 AI 中的作用
- 语言模型就是在建模条件概率 ,见语言模型。
- 最大似然估计导出了交叉熵损失,见损失函数和信息论。
- 归一化层使用均值和方差,见归一化。
- 采样、温度与贪心解码决定了模型的生成方式,概率模型还支撑了投机解码中的拒绝采样。