3.4 概率论基础:贝叶斯思维与不确定性

概率论基础:贝叶斯思维与不确定性

本文适合谁:对概率感到陌生的读者,或者觉得"概率跟AI有什么关系"的读者。读完后你将明白:为什么LLM每次输出不一样、Temperature参数是什么意思、LLM为什么会产生幻觉。这些问题的答案都在本文里。


一、为什么AI需要概率论

传统编程是确定性的:给定同样的输入,永远得到同样的输出。但AI面对的世界根本不是确定性的。

想想看,同一张图片,人类有时候会认错;同一道问题,不同的人会给出不同的回答;同一个病人的化验结果,医生也可能有不同判断。现实世界充满了噪声、歧义和不完整信息。

早期的专家系统试图用确定性规则来描述这个世界------穷举所有可能的情况,写出对应的规则。结果规则复杂度爆炸,这条路走不通。

概率论提供了一个根本不同的思路:不去寻找"确定的答案",而是去估计"每种可能的答案有多大可能性"

AI领域对概率论的依赖体现在三个层次:

第一层:表示不确定性。模型的输出不是一个确定值,而是一个概率分布。"这张图片80%是猫,15%是狗,5%是其他"------比直接说"这是猫"包含更多信息,也更诚实地反映了模型的置信度。

第二层:从数据中学习。学习的本质是:根据观测到的数据,更新对"什么输入对应什么输出"的概率估计。贝叶斯定理正是这种"根据新证据更新信念"的数学框架。

第三层:生成文本。这是最关键的。LLM生成文字的过程,本质上就是在做概率采样:给定前面所有词,计算下一个词的概率分布,然后从这个分布中采样一个词。这个过程反复执行,逐词生成文本。没有概率论,LLM根本无法运作。


二、生活中无处不在的概率

概率不是数学家发明的抽象概念,它本来就存在于每个人的日常思维中。

天气预报说"明天下雨的概率是70%",这是概率。医生说"这种手术的成功率是95%",这是概率。你买彩票,知道中大奖的概率极低,所以不会把全部积蓄都押进去------你在用概率做决策。

概率论的贡献是:把这种直觉精确化,变成可以计算的数学工具。

概率的核心规则很简单:一个事件的概率是0到1之间的数字,所有可能结果的概率之和等于1。

python 复制代码
# 抛硬币
# P(正面) = 0.5,P(反面) = 0.5
# P(正面) + P(反面) = 1.0 ← 所有可能结果之和必须为1

# 天气预报
# P(晴天) = 0.3,P(多云) = 0.5,P(下雨) = 0.2
# 0.3 + 0.5 + 0.2 = 1.0 ✓

# LLM预测下一个词
probs = {
    "很好": 0.35,
    "不错": 0.28,
    "晴朗": 0.20,
    "糟糕": 0.10,
    "其他所有词": 0.07
}
print(sum(probs.values()))  # 1.0 ← 所有词的概率之和等于1

为什么"所有概率之和为1"很重要?

这个约束强迫模型"诚实"地分配置信度。对一种可能更确信,就意味着对其他可能的确信度要相应降低。这确保了模型在表达不确定性时是自洽的。


三、LLM输出的概率本质

LLM是一个巨大的条件概率机器

在深入学习概率论细节之前,先把最重要的结论说清楚:LLM生成文本的全过程,就是在反复做一件事------计算下一个词的概率分布,然后采样

没有更复杂的机制。整个LLM的运作,从数学角度看,就是一个极其复杂的概率预测器。

python 复制代码
# 概念示意:LLM每次生成一个词的过程
# 输入:"今天天气"
# 模型计算下一个词的概率分布:
probs_next_word = {
    "很好": 0.35,    # 最可能的词
    "不错": 0.28,
    "晴朗": 0.20,
    "糟糕": 0.10,
    "其他...": 0.07
}

# 从这个分布中采样,选择下一个词
# 采样结果:"很好"(因为概率最高)
# 然后把"很好"加入上下文,继续预测下一个词

