【概率论在机器学习中·第八篇·收官】现代应用: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 出现在三个地方:统一视角

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(qprior)=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
概率论在机器学习中系列(八篇)完结 🎉

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