对比散度(Contrastive Divergence, CD)算法的原理与受限玻尔兹曼机(RBM)的训练过程
字数 3063 2025-12-13 07:55:31
对比散度(Contrastive Divergence, CD)算法的原理与受限玻尔兹曼机(RBM)的训练过程
对比散度算法是训练受限玻尔兹曼机的一种高效近似方法。我会为你详细讲解RBM的基本结构、训练的核心难题,以及CD算法如何巧妙地解决了这个难题。
1. 问题背景:什么是受限玻尔兹曼机?
RBM是一种两层的、生成式的随机神经网络模型,也是很多深度概率模型的基础构件。
- 结构:它包含一个可见层(Visible Layer, 记作 v)和一个隐藏层(Hidden Layer, 记作 h)。层内的节点之间没有连接,但可见层和隐藏层的节点之间是全连接的(“受限”就是指层内无连接)。
- 状态:每个节点的状态通常是二进制的(0或1),也可以是其他分布(如高斯分布)。这里我们以二进制为例。
- 能量函数:RBM是一个基于能量的模型。对于一个给定的可见向量v和隐藏向量h,其能量定义为:
E(v, h) = -b^T v - c^T h - h^T W v
其中,W 是可见层和隐藏层之间的连接权重矩阵,b 是可见层的偏置向量,c 是隐藏层的偏置向量。能量越低,该状态组合的概率越高。 - 联合概率分布:基于能量函数,(v, h)的联合概率分布为玻尔兹曼分布:
P(v, h) = (1/Z) * exp(-E(v, h))
其中,Z = Σ_{v,h} exp(-E(v, h))是归一化常数(或配分函数),对全部可能状态求和,计算极其困难。
2. 核心难题:RBM的参数学习目标是什么?如何求解?
我们的目标是学习模型参数 θ = {W, b, c},使得模型定义的分布 P_θ(v) 尽可能接近真实数据的分布 P_data(v)。
- 目标函数:通常采用对数极大似然估计。对于单个训练样本 v,其对数似然关于参数 θ 的梯度为:
∂log P(v) / ∂θ = E_{P(h|v)}[ -∂E(v, h)/∂θ ] - E_{P(v, h)}[ -∂E(v, h)/∂θ ] - 梯度分解:
- 正相(Positive Phase):
E_{P(h|v)}[ -∂E(v, h)/∂θ ]。这表示在给定真实数据v的条件下,关于后验分布P(h|v)的期望。由于RBM的层内无连接,给定可见层时,隐藏层节点是条件独立的(反之亦然),这个条件概率P(h|v)可以高效、精确地计算。正相的作用是降低当前训练样本对应的能量。 - 负相(Negative Phase):
E_{P(v, h)}[ -∂E(v, h)/∂θ ]。这表示关于模型定义的联合分布P(v, h)的期望。计算这个期望需要对所有可能的(v, h)状态组合进行求和,这在高维空间中是计算上不可行的(O(2^{|v|+|h|}))。负相的作用是提高模型自身生成的样本对应的能量,作为一个正则化项。
- 正相(Positive Phase):
3. 对比散度的解决方案:用巧妙采样替代精确计算
由于精确计算负相的期望不可行,对比散度算法提出用一个从训练数据开始的、运行k步的马尔可夫链蒙特卡洛(MCMC)采样来近似这个期望。
- 基本思想:与其从随机状态开始运行一个漫长的MCMC链直到收敛到平稳分布(
P(v, h)),不如从一个训练样本v^0开始,只运行很少的几步(通常是k=1步),得到的样本v^k就可以作为模型分布的一个近似样本。这个近似是有效的,因为模型参数初始化时接近数据分布,从数据点开始的短链已经能提供有意义的梯度方向。
4. CD-k算法详细步骤(以CD-1为例)
假设我们有一个训练样本 v^0。
-
步骤1:正相采样(计算正相统计量)
- 给定可见层 v^0,计算每个隐藏单元j被激活的概率:
p(h_j^1 = 1 | v^0) = σ(c_j + Σ_i W_ij * v_i^0),其中σ是sigmoid函数。 - 基于这个概率分布,采样得到一个隐藏层的二值状态向量 h^1。这一步对应计算正相期望中的
P(h|v^0)。 - 然后,我们可以计算正相统计量。例如,对于权重W,梯度中的正相部分正比于
v^0 * (h^1)^T的期望(这里h^1是从条件分布中采样的结果)。
- 给定可见层 v^0,计算每个隐藏单元j被激活的概率:
-
步骤2:负相重建(执行一步吉布斯采样)
- 给定刚刚采样得到的隐藏层 h^1,重建可见层。计算每个可见单元i被激活的概率:
p(v_i^2 = 1 | h^1) = σ(b_i + Σ_j W_ij * h_j^1)。 - 基于这个概率,采样得到一个重建的可见层状态向量 v^2。
- 然后,给定这个重建的可见层 v^2,再次计算隐藏层的概率:
p(h_j^2 = 1 | v^2) = σ(c_j + Σ_i W_ij * v_i^2)。 - 注意:在CD-1中,我们通常不采样 h^2,而是直接使用它的概率值(这被称为“持续对比散度”,PCD,的一种简化,有时也称为“均值场”近似)。但在经典CD-1描述中,我们可以采样得到 h^2,或者更简单地,负相的期望计算用
v^2和p(h^2|v^2)。
- 给定刚刚采样得到的隐藏层 h^1,重建可见层。计算每个可见单元i被激活的概率:
-
步骤3:计算参数梯度更新
- 现在,我们有了数据点 (v^0, h^1) 和模型一步重构的样本 (v^2, h^2)。
- 参数梯度的近似更新规则为(对于小批量数据,取平均):
- 权重 W 的更新:
ΔW ∝ (v^0)^T * p(h^1=1|v^0) - (v^2)^T * p(h^2=1|v^2) - 可见层偏置 b 的更新:
Δb ∝ v^0 - v^2 - 隐藏层偏置 c 的更新:
Δc ∝ p(h^1=1|v^0) - p(h^2=1|v^2)
- 权重 W 的更新:
- 直观理解:更新规则是“数据相关性”减去“模型重构相关性”。算法试图降低真实数据(v^0)对应的能量(第一项),同时提高模型重构数据(v^2)对应的能量(第二项)。当模型学得很好时,v^2 会非常接近 v^0,这两项会相互抵消,梯度趋于零。
-
步骤4:迭代更新
- 使用计算出的梯度,通过随机梯度下降或其变体(如动量法)来更新参数 W, b, c。
- 对训练集中的所有(或小批量)样本重复上述过程。
5. 算法总结与深入理解
- CD-k:上述过程是k=1的情况。CD-k就是从数据点 v^0 开始,执行k步完整的“可见层→隐藏层→可见层”吉布斯采样,得到 v^k,然后用
(v^0, h^1)和(v^k, h^{k+1})来计算梯度。实践表明,即使k=1,对于很多任务也能得到很好的结果。 - 为什么有效:对比散度之所以有效,是因为它本质上是最小化数据分布和模型在经过k步吉布斯采样后的分布之间的KL散度(即
KL(P_data || P_model) - KL(P_model^k || P_model)),而不仅仅是模型分布。虽然这不精确等于极大似然梯度,但在实践中是极大似然梯度的一个很好、很快的近似。 - 优势:相比需要运行漫长MCMC链直到收敛的方法,CD算法(特别是CD-1)计算量小,速度快,使得训练RBM变得可行,从而推动了深度信念网络等早期深度学习模型的成功。
总结来说,对比散度算法通过一种“短链采样”的巧妙思想,用计算上可行的近似,替代了RBM训练中难以计算的负相期望,是连接RBM理论和实际应用的关键桥梁。