当前位置: 首页 > ops >正文

【深度学习】配分函数:近似最大似然与替代准则

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。

之前的文章参考下面的链接:
【深度学习】蒙特卡罗方法:原理、应用与未来趋势
【深度学习】深度学习中的结构化概率模型:理论、方法与应用
【深度学习】表示学习:深度学习的数据解构与重构艺术
【深度学习】自编码器:数据压缩与特征学习的神经网络引擎
【深度学习】线性因子模型:数据降维与结构解析的数学透镜
【学习笔记】强化学习:实用方法论
【学习笔记】序列建模:递归神经网络(RNN)
【学习笔记】理解深度学习和机器学习的数学基础:数值计算
【学习笔记】理解深度学习的基础:机器学习
【学习笔记】深度学习网络-深度前馈网络(MLP)
【学习笔记】深度学习网络-正则化方法
【学习笔记】深度学习网络-深度模型中的优化
【学习笔记】卷积网络简介及原理探析

引言

在能量模型的学习过程中,配分函数(Partition Function) 始终是一道难以跨越的障碍。它决定了模型的归一化,却往往因维度过高而无法精确计算。这使得直接应用最大似然估计几乎不可行。为了应对这一挑战,研究者们发展出两条主要路径:一是通过近似方法来模拟最大似然的训练过程,例如对比散度(CD)、持续对比散度(PCD)等基于 MCMC 的技术;二是完全绕开配分函数,转而使用替代准则,如伪似然、得分匹配与噪声对比估计(NCE)。此外,在需要估计配分函数时,人们还引入了退火重要性采样(AIS)等高效的近似方法。本章将系统讨论这些方法,揭示在面对配分函数难题时,深度学习与统计建模领域所采取的多种策略。

第18章: 面对配分函数
│
├── 18.1 问题背景
│     └── 配分函数 Z(θ) 的难点:高维积分/求和 → 训练困难
│
├── 18.2 最大似然与 MCMC 学习
│     └── 正相 vs 负相梯度
│
├── 18.3 对比散度 (CD)
│     └── 从数据初始化短链 Gibbs 采样
│     └── 优点: 高效,广泛使用
│     └── 缺点: 偏差,探索不足
│
├── 18.4 持续对比散度 (PCD/SML)
│     └── 持续运行采样链,不从头重置
│     └── 优点: 更贴近模型分布
│
├── 18.5 快速 PCD (FPCD)
│     └── 引入“快参数”加速混合
│     └── 平衡采样效率和稳定性
│
├── 18.6 替代准则方法
│     ├── 伪似然 (Pseudolikelihood) —— 条件概率乘积
│     ├── 得分匹配 (Score Matching) —— 利用梯度,避开 Z(θ)
│     ├── 比率匹配 (Ratio Matching) —— 二值数据翻转概率比值
│     ├── 去噪得分匹配 (Denoising Score Matching) —— 与去噪自编码器相关
│     └── 噪声对比估计 (NCE) —— 转换为二分类问题,学习归一化常数
│
├── 18.11 配分函数的估计方法
│     ├── 重要性采样 (IS)
│     ├── 退火重要性采样 (AIS) —— 常用
│     ├── 桥采样 (Bridge Sampling)
│     └── 对数线性上下界
│
└── 18.12 总结├── 两大思路:│     1) 近似最大似然 (CD/PCD/FPCD)│     2) 替代训练准则 (NCE/Score Matching)└── 需要估计 Z(θ) 时 → AIS 等方法

18.1 Partition Function 的挑战

在许多概率模型中,我们并不能直接给出一个已经归一化的概率分布,而是定义一个未归一化的概率函数

p~(x;θ)=exp⁡(−E(x;θ))\tilde{p}(x;\theta) = \exp(-E(x;\theta)) p~(x;θ)=exp(E(x;θ))

这里 E(x;θ)E(x;\theta)E(x;θ)是能量函数。
为了得到真正的概率分布,我们需要除以一个归一化常数(即配分函数):

p(x;θ)=p~(x;θ)Z(θ),Z(θ)=∑xp~(x;θ)p(x;\theta) = \frac{\tilde{p}(x;\theta)}{Z(\theta)}, \quad Z(\theta) = \sum_x \tilde{p}(x;\theta) p(x;θ)=Z(θ)p~(x;θ),Z(θ)=xp~(x;θ)

然而,问题在于:

  • Z(θ)Z(\theta)Z(θ) 的计算往往不可行,因为它涉及对所有可能的 xxx 求和(或积分),状态空间往往是指数级别的。
  • 在最大似然训练时,log-likelihood 的梯度包含两部分:
    • 正相(positive phase):容易计算,直接依赖于观测数据。
    • 负相(negative phase):涉及对整个模型分布的期望,必须用到 (Z(\theta)),计算代价极大。

因此,训练这类模型的难点,就是如何处理 partition function。

18.2 使用 MCMC 的原始学习算法

最直接的方法是使用**马尔可夫链蒙特卡洛(MCMC)**来近似负相的期望:

  1. 每次更新参数时,从某个初始化点开始运行一个马尔可夫链。
  2. 等待链收敛(burn-in),直到它接近目标分布。
  3. 从该链中采样,近似负相梯度。