这解释了LLM的很多行为:

  • 为什么每次输出不完全一样:随机采样,每次从概率分布中抽取,结果可能不同
  • 为什么temperature=0时输出固定:选概率最高的词,不再随机
  • 为什么temperature高时输出更"创意":增加低概率词的被选机会,让输出更多样化

四、Temperature:控制随机性的旋钮

为什么要调整随机性

LLM生成"今天天气"后面的词时,如果总是选最高概率的词,输出会很稳定,但缺乏创意,而且有时会陷入重复。如果允许低概率的词也有机会被选中,输出会更多样、更有创意,但随机性太强可能变得混乱。

Temperature参数在"确定性"和"创意"之间找平衡。

Temperature的工作原理:在把原始分数转成概率之前,先对原始分数进行缩放。Temperature越小,高分和低分的差距被放大,高概率词更突出;Temperature越大,差距被压缩,各词的概率趋于均匀。

Temperature(温度参数):控制模型输出随机程度的旋钮,值越低输出越固定,值越高输出越多样。

python 复制代码
import numpy as np

def softmax(x):
    # softmax:把一组任意数字转换成概率分布(所有值加起来等于1)
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum()

def apply_temperature(logits, temperature):
    # logits是模型原始输出(未经归一化的原始分数)
    # temperature调整概率分布的"尖锐程度"
    scaled_logits = logits / temperature
    return softmax(scaled_logits)

# 模拟模型对4个候选词的原始打分
logits = np.array([3.0, 1.5, 0.5, -1.0])  # 分数越高,词越可能

print("Temperature=0.1(低温):")
print(apply_temperature(logits, 0.1))   # 概率高度集中在第一个词
# 约 [0.99, 0.01, 0.00, 0.00]

print("\nTemperature=1.0(正常):")
print(apply_temperature(logits, 1.0))   # 正常分布
# 约 [0.71, 0.21, 0.06, 0.01]

print("\nTemperature=2.0(高温):")
print(apply_temperature(logits, 2.0))   # 概率更加均匀
# 约 [0.51, 0.28, 0.15, 0.06]

运行这段代码,你会清楚地看到:

  • Temperature=0.1时,概率几乎全部集中在第一个词(确定性输出)
  • Temperature=1.0时,概率正常分布,偶尔会选到其他词
  • Temperature=2.0时,概率更均匀,低概率词也有较大机会被选中

这就是为什么:

  • 写代码/做事实查询用低temperature(需要确定性)
  • 写创意文章/头脑风暴用高temperature(需要多样性)

Temperature参数对词汇概率分布的影响


五、条件概率:上下文改变概率

信息改变概率

有一道经典思考题:你知道一个家庭有两个孩子,其中至少一个是男孩,那么两个都是男孩的概率是多少?

不加任何条件,两个都是男孩的概率是1/4。但"至少一个是男孩"这个信息改变了答案------排除了"两个都是女孩"的情况,剩下三种等可能的情况(男男、男女、女男),其中只有一种是两个都是男孩,所以概率是1/3。

这就是条件概率 的本质:新信息到来后,原有概率要相应更新

复制代码
P(B|A) = 在A发生的条件下,B发生的概率

LLM的每次生成都是条件概率

LLM生成文本就是条件概率:

复制代码
P(下一个词 | 之前所有词的上下文)

举个例子:

  • P("苹果" | "我喜欢吃") 比较高------"我喜欢吃苹果"很自然
  • P("苹果" | "我刚用") 也较高------"我刚用苹果手机"
  • P("苹果" | "爱因斯坦发现了") 很低------上下文暗示这里说的是科学发现

LLM正是通过学习大量文本,掌握了"在各种上下文下,下一个词的条件概率分布"。

这就是为什么:

  • 上下文越清晰,模型输出越准确:提供的条件越精确,概率分布越集中
  • Prompt工程本质上是在优化条件概率:好的Prompt让模型理解你想要哪种条件下的输出

六、贝叶斯定理:根据证据更新信念

医学检测的反直觉例子

假设有一种疾病,人群中患病率是1%(100个人里有1个患者)。现在有一种检测方法:患病时,检测阳性的概率是99%;没患病时,检测阳性(假阳性)的概率是5%。

