【概率论在机器学习中·第八篇·收官】现代应用:VAE、扩散模型与贝叶斯深度学习的概率本质
【概率论在机器学习中·第八篇·收官】现代应用:VAE、扩散模型与贝叶斯深度学习的概率本质
作者:技术博主 | 更新时间:2026-05-21 | 阅读时长:约 25 分钟
系列:概率论在机器学习中(共 8 篇)· 收官篇
环境:Python 3.12 + NumPy + SciPy + PyTorch
标签:VAE扩散模型贝叶斯深度学习ELBO不确定性量化流模型概率论机器学习

🔥 收官篇目标:走完七篇,你已经掌握了从概率基础到 MCMC、变分推理、图模型的完整工具箱。本篇用这套工具重新审视现代深度学习中最重要的概率模型——VAE 的 ELBO 来自变分推理、扩散模型的训练目标来自 ELBO 的特殊情形、贝叶斯深度学习用后验量化神经网络的不确定性。理解了这些联系,你就能在"调参工程师"和"理解模型"之间跨出关键一步。
系列完整进度
| 篇次 | 主题 | 状态 |
|---|---|---|
| 第一篇 | 从频率到贝叶斯:重新认识概率 | ✅ |
| 第二篇 | 常用分布与指数族 | ✅ |
| 第三篇 | MLE 与 MAP:正则化的概率解释 | ✅ |
| 第四篇 | 贝叶斯推断:从先验到后验 | ✅ |
| 第五篇 | 变分推理:ELBO 与 VAE | ✅ |
| 第六篇 | 蒙特卡洛方法:MCMC | ✅ |
| 第七篇 | 图模型:贝叶斯网络与 EM 算法 | ✅ |
| 第八篇(本篇·收官) | 现代应用:VAE、扩散模型与贝叶斯深度学习 | — |
目录
- 一、ELBO 出现在三个地方:统一视角
- 二、VAE 完整推导:从生成模型到 ELBO
- 三、扩散模型的 ELBO 视角
- 四、归一化流:精确似然的生成模型
- 五、贝叶斯深度学习:神经网络的不确定性
- 六、深度集成与 MC Dropout
- 七、系列收官:完整知识图谱
一、ELBO 出现在三个地方:统一视角
import numpy as np
import scipy.stats as stats
from scipy.stats import norm, multivariate_normal
from scipy.special import logsumexp
import warnings
warnings.filterwarnings('ignore')
print("ELBO 在现代 ML 中无处不在:统一视角")
print()
print(" 三个看似不同的模型,背后都是同一个 ELBO:")
print()
elbo_unified = {
"VAE(变分自编码器)": {
"观测": "图像/文本 x",
"隐变量": "潜在表示 z",
"目标": "最大化 log P(x)",
"ELBO": "E_{q(z|x)}[log P(x|z)] - KL(q(z|x)||P(z))",
"实现": "编码器 + 解码器 + 重参数",
},
"扩散模型(DDPM)": {
"观测": "图像 x₀",
"隐变量": "各时间步的加噪图像 x₁:T",
"目标": "最大化 log P(x₀)",
"ELBO": "Σₜ E[||ε - ε_θ(xₜ,t)||²](简化后)",
"实现": "前向加噪 + U-Net 去噪 + DDIM 采样",
},
"EM 算法(GMM)": {
"观测": "数据点 x",
"隐变量": "分量标签 z",
"目标": "最大化 log P(X|θ)",
"ELBO": "E_{P(z|x,θ_old)}[log P(x,z|θ)]",
"实现": "E 步(责任权重)+ M 步(参数更新)",
},
}
for model, info in elbo_unified.items():
print(f" [{model}]")
for k, v in info.items():
print(f" {k:8s}: {v}")
print()
print(" 统一公式:")
print(" log P(观测) ≥ E_{q(隐变量|观测)}[log P(观测,隐变量)] - KL(q||先验)")
print(" = ELBO(证据下界)")
print()
print(" 三者的差异只在于:")
print(" ① 隐变量 z 的结构(连续向量 / 离散序列 / 离散标签)")
print(" ② 变分分布 q 的复杂度(神经网络 / 精确后验 / 高斯)")
print(" ③ 优化策略(SGD / EM / DDIM)")
二、VAE 完整推导:从生成模型到 ELBO
def vae_complete_derivation():
print("VAE 完整推导:从生成模型到训练目标")
print()
print(" 生成过程(模型定义):")
print(" z ~ P(z) = N(0, I) ← 隐空间先验")
print(" x|z ~ P_θ(x|z) ← 解码器(神经网络)")
print()
print(" 目标:最大化数据的对数似然")
print(" θ* = argmax Σᵢ log P_θ(xᵢ)")
print()
print(" 困难:P_θ(x) = ∫ P_θ(x|z)·P(z) dz 通常无解析解")
print()
print(" 变分下界(ELBO)推导:")
print()
print(" log P_θ(x)")
print(" = log ∫ P_θ(x|z)·P(z) dz")
print(" = log ∫ P_θ(x|z)·P(z)/q_φ(z|x) · q_φ(z|x) dz")
print(" ≥ E_{q_φ(z|x)}[log P_θ(x|z)·P(z)/q_φ(z|x)] ← Jensen 不等式")
print(" = E_{q_φ(z|x)}[log P_θ(x|z)] + E_{q_φ(z|x)}[log P(z)/q_φ(z|x)]")
print(" = E_{q_φ(z|x)}[log P_θ(x|z)] - KL(q_φ(z|x) || P(z))")
print()
print(" ELBO(θ, φ; x) = 重建项 - KL 正则化项")
print()
print(" 两项的含义:")
print()
print(" ① 重建项 E_{q_φ(z|x)}[log P_θ(x|z)]:")
print(" 从编码器采样 z,解码器能多好地重建 x")
print(" P_θ(x|z) = N(x; μ_θ(z), σ²I) → MSE 损失")
print(" P_θ(x|z) = Bernoulli(μ_θ(z)) → BCE 损失")
print()
print(" ② KL 正则化项 KL(q_φ(z|x) || P(z)):")
print(" 编码器输出的分布应接近先验 N(0,I)")
print(" 解析形式:½ Σⱼ [μⱼ² + σⱼ² - log σⱼ² - 1]")
print(" 防止潜空间'崩塌'(所有 x 映射到同一点)")
print()
# β-VAE:控制 KL 权重
print(" β-VAE 的扩展:")
print(" ELBO_β = E[log P(x|z)] - β·KL(q(z|x)||P(z))")
print()
print(f" {'β 值':^8} {'效果':^30} {'应用场景':^24}")
print(" " + "─" * 66)
beta_effects = [
(0, "等同 AE(无 KL),潜空间不连续", "无随机性需求"),
(0.1, "弱正则化,重建质量高", "高质量重建"),
(1.0, "标准 VAE 平衡", "生成+重建平衡 ⭐"),
(4.0, "解耦潜空间(β-VAE)", "语义因子解耦"),
(10.0, "强正则化,解耦好但重建差", "可解释潜空间"),
]
for b, effect, use in beta_effects:
print(f" {b:^8} {effect:^30} {use:^24}")
vae_complete_derivation()
def vae_kl_analytical():
"""VAE KL 散度的解析计算与实现"""
print("\nVAE KL 散度的解析公式与数值验证:")
print()
print(" q(z|x) = N(μ_φ(x), diag(σ²_φ(x)))")
print(" P(z) = N(0, I)")
print()
print(" KL(q||P) = ½ Σⱼ [μⱼ² + σⱼ² - log σⱼ² - 1]")
print()
print(" 等价写法(用 log σ² 参数化,数值稳定):")
print(" 设 log_var = log σ²(编码器实际输出的是 log σ²)")
print(" KL = ½ Σⱼ [μⱼ² + exp(log_varⱼ) - log_varⱼ - 1]")
print()
def kl_gaussian_to_standard(mu, log_var):
return 0.5 * np.sum(mu**2 + np.exp(log_var) - log_var - 1)
# 验证极端情况
cases = [
(np.zeros(4), np.zeros(4), "q = P(完美匹配)"),
(np.ones(4), np.zeros(4), "μ 偏离 0"),
(np.zeros(4), np.ones(4)*2, "σ² = e² ≈ 7.4(过大)"),
(np.zeros(4), np.ones(4)*(-5), "σ² = e^{-5} ≈ 0(接近确定性)"),
(np.array([2,-1,0.5,0]), np.array([-1,0,1,-2]), "混合情形"),
]
print(f" {'μ':^30} {'log σ²':^30} {'KL':^10}")
print(" " + "─" * 74)
for mu, log_var, desc in cases:
kl = kl_gaussian_to_standard(mu, log_var)
print(f" {str(mu.round(2)):^30} {str(log_var.round(2)):^30} {kl:^10.4f} {desc}")
print()
print(" KL = 0 当且仅当 μ = 0, σ² = 1(q 等于先验)")
print(" KL 越大,编码器输出越偏离先验 → 潜空间越'不规整'")
vae_kl_analytical()
三、扩散模型的 ELBO 视角
def diffusion_model_elbo():
print("\n扩散模型的 ELBO 视角:")
print()
print(" 扩散模型的生成模型:")
print(" x₀:原始图像(观测)")
print(" x₁,...,x_T:各步加噪图像(隐变量)")
print()
print(" 联合分布(反向过程,生成模型):")
print(" P_θ(x₀:T) = P(x_T) ∏_{t=1}^T P_θ(x_{t-1}|x_t)")
print(" P(x_T) = N(0,I)(最终纯噪声)")
print()
print(" 目标:最大化 log P_θ(x₀)")
print()
print(" ELBO(用前向过程 q 作为变分分布):")
print(" ELBO = E_q[log P_θ(x₀:T) / q(x₁:T|x₀)]")
print()
print(" 分解为三项(Ho et al. 2020):")
print(" ELBO = E_q[log P_θ(x₀|x₁)]")
print(" - KL(q(x_T|x₀) || P(x_T))")
print(" - Σ_{t=2}^T E_q[KL(q(x_{t-1}|x_t,x₀) || P_θ(x_{t-1}|x_t))]")
print()
print(" 三项含义:")
print(" ① 重建项:从 x₁ 重建 x₀")
print(" ② 先验匹配:x_T 接近 N(0,I)(噪声调度合适时几乎为 0)")
print(" ③ 去噪匹配:学到的反向过程 vs 真实后验")
print()
print(" 简化:将第 ③ 项写成预测噪声的 MSE(Ho et al. 的关键简化)")
print()
print(" L_simple = E_{t,x₀,ε}[||ε - ε_θ(√ᾱₜ x₀ + √(1-ᾱₜ)ε, t)||²]")
print()
print(" ← 这就是 DDPM 的训练损失!")
print(" ← 它来自 ELBO 的简化,不是凭空设计的")
print()
# DDPM 各时间步的 KL 散度
print(" DDPM 各时间步的去噪 KL 散度(t=500 附近最大):")
print()
T = 1000
betas = np.linspace(1e-4, 0.02, T)
alphas = 1 - betas
alphas_cumprod = np.cumprod(alphas)
alphas_cumprod_prev = np.concatenate([[1.0], alphas_cumprod[:-1]])
# 后验方差(理论值)
posterior_var = betas * (1 - alphas_cumprod_prev) / (1 - alphas_cumprod)
# KL 散度近似(两个高斯的 KL)
# KL ≈ 0.5 * (variance ratio - 1 - log ratio)(简化)
beta_over_var = betas / (posterior_var + 1e-8)
approx_kl = 0.5 * (beta_over_var - 1 - np.log(beta_over_var + 1e-8))
print(f" {'时间步 t':^10} {'βₜ':^10} {'后验方差':^14} {'近似 KL':^12}")
print(" " + "─" * 50)
for t in [1, 100, 250, 500, 750, 900, 999]:
print(f" {t:^10} {betas[t]:^10.6f} {posterior_var[t]:^14.6f} "
f"{approx_kl[t]:^12.6f}")
print()
print(" 扩散模型与 VAE 的联系:")
print()
comparison = [
("编码器 q(z|x)", "VAE: 神经网络", "扩散: 固定加噪过程 q(x_t|x_0)"),
("解码器 P(x|z)", "VAE: 神经网络", "扩散: 去噪网络 P(x_{t-1}|x_t)"),
("隐变量维度", "VAE: 低维 z", "扩散: 与 x 等维(x_1,...,x_T)"),
("重建损失", "VAE: MSE/BCE", "扩散: 预测噪声 MSE"),
("KL 正则化", "VAE: q(z|x)||N(0,I)", "扩散: 多步 KL 散度之和"),
("采样", "VAE: 一步解码", "扩散: T 步去噪(DDIM)"),
]
print(f" {'特征':^20} {'VAE':^28} {'扩散模型':^28}")
print(" " + "─" * 80)
for feat, vae, diff in comparison:
print(f" {feat:^20} {vae:^28} {diff:^28}")
diffusion_model_elbo()
四、归一化流:精确似然的生成模型
def normalizing_flows():
print("\n归一化流(Normalizing Flows):精确似然的另一条路")
print()
print(" VAE 和扩散模型:优化 ELBO(下界,近似)")
print(" 归一化流:直接最大化精确对数似然")
print()
print(" 核心思想:")
print(" 用可逆变换 f: z → x(z ~ P_z,x = f(z))")
print(" 变量变换公式:")
print(" log P_x(x) = log P_z(f⁻¹(x)) + log |det(∂f⁻¹/∂x)|")
print()
print(" 关键:雅可比矩阵的行列式必须高效计算")
print(" 这是归一化流设计的核心约束")
print()
# 简单演示:一维仿射流
print(" 一维仿射流演示:z → x = a·z + b")
print()
print(" log P_x(x) = log P_z((x-b)/a) + log|1/a|")
print(" = log N((x-b)/a; 0,1) - log|a|")
print()
np.random.seed(42)
# 目标分布:非中心化高斯 N(3, 4)(均值=3,方差=4)
a_true, b_true = 2.0, 3.0 # x = 2z + 3
# 训练数据
z_samples = np.random.randn(1000)
x_samples = a_true * z_samples + b_true
# 精确对数似然(用学到的 a, b 计算)
def log_likelihood_affine_flow(x_data, a, b):
z = (x_data - b) / a
log_pz = norm.logpdf(z, 0, 1)
log_det = -np.log(abs(a)) # log|J⁻¹| = log(1/|a|)
return np.mean(log_pz + log_det)
# 真实参数的对数似然
ll_true = log_likelihood_affine_flow(x_samples, a_true, b_true)
print(f" 训练数据:x = {a_true}·z + {b_true},n=1000")
print(f" 真实参数 (a={a_true}, b={b_true}) 的对数似然:{ll_true:.4f}")
print()
# 不同参数的对数似然
print(f" {'参数 (a, b)':^20} {'对数似然':^14} {'距离真实':^14}")
print(" " + "─" * 50)
param_tests = [
(2.0, 3.0, "真实参数"),
(2.0, 2.5, "b 偏小"),
(1.5, 3.0, "a 偏小(方差偏小)"),
(3.0, 3.0, "a 偏大(方差偏大)"),
(2.0, 3.5, "b 偏大"),
]
for a, b, desc in param_tests:
ll = log_likelihood_affine_flow(x_samples, a, b)
diff = ll - ll_true
print(f" ({a:.1f}, {b:.1f}) {desc:10s} {ll:^14.4f} {diff:^14.4f}")
print()
print(" 归一化流的常见设计(高维图像):")
flow_types = [
("NICE / RealNVP", "加性/仿射耦合层", "高效,对角 Jacobian"),
("Glow", "1×1 卷积 + 仿射耦合", "OpenAI 的高质量图像生成"),
("MAF/IAF", "自回归流", "灵活但慢(序贯计算)"),
("Flow Matching", "连续流,直线 ODE 轨迹", "FLUX 模型使用(第七篇)"),
("CNF(连续时间流)", "ODE 定义流,Neural ODE", "最灵活,但慢"),
]
for name, method, note in flow_types:
print(f" [{name}]: {method} — {note}")
normalizing_flows()
五、贝叶斯深度学习:神经网络的不确定性
def bayesian_deep_learning():
print("\n贝叶斯深度学习:给神经网络加上不确定性")
print()
print(" 标准神经网络(频率主义视角):")
print(" θ_MLE = argmax P(D|θ)(点估计)")
print(" 预测:ŷ = f_θ(x)(确定性输出)")
print()
print(" 贝叶斯神经网络(BNN):")
print(" 先验:P(θ) = N(0, σ_prior²I)")
print(" 后验:P(θ|D) ∝ P(D|θ)·P(θ)(难以精确计算)")
print(" 预测:P(y|x,D) = ∫ P(y|x,θ)·P(θ|D) dθ(贝叶斯模型平均)")
print()
print(" 贝叶斯神经网络的优势:")
print()
advantages = [
("不确定性量化",
"预测时输出分布而非点值",
"自动驾驶:'我不确定前面是什么'比'随便猜一个'安全"),
("防止过拟合",
"先验 P(θ) 等同于正则化(MAP ≈ L2 正则化)",
"小数据场景下贝叶斯方法天然正则化"),
("主动学习",
"认知不确定性高的地方 = 最值得采集新数据的地方",
"最大化信息增益选择下一个标注样本"),
("异常检测",
"训练分布外的数据会有高认知不确定性",
"OOD(out-of-distribution)检测"),
]
for name, mechanism, example in advantages:
print(f" [{name}]")
print(f" 机制:{mechanism}")
print(f" 例子:{example}")
print()
# 近似贝叶斯方法
print(" 实际 BNN 的近似方法:")
print()
methods = [
("Mean-Field VI", "对角高斯变分后验", "快速,但低估不确定性", "Bayes by Backprop"),
("Laplace 近似", "MAP + Hessian 高斯", "简单,只需 MAP 后额外计算", "Laplace Redux"),
("MC Dropout(下节)", "Dropout 采样", "几乎零成本,广泛使用", "Gal & Ghahramani 2016"),
("深度集成(下节)", "多个独立模型", "简单有效,工程首选", "Lakshminarayanan 2017"),
("SWAG", "SGD 轨迹建模后验", "无额外训练成本", "2019"),
]
print(f" {'方法':^20} {'近似':^20} {'特点':^24} {'代表工作':^20}")
print(" " + "─" * 88)
for method, approx, prop, ref in methods:
print(f" {method:^20} {approx:^20} {prop:^24} {ref:^20}")
bayesian_deep_learning()
六、深度集成与 MC Dropout
def deep_ensemble_and_mc_dropout():
"""两种最实用的神经网络不确定性估计方法"""
print("\n深度集成(Deep Ensemble)与 MC Dropout:")
print()
# ── 深度集成 ────────────────────────────────────────────────
print(" ① 深度集成(最简单、最有效):")
print()
print(" 做法:训练 M 个独立的神经网络(不同随机种子)")
print(" 预测均值:ȳ = (1/M) Σₘ f_{θₘ}(x)")
print(" 预测方差:σ² = (1/M) Σₘ [f_{θₘ}(x) - ȳ]²")
print()
print(" 为什么管用?")
print(" 每个模型从不同随机位置出发,收敛到后验的不同局部区域")
print(" 集成 = 粗糙近似贝叶斯模型平均")
print()
np.random.seed(42)
# 模拟多个模型的预测(在训练区内 vs 外推区)
def simulate_ensemble_predictions(x_test, n_models=5, in_distribution=True):
"""模拟集成模型的预测"""
if in_distribution:
# 训练区内:各模型预测一致,方差小
base = np.sin(x_test)
preds = np.array([base + 0.05 * np.random.randn(len(x_test))
for _ in range(n_models)])
else:
# 外推区:各模型分歧大,方差大
base = np.sin(x_test)
preds = np.array([base + 0.5 * np.random.randn(len(x_test))
for _ in range(n_models)])
return preds
x_in = np.array([0.5, 1.0, 1.5]) # 训练区内
x_out = np.array([5.0, 6.0, 7.0]) # 外推区
preds_in = simulate_ensemble_predictions(x_in, in_distribution=True)
preds_out = simulate_ensemble_predictions(x_out, in_distribution=False)
print(" 数值演示(5 个模型集成):")
print()
print(f" {'测试点 x':^12} {'预测均值':^12} {'预测标准差':^14} {'区域':^12}")
print(" " + "─" * 54)
for x_val, preds, region in [
(x_in, preds_in, "训练区内"),
(x_out, preds_out, "外推区域"),
]:
for i, x in enumerate(x_val):
mean = preds[:, i].mean()
std = preds[:, i].std()
print(f" {x:^12.1f} {mean:^12.4f} {std:^14.4f} {region:^12}")
print()
print(" 外推区域的预测方差更大 → 正确反映了不确定性 ✓")
print()
# ── MC Dropout ─────────────────────────────────────────────
print(" ② MC Dropout(几乎零成本):")
print()
print(" 核心发现(Gal & Ghahramani 2016):")
print(" 推理时保持 Dropout 开启,多次前向传播")
print(" = 近似对深度高斯过程的变分推理!")
print()
print(" 做法:")
print(" 1. 正常训练(带 Dropout)")
print(" 2. 推理时不关闭 Dropout")
print(" 3. 对同一输入前向传播 T 次,得到 T 个预测")
print(" 4. 用这 T 个预测的均值和方差估计不确定性")
print()
def mc_dropout_simulation(x, n_forward=30, p_dropout=0.3):
"""
模拟 MC Dropout(用随机扰动代替实际 Dropout)
"""
# 真实函数
true_output = np.sin(x)
# T 次带 Dropout 的前向传播
predictions = []
for _ in range(n_forward):
# 模拟 Dropout 效果:随机屏蔽部分权重
noise = np.random.choice([0, 1], p=[p_dropout, 1-p_dropout])
pred = true_output * noise + (1 - noise) * 0.0 # 简化
pred += 0.1 * np.random.randn()
predictions.append(pred)
predictions = np.array(predictions)
return predictions.mean(), predictions.std()
print(" MC Dropout 演示(T=30 次前向传播):")
print()
print(f" {'输入 x':^10} {'均值预测':^12} {'预测不确定性 σ':^18} {'真实值':^10}")
print(" " + "─" * 54)
for x_val in [0.5, 1.0, 2.0, 3.14, 5.0]:
mean, std = mc_dropout_simulation(x_val)
true = np.sin(x_val)
print(f" {x_val:^10.2f} {mean:^12.4f} {std:^18.4f} {true:^10.4f}")
print()
print(" 不确定性分解(贝叶斯视角):")
print()
print(" 总不确定性 = 偶然不确定性 + 认知不确定性")
print()
print(" MC Dropout 估计:")
print(" E_T[Var[y|x,θ_t]]:偶然不确定性(每次预测的内部方差)")
print(" Var_T[E[y|x,θ_t]]:认知不确定性(各次预测均值的方差)")
print()
print(" 工程实践建议:")
print(" 小团队/快速迭代 → MC Dropout(改一行代码)")
print(" 追求最佳性能 → 深度集成(5-10 个模型)")
print(" 可解释性需求 → Laplace 近似(明确后验)")
print(" 数学严格性 → 变分 BNN(Bayes by Backprop)")
deep_ensemble_and_mc_dropout()
七、系列收官:完整知识图谱
def series_complete_knowledge_map():
"""打印系列的完整知识图谱"""
print("\n" + "=" * 72)
print(" 概率论在机器学习中:完整知识图谱")
print("=" * 72)
print()
chapters = [
("第一篇", "从频率到贝叶斯", [
"概率的两种含义:频率(客观)vs 贝叶斯(主观信念)",
"贝叶斯公式:P(θ|D) ∝ P(D|θ)·P(θ)(后验∝似然×先验)",
"⚠️ P(θ|X) ≠ P(X|θ):基率谬误的根源",
"序贯更新:新数据到来时直接更新后验参数",
]),
("第二篇", "常用分布与指数族", [
"伯努利→Sigmoid, 类别→Softmax(指数族自然导出)",
"高斯:最大熵,线性变换闭合,条件分布解析",
"Beta-Bernoulli, Dirichlet-Categorical(共轭对)",
"指数族:p(x|η) = h(x)exp(η^T T(x)-A(η)),A'(η)=均值",
]),
("第三篇", "MLE 与 MAP", [
"MLE = 最大化对数似然 = 最小化 KL(p_data||p_θ)",
"MSE ↔ 高斯噪声,MAE ↔ Laplace 噪声(损失函数的概率来源)",
"L2 正则 ↔ 高斯先验,L1 正则 ↔ Laplace 先验(MAP)",
"正则化强度 λ = 噪声方差 / 先验方差",
]),
("第四篇", "贝叶斯推断", [
"完整后验 > MAP:不确定性量化,后验预测,模型比较",
"S_N⁻¹ = αI + βΦ^TΦ(贝叶斯线性回归解析后验)",
"预测方差 = 噪声不确定性 + 参数不确定性",
"边缘似然(Evidence)= 自动奥卡姆剃刀",
]),
("第五篇", "变分推理", [
"ELBO = E_q[log p(D,θ)] - E_q[log q(θ)](下界)",
"最大化 ELBO ⟺ 最小化 KL(q||p)(后验近似)",
"VAE = 变分推理 + 神经网络(重建损失 + KL 正则化)",
"重参数技巧:z = μ + σ·ε 让采样可微分",
]),
("第六篇", "蒙特卡洛方法", [
"MC 积分:误差 O(1/√N),与维度无关!",
"重要性采样:从 q 采样,用权重 p(x)/q(x) 修正",
"MH-MCMC:随机游走 + 接受/拒绝(细致平衡保证精确)",
"HMC:借助梯度大步采样,ESS 远高于 MH",
]),
("第七篇", "图模型与 EM", [
"贝叶斯网络:P(X) = ∏P(Xᵢ|parents)(局部化分布)",
"⭐ 对撞节点:观测后两个独立原因变得相关(伯克森悖论)",
"EM = E 步(计算责任权重)+ M 步(更新参数)",
"GMM 是 EM 最经典应用,单调收敛保证",
]),
("第八篇", "现代应用(收官)", [
"ELBO 贯穿 VAE / 扩散模型 / EM(统一框架)",
"扩散模型训练目标 = ELBO 的特殊简化(MSE 噪声预测)",
"贝叶斯深度学习:MC Dropout / 深度集成量化不确定性",
"认知不确定性(数据不足)vs 偶然不确定性(固有噪声)",
]),
]
for chapter, title, points in chapters:
print(f" ┌─ {chapter}:{title}")
for i, point in enumerate(points):
is_last = i == len(points) - 1
prefix = " └─── " if is_last else " ├─── "
print(f" {prefix}{point}")
print()
print()
print(" 贯穿全系列的三条主线:")
print()
print(" 主线1:似然 × 先验 = 后验(贝叶斯更新)")
print(" P(θ|D) ∝ P(D|θ)·P(θ)")
print(" 第一篇 → 第三篇(MLE/MAP)→ 第四篇(完整后验)→ 第八篇(BNN)")
print()
print(" 主线2:ELBO 是近似推断的核心")
print(" log p(D) ≥ E_q[log p(D,θ)] - KL(q||prior)")
print(" 第五篇(VI)→ 第七篇(EM)→ 第八篇(VAE/扩散)")
print()
print(" 主线3:条件独立性是处理复杂分布的关键")
print(" P(x₁,...,xₙ) = ∏P(xᵢ|parents) → 参数从指数到线性")
print(" 第二篇(指数族)→ 第七篇(图模型)→ 所有 ML 模型")
print()
print("=" * 72)
print(" 感谢你跟随这个系列学习概率论在 ML 中的应用!")
print(" 从第一篇的'概率是什么意思'到最后的扩散模型和 BNN,")
print(" 希望你看到了数学工具的统一性和优雅性。")
print(" 理解了这些,你就能从'调参'走向'理解',")
print(" 从'知道怎么用'走向'知道为什么'。")
print("=" * 72)
series_complete_knowledge_map()
总结:三条主线,一个框架
主线1:贝叶斯更新
P ( θ ∣ D ) ∝ P ( D ∣ θ ) ⏟ 似然 ⋅ P ( θ ) ⏟ 先验 P(\theta|D) \propto \underbrace{P(D|\theta)}_{\text{似然}} \cdot \underbrace{P(\theta)}_{\text{先验}} P(θ∣D)∝似然 P(D∣θ)⋅先验 P(θ)
从第一篇的基础概念,到 MLE/MAP 的正则化解释,到完整贝叶斯推断,到贝叶斯深度学习——贝叶斯定理贯穿始终。
主线2:ELBO 是近似推断的通用语言
log p ( D ) ≥ E q [ log p ( D , θ ) ] ⏟ 期望完整对数似然 − KL ( q ∥ prior ) ⏟ KL 正则化 = ELBO \log p(D) \geq \underbrace{\mathbb{E}_q[\log p(D,\theta)]}_{\text{期望完整对数似然}} - \underbrace{\text{KL}(q \| \text{prior})}_{\text{KL 正则化}} = \text{ELBO} logp(D)≥期望完整对数似然 Eq[logp(D,θ)]−KL 正则化 KL(q∥prior)=ELBO
VAE 的损失函数、扩散模型的训练目标、EM 算法的 Q 函数,本质上都是同一个 ELBO 的不同具体化。
主线3:条件独立性让复杂分布可处理
朴素贝叶斯、HMM、GMM、LDA、扩散模型——所有这些模型的高效训练,都得益于图结构揭示的条件独立性假设,将指数级参数压缩为线性级。
| 工具 | 适用场景 | 核心思想 |
|---|---|---|
| MLE / MAP | 大数据,点估计 | 优化似然(+ 先验正则化) |
| 贝叶斯推断(解析) | 共轭先验,小模型 | 精确后验分布 |
| 变分推理 | 深度模型,大数据 | ELBO 优化,快速近似 |
| MCMC | 精确后验,小数据 | 渐近精确,慢 |
| EM 算法 | 隐变量模型 | 交替更新,单调收敛 |
| 集成 / MC Dropout | 深度学习不确定性 | 近似贝叶斯,工程简单 |
💬 走完这八篇,你觉得哪个概念对你影响最大?是 ELBO 的统一视角,还是条件独立性的力量,或者某个让你豁然开朗的推导? 欢迎评论区分享!
🙏 「概率论在机器学习中」系列(八篇)完结撒花!如果整个系列帮到你,最后一次三连(点赞👍 + 收藏⭐ + 关注)!感谢一路相伴!
本文为原创技术分享。代码在 Python 3.12 + NumPy + SciPy 下验证。最后更新:2026-05-21
概率论在机器学习中系列(八篇)完结 🎉
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)