ITADN
cossio/RestrictedBoltzmannMachines.jl
cossio/RestrictedBoltzmannMachines.jl · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

RestrictedBoltzmannMachines.jl

Docs (stable) Docs (dev) Coverage

一个用于训练和采样 受限玻尔兹曼机 (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}θ自旋单元
Pottsone-hot 向量θ类别单元
Gaussianθ, γ高斯单元
ReLU[0, ∞)θ, γ整流线性单元
dReLUθ⁺, θ⁻, γ⁺, γ⁻双 ReLU
pReLUθ, γ, Δ, η参数化 ReLU
xReLUθ, γ, Δ, ξ扩展 ReLU
nsReLUθ, Δ, ξ固定尺度 xReLU (γ = 1)

dReLU, pReLU, xReLU, 和 nsReLU 是密切相关的非对称分段二次层类型:

  • dReLU, pReLU, 和 xReLU 可以相互转换而不损失信息。
  • dReLU 为正负部分使用独立的参数。
  • pReLUxReLU 使用共享尺度 γ 和非对称参数(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)

使用 gpucpu 将 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

CenteredRBMStandardizedRBM 均支持所有标准 RBM 操作(训练、采样和评估)。

文档

完整的文档包含 API 参考和示例(MNIST、Metropolis 采样、AIS 配分函数估计、特定层指南):

https://cossio.github.io/RestrictedBoltzmannMachines.jl/stable

相关软件包

使用本软件包的出版物

引用

如果您在出版物中使用本软件包,请引用:

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.