你做了检测,结果是阳性。那么你实际患病的概率是多少?

很多人的第一直觉是:检测准确率99%,患病概率应该很高,可能是95%甚至更高。

但实际计算结果出乎意料:患病概率只有约16.7%

为什么?因为患病率本来就很低(只有1%),即使检测有99%的准确率,在大量没有患病的人里,仍然会有不少假阳性------而这些假阳性的数量,比真阳性还多。

用数字来验证:假设1000个人接受检测

  • 其中10人患病(1%),检测阳性的有 10 × 99% ≈ 10人(真阳性)
  • 其中990人没患病,检测阳性的有 990 × 5% ≈ 50人(假阳性)
  • 检测阳性的共约60人,其中真正患病的只有10人
  • 所以阳性中患病的概率是 10/60 ≈ 16.7%

这个例子揭示了贝叶斯思维的核心:在评估任何证据时,都必须考虑事件本身的基础概率(先验概率)。忽略先验概率,就会得出错误的结论。

贝叶斯定理的公式

复制代码
P(A|B) = P(B|A) × P(A) / P(B)

用医学检测的语言来解读:

  • P(A) = 患病的先验概率(没做检测前的基础概率)= 1%
  • P(B|A) = 患病时检测阳性的概率 = 99%
  • P(B) = 检测阳性的总体概率(真阳性+假阳性)
  • P(A|B) = 检测阳性后患病的概率(我们想知道的)

贝叶斯定理的直觉:根据新证据(B)更新原有信念(P(A))。

就像你认为今天下雨概率是30%(先验),后来看到乌云(新证据),你把概率更新到80%------这就是贝叶斯思维。

python 复制代码
import numpy as np

def bayes_update(prior, likelihood, false_positive_rate, population=1000):
    """
    prior: 先验概率(患病率)
    likelihood: 真阳性率(患病时检测阳性的概率)
    false_positive_rate: 假阳性率(未患病时检测阳性的概率)
    """
    n_sick = int(population * prior)          # 患病人数
    n_healthy = population - n_sick           # 健康人数

    true_positives = n_sick * likelihood      # 真阳性数量
    false_positives = n_healthy * false_positive_rate  # 假阳性数量

    total_positives = true_positives + false_positives
    posterior = true_positives / total_positives  # 后验概率

    print(f"患病人数: {n_sick}")
    print(f"健康人数: {n_healthy}")
    print(f"真阳性: {true_positives:.0f}")
    print(f"假阳性: {false_positives:.0f}")
    print(f"阳性中实际患病的概率: {posterior:.1%}")

    return posterior

# 1%患病率,99%真阳性率,5%假阳性率
bayes_update(prior=0.01, likelihood=0.99, false_positive_rate=0.05)
# 输出:阳性中实际患病的概率: 16.7%(出乎意料!)

运行这段代码,你会看到即使检测准确率很高,实际患病概率仍然很低,因为患病率本来就很低。

贝叶斯定理在AI中的应用

  • 垃圾邮件过滤:根据邮件里出现了哪些词,更新"这是垃圾邮件"的概率
  • RLHF中的奖励模型:根据人类对模型输出的评分,更新对"什么样的回答更好"的判断
  • RAG检索:根据文档内容更新回答特定问题的概率

七、为什么LLM会产生幻觉

LLM为什么会编造不存在的事实("幻觉"问题)?

因为LLM本质上是概率机器,它的目标是生成**"看起来合理"的文字序列**,而不是**"在事实上正确"的文字序列**。一个词是否会被选中,取决于它在给定上下文下出现的概率有多高------概率高,反映的是"这个词在训练数据的类似语境中出现的频率高",不代表它在现实中是真实的。

理解了这一点,你就理解了:

  • 为什么要对LLM的输出保持批判性思维
  • 为什么RAG能减少幻觉------它通过把真实文档加入上下文,改变了条件概率分布,让模型生成时更倾向于与文档事实一致的输出

八、常用概率分布速查

AI里最常见的几种概率分布:

分布 直觉 在AI中的用途
正态分布 钟形曲线,大部分值集中在中间 神经网络权重初始化
均匀分布 所有值等可能 随机采样
伯努利分布 只有是/否两种结果 二分类输出
多项式分布 多个类别各有概率 词汇表采样(LLM的每次生成)

为什么神经网络权重用正态分布初始化?

如果所有权重初始化为0,所有神经元计算出相同的结果,模型永远无法学到多样化的特征。用正态分布随机初始化,每个权重有不同的起点,打破了这种对称性,让不同神经元可以学习不同的特征。

为什么LLM输出用多项式分布采样?

LLM的词汇表通常有几万到十几万个词,每次生成一个词就是从这个巨大的多项式分布中采样------给每个词一个概率,然后按概率随机选取。这就是LLM生成文本的数学机制。


九、熵:不确定性的度量

信息熵(Entropy)衡量一个概率分布有多不确定------值越大说明越不确定,值越小说明越确定。

直觉:如果硬币两面完全对称,每次抛掷你完全无法预测结果,熵最高。如果硬币两面一样,每次都能预测结果,熵为0。

python 复制代码
def entropy(probs):
    probs = np.array(probs)
    return -np.sum(probs * np.log2(probs + 1e-8))

# 完全确定(只有一种可能)
print(entropy([1.0, 0.0, 0.0]))  # ≈ 0,完全确定

# 完全不确定(均匀分布)
print(entropy([0.33, 0.33, 0.34]))  # ≈ 1.58,不确定性最高

# LLM在不同情况下的输出不确定性
# 问"2+2=?":概率集中在"4",熵很低
# 问"今天吃什么?":很多答案都可能,熵很高

交叉熵损失(Cross-Entropy Loss)就是基于熵的概念,衡量预测分布和真实分布的差距------预测越准,交叉熵越小。

在LLM训练中,"预测下一个词"本质上是一个分类任务:词汇表里每个词是一个类别。训练时使用交叉熵损失,就是在告诉模型:让你预测到真实下一个词的概率尽可能高。


小结

概念 AI中的意义 实际影响
概率分布 LLM输出是词汇表上的概率分布 每次生成可能不同
Temperature 控制采样的随机程度 低温确定性高,高温创意多
条件概率 LLM根据上下文预测下一个词 Prompt写法影响输出质量
贝叶斯定理 根据新证据更新对事件的概率估计 垃圾邮件过滤、RLHF等
交叉熵损失 衡量预测分布与真实分布的差距 分类任务训练的损失函数
衡量概率分布的不确定性程度 信息量的数学度量

理解了概率论,你就理解了LLM的"随机性"从哪里来,以及如何通过Temperature来控制它。

更重要的是,你理解了AI和传统编程的根本区别:传统程序处理确定性规则,AI处理不确定性分布。概率论是理解这个区别的数学语言。

下一章将进入机器学习基础,看概率论和线性代数如何共同支撑经典的ML算法。

相关推荐
AI科技星6 小时前
第三卷:质数王朝志(全卷定稿)
c语言·开发语言·汇编·electron·概率论
AI科技星8 小时前
第四卷:橡皮泥江湖(拓扑学)――诸同奥义,九同立境贯拓扑
网络·人工智能·线性代数·架构·概率论·学习方法·拓扑学
AI科技星9 小时前
第三卷:质数王朝志 第四章:RSA护国玄阵,质数锁天地,一数镇万法
android·人工智能·架构·概率论·学习方法
AI科技星1 天前
《全域数学/数术工坊》体系总览
c语言·开发语言·汇编·electron·概率论
lhjcsubupt1 天前
第二十二篇 从随机过程到IMU噪声模型
算法·机器学习·概率论
做cv的小昊2 天前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
AI科技星2 天前
数术工坊:投影秘籍
人工智能·线性代数·架构·概率论·学习方法
2601_961845153 天前
新高考一卷真题2025|真题PDF全科整理
线性代数·矩阵·pdf·动态规划·概率论·高考
changjh15 天前
线性回归的似然函数推导
机器学习·线性回归·概率论
AI科技星6 天前
精细结构常数α的多维度物理比值特性及空间螺旋模型研究
人工智能·线性代数·架构·概率论·学习方法