news 2026/9/28 4:46:08

玻尔兹曼机:深度学习的「前世」,从统计力学到 RBM

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
玻尔兹曼机:深度学习的「前世」,从统计力学到 RBM

从统计力学到受限玻尔兹曼机,理解深度学习的历史脉络


开头:统计力学和机器学习有什么关系?

上一篇我们学习了信息论,用熵度量不确定性。

今天我们学习玻尔兹曼机——深度学习的「前世」。

统计力学: 研究大量粒子的宏观行为 机器学习: 研究大量数据的统计规律 它们有什么关系? 玻尔兹曼分布: p(x) = exp(-E(x)) / Z 统计力学:能量越低的状态概率越大 机器学习:损失越小的参数概率越大 → 本质是同一个数学框架!

一、统计力学基础

1.1 能量函数

能量函数 ═══════════════════════════════════════════════════════════════════ 在统计力学中,系统的能量决定其状态的概率: E(x) = -Σ w_ij x_i x_j 其中: x_i:第 i 个神经元的状态(0 或 1) w_ij:神经元 i 和 j 之间的连接权重 能量越低 → 状态越稳定 → 概率越大

1.2 玻尔兹曼分布

玻尔兹曼分布 ═══════════════════════════════════════════════════════════════════ 状态 x 的概率: p(x) = exp(-E(x)) / Z 其中: Z = Σ exp(-E(x)):配分函数(归一化常数) 性质: - 能量越低,概率越大 - 温度 T 控制分布的「尖锐程度」 - T → 0:只取最低能量状态 - T → ∞:均匀分布

1.3 为什么要用玻尔兹曼分布?

玻尔兹曼分布在机器学习中的意义 ═══════════════════════════════════════════════════════════════════ 类比: 统计力学:能量函数 → 粒子状态的概率 机器学习:损失函数 → 模型参数的概率 应用: - 生成模型:学习数据的概率分布 - 优化:模拟退火(Simulated Annealing) - 推断:贝叶斯推断

二、玻尔兹曼机

2.1 网络结构

玻尔兹曼机结构 ═══════════════════════════════════════════════════════════════════ 可见层:v₁, v₂, ..., vₙ(观测数据) 隐藏层:h₁, h₂, ..., hₘ(隐变量) v₁ ──── v₂ │ ╲ ╱ │ │ ╲ ╱ │ │ ╲╱ │ │ ╱╲ │ │ ╱ ╲ │ │ ╱ ╲ │ h₁ ──── h₂ 特点: - 全连接(每个神经元与其他所有神经元连接) - 无自连接 - 对称权重:w_ij = w_ji

2.2 能量函数

玻尔兹曼机的能量函数 ═══════════════════════════════════════════════════════════════════ E(v, h) = -Σ_i a_i v_i - Σ_j b_j h_j - Σ_{i,j} w_ij v_i h_j - Σ_{i,j} w_ij^v v_i v_j - Σ_{i,j} w_ij^h h_j h_k 简化(只考虑可见-隐藏连接): E(v, h) = -Σ_i a_i v_i - Σ_j b_j h_j - Σ_{i,j} w_ij v_i h_j 其中: a_i:可见层偏置 b_j:隐藏层偏置 w_ij:可见层到隐藏层的权重

2.3 学习规则

玻尔兹曼机的学习规则 ═══════════════════════════════════════════════════════════════════ 目标:最大化训练数据的对数似然 max Σ_x log p(x) 梯度: ∂log p(x)/∂w_ij = ⟨v_i h_j⟩_data - ⟨v_i h_j⟩_model 其中: ⟨·⟩_data:数据分布下的期望 ⟨·⟩_model:模型分布下的期望 学习规则: Δw_ij = η (⟨v_i h_j⟩_data - ⟨v_i h_j⟩_model) 直觉: - 增大数据中同时激活的神经元对的权重 - 减小模型中同时激活的神经元对的权重

三、受限玻尔兹曼机(RBM)

3.1 为什么要简化?

玻尔兹曼机的问题 ═══════════════════════════════════════════════════════════════════ 全连接玻尔兹曼机: - 计算量大:需要计算所有神经元对的期望 - 训练慢:需要用 MCMC 采样 解决方案: 受限玻尔兹曼机(RBM) - 层间全连接,层内无连接 - 训练更快,更容易并行

3.2 RBM 结构

