ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

玻尔兹曼机入门:能量函数与生成式模型的桥梁

玻尔兹曼机入门:能量函数与生成式模型的桥梁 这篇笔记拖了很久才动笔。说实话玻尔兹曼机Boltzmann Machine这名字听起来就劝退——又是统计力学又是能量函数再加上一个让人头皮发麻的配分函数partition function很多搞机器学习的朋友一上来就被吓住了。我当年也是学完反向传播、卷积网络之后觉得自己已经懂深度学习结果翻开玻尔兹曼机的资料第一页的吉布斯分布直接把我干沉默了。后来硬着头皮啃下来才发现玻尔兹曼机在机器学习里的位置非常特别它是连接统计物理与神经网络之间的桥也是理解深度生成模型、受限玻尔兹曼机RBM、深度信念网络DBN的一把钥匙。这篇笔记作为该系列的第一篇聚焦最基础的问题玻尔兹曼机为了解决什么问题而来它的网络结构和能量函数长什么样它跟我们用惯了的反向传播网络在范式上有哪些本质区别以及为什么后来大家几乎不用原始玻尔兹曼机而必须改成受限结构。适合谁看呢两类人。一类是刚学完机器学习基础、正处在“判别式模型天下第一”阶段的学生需要掰开认知、理解生成式模型的另一种逻辑另一类是以前零散听过RBM、DBN想回头把底层原理弄扎实的工程师。这篇不涉及复杂数学推导和代码实现但会把能量、状态、采样、配分函数这些核心概念讲透数学只保留最必要的部分。1. 从两个问题开场深度学习先驱为什么盯上一个物理模型1.1 判别式模型已经很好用玻尔兹曼机到底解决了什么先不急着看公式。我们回顾一个很朴素的问题给机器看一堆猫的图片目标是让它学会认识猫。主流的做法是什么标注几千张“这是猫”“这不是猫”然后用卷积网络去拟合一个条件概率 P(标签 | 图片)网络输出一个概率值比如 0.98意思是“有98%的把握判断这张图是猫”。这个思路就是判别式模型它直接建模决策边界输入 x输出 y。深度学习这几年在图像分类、语音识别上取得的突破基本都是判别式模型的胜利。但判别式模型有一个天然短板它只学会了“区分”并没有真正学会“猫长什么样”。你不给标签只扔给它一万张没有标注的猫图让它在没有任何外部信号的情况下自己总结出“猫有耳朵、有胡须、身体有毛、通常四条腿”这些规律——普通的前馈网络做不到。玻尔兹曼机就是冲着这个问题去的。它的思路跟“判别”完全相反不直接建模 P(标签 | 图片)而是建模 P(图片) 本身即训练数据的概率分布。玻尔兹曼机假设我们观察到的数据比如猫的图片像素并不是随机散乱的而是从一个未知的概率分布中采样得到的如果能学到一个网络让它自己生成的样本分布尽量贴近真实数据分布那么这个网络就“内化”了数据的结构。这个思路在机器学习里叫生成式模型也是后来GAN、VAE大红大紫之前深度学习领域最核心的生成式建模路线之一。所以玻尔兹曼机回答的问题不是“这张图是猫还是狗”而是“什么样的像素组合更像一张真实的猫图”。这两种问题在数学上可以相互转化但学习路径完全不同。理解了这个出发点后面所有内容都不会跑偏。1.2 从一个经典八卦说起谷歌的“猫脸识别”与无监督预训练关于玻尔兹曼机的价值有一个流传很广的故事。2012年前后谷歌的谷歌大脑Google Brain团队用大规模分布式训练在没有标签的情况下让模型自主学会了识别“猫”的概念——一个神经元对猫的脸部图像产生强烈反应。当时很多人惊讶于“机器居然自己学会了什么是猫”而背后真正起作用的技术正是基于受限玻尔兹曼机搭建的深度信念网络做的无监督预训练。虽然从今天的角度看那套方案已经显得笨重但在当时它证明了不依赖人工标签、不依赖反向传播机器也完全可以从数据分布中提取出有意义的特征。这个故事对理解玻尔兹曼机很重要。它说明玻尔兹曼机不是实验室里没人用的古董而是深度学习寒冬之后重新点燃神经网络希望的关键火种之一。Hinton等人正是靠着对玻尔兹曼机家族的研究在多层网络训练普遍困难的时代找到了逐层无监督预训练这条曲线救国的路径。后面我们熟悉的深度信念网络就是把一层层训练好的受限玻尔兹曼机堆叠起来再用BP做微调。可以说没有玻尔兹曼机打底深度学习可能还要再晚若干年才迎来爆发。当然今天我们不会再用玻尔兹曼机做图像识别了算力、算法都远超当年。但它的思想遗产留在了很多当代模型里energy-based model基于能量的模型在生成式AI、对比学习里依然活跃RBM的思路也直接启发了后续一堆深度学习架构。理解它等于打通了从Hopfield网络到现代生成模型的整条脉络。2. 能量函数与玻尔兹曼分布先把物理直觉讲透玻尔兹曼机最特别的地方就是它把“系统的稳定程度”跟“状态出现的概率”绑定在一起。这一小节是整篇笔记的地基后面所有内容都从这里长出来。2.1 能量函数给网络的每一种状态打分玻尔兹曼机里的每个神经元都是一个二值单元取值只有 0 或 1有的资料写作 1/-1本质等价只是参数含义差一个倍数。把所有神经元的取值拼在一起就得到一个状态向量 x比如 (0,1,0,1,1,...)。N 个神经元一共有 2^N 种可能状态玻尔兹曼机给每个状态都算出一个数叫能量 E(x)。这就是一个“打分函数”能量低的状态好能量高的状态差。这么一想整个模型立刻就形象了网络的所有可能状态分布在一张“能量地形图”上有的地方是山谷低能量有的地方是山脊高能量。训练玻尔兹曼机的过程本质上是调整地形图的形状让真实数据对应的状态落在低能量的谷底让那些“看起来不像数据”的状态被推到高能量的山顶。这里我建议初学者做一个直观类比把每个状态想象成玻璃珠在凹凸不平的桌面上的位置能量就是“高度”。珠子天然倾向于滚到低洼处所以低能量状态出现的概率大。如果桌面被磨得很光滑没有起伏珠子到处都是分布就是均匀的——那是没有学到任何结构的玻尔兹曼机如果桌面被凿出几个又深又窄的坑珠子大概率停在坑里网络就形成了几簇“吸引子”状态会倾向于聚集在少数几个能量极低处。2.2 从吉布斯分布到玻尔兹曼分布温度 T 的角色在统计物理中一个系统处于某个状态的概率服从吉布斯分布也叫玻尔兹曼分布p(x) (1/Z) * exp(-E(x) / T)其中 Z 叫配分函数等号右边分母上的那一项Z Σ_x exp(-E(x)/T)对所有可能状态求和。T 是温度。在玻尔兹曼机里T 通常取一个固定值默认1直接并入能量函数里但在理解时需要保留 T 这个量因为它提供了非常关键的直觉。温度 T 决定分布的“锐利程度”。T 很大时exp(-E/T) 对所有状态几乎一视同仁系统趋于混乱状态完全随机T 减小时能量差异被放大低能状态的优势越来越明显当 T 趋近于0时系统几乎只停留在能量最低的状态。这就是模拟退火simulated annealing的基本思想训练早期温度高让网络敢于探索各种状态训练后期温度下降让网络逐渐收敛到低能区域。如果顺着能量地形去理解高温相当于把玻璃珠放在剧烈震动的桌面上它到处乱跳哪里都待不久降温后桌面震动减弱珠子慢慢在山谷里稳定下来。这个过程在玻尔兹曼机的采样和训练中扮演重要角色。2.3 配分函数 Z看着简单其实就是难很多人在玻尔兹曼机这里第一次感受到“统计物理的恶意”几乎都来自配分函数 Z。它的定义一句话就能说完——对所有可能状态求和——但是真的动手算就会发现它是指数爆炸30个神经元就有 2^30 种状态超过10亿项50个神经元直接逼近千万亿量级。真实应用里玻尔兹曼机动辄几百上千个单元Z 根本没法精确计算只能近似估算。Z 难算不是一个技术细节而是一个深刻的方法论问题。因为概率分母算不出来玻尔兹曼机里的几乎所有量——梯度、期望、归一化概率——都变成不可精确计算的。这种“归一化常数难求”的问题后来成了基于能量模型EBM的核心挑战之一几乎所有相关算法的设计本质上都是在跟 Z 搏斗怎么绕开它、近似它、或者干脆隐式处理它。我个人的建议是第一次学玻尔兹曼机不要试图把配分函数算出来接受“它很难算”这个事实就行。真正重要的是理解它在概率公式中的位置它保证所有状态概率加起来等于1。那篇让你头疼的数学推导问题基本都出在“要对 Z 求导”这一步第五章会稍微展开讲。2.4 一个关键直觉低能量不等于一定出现再看一遍分布公式有个点很容易被忽略能量低的状态概率高但概率高不等于必然出现甚至不一定是出现次数最多的那个状态本身——因为状态的数量会抵消一部分能量的优势。举个例子。假设网络有100个神经元状态A能量很低是唯一的深谷但状态B那一大片区域能量略高却有成千上万种不同构型。单独看每个B状态的概率都不如A可是B的总数量太大如果你做随机采样最终落在“B大区”的次数加起来可能远超落在A的次数。这给玻尔兹曼机带来一个跟直觉相反的性质它并不是一股脑地把所有概率质量都塞进最低能量状态而是在“能量高低”和“状态数量”之间做权衡。这个性质在训练中非常重要。它意味着玻尔兹曼机学到的不是一个“标准答案”而是一个分布。训练数据的多样性就体现在相似的猫图片落在同一个低能区域的不同位置上区域越宽网络生成的猫的样貌越丰富。如果网络把所有概率都集中到一个极小区域里生成结果反而会显得单调、模式崩塌——这个问题在GAN的研究里大家最熟悉但玻尔兹曼机几十年前就已经在概念层面面对过它了。3. 玻尔兹曼机的网络结构可见单元、隐藏单元与对称连接3.1 可见单元和隐藏单元的分工玻尔兹曼机的网络结构从任务上看天然分为两类单元可见单元visible units和隐藏单元hidden units。可见单元对应输入数据是要被“解释”的对象——如果是图像可见单元就是像素如果是二值化的用户评分可见单元就是每个用户的打分项。隐藏单元不直接对应外部数据它们是网络的内部变量负责捕捉数据背后的隐藏相关性和抽象特征。为什么要隐藏单元因为真实数据往往不是直接“看着”就懂的结构。以猫的图片为例像素之间的相关性很弱、很局部相邻像素可能有关系但相隔很远的像素几乎独立。真正的结构存在于抽象层耳朵的位置、毛发的纹理、眼睛的形状。这些概念在像素层面看不见、摸不着需要模型自己发明一些隐变量去解释数据。概率模型的角度看可见单元上的分布是隐藏单元分布积分求和后的边际分布P(v) Σ_h P(v, h)。可见分布的复杂结构恰恰是通过隐藏单元之间的交互“折叠”出来的。没有隐藏单元的玻尔兹曼机只能表达非常简单的可因子化概率分布有了隐藏层表达能力才真正打开。3.2 为什么连接必须对称为什么不能有自环玻尔兹曼机网络里的神经元之间用权重连接这里有一个关键约束连接必须是对称的。也就是说如果单元 i 到单元 j 的权重是 w_ij那么 j 到 i 的权重必须等于 w_ij。同时单元不能有自连接自身连到自身的环。这个约束看起来只是简化处理实际上它决定了整个模型的核心性质——它保证能量函数是一个良定义的二次函数从而保证系统存在一个稳定的平衡分布稳态分布也就是前面说的玻尔兹曼分布。如果不加对称约束权重矩阵就不具有“势函数”性质系统可能在循环中震荡根本没有一个稳定的概率分布可以用来学习和采样整个模型在数学上就崩了。这个思路是从霍普菲尔德网络Hopfield Network继承过来的。霍普菲尔德网络用对称连接让系统能量单调下降最终收敛到一个稳定的吸引子功能相当于联想记忆。玻尔兹曼机在霍普菲尔德网络的能量基座上引入了随机性让系统不再只是收敛到低能点而是按照玻尔兹曼分布在整个状态空间里采样。本质上是把“确定性能量模型中添加随机探索能力”对称性这个基因表面上没变但行为完全不同了。另外补充一点玻尔兹曼机是全连接的意思是任意两个单元之间都可能有权重包括可见单元之间的连接、隐藏单元之间的连接、以及可见单元和隐藏单元之间的连接。这个“全连接”是它后来跟受限玻尔兹曼机的最大区别也是它训练困难的主要来源。第六章会重点展开。3.3 能量表达式的每一项都是什么意思玻尔兹曼机的能量函数通常写成E(x) -Σ_i b_i x_i - Σ_{ij} w_ij x_i x_j这里的 x 包含所有单元可见和隐藏b_i 是单元 i 的偏置biasw_ij 是单元 i 和 j 之间的对称权重。展开看每一项的含义。第一项 -Σ b_i x_i如果偏置 b_i 是正的单元取 1 时这一项贡献 -b_i能量降低所以正的偏置相当于“鼓励”这个单元倾向于开启偏置为负则相反相当于惩罚单元开启。这一项可以理解成每个单元的内在倾向。第二项 -Σ w_ij x_i x_j只有两个单元同时为 1 时才有贡献。如果权重 w_ij 是正的两个单元同时开启时能量下降说明它们之间是“互相鼓励”的关系同时激活的概率高如果权重是负的说明它俩互相抑制同时开启不划算更倾向于一个开启、另一个关闭。这一项描述的就是单元之间的二元交互。所以玻尔兹曼机的能量函数刻画的是“单个单元的倾向 两两单元的协同关系”。这里注意玻尔兹曼机只建模了二阶交互没有更高阶的项。这个限制保证了能量的简洁性也为推导带来了便利。你可能会问高于二阶的相互作用不够用怎么办实际上隐藏单元的引入可以在一定程度上弥补这个限制通过隐变量模型间接表达出更复杂的相关性结构——就像线性模型看似简单配上核技巧和能力足够强的特征变换也能表达非线性关系一样玻尔兹曼机用二阶交互加隐变量完成这种“升维”。3.4 一个三神经元的小例子拿三个神经元 A、B、C 来感受一下。假设它们之间没有正负号上的花活两两权重分别是 w_AB 2w_AC -1w_BC 1偏置全为0。我们看几个状态的能量状态 (A1, B1, C0)此时 AB 项贡献 -2AC 项为0BC 项为0E -2。状态 (A1, B0, C1)AB 为0AC 项贡献 -(-1)-1*(-1)? 注意前面有负号E -(-1) 1要仔细算-Σ w_ij x_i x_jAC 权重 -1x_A1, x_C1所以 -(-111) 1能量是1。正的能量说明这个组合不受欢迎。状态 (A1, B1, C1)AB 贡献 -2AC 贡献 -(-1)1BC 贡献 -1总能量 E -2。AB同时开启的收益抵消了AC互相抑制的损失而且B、C之间的正向连接又添了收益所以这个状态的能量也很低。这个小例子能直观看出正的权重在“拉拢”两个单元一起激活负的权重在“拆散”它们。整个网络的状态分布就是所有这种拉拢和拆散的力量博弈平衡之后的结果。注意这只是任意设定的权重还没经过学习。训练的过程本质上是根据数据调整这些 w 和 b使得那些“数据中频繁出现的状态”能量低“不常出现的状态”能量高。4. 学习的核心任务最大似然、正相与负相玻尔兹曼机的训练目标一句话概括调整网络的权重和偏置使模型定义的分布尽量贴近训练数据。4.1 目标函数最大化可见单元的对数似然形式化一点。假设我们有 M 个训练样本 v^(1), ..., v^(M)都是从真实数据分布 p_data 里采样出来的。我们希望玻尔兹曼机定义的边际分布 p(v) 尽可能大化这些样本出现的概率。这就得到最大似然估计θ* argmax_θ Σ log p(v^(m))把 p(v) (1/Z) Σ_h exp(-E(v,h)) 代入对参数 θ 求导。这里 θ 可以是权重 w_ij 或偏置 b_i。推导后可以得到这里简化写出不展开完整过程∂log p(v) / ∂θ - E_{p(h|v)}[∂E(v,h)/∂θ] E_{p(v,h)}[∂E(v,h)/∂θ]这个公式是玻尔兹曼机训练的核心。等号右边有两项第一项是在条件分布 p(h|v) 下对能量导数的期望叫正相positive phase第二项是在联合分布 p(v,h) 下对能量导数的期望叫负相negative phase。训练时让正相和负相的差不为0就用这个差值去更新参数两者相等时梯度为0模型达到均衡。两个相位的名字跟很多人直觉相反正相的“正”不代表朝着增大的方向。具体来说正相拿着真实数据样本计算“要让这些样本更可能参数该往哪个方向走”——它降低数据状态对应的能量负相拿着模型自己生成的样本计算“模型现在的行为是什么样”——它负责抬升模型自身当前会生成的“幻觉状态”的能量避免模型一味把概率堆在某些错误状态上。训练的过程就是反复做“拉扯”数据状态往下拽模型状态往上推最终在一个平衡点停下来。4.2 配分函数 Z 在这一步终于暴露了真面目为什么负相那么难算因为第二项 E_{p(v,h)} 是对模型自己的分布求期望。模型分布是由能量関数和配分函数 Z 共同定义的而对 Z 求导之后自然就会出现“按照模型分布采样”的需求。也就是说要算负相你必须能从当前模型定义的分布中采样出来——而采样又要面对指数级的状态空间和算不出来的 Z。这就是玻尔兹曼机“训练困难”的数学根源不是正相难因为数据给定后条件分布相对好算真正难的是负相它是“模型眼中的世界”而模型自己也是一种复杂分布没有捷径可走。这里有个非常核心的启发值得反复琢磨训练一个概率模型本质上是在不断比较“真实数据的长相”和“模型自己生成的数据的长相”然后修正差异。判别式模型用标注数据提供学习信号而玻尔兹曼机用“数据分布”和“模型分布”的差异提供学习信号。模型越训练越像真实数据负相样本也越像真实数据学习的压力越来越小直至收敛。这个过程在今天所有生成模型里几乎都能看到影子——GAN的判别器与生成器对抗本质上也在做类似的事情——只是表层的数学工具完全变了。4.3 学习率的朴素直观理解为什么负相更新幅度大了模型容易崩理解了正相负相之后关于训练参数调整的一个经验之谈是负相更新幅度不宜过大。原因是负相用的样本是模型当前自己采出来的采样质量本身受上一轮参数影响噪声非常大。如果学习率设得太大梯度里来自噪声的部分被过分放大模型会被扯来扯去甚至在几个“幻觉状态”之间来回跳最后连基本的数据模式都被毁掉。我在自己跑小规模实验时深有体会用对比散度CD训练RBM学习率从0.1提到0.5看起来只差几倍模型直接从一个能生成近似MNIST数字的状态退化成一团乱码。训练玻尔兹曼机家族学习率要小得多并且要配合动量、权重衰减这些常规武器但这些话题留到后续讲RBM的实战笔记里再说。4.4 朴素玻尔兹曼机为什么几乎不能被真正训练起来回到前文提到的全连接结构这种“所有单元两两相连”的设计给负相采样工作带来了第二个麻烦状态空间太大、采样太慢。每更新一次参数都要跑一遍马尔可夫链采样而全连接结构下每个单元的采样都依赖所有其他单元的状态计算量巨大。同时全连接导致的条件分布 p(h|v) 里隐藏单元之间是相互依赖的没法分解成独立因子乘积也就没法并行采样和计算只能串行地一个个更新神经元状态。这意味着训练一个稍微大一点的玻尔兹曼机哪怕只是几十个神经元也要跑很久很久才能有像样的结果而且收敛质量还不稳定。所以纯粹意义上的玻尔兹曼机实际应用场景非常稀缺。一个朴素的全连接玻尔兹曼机训练代价高、收敛慢、容易陷入糟糕的局部模式基本不具备工程可用性。这也是它后来被受限玻尔兹曼机取代的直接原因——用限制结构换计算可行性这笔交易在实践里太划算了。5. 玻尔兹曼机与反向传播网络对比两种范式两个世界很多初学者搞不清楚玻尔兹曼机和普通神经网络到底差在哪儿总觉得都是“神经元权重激活”。这一节把两套系统的分歧点放到桌面上逐条说清楚。理解了这些差异你才真正理解为什么玻尔兹曼机不只是一个换皮的全连接网络。5.1 平行的坐标系判别式 vs 生成式前面第1节已经说过两者最根本的分歧是任务类型反向传播网络做判别玻尔兹曼机做生成。判别式模型学条件概率 P(y|x)生成式模型学联合概率 P(x,y) 或纯输入分布 P(x)。这意味着玻尔兹曼机不需要标签这赋予了它两个独特的应用可能性一是训练数据好找互联网上的图片、文本、语音天然海量标注数据才贵二是它可以用来“造”数据而不只是“分类”数据——这是判别式网络完全没有的能力。很多初学者容易有疑问那能不能用玻尔兹曼机直接做分类呢当然可以。跟Hinton他们早期的做法可以在可见单元里包含标签单元训练时把标签和数据同时作为可见单元一起“呈现”给网络推理时把标签节点留空模型会自己在标签节点上采样填值这个值就相当于模型的分类输出。不过实战里这种用法很少原因很简单判别式模型在分类精度上有压倒性优势玻尔兹曼机的强项在无监督特征学习、数据补全和生成。5.2 学习信号不同目标梯度 vs 数据分布与模型分布的差距反向传播网络的学习信号来自损失函数对参数的梯度给定一批带标签的样本算误差反向传播更新权重。误差信号是从标注里来的一旦有了标签训练路径非常直接。玻尔兹曼机的学习信号则来自四个字正负相之差。它没有外在的标签比的是“数据分布”和“模型分布”的差异——更像是在找一个“模型越来越像数据”的方向。这也是为什么玻尔兹曼机的训练被称作“对比学习”此处指对比两分布现在是表示学习里的那个对比学习之别每个梯度步骤都由模型自己生成一些样本作为“反面教材”拿真实数据和反面教材做对比再决定参数怎么更新。这个“用模型自己造样本训练自己”的思想在无监督和生成式学习里遍地开花而反向传播网络的结构里没有这个东西。另外有个关键区别反向传播要求网络结构可微损失函数一层层往回传梯度玻尔兹曼机网络本身是一个随机动力系统根本没有明确的“前向计算”或者“损失函数”概念只能通过分布差异来间接调整参数。所以玻尔兹曼机的训练思路不是“算误差传梯度”而是“采样→比较分布→更新”。它不使用传统BP虽然早期Hinton论证过可以用BP加速玻尔兹曼机的某些变体但主路线是完全不同的。5.3 训练过程的本质差异收敛目标与稳定性反向传播训练神经网络目标是用梯度下降最小化某个损失函数相对直观。玻尔兹曼机则在一个更抽象的空间里“流浪”它每走一步都要处理一个跟模型自身分布相关的期望值而这个分布本身随参数变化而变化且永远只能采样近似。因此玻尔兹曼机的收敛过程更像一个随机搜索而不是一个清晰的下降轨迹。这使得它在训练稳定性上天然不如反向传播网络。在实际训练中玻尔兹曼机特别容易受到采样噪声的影响参数更新方向的方差很大需要更多次的迭代往往指数级多于BP网络才能趋于稳定。而且由于随机采样本身具有随机性就算训练到后期模型也可能在某些高能状态和低能状态之间频繁切换造成所谓“幻象”现象导致最终学到的能量函数不够锐利数据特征的区分度不高。这些痛点在后来的受限玻尔兹曼机里依然没有完全消失只能说CD算法从工程上绕开了一些麻烦。5.4 什么时候用谁别拿锤子砸螺丝搞清楚了这些差异选择就变得很清楚了。你有大量标注数据任务就是要给输入打标签图像分类、语音识别、情感分析深度学习框架 反向传播是当之无愧的主力。你没有标签或者你的目标是生成新样本、做数据补全、学习数据的低维表示那基于能量的生成式模型就有优势——哪怕今天已经很少直接使用玻尔兹曼机这个思路仍然是很多前沿方法的基本盘。我见过不少同学在项目里非要用RBM去做图像分类结果精度被CNN吊打然后得出结论“玻尔兹曼机没用”。这其实是用错了场景。拿生成模型的推理能力去跟判别模型拼分类精度有点像拿越野车去赛道上比圈速——车的定位就不是为了干这个。正确的心态是判别式和生成式是两条平行的路每种模型都有自己的强项和短板选用哪种取决于手头的数据形态和任务目标。6. 从朴素玻尔兹曼机到受限玻尔兹曼机工程可行性让位给结构限制6.1 全连接的麻烦隐藏层之间的连接是最大的祸根回顾一下朴素玻尔兹曼机的三个问题配分函数难算、负相采样困难、隐藏单元之间全连接导致采样复杂度爆炸。前两个问题在概率角度上几乎无解工程方的解决办法是改结构。研究者们发现如果去掉可见单元之间和隐藏单元之间的连接只保留可见单元与隐藏单元之间的连接训练困难一下子缓解了。这就是受限玻尔兹曼机Restricted Boltzmann Machine, RBM。去掉这两类连接带来一个巨大的数学红利给定可见单元的状态所有隐藏单元的激活概率变得相互独立可以写成连乘积的因子分解形式。这意味着条件分布 p(h|v) 和 p(v|h) 都变得极其简单——每个单元以独立的概率决定取0还是1可以并行计算不需要条件依赖。在采样时可以利用“交替吉布斯采样”alternating Gibbs sampling固定可见采样隐藏固定隐藏采样可见循环往复。这样的采样过程效率大大提高才让大规模训练有了可能。6.2 限制结构换来的是什么可计算的分布与可用性表面上看RBM“砍掉了”一堆连接模型表达能力似乎该变弱。但实际上由于隐藏单元之间的交互被移除可见单元之间的复杂相关性不再通过直接连接捕捉而是通过“经由隐藏单元的间接路径”来建模。这一点跟深度信念网络里“多层堆叠RBM”来增强表达力的思路完全一致单层不行就堆多层。这种分层设计把原本“全连接复杂依赖”的棘手结构转化为“层内独立层间全连接”的可计算结构让基于能量的模型第一次有了大规模落地的可能性。这一步历史性的结构简化也解释了为什么今天大家提“玻尔兹曼机”多数情况下默认指的是受限玻尔兹曼机很少提朴素版本。真正进入工程实践、被写成各种开源库、出现在论文实验里的几乎都是RBM或它的堆叠变体。朴素玻尔兹曼机更像教科书里的理论原型帮助理解能量模型的思想但一上手实操就必须切换到受限版本。6.3 从玻尔兹曼机到RBM再到DBN一条清晰的技术演进线再往深看一步玻尔兹曼机家族的演进路径非常清晰朴素玻尔兹曼机BM全连接、理论完整但训练不可行→ 受限玻尔兹曼机RBM去掉层内连接、可计算条件分布→ 深度信念网络DBN多个RBM逐层堆叠、无监督预训练有监督微调。每一代演进解决的都是上一代的工程瓶颈而底层那套能量函数和玻尔兹曼分布的物理直觉被完整继承下来。理解了这条线你在读相关文献时就不会迷路。看到“BM”要知道它说的是理论原型看到“RBM”要意识到这是可用的工程版本看到“DBN”要明白它是“多层RBM的堆叠产物”。另外还要提一下深度玻尔兹曼机DBM——它跟DBN非常相似区别在于DBM的隐藏层之间也有连接通常需要近似推断来训练比DBN复杂一些但表达能力在某些任务上更强。这个后续找机会单独展开。6.4 下一篇笔记的预告RBM的训练、采样与实战坑作为系列第一篇这篇笔记踩稳了玻尔兹曼机的概念地基能量函数、玻尔兹曼分布、正负相学习、与反向传播的范式差异、以及从BM到RBM的演进逻辑。接下来这个系列的重头戏显然是受限玻尔兹曼机怎么推导RBM的梯度CD-k算法到底在做什么怎么用RBM做特征学习和生成样本训练RBM时那些“参数稍微一调就废”的坑怎么避以及它跟PyTorch里常见的自动编码器、VAE、GAN这些现代生成模型到底有什么联系和区别。我自己的切身体会学习玻尔兹曼机这类带着物理背景的模型最容易踩的坑就是“死磕数学”从能量函数一路推到配分函数最后卡在采样那里好几个星期出不来。我的建议是第一遍学的时候把精力放在理解“能量低的状态概率高”“训练是通过正负相拉扯让模型逼近真实分布”这两句话上先接受再回头抠推导。那些让你头疼的公式等你能用自己的话把“为什么模型要采自己的样”说清楚之后再看就会顺很多。这个模型家族训练起来确实比普通神经网络费劲得多但理解它带来的那种“原来模型还能这样学”的启发是特别值得的。
返回列表