资讯动态

概率图模型、贝叶斯推断与VAE/GAN:从理论到实践的生成模型统一框架

发布时间:2026/10/17 12:45:30 来源:尧图企业网站定制
1. 从一张手绘草图说起为什么我要把这几个概念串起来讲前阵子有个做算法的朋友找我聊天说他面试时被问到一个问题“你如何用一句话区分判别模型和生成模型”他答得还行但面试官紧接着追问“那VAE和GAN在概率图模型的框架下分别处于什么位置”他当场卡壳了。回来之后他跟我说感觉自己学的东西都是散的——概率图模型是概率图模型贝叶斯是贝叶斯VAE和GAN又像是两个独立的专题彼此之间好像没什么关系。这个感受我太熟悉了。我自己刚开始接触这块内容的时候也是东一榔头西一棒子。学贝叶斯网络的时候觉得挺清晰学VAE的时候推导ELBO推得头大学GAN的时候又觉得对抗训练和概率图好像完全不搭边。直到后来做了一段时间的生成式模型项目才慢慢把这些东西串起来了。今天这篇文章就是想把我自己理解的这条线索完整地分享出来——概率图模型是骨架贝叶斯推断是灵魂VAE和GAN是在这个骨架上长出来的两种截然不同的生成策略。如果你正在学机器学习、深度学习或者做生成式模型相关的项目又或者你只是对“这些模型到底在干什么”感到好奇那这篇文章应该能帮你把这几块知识拼成一张完整的图。我会尽量少用公式堆砌多用类比和直觉来解释但该有的推导关键步骤一个都不会少。毕竟理解一个东西最好的方式就是把它从头到尾讲一遍。2. 概率图模型把概率关系画成一张图2.1 为什么需要“图”来表示概率先从一个最朴素的问题开始假设你有五个随机变量它们之间可能存在各种依赖关系。你要怎么描述它们的联合概率分布最直接的办法是写出完整的联合概率表但五个二值变量就需要2的5次方减1等于31个参数。如果有20个变量呢那就是2的20次方超过一百万。这个参数量在实际中根本没法处理。但现实中的变量往往不是两两都相关的。比如在医疗诊断场景里症状和疾病之间有直接关系但两个不同的症状之间可能只通过疾病间接关联。这种“条件独立性”就是概率图模型的核心洞察用图结构来编码变量之间的条件独立关系从而大幅减少需要估计的参数数量。我习惯用一个类比来解释想象一个公司的组织架构图。CEO和基层员工之间可能隔着好几层但基层员工的具体工作安排并不需要CEO直接过问只需要他的直属上级知道就行。概率图模型里的图结构就是这种“谁直接影响谁”的架构图有了它我们就不需要让每个变量都和其他所有变量直接建立关系。2.2 有向图与无向图两种不同的“关系语言”概率图模型主要分两大类贝叶斯网络有向图和马尔可夫随机场无向图。它们的区别在于边有没有方向。有向边表示因果关系或者生成关系。比如“下雨→地面湿”箭头从“下雨”指向“地面湿”意思是下雨导致了地面湿。在贝叶斯网络中联合概率分布可以分解为每个节点在给定其父节点条件下的概率乘积P(x₁, x₂, ..., xₙ) ∏ P(xᵢ | parents(xᵢ))这个分解公式看起来简单但它是贝叶斯网络最核心的东西。它把一个大问题拆成了若干个小问题每个小问题只涉及一个节点和它的父节点参数量从指数级降到了线性级。无向边则表示变量之间的相关性或约束关系不强调谁导致谁。马尔可夫随机场用势函数来定义联合概率形式是P(x) (1/Z) ∏ φ_c(x_c)其中φ_c是定义在团上的势函数Z是归一化常数。无向图在图像处理、社交网络分析里用得比较多因为很多场景下我们只关心“谁和谁相关”不关心“谁导致谁”。注意有向图和无向图不是随便选的。如果你的问题里有明确的因果方向或者生成过程用贝叶斯网络更自然如果只是描述相关性约束无向图更合适。当然也有混合模型但那是进阶话题了。2.3 条件独立性图模型真正的“杀手锏”图结构之所以能减少参数量根本原因在于它隐含了条件独立性假设。在贝叶斯网络中一个节点在给定其父节点的条件下与其所有非后代节点条件独立。这个性质叫做局部马尔可夫性。举个例子假设有一个简单的贝叶斯网络A→B→C。那么给定B的条件下A和C是条件独立的。也就是说一旦我知道了B的值A的信息对预测C没有任何额外帮助。这个性质在计算后验概率时极其有用因为它允许我们把复杂的推断问题分解成局部计算。在实际做推断的时候条件独立性还决定了我们能不能用高效的算法。比如变量消元法、信念传播算法都是利用图结构来避免重复计算。如果图结构很复杂比如有大量环推断就会变得很困难这时候就需要近似推断方法了。3. 贝叶斯模型从先验到后验的推理引擎3.1 贝叶斯定理一个“更新信念”的公式贝叶斯定理本身很简单P(θ|D) P(D|θ) · P(θ) / P(D)但这个公式背后的思想非常深刻。它说的是我们对某个未知参数θ的信念应该在看到数据D之后进行更新。P(θ)是先验信念P(D|θ)是似然数据在给定参数下的概率P(θ|D)是后验信念P(D)是证据归一化常数。我经常用一个生活中的例子来解释假设你有一个朋友平时很靠谱但偶尔也会迟到。你想估计他“准时到达”的概率。在没有任何观察之前你可能根据以往经验觉得他准时率大概是80%这就是先验。然后你连续观察了他五次四次准时一次迟到这就是数据。贝叶斯定理告诉你如何把先验和这些新数据结合起来得到一个更新后的估计。3.2 共轭先验让计算变得可行的小技巧在实际计算后验分布的时候分母P(D)往往很难算因为它需要对所有可能的θ积分P(D) ∫ P(D|θ) · P(θ) dθ这个积分在高维空间里基本没法解析计算。但有一类特殊情况可以让计算变得非常简单共轭先验。如果先验分布和后验分布属于同一个分布族那么后验分布的形式可以直接写出来不需要计算那个积分。最经典的例子是Beta-二项分布共轭。如果先验是Beta(α, β)似然是二项分布那么后验还是Beta分布参数更新为Beta(α 成功次数, β 失败次数)。这个性质在实际中非常有用因为它把复杂的积分变成了简单的参数加法。实操心得做贝叶斯建模的时候优先考虑共轭先验。虽然现在有MCMC和变分推断可以处理非共轭的情况但共轭先验在计算速度和可解释性上有巨大优势。我做过一个用户行为预测的项目用Beta-二项共轭模型整个后验更新只需要几行代码比跑MCMC快了几百倍。3.3 从贝叶斯模型到贝叶斯网络结构化的先验贝叶斯网络可以看作是贝叶斯模型的结构化扩展。在普通贝叶斯模型里我们通常只有一个或少数几个参数。但在贝叶斯网络中每个节点都有自己的参数而且这些参数之间通过图结构关联起来。在贝叶斯网络的框架下做推断通常有两种任务参数学习和结构学习。参数学习是在图结构已知的情况下估计条件概率表结构学习则是连图结构本身都要从数据中学习。后者难度大得多因为可能的图结构数量随节点数超指数增长。实际项目中图结构往往是领域专家给出的或者基于一些已知的因果假设来设定。比如在故障诊断系统里哪些部件会影响哪些部件工程师心里是有数的。完全从数据学结构的情况也有但通常需要大量数据和很强的先验约束。4. VAE当贝叶斯推断遇上神经网络4.1 VAE到底在解决什么问题变分自编码器VAE的核心问题是给定一批观测数据如何学习一个生成模型使得我们可以从学到的分布中采样出新的、类似的数据用概率图模型的语言来说VAE假设数据x是由一个隐变量z生成的。生成过程是先从先验p(z)中采样一个z然后从条件分布p(x|z)中采样得到x。我们的目标是学习p(x|z)的参数使得模型生成的数据分布尽可能接近真实数据分布。但问题来了要计算p(x) ∫ p(x|z)p(z)dz这个积分在高维空间中不可解。而且给定一个x我们想知道它对应的z是什么即后验p(z|x)这个后验分布也通常没有解析形式。VAE的解决方案非常巧妙用一个神经网络来近似后验分布。这个神经网络叫做编码器它接收x输出一个分布q(z|x)的参数通常是高斯分布的均值和方差。同时用另一个神经网络解码器来参数化p(x|z)。整个模型通过最大化一个叫做ELBO证据下界的目标函数来训练。4.2 ELBO推导一步步拆解ELBO的推导是理解VAE的关键。我们从对数边际似然开始log p(x) log ∫ p(x|z)p(z)dz直接计算这个积分不可行但我们可以引入一个近似后验q(z|x)然后利用Jensen不等式得到下界log p(x) log ∫ q(z|x) · p(x|z)p(z)/q(z|x) dz ≥ ∫ q(z|x) log [p(x|z)p(z)/q(z|x)] dz E_q[log p(x|z)] - KL(q(z|x) || p(z))这个下界就是ELBO。它由两部分组成第一项是重构误差的期望鼓励解码器从z重建出x第二项是KL散度鼓励近似后验q(z|x)接近先验p(z)。注意ELBO是下界不是精确值。最大化ELBO等价于同时最大化边际似然的下界和最小化近似后验与真实后验之间的KL散度。这也是为什么VAE的生成质量通常不如GAN——它优化的是一个下界而不是似然本身。4.3 重参数化技巧让采样变得可导VAE训练中有一个技术难点我们需要从q(z|x)中采样z但采样操作本身是不可导的梯度没法通过采样节点反向传播。重参数化技巧解决了这个问题。假设q(z|x)是高斯分布N(μ, σ²)我们可以把采样写成z μ σ · ε, 其中ε ~ N(0, 1)这样一来随机性被转移到了ε上而μ和σ是确定性的神经网络输出梯度可以正常传播。这个技巧看似简单但它是VAE能够端到端训练的关键。我在实际实现VAE的时候一开始没注意σ的处理。如果直接让网络输出σ可能会出现σ为负数的情况导致训练不稳定。正确的做法是让网络输出log σ²然后取exp得到σ²。这样既保证了方差为正又让数值范围更稳定。4.4 VAE的实操要点与常见坑训练VAE有几个常见的坑。第一个是后验坍塌如果解码器太强它可能忽略隐变量z直接从x的噪声中重建出x。这时候KL散度会趋近于零q(z|x)退化成先验隐变量完全没起作用。解决方法包括KL退火训练初期给KL项一个小的权重逐渐增大、自由比特给KL散度设一个阈值低于阈值不惩罚等。第二个坑是生成样本模糊。VAE生成的图像往往比GAN模糊这是因为ELBO中的重构误差通常用均方误差而均方误差倾向于产生均值化的输出。改用其他重构损失如感知损失可以缓解这个问题。第三个坑是隐变量维度选择。维度太低模型容量不够生成质量差维度太高训练困难容易过拟合。我一般从32维或64维开始试根据数据集复杂度调整。5. GAN用对抗代替推断5.1 GAN的核心思想两个网络的博弈GAN的思路和VAE完全不同。它不试图显式地建模概率分布而是直接学习一个从噪声到数据的映射。GAN由两个网络组成生成器G接收随机噪声z输出假样本G(z)判别器D接收一个样本输出它是真实样本的概率。训练过程是一个极小极大博弈G试图骗过D让D认为G(z)是真实的D试图区分真实样本和生成样本。理想情况下最终G生成的样本分布会与真实数据分布完全重合D的输出处处为0.5完全无法区分。用概率图模型的语言来说GAN没有显式的隐变量后验推断也没有似然函数。它通过对抗训练隐式地最小化生成分布和真实分布之间的某种散度在原版GAN中是Jensen-Shannon散度。5.2 GAN与概率图模型的关系虽然GAN看起来和概率图模型关系不大但我们可以从几个角度把它纳入这个框架。首先GAN的生成器定义了一个隐式分布p_G(x) ∫ p(z) · δ(x - G(z)) dz。这个分布没有解析形式但我们可以从中采样。这和VAE的生成过程在结构上是一样的——都是从先验采样z然后通过一个确定性变换得到x。区别在于VAE的变换是概率性的输出一个分布而GAN的变换是确定性的。其次GAN的训练可以看作是一种对抗式的密度比估计。最优判别器D*(x) p_data(x) / (p_data(x) p_G(x))它实际上估计了真实分布和生成分布之间的密度比。这个密度比在变分推断和重要性采样中也有出现所以GAN和贝叶斯推断之间其实有深层的联系。5.3 GAN的训练难点与实用技巧GAN的训练是出了名的不稳定。我踩过的坑包括模式坍塌生成器只生成少数几种样本、梯度消失判别器太强导致生成器梯度趋近于零、训练震荡两个网络来回拉锯不收敛。几个实用的技巧Wasserstein GAN用Wasserstein距离代替JS散度即使两个分布不重叠也能提供有意义的梯度。谱归一化限制判别器的Lipschitz常数防止判别器过强。TTUR双时间尺度更新规则让判别器学习率高于生成器保持博弈平衡。实操心得训练GAN的时候监控判别器的输出分布比监控损失函数更有用。如果判别器对所有样本的输出都接近0或1说明它太强了需要调整。理想情况下判别器对真实样本和生成样本的输出应该都在0.5附近波动。6. 三者之间的深层联系一张统一的图景6.1 从概率图到生成模型一条逻辑主线现在让我们把这条线索串起来。概率图模型提供了用图结构表示变量依赖关系的框架。贝叶斯推断提供了从先验和数据更新到后验的推理机制。当我们把这两者结合起来处理高维数据时就遇到了计算上的瓶颈——后验不可解、积分不可算。VAE和GAN是两种绕过这个瓶颈的策略。VAE用变分推断加神经网络来近似后验优化ELBOGAN用对抗训练直接学习生成映射绕过了显式的概率建模。两者都可以看作是在概率图模型的框架下针对“推断不可解”这个问题给出的不同工程解决方案。6.2 什么时候用VAE什么时候用GAN这个问题没有标准答案但有一些经验性的判断。如果你需要隐变量的可解释性或者概率密度估计VAE更合适因为它显式地建模了q(z|x)和p(x|z)。如果你追求生成质量尤其是在图像生成任务上GAN通常能产生更清晰、更锐利的样本。实际项目中两者也经常结合使用。比如VAE-GAN混合模型用VAE的编码器提供隐变量用GAN的判别器提供对抗损失兼顾生成质量和隐空间结构。还有一些工作用GAN来做VAE的推断网络或者用VAE来初始化GAN的生成器。6.3 一个容易混淆的点生成模型与判别模型最后澄清一个常见的混淆。生成模型如VAE、GAN、贝叶斯网络建模的是P(x)或P(x, z)它们可以生成新样本。判别模型如逻辑回归、SVM、大多数分类神经网络建模的是P(y|x)它们只做预测不做生成。概率图模型既可以用于生成任务也可以用于判别任务。贝叶斯网络通常是生成模型但条件随机场一种无向图模型就是判别模型。VAE和GAN都是生成模型但它们的判别器GAN中的D本身是一个判别模型。理解这个区分对于选择模型和设计实验非常重要。7. 常见问题与排查技巧实录7.1 VAE训练中loss不下降怎么办先检查重构误差和KL散度的数值范围。如果重构误差远大于KL散度说明模型主要在学重建隐变量可能没起作用。可以尝试增大KL项的权重或者用KL退火。如果KL散度迅速趋近于零那就是后验坍塌需要减小KL权重或者用自由比特方法。另一个常见原因是学习率太大。VAE对学习率比较敏感我一般用1e-3到1e-4之间的值配合Adam优化器。如果loss震荡严重试试减小batch size或者加梯度裁剪。7.2 GAN的判别器太强或太弱怎么调判别器太强的信号是生成器loss持续上升生成样本质量不提升。解决方法包括减小判别器的学习率、增加生成器的更新频率、给判别器加dropout或噪声、用标签平滑把真实样本的标签从1改成0.9。判别器太弱的信号是判别器loss很快趋近于零生成器loss也很低但生成样本明显不真实。这时候需要增强判别器增加判别器的层数或宽度、提高判别器学习率、减少生成器的更新频率。7.3 概率图模型推断太慢怎么优化如果图结构允许优先用精确推断算法变量消元、信念传播。如果图中有大量环精确推断不可行考虑近似推断变分推断速度快但精度有限、MCMC精度高但速度慢、期望传播介于两者之间。在实际工程中我通常会先尝试变分推断因为它的计算复杂度可控而且可以和神经网络结合就像VAE那样。如果变分推断的近似误差太大再考虑MCMC但要做好等待的心理准备。7.4 常见问题速查表问题现象可能原因排查方向解决方法VAE生成样本模糊重构损失为MSE检查损失函数改用感知损失或对抗损失VAE隐变量无作用后验坍塌监控KL散度KL退火、自由比特GAN模式坍塌生成器多样性不足检查生成样本分布加多样性正则、用WGANGAN训练震荡博弈不平衡监控D输出TTUR、谱归一化贝叶斯推断太慢图结构复杂检查图中有无环近似推断、变分推断ELBO难以计算期望不可解检查q的选择重参数化、蒙特卡洛估计8. 我个人的一些体会学这些东西最大的感受是不要试图一次性理解所有细节。我一开始看VAE的推导卡在ELBO那一步很久后来先接受了“它就是一个下界”这个事实把代码跑通了再回头看推导反而豁然开朗。GAN也是先跑通一个最简单的DCGAN看着生成的图像从噪声慢慢变成有意义的形状再去理解背后的博弈论会容易得多。另一个体会是概率图模型和深度学习不是对立的。很多人觉得概率图模型是“传统方法”深度学习是“新方法”其实VAE就是两者的结合。贝叶斯推断提供了理论框架神经网络提供了函数逼近能力两者配合才能处理高维复杂数据。最后分享一个我常用的学习路径先理解概率图模型的基本概念条件独立性、因子分解然后学贝叶斯推断的核心思想先验、似然、后验、共轭接着看VAE的ELBO推导和重参数化技巧最后学GAN的对抗训练和WGAN。这个顺序从理论到实践从简单到复杂每一步都建立在前一步的基础上学起来会比较顺。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