从统计力学到受限玻尔兹曼机,理解深度学习的历史脉络
开头:统计力学和机器学习有什么关系?
上一篇我们学习了信息论,用熵度量不确定性。
今天我们学习玻尔兹曼机——深度学习的「前世」。
统计力学: 研究大量粒子的宏观行为 机器学习: 研究大量数据的统计规律 它们有什么关系? 玻尔兹曼分布: 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_ji2.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_reconstructed4.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 的贡献: - 证明了深度网络可以有效训练 - 预训练 + 微调的范式 - 开启了深度学习的新时代九、本篇总结
核心要点回顾
- 统计力学基础:能量函数、玻尔兹曼分布
- 玻尔兹曼机:全连接,学习规则基于对比散度
- RBM:层内无连接,训练更快
- 对比散度(CD):k 步 Gibbs 采样近似梯度
- DBN:多层 RBM 堆叠,预训练 + 微调
- 历史意义:深度学习复兴的开端
下篇预告
下一篇我们学习动态规划。
玻尔兹曼机用能量函数建模概率分布,动态规划用贝尔曼方程求解最优策略。
下一篇你将学到:
- 马尔可夫决策过程(MDP)
- 贝尔曼方程
- 值迭代和策略迭代
- 强化学习的基础
本期互动
你对玻尔兹曼机有什么看法?
- 你知道玻尔兹曼机和 GAN 的关系吗?
- 你觉得预训练在深度学习中还有意义吗?
- 你知道玻尔兹曼机的哪些应用?
欢迎在评论区留言。
系列目录
| 篇 | 标题 | 状态 |
|---|---|---|
| 01 | Haykin 精讲开篇:从「只会调参」到「理解神经网络的灵魂」 | ✅ 完成 |
| 02 | 感知器:神经网络的「鼻祖」,为什么它能「学会」分类? | ✅ 完成 |
| 03 | LMS 算法:从最小二乘到随机梯度下降,工业自适应滤波的核心 | ✅ 完成 |
| 04 | 反向传播:神经网络为什么能「学习」?用 NumPy 手写 BP | ✅ 完成 |
| 05 | 核方法:为什么 SVM 能处理非线性问题?理解「升维」的本质 | ✅ 完成 |
| 06 | 支持向量机:最大间隔的「艺术」,为什么它是「小数据之王」? | ✅ 完成 |
| 07 | 正则化:为什么模型越复杂越容易过拟合?L1/L2/Dropout | ✅ 完成 |
| 08 | PCA:为什么降维能「去噪」?从特征值分解到核 PCA | ✅ 完成 |
| 09 | SOM:无监督学习的「聚类之王」,为什么它能「自组织」? | ✅ 完成 |
| 10 | 信息论:为什么「信息最大化」能学特征?从熵到 ICA | ✅ 完成 |
| 11 | 玻尔兹曼机:深度学习的「前世」,从统计力学到 RBM | ✅ 当前 |
| 12 | 动态规划:强化学习的「数学基础」,从 MDP 到值迭代 | ⏳ 下一篇 |
| 13 | Hopfield 网络:联想记忆的「鼻祖」,为什么它能「回忆」? | ⏳ 待写 |
| 14 | 卡尔曼滤波:为什么它能「预测」?从贝叶斯推断到粒子滤波 | ⏳ 待写 |
| 15 | Haykin 精讲终篇:从感知器到深度学习——一部神经网络的「进化史」 | ⏳ 待写 |
点赞收藏转发,是我持续更新的动力!