一个简单的 Boltzmann Machine 实现
Boltzmann Machines 本文将介绍 Boltzmann Machine,并展示一个可以在浏览器中运行的 Tiny Restricted Boltzmann Machine。
Boltzmann Machine 简介:最早的生成式 AI 模型之一
Boltzmann Machine 是最早的生成式 AI 模型之一,于 20 世纪 80 年代提出。
Boltzmann Machine 用于无监督学习,这意味着它们可以在无需明确指导的情况下从数据中学习。
它们可用于生成与训练数据相似的新数据,也被称为生成式 AI。
Boltzmann Machine 详解
Boltzmann Machine 是一种神经网络,它试图通过模仿物理学中的能量运作方式来学习模式。
每个神经元都可以处于开启或关闭状态,机器由许多相互连接的神经元组成。
一些神经元是可见的(我们可以看到它们甚至可以设置它们的状态),而另一些是隐藏的(我们无法看到它们)。
神经元之间的连接称为权重,它们可以是正的或负的。
v0v1v2v3v4v5v6v7v8v9h0h1h2h3h4h5h6h7h8h9 将鼠标悬停在神经元上以突出显示它们的连接。
General Boltzmann Machine v0v1v2v3v4v5v6v7v8v9h0h1h2h3h4h5h6h7h8h9 将鼠标悬停在神经元上以突出显示它们的连接。
General Boltzmann Machine 在所有神经元之间都有连接。这使得它功能强大,但其训练涉及计算一个 O(2n)O(2^n)O(2n) 项。
Restricted Boltzmann Machine v0v1v2v3v4v5v6v7v8v9h0h1h2h3h4h5h6h7h8h9 Restricted Boltzmann Machine 是一种特殊情况,其中可见神经元和隐藏神经元彼此之间没有连接。这使得它训练和理解起来更快。
Boltzmann Machine 是一种基于能量的模型
Boltzmann Machine 是一种基于能量的模型。
可见单元和隐藏单元配置的能量定义为: E(v,h)=−∑i=1m∑j=1nwijvihj−∑i=1mbivi−∑j=1ncjhj E(v,h) = -\sum_{i=1}^{m} \sum_{j=1}^{n} w_{ij} v_i h_j - \sum_{i=1}^{m} b_i v_i - \sum_{j=1}^{n} c_j h_jE(v,h)=−i=1∑mj=1∑nwijvihj−i=1∑mbivi−j=1∑ncjhj 其中 vvv 是可见层,hhh 是隐藏层,www 是权重矩阵,bbb 和 ccc 分别是可见层和隐藏层的偏置。
右侧的可视化随机化 Boltzmann Machine 的权重、偏差和激活值,并计算其能量。
0.001.001.000.000.000.001.001.000.001.001.000.000.000.000.000.000.001.001.001.00 网络能量: 3.17 随机化状态
训练和生成
在训练期间,它会获得示例(例如,图像、文本),并且机器会调整其权重以降低这些样本的能量。
它有效地学习 P(v)P(v)P(v),即可见单元 vvv 的概率,该概率与 e−E(v)e^{-E(v)}e−E(v) 成正比。
训练后,它可以使用 Gibbs sampling 从学习到的分布中抽取新数据。
这些样本是新的、前所未见的,但在统计上与训练数据相似。
这是我们的训练数据。 我们希望网络学习如何生成与这些相似的样本。 让我们一次模拟一个步骤
Restricted Boltzmann Machine (RBM) 使用一种称为 Contrastive Divergence 的过程进行训练。步骤如下:
- 步骤 1:将可见单元固定到数据
- 步骤 2:对隐藏单元进行采样
- 步骤 3:对可见单元进行采样
- 步骤 4:对隐藏单元进行采样
- 步骤 5:更新权重
运行一步 以上步骤的更正式描述在附录中给出。
输入样本
v0v1v2v3v4v5v6v7v8v9h0h1h2h3h4h5h6h7h8h9 模拟器 按“运行模拟”按钮开始训练 RBM。 如果让模拟运行一段时间,您将看到 RBM 的权重收敛到稳定状态。 能量损失也会随着时间的推移而减少。
您可以通过暂停模拟来比较 RBM 的输入和输出状态。
在开始时,输入和输出状态将不同。 随着模拟的进行,输入和输出状态将变得越来越相似。 运行模拟 迭代次数: 0 / 100000
输入样本
v0v1v2v3v4v5v6v7v8v9h0h1h2h3h4h5h6h7h8h9
输出
重构精度
0.00.51.0
能量
权重
0.00.1 附录: Contrastive Divergence 从先前定义的 Boltzmann Machine 开始,我们希望推导出用于训练的 contrastive divergence 算法。目标是调整网络的权重,以最小化训练数据的能量。 我们有:
- 一个可见层 vvv 和一个隐藏层 hhh。
- 一个连接可见层和隐藏层的权重矩阵 WWW。
- 可见层的偏置向量 bbb 和隐藏层的偏置向量 ccc。
能量函数(矩阵形式): E(v,h)=−∑i=1m∑j=1nwijvihj−∑i=1mbivi−∑j=1ncjhjE(v,h) = -\sum_{i=1}^{m} \sum_{j=1}^{n} w_{ij} v_i h_j - \sum_{i=1}^{m} b_i v_i - \sum_{j=1}^{n} c_j h_jE(v,h)=−i=1∑mj=1∑nwijvihj−i=1∑mbivi−j=1∑ncjhj
联合分布: P(v,h)=1Ze−E(v,h)P(v,h) = \frac{1}{Z} e^{-E(v,h)}P(v,h)=Z1e−E(v,h) 其中 ZZZ 是配分函数,用于归一化分布。
我们通过最大化训练数据的似然性来训练 RBM,即最大化 log(P(v))\text{log}(P(v))log(P(v))。
可见层的边际似然为: P(v)=∑hP(v,h)P(v) = \sum_{h} P(v,h)P(v)=h∑P(v,h)
那么,对数似然为: log(P(v))=log∑h1Ze−E(v,h)=log∑he−E(v,h)−log(Z)\text{log}(P(v)) = \text{log}\sum_{h} \frac{1}{Z} e^{-E(v,h)} = \text{log}\sum_{h} e^{-E(v,h)} - \text{log}(Z)log(P(v))=logh∑Z1e−E(v,h)=logh∑e−E(v,h)−log(Z)
对权重 wijw_{ij}wij 求导得出: ∂logP(v)∂wij=1∑he−E(v,h)∑h(−∂E(v,h)∂wij)e−E(v,h)−1Z∑v,h(−∂E(v,h)∂wij)e−E(v,h)\begin{align*} \frac{\partial \log P(\mathbf{v})}{\partial w_{ij}} &= \frac{1}{\sum_{\mathbf{h}} e^{-E(\mathbf{v}, \mathbf{h})}} \sum_{\mathbf{h}} \left( -\frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial w_{ij}} \right) e^{-E(\mathbf{v}, \mathbf{h})} \\ &\quad - \frac{1}{Z} \sum_{\mathbf{v}, \mathbf{h}} \left( -\frac{\partial E(\mathbf{v}, \mathbf{h})}{\partial w_{ij}} \right) e^{-E(\mathbf{v}, \mathbf{h})} \end{align*}∂wij∂logP(v)=∑he−E(v,h)1h∑(−∂wij∂E(v,h))e−E(v,h)−Z1v,h∑(−∂wij∂E(v,h))e−E(v,h) 对于偏置 bib_ibi 和 cjc_jcj 存在相似的形式。
由于我们执行的是梯度上升,因此: Δwij←Δwij+η∂logP(v)∂wij\Delta w_{ij} \leftarrow \Delta w_{ij} + \eta \frac{\partial \log P(v)}{\partial w_{ij}}Δwij←Δwij+η∂wij∂logP(v)
因此,我们得到权重更新规则: Δwij=η∂logP(v)∂wij=η(⟨vihj⟩data−⟨vihj⟩model)\Delta w_{ij} = \eta \frac{\partial \log P(v)}{\partial w_{ij}} = \eta \left( \langle v_i h_j \rangle_{data} - \langle v_i h_j \rangle_{model} \right)Δwij=η∂wij∂logP(v)=η(⟨vihj⟩data−⟨vihj⟩model) 对于偏置 bib_ibi 和 cjc_jcj,可以遵循类似的过程。 Δbi=η(⟨vi⟩data−⟨vi⟩model)\Delta b_i = \eta \left( \langle v_i \rangle_{data} - \langle v_i \rangle_{model} \right)Δbi=η(⟨vi⟩data−⟨vi⟩model) Δcj=η(⟨hj⟩data−⟨hj⟩model)\Delta c_j = \eta \left( \langle h_j \rangle_{data} - \langle h_j \rangle_{model} \right)Δcj=η(⟨hj⟩data−⟨hj⟩model) 其中 ⟨⋅⟩data\langle \cdot \rangle_{data}⟨⋅⟩data 是相对于训练数据的期望,⟨⋅⟩model\langle \cdot \rangle_{model}⟨⋅⟩model 是相对于模型分布的期望。
下一步是使用 Gibbs sampling 逼近模型期望。
- 正相:采样 h(0)≈P(h∣v(0)=data)\mathbf{h}^{(0)} \approx P(\mathbf{h}|\mathbf{v}^{(0)} = \text{data})h(0)≈P(h∣v(0)=data)
- 负相:运行 k 步 Gibbs sampling:
- 在 v(t+1)≈P(v∣(h)(t))\mathbf{v}^{(t+1)} \approx P(\mathbf{v}|\mathbf(h)^{(t)})v(t+1)≈P(v∣(h)(t)) 之间交替
- 和 h(t+1)≈P(h∣(v)(t))\mathbf{h}^{(t+1)} \approx P(\mathbf{h}|\mathbf(v)^{(t)})h(t+1)≈P(h∣(v)(t))
完成这些步骤后,我们根据以下公式更新权重和偏差: Δwij=η(⟨vihj⟩data−⟨vihj⟩model)\Delta w_{ij} = \eta \left( \langle v_i h_j \rangle_{data} - \langle v_i h_j \rangle_{model} \right)Δwij=η(⟨vihj⟩data−⟨vihj⟩model) Δbi=η(⟨vi⟩data−⟨vi⟩model)\Delta b_i = \eta \left( \langle v_i \rangle_{data} - \langle v_i \rangle_{model} \right)Δbi=η(⟨vi⟩data−⟨vi⟩model) Δcj=η(⟨hj⟩data−⟨hj⟩model)\Delta c_j = \eta \left( \langle h_j \rangle_{data} - \langle h_j \rangle_{model} \right)Δcj=η(⟨hj⟩data−⟨hj⟩model)