RestrictedBoltzmannMachines.jl
一个用于训练和采样 受限玻尔兹曼机 (RBMs) 的 Julia 包——一类具有可见单元和隐藏单元二分结构的概率生成模型。该包支持多种单元类型(二元、自旋、Potts、高斯、ReLU 变体)、通过 CUDA 实现的 GPU 加速,以及居中和标准化 RBM 等高级技术。
安装
该包已注册。使用以下命令安装:
import Pkg
Pkg.add("RestrictedBoltzmannMachines")
此包不导出任何符号。由于名称较长,我们建议将其导入为:
import RestrictedBoltzmannMachines as RBMs
快速入门
在二值化 MNIST 数字上训练一个二元 RBM 并生成样本:
import RestrictedBoltzmannMachines as RBMs
import MLDatasets
# Load and binarize MNIST data (28×28 images)
train_x = Array{Float32}(MLDatasets.MNIST(split=:train)[:].features .≥ 0.5)
# Create a Binary RBM with 400 hidden units and initialize from data
rbm = RBMs.BinaryRBM(Float32, (28, 28), 400)
RBMs.initialize!(rbm, train_x)
# Train with Persistent Contrastive Divergence
RBMs.pcd!(rbm, train_x; iters=10000, batchsize=256)
# Generate new samples via Gibbs sampling
fantasy = RBMs.sample_v_from_v(rbm, train_x[:, :, 1:100]; steps=3000)
支持的层类型
RBM 可以由以下可见层和隐藏层类型的任意组合构建:
| 层 | 取值 | 参数 | 描述 |
|---|---|---|---|
Binary | {0, 1} | θ | 二元单元 |
Spin | {-1, +1} | θ | 自旋单元 |
Potts | one-hot 向量 | θ | 类别单元 |
Gaussian | ℝ | θ, γ | 高斯单元 |
ReLU | [0, ∞) | θ, γ | 整流线性单元 |
dReLU | ℝ | θ⁺, θ⁻, γ⁺, γ⁻ | 双 ReLU |
pReLU | ℝ | θ, γ, Δ, η | 参数化 ReLU |
xReLU | ℝ | θ, γ, Δ, ξ | 扩展 ReLU |
nsReLU | ℝ | θ, Δ, ξ | 固定尺度 xReLU (γ = 1) |
dReLU, pReLU, xReLU, 和 nsReLU 是密切相关的非对称分段二次层类型:
dReLU,pReLU, 和xReLU可以相互转换而不损失信息。dReLU为正负部分使用独立的参数。pReLU和xReLU使用共享尺度 γ 和非对称参数(pReLU中 η 有界于 (-1,1);xReLU中 ξ 无界)。nsReLU是固定尺度变体,消除了隐藏单元尺度与权重之间的不变性。
每个 pReLU.η 值必须是有限的且严格位于 (-1, 1) 内部。对于
无约束的学习非对称性,优先选择 xReLU,或者当需要固定尺度时选择 nsReLU。
使用 RBM(visible, hidden, weights) 构建具有任意层类型对的 RBM,或使用诸如 BinaryRBM, HopfieldRBM 等便捷构造函数。
主要功能
- 训练:
pcd!— 具有可定制优化器(通过 Optimisers.jl)、正则化(对权重/场进行 L1、L2 正则化)和回调的持久对比散度。 - 采样:
sample_v_from_v,sample_h_from_v,sample_v_from_h— 吉布斯采样;metropolis— 任意温度下的 Metropolis-Hastings 采样。 - 评估:
free_energy,log_pseudolikelihood,log_likelihood,reconstruction_error. - 配分函数:
log_partition(精确值,适用于小型 RBM),aise/raise(退火重要性采样估计值)。 - 初始化:
initialize!(rbm, data)— 匹配数据的单点统计量。 - 规范变换:
zerosum!,rescale_weights!— 施加规范约束(对 Potts 层有用)。
GPU 支持 (CUDA)
使用 gpu 和 cpu 将 RBM 移动至/移出 GPU(需要 CUDA.jl):
import CUDA
using RestrictedBoltzmannMachines: BinaryRBM, cpu, gpu
rbm = BinaryRBM(randn(5), randn(3), randn(5, 3))
rbm_gpu = gpu(rbm) # transfer to GPU
# ... train or sample on GPU ...
rbm_cpu = cpu(rbm_gpu) # transfer back to CPU
Layers 和 RBM 也实现了 Adapt.jl 接口,因此像 adapt(CuArray, rbm) 这样的通用传输操作可以与任何 GPU 数组后端配合使用。
请参阅此 Google Colab 笔记本 以获取完整的 GPU 训练示例。
已执行的 Binary–nsReLU MNIST 笔记本 展示了一次长时间的 GPU 训练运行、平衡后的样本,以及一阶、二阶和三阶矩匹配诊断。
中心化与标准化 RBM
CenteredRBM 引入了偏移参数来跟踪单元的平均活动,从而提高了训练稳定性(Melchior et al., 2016; Montavon & Müller, 2012):
$$E(\mathbf{v},\mathbf{h}) = -\sum_i a_i v_i - \sum_\mu b_\mu h_\mu - \sum_{i\mu} w_{i\mu} (v_i - c_i)(h_\mu - d_\mu)$$
StandardizedRBM 进一步添加了缩放参数来跟踪单元的标准差:
$$ E(\mathbf{v},\mathbf{h}) = -\sum_i \theta_i v_i -\sum_\mu \theta_\mu h_\mu -\sum_{i\mu} w_{i\mu} \frac{v_i - \lambda_i}{\sigma_i} \frac{h_\mu - \lambda_\mu}{\sigma_\mu} $$
这里 $\lambda$ 跟踪偏移量(单元均值),$\sigma$ 跟踪尺度(单元标准差),适用于可见单元和隐藏单元。
标准化模型与普通 RBM 是规范等价的(具有相同的 $P(\mathbf{v},\mathbf{h})$),其有效参数为:
$$ \tilde w_{i\mu} = \frac{w_{i\mu}}{\sigma_i\sigma_\mu},\qquad \tilde \theta_i = \theta_i - \sum_\mu \tilde w_{i\mu}\lambda_\mu,\qquad \tilde \theta_\mu = \theta_\mu - \sum_i \tilde w_{i\mu}\lambda_i. $$
在代码中,此对应关系可通过 unstandardize(rbm) 获取,它将 StandardizedRBM 转换为等效的普通 RBM。
CenteredRBM 和 StandardizedRBM 均支持所有标准 RBM 操作(训练、采样和评估)。
文档
完整的文档包含 API 参考和示例(MNIST、Metropolis 采样、AIS 配分函数估计、特定层指南):
https://cossio.github.io/RestrictedBoltzmannMachines.jl/stable
相关软件包
- AdvRBMs.jl — 对抗约束的 RBM
- StackedTempering.jl — 用于 RBM 的堆叠退火
使用本软件包的出版物
- 通过共享潜在表示实现自发斑马鱼脑活动的跨个体翻译 — PNAS (2026)
- 使用受限玻尔兹曼机设计分子 RNA 开关 — Nature Communications 16, 11223 (2025)
- 使用受限玻尔兹曼机对 RNA 序列家族进行生成建模 — Methods in Molecular Biology 2847, 163–175 (2025)
- 欠采样受限玻尔兹曼机中的复制对称性破缺与聚类相变 — HAL 预印本 (2024)
- 使用堆叠受限玻尔兹曼机加速采样 — ICLR (2024)
- 无对抗的受限玻尔兹曼机表示解耦 — Physical Review X 13, 021003 (2023)
引用
如果您在出版物中使用本软件包,请引用:
Jorge Fernandez-de-Cossio-Diaz, Simona Cocco, and Rémi Monasson. "Disentangling Representations in Restricted Boltzmann Machines without Adversaries." Physical Review X 13, 021003 (2023).
引用元数据可在 CITATION.cff 中获取。
参考文献
- Montavon, G. & Müller, K.-R. "Deep Boltzmann machines and the centering trick." Neural Networks: Tricks of the Trade, Springer, 2012, pp. 621–637.
- Melchior, J., Fischer, A. & Wiskott, L. "How to center deep Boltzmann machines." JMLR 17(1), 2016, pp. 3387–3447.