RBM 结构 ═══════════════════════════════════════════════════════════════════ 可见层:v₁, v₂, ..., vₙ 隐藏层:h₁, h₂, ..., hₘ v₁ v₂ v₃ │╲ ╱│╲ ╱│ │ ╲ ╱ │ ╲ ╱ │ │ ╳ │ ╳ │ │ ╱ ╲ │ ╱ ╲ │ │╱ ╲│╱ ╲│ h₁ h₂ h₃ 关键特性: - 层内无连接:v_i 之间无连接,h_j 之间无连接 - 层间全连接:每个 v_i 与所有 h_j 连接 → 条件独立:给定 v,h 的各分量独立

3.3 RBM 的优势

RBM 的优势 ═══════════════════════════════════════════════════════════════════ 1. 条件独立 p(h|v) = Π_j p(h_j|v) → 可以并行采样 2. 训练更快 对比散度(CD)算法 → 只需要 k 步 Gibbs 采样 3. 更容易堆叠 多层 RBM → 深度信念网络(DBN)

四、Python 实现 RBM

4.1 完整代码

importnumpyasnpdefsigmoid(x):"""Sigmoid 激活函数"""return1/(1+np.exp(-np.clip(x,-500,500)))classRBM:"""受限玻尔兹曼机"""def__init__(self,n_visible,n_hidden,learning_rate=0.1):""" 参数: n_visible: 可见层维度 n_hidden: 隐藏层维度 learning_rate: 学习率 """self.n_visible=n_visible self.n_hidden=n_hidden self.lr=learning_rate# 初始化权重self.W=np.random.randn(n_visible,n_hidden)*0.01self.v_bias=np.zeros(n_visible)self.h_bias=np.zeros(n_hidden)defsample_hidden(self,v):"""给定可见层,采样隐藏层"""h_prob=sigmoid(v @ self.W+self.h_bias)h_sample=np.random.binomial(1,h_prob)returnh_sample,h_probdefsample_visible(self,h):"""给定隐藏层,采样可见层"""v_prob=sigmoid(h @ self.W.T+self.v_bias)v_sample=np.random.binomial(1,v_prob)returnv_sample,v_probdefcontrastive_divergence(self,v,k=1):"""对比散度算法(CD-k)"""# 步骤 1:数据驱动h0_prob=sigmoid(v @ self.W+self.h_bias)h0_sample=np.random.binomial(1,h0_prob)# 步骤 2:k 步 Gibbs 采样v_k=v.copy()for_inrange(k):h_k_prob=sigmoid(v_k @ self.W+self.h_bias)h_k_sample=np.random.binomial(1,h_k_prob)v_k_prob=sigmoid(h_k_sample @ self.W.T+self.v_bias)v_k=np.random.binomial(1,v_k_prob)# 步骤 3:计算梯度h_k_prob=sigmoid(v_k @ self.W+self.h_bias)# 正相(数据)positive=np.outer(v,h0_prob)# 负相(重构)negative=np.outer(v_k,h_k_prob)returnpositive,negative,v_kdeffit(self,X,n_iterations=100,batch_size=32,k=1):""" 训练 RBM 参数: X: 训练数据,形状 (n_samples, n_visible) n_iterations: 迭代次数 batch_size: 批大小 k: CD-k 的 k """n_samples=X.shape[0]forepochinrange(n_iterations):# 随机打乱indices=np.random.permutation(n_samples)X_shuffled=X[indices]epoch_error=0forstartinrange(0,n_samples,batch_size):end=min(start+batch_size,n_samples)X_batch=X_shuffled[start:end]# 对比散度positive,negative,v_reconstructed=self.contrastive_divergence(X_batch,k)# 更新权重self.W+=self.lr*(positive-negative)/len(X_batch)self.v_bias+=self.lr*np.mean(X_batch-v_reconstructed,axis=0)self.h_bias+=self.lr*np.mean(sigmoid(X_batch @ self.W+self.h_bias)-sigmoid(v_reconstructed @ self.W+self.h_bias),axis=0)# 记录重构误差epoch_error+=np.mean((X_batch-v_reconstructed)**2)ifepoch%10==0:print(f"Epoch{epoch}: Reconstruction Error ={epoch_error/(n_samples//batch_size):.4f}")defreconstruct(self,v):"""重构可见层"""h_prob=sigmoid(v @ self.W+self.h_bias)v_reconstructed=sigmoid(h_prob @ self.W.T+self.v_bias)returnv_reconstructed