这种方法理论上可行,但在实际中有巨大缺点:

  • 每次参数更新都要重新从头运行一条马尔可夫链,开销非常大。
  • 链收敛可能需要很长时间。
  • 对于高维复杂模型,几乎不可用。

因此,这种**“朴素的 MCMC 学习”**在实际中不常使用,但它为后续改进(如 Contrastive Divergence)奠定了理论基础。

18.3 对比散度(Contrastive Divergence, CD)

Hinton 提出了一种称为 Contrastive Divergence (CD) 的近似方法,用于高效训练像 RBM(受限玻尔兹曼机)这样的能量模型。

核心思想是:

  • 不必等到 MCMC 完全收敛
  • 直接从观测数据点初始化 Gibbs 采样链,只运行少量步骤(通常 1–5 步)。
  • 这样得到的样本近似模型分布,用于估算负相梯度。

优点

  • 相比“原始 MCMC 学习”,大大降低了计算成本。
  • 在实践中效果很好,因此成为训练 RBM 的标准方法。

缺点

  • 因为链没有完全混合,CD 可能无法探索模型分布中的所有模式。
  • 它可能导致模型“忽视”数据之外的一些潜在状态(即虚假峰值),在生成任务中表现不佳。

18.4 持续对比散度(Persistent Contrastive Divergence, PCD / SML)

为了解决 CD 的偏差问题,提出了 Persistent Contrastive Divergence (PCD),又称 Stochastic Maximum Likelihood (SML)

主要改进是:

  • 不再每次都从数据点初始化链,而是保持一批马尔可夫链的状态跨迭代更新。
  • 每次参数更新后,继续从上一次的状态开始采样,而不是重新开始。

这样做的好处:

  • 链能够逐渐接近并跟随真实的模型分布,而不是被数据强行“重置”。
  • 更适合训练复杂的能量模型。

18.5 快速持续对比散度(Fast Persistent Contrastive Divergence, FPCD)

在实践中,即使使用 PCD,马尔可夫链的混合速度依旧可能很慢。为此,提出了 FPCD

  • 将参数分为两类:
    • 慢速参数:正常学习率更新,用于稳定收敛。
    • 快速参数:采用更快的动态,用来加速 MCMC 混合。
  • 在训练过程中,快速参数帮助采样更快遍历空间,而最终模型由慢速参数主导。

这种方法在一定程度上平衡了 高效采样模型稳定性

18.6 伪似然(Pseudolikelihood)

原文要点翻译:

  • 在无向模型中,直接最大化对数似然很难,因为涉及到配分函数。
  • 一种替代方法是最大化 伪似然(pseudolikelihood),它不是对完整联合分布求和,而是最大化每个变量在给定其余变量时的条件概率:

∏ip(xi∣x∖i;θ)\prod_i p(x_i \mid x_{\setminus i}; \theta) ip(xixi;θ)

  • 优点:
    • 不需要计算配分函数,因为条件概率中的分母只涉及有限的状态。
    • 在一些任务(如缺失值推断、标注任务)表现不错。
  • 缺点:
    • 伪似然与真实的对数似然不完全等价。
    • 在某些情况下训练结果会偏离生成模型的真实分布。

18.7 得分匹配(Score Matching)

  • 对于连续型随机变量,可以利用 得分函数(score function) 来规避配分函数:

∇xlog⁡p(x;θ)=∇xlog⁡p~(x;θ)\nabla_x \log p(x;\theta) = \nabla_x \log \tilde{p}(x;\theta) xlogp(x;θ)=xlogp~(x;θ)

  • 因为右边不涉及 Z(θ)Z(\theta)Z(θ),所以可以直接计算。
  • Score Matching 通过最小化模型得分与数据分布得分的差异来进行训练。

优点:

  • 不需要估计配分函数。
  • 对连续数据集效果好。

缺点:

  • 不适用于离散数据。
  • 对深度模型效果有限。

18.8 比率匹配(Ratio Matching)

  • Ratio Matching 是针对二值数据提出的替代方法。
  • 它不是使用 log-likelihood,而是考虑单个比特翻转前后概率的比值:

p(x)p(x~)\frac{p(x)}{p(\tilde{x})} p(x~)p(x)

  • 这样就避免了直接计算配分函数。

优点:

  • 适合二进制输入的模型。
  • 与 CD 类似,计算开销小。

缺点:

  • 推理性能不如基于最大似然的方法。

18.9 去噪得分匹配(Denoising Score Matching)

  • 在数据上添加少量噪声,再训练模型去恢复原始数据分布。
  • 这与**去噪自编码器(Denoising Autoencoder)**的思想密切相关。
  • 实际上,得分匹配和去噪自编码器之间有等价关系。

优点:

  • 避免了计算配分函数。
  • 在连续数据的学习任务中常用,效果良好。