4.2 测试:手写数字

fromsklearn.datasetsimportload_digitsfromsklearn.preprocessingimportMinMaxScaler# 加载手写数字数据digits=load_digits()X=digits.data y=digits.target# 归一化到 [0, 1]scaler=MinMaxScaler()X_scaled=scaler.fit_transform(X)# 二值化(RBM 要求输入是二值的)X_binary=(X_scaled>0.5).astype(float)# 训练 RBMrbm=RBM(n_visible=64,n_hidden=32,learning_rate=0.1)rbm.fit(X_binary,n_iterations=50,batch_size=32,k=1)# 重构X_reconstructed=rbm.reconstruct(X_binary)# 可视化fig,axes=plt.subplots(2,10,figsize=(15,4))foriinrange(10):axes[0,i].imshow(X_binary[i].reshape(8,8),cmap='gray')axes[0,i].axis('off')axes[1,i].imshow(X_reconstructed[i].reshape(8,8),cmap='gray')axes[1,i].axis('off')axes[0,0].set_title('Original')axes[1,0].set_title('Reconstructed')plt.tight_layout()plt.show()

五、深度信念网络(DBN)

5.1 多层 RBM 堆叠

深度信念网络(DBN) ═══════════════════════════════════════════════════════════════════ 结构: RBM₁ → RBM₂ → RBM₃ → ... 训练: 1. 逐层预训练:每层 RBM 单独训练 2. 微调:用 BP 算法整体优化 输入层 → [RBM₁] → [RBM₂] → [RBM₃] → 输出层 预训练:无监督(每层 RBM) 微调:有监督(BP)

5.2 预训练的意义

预训练的意义 ═══════════════════════════════════════════════════════════════════ 问题: 深度网络直接用 BP 训练 → 梯度消失 → 难以训练 预训练的作用: - 为网络提供一个好的初始化 - 每层学习数据的统计特征 → 微调时更容易收敛 历史意义: 2006 年 Hinton 提出 DBN → 深度学习复兴的开端

六、工业应用

6.1 特征学习

特征学习 ═══════════════════════════════════════════════════════════════════ RBM 可以用于无监督特征学习: 输入数据 → RBM → 隐藏层激活 → 特征 应用场景: - 图像特征提取 - 文本特征提取 - 推荐系统

6.2 生成模型

生成模型 ═══════════════════════════════════════════════════════════════════ RBM 可以生成新样本: 随机噪声 → RBM → 生成样本 与 GAN 的关系: RBM 是生成模型的早期形式 GAN 是更强大的生成模型

6.3 降维

降维 ═══════════════════════════════════════════════════════════════════ RBM 可以用于降维: 高维数据 → RBM → 低维表示 与 PCA 的区别: PCA:线性降维 RBM:非线性降维

七、避坑指南:使用 RBM 的 3 个陷阱

坑 1:学习率太大 → 训练不稳定

错误做法:learning_rate=10

# ❌ 学习率太大rbm=RBM(n_visible=64,n_hidden=32,learning_rate=10)# 权重剧烈震荡,无法收敛

正确做法:从 0.01~0.1 开始

# ✅ 合适的学习率rbm=RBM(n_visible=64,n_hidden=32,learning_rate=0.1)

坑 2:隐藏层太大 → 过拟合

错误做法:hidden_size=1000

# ❌ 隐藏层太大rbm=RBM(n_visible=64,n_hidden=1000)# 参数太多,过拟合

正确做法:根据输入维度选择

# ✅ 隐藏层约为输入的 2-4 倍rbm=RBM(n_visible=64,n_hidden=128)

坑 3:训练轮数太少 → 收敛不充分

错误做法:n_iterations=5

# ❌ 训练轮数太少rbm.fit(X,n_iterations=5)# 还没收敛就停了

正确做法:监控重构误差,直到稳定

# ✅ 监控收敛rbm.fit(X,n_iterations=100)# 观察重构误差是否稳定

八、历史意义:深度学习的进化

深度学习的历史脉络 ═══════════════════════════════════════════════════════════════════ 1943 M-P 神经元 1958 感知器 1969 感知器局限 → AI 寒冬 1986 反向传播(BP)→ AI 寒冬结束 2006 深度信念网络(DBN)→ 深度学习复兴 2012 AlexNet → 深度学习爆发 DBN 的贡献: - 证明了深度网络可以有效训练 - 预训练 + 微调的范式 - 开启了深度学习的新时代

九、本篇总结

核心要点回顾

  1. 统计力学基础:能量函数、玻尔兹曼分布
  2. 玻尔兹曼机:全连接,学习规则基于对比散度
  3. RBM:层内无连接,训练更快
  4. 对比散度(CD):k 步 Gibbs 采样近似梯度
  5. DBN:多层 RBM 堆叠,预训练 + 微调
  6. 历史意义:深度学习复兴的开端

下篇预告

下一篇我们学习动态规划。

玻尔兹曼机用能量函数建模概率分布,动态规划用贝尔曼方程求解最优策略。

下一篇你将学到:

  • 马尔可夫决策过程(MDP)
  • 贝尔曼方程
  • 值迭代和策略迭代
  • 强化学习的基础

本期互动

你对玻尔兹曼机有什么看法?

  • 你知道玻尔兹曼机和 GAN 的关系吗?
  • 你觉得预训练在深度学习中还有意义吗?
  • 你知道玻尔兹曼机的哪些应用?

欢迎在评论区留言。


系列目录

篇标题状态
01Haykin 精讲开篇:从「只会调参」到「理解神经网络的灵魂」✅ 完成
02感知器:神经网络的「鼻祖」,为什么它能「学会」分类?✅ 完成
03LMS 算法:从最小二乘到随机梯度下降,工业自适应滤波的核心✅ 完成
04反向传播:神经网络为什么能「学习」?用 NumPy 手写 BP✅ 完成
05核方法:为什么 SVM 能处理非线性问题?理解「升维」的本质✅ 完成
06支持向量机:最大间隔的「艺术」,为什么它是「小数据之王」?✅ 完成
07正则化:为什么模型越复杂越容易过拟合?L1/L2/Dropout✅ 完成
08PCA:为什么降维能「去噪」?从特征值分解到核 PCA✅ 完成
09SOM:无监督学习的「聚类之王」,为什么它能「自组织」?✅ 完成
10信息论:为什么「信息最大化」能学特征?从熵到 ICA✅ 完成
11玻尔兹曼机:深度学习的「前世」,从统计力学到 RBM✅ 当前
12动态规划:强化学习的「数学基础」,从 MDP 到值迭代⏳ 下一篇
13Hopfield 网络:联想记忆的「鼻祖」,为什么它能「回忆」?⏳ 待写
14卡尔曼滤波:为什么它能「预测」?从贝叶斯推断到粒子滤波⏳ 待写
15Haykin 精讲终篇:从感知器到深度学习——一部神经网络的「进化史」⏳ 待写

点赞收藏转发,是我持续更新的动力!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 4:45:52

JVM 应用度量框架 Micrometer 实战详解

1. 为什么需要 Micrometer在微服务和云原生时代,应用的运行状态已经不能只靠「服务是否在线」来判断。接口有没有变慢、线程池是否被打满、缓存命中率是否下降、GC 是否频繁、下游依赖是否抖动,这些问题都需要通过可量化的指标来持续观测。传统的日志只能…

作者头像 李华
网站建设 2026/9/28 4:45:34

House of pig

我们要聊的 House of Pig 不是什么枯燥的代码段,而是一场极其优雅、环环相扣的“内存抢劫案”。这个技术由中国安全研究员 pig 在 2021 年的 XCTF 总决赛中首次提出,主要用来对付 glibc 2.31 及以上版本 的高难度 Linux 堆漏洞利用(Pwn&#…

作者头像 李华
网站建设 2026/9/28 4:45:31

House of Roman

House of Roman:无泄漏堆利用的艺术House of Roman 是一种极其巧妙的堆利用(Heap Exploitation)技术。用一句话来概括:它是一种在“没有任何内存泄漏(Info Leak)”的情况下,通过“部分覆盖&…

作者头像 李华
网站建设 2026/9/28 4:44:38

PLC断电重启后无法写入指令,核心原因是通讯链路未正确重建或PLC内部状态在断电时发生了异常

PLC断电重启后无法写入指令,核心原因是通讯链路未正确重建或PLC内部状态在断电时发生了异常。建议按以下顺序排查处理: 1. 确认物理层与通讯连接状态 观察指示灯:检查PLC的电源灯、运行灯(RUN)以及通讯口指示灯(如COM、LINK、PRPHL)。如果通讯灯不闪烁,说明物理连接或…

作者头像 李华