18.10 噪声对比估计(Noise-Contrastive Estimation, NCE)

  • NCE 将生成建模问题转化为一个二分类问题

  • 做法:

    1. 从真实数据分布 pdatap_{data}pdata采样。
    2. 从某个已知的“噪声分布” pnp_npn采样。
    3. 训练一个分类器,判断样本来自数据分布还是噪声分布。
  • 在训练过程中,引入一个额外参数c≈−log⁡Z(θ)c \approx -\log Z(\theta)clogZ(θ),让模型同时学习生成分布和归一化常数。

优点:

  • 避免直接计算 Z(θ)Z(\theta)Z(θ)
  • 在大词汇表建模(如语言模型)中非常有效。

缺点:

  • 仍然依赖噪声分布的选择。
  • 如果噪声分布选得不好,估计会有偏差。

18.11 配分函数的估计方法

即使我们无法在训练中显式计算 Z(θ)Z(\theta)Z(θ),在一些情况下(如模型比较或模型选择),我们仍然需要估计配分函数或其对数。以下方法常用:

18.11.1 重要性采样(Importance Sampling)

  • 核心思想是使用一个易于采样的分布 q(x)q(x)q(x),来近似计算目标分布的配分函数:

Z(θ)=∑xp~(x;θ)q(x)q(x)Z(\theta) = \sum_x \frac{\tilde{p}(x;\theta)}{q(x)} q(x) Z(θ)=xq(x)p~(x;θ)q(x)

  • 通过采样 x∼qx \sim qxq,我们得到一个无偏估计。
  • 问题在于:如果 qqq与目标分布差异过大,方差会极高。

18.11.2 退火重要性采样(Annealed Importance Sampling, AIS)

  • AIS 结合了 退火(从简单分布逐步过渡到复杂分布)与 重要性采样
  • 做法是构造一系列中间分布:

pk(x)∝p~(x)βkq(x)1−βk,0=β0<β1<...<βK=1p_k(x) \propto \tilde{p}(x)^{\beta_k} q(x)^{1-\beta_k}, \quad 0=\beta_0 < \beta_1 < ... < \beta_K=1 pk(x)p~(x)βkq(x)1βk,0=β0<β1<...<βK=1

  • 通过逐渐“加热/冷却”参数,使采样过程更稳定。
  • 这是目前估计配分函数最常用的方法之一。

18.11.3 桥采样(Bridge Sampling)与对数线性估计

  • 桥采样在两个分布之间建立桥梁,减少方差。
  • 对数线性方法利用 Jensen 不等式,得到配分函数的上下界。
  • 这些方法适用于在两个模型间比较对数似然时。

18.12 总结

  • 在能量模型中,配分函数是训练的最大难点
  • 我们有两大类解决思路:
    1. 近似最大似然:通过 MCMC(如 CD、PCD、FPCD)近似负相梯度。
    2. 替代准则:完全绕开配分函数(如伪似然、得分匹配、NCE)。
  • 在需要估计Z(θ)Z(\theta)Z(θ) 时,常用 AIS 等采样方法。

整体而言,配分函数为能量模型训练提供了一整套策略,核心思想就是:要么近似计算负相,要么找到能绕过配分函数的训练目标

http://www.xdnf.cn/news/19290.html

相关文章:

  • python复杂代码如何让ide自动推导提示内容
  • 编写Linux下usb设备驱动方法:disconnect函数中要完成的任务
  • More Effective C++ 条款20:协助完成返回值优化(Facilitate the Return Value Optimization)
  • 每日算法题【栈和队列】:栈和队列的实现、有效的括号、设计循环队列
  • [软考中级]嵌入式系统设计师—考核内容分析
  • Redis持久化之AOF(Append Only File)
  • Java基础知识(十二)
  • 8.31【Q】CXL-DMSim:
  • vue3+vite+ts 发布npm 组件包
  • Deep Think with Confidence:llm如何进行高效率COT推理优化
  • 第24章学习笔记|用正则表达式解析文本文件(PowerShell 实战)
  • zkML-JOLT——更快的ZK隐私机器学习:Sumcheck +Lookup
  • Pytest 插件介绍和开发
  • leetcode 260 只出现一次的数字III
  • COLA:大型语言模型高效微调的革命性框架
  • 免费电脑文件夹加密软件
  • 基于Adaboost集成学习与SHAP可解释性分析的分类预测
  • 【K8s】整体认识K8s之存储--volume
  • 在win服务器部署vue+springboot + Maven前端后端流程详解,含ip端口讲解
  • Transformer架构三大核心:位置编码(PE)、前馈网络(FFN)和多头注意力(MHA)。
  • 学习Python中Selenium模块的基本用法(12:操作Cookie)
  • TFS-2005《A Possibilistic Fuzzy c-Means Clustering Algorithm》
  • 使用 Python 自动化检查矢量面数据的拓扑错误(含导出/删除选项)
  • 算法题(196):最大异或对
  • 特殊符号在Html中的代码及常用标签格式的记录
  • Qt组件布局的经验
  • 线程池、锁策略
  • 机器视觉opencv教程(四):图像颜色识别与颜色替换
  • Linux中的ss命令
  • kotlin - 2个Activity实现平行视图,使用SplitPairFilter