玻尔兹曼机

2016-11-10

玻尔兹曼机

玻尔兹曼机是一种生成随机神经网络模型,也是一种Markov随机场模型,由Geoffrey Hinton和Terry Sejnowski在1985年最先发明[^Hinton1985]。玻尔兹曼机可以看做是Hopefield网络1的生成版本。玻尔兹曼机算法本身具有很好的并行性(因为训练是类似于MC的方法),全连接的玻尔兹曼机一般很难被训练,所以后来有了受限玻尔兹曼机(Restricted Boltzmann Machine)2,而深度学习(Deep Learning)实际上就是从受限玻尔兹曼机构成的深度可信网络(Deep Belief Nets)发展而来的。

 一些关于玻尔兹曼机原理的博客和材料

对玻尔兹曼机原理的一个简单介绍

结构

玻尔兹曼机由一些Ising 自旋粒子构成,每个unit具有0或者1两个状态,并各自有一定概率处于这个状态。当然可以将它推广到更加一般的情况。我们把全局能量记为\(E\),那么一个玻尔兹曼机的能量就具有如下的形式

\[ E = -(\sum_{i,j}\omega_{ij} s_i s_j +\sum_i\theta_i s_i) \]

这里

  • \(\omega_{ij}\) 是连接编号为\(j\)的unit和编号为\(i\)的unit的边的权重
  • \(s_i\) 是编号为\(i\)的unit的状态, \(s_i\in {0,1}\)
  • \(\theta_i\) 是unit \(i\) 在全局能量里的偏移 (\(-\theta_i\) 是这个unit的激活阈值,类似于人工神经网络的哪个阈值)

每个态的概率

当一个自旋粒子\(i\)从 0 (关闭)变到1(打开),的时候的全局能量变化记作\(\Delta E_i\),并假设权重矩阵是对称的(也就是说连边都是无向的)就有

\[ \Delta E_i = \sum_{j} \omega_{ij}s_j + \theta_i \]

这个也可以被写作两个不同态的能量差

\[ \Delta E_i = E_{i=off} - E_{i=on} \]

然后我们再根据熵的定义来写成单个unit开合的概率的形式,就可以获得单个unit开合的概率分布函数

\[ \begin{aligned} \Delta E_i &= -T\ln(p_{i=off})+T\ln(p_{i=on})\\\\ \frac{\Delta E_i}{T} &= \ln(p_{i=on}) - \ln(1-p_{i=on})\\\\ p_{i=on} &= \frac{1}{1+\exp(-\frac{\Delta E_i}{T})} \end{aligned} \]

这里\(T\)是系统的温度,往往决定了这个系统的学习能力(温度越低可以变化的空间就越少,学习能力就越差)

平衡态

对于任意的初态,我们不断地对每一个unit用上面的概率分布扔色子来决定一个unit的状态,在足够长的演化之后,那么系统就会达到平衡态。(也就是热平衡)

训练

训练的时候需要将unit分为可见(Visible)和不可见(Hidden)。可见的单元会接收来自周围环境的数据,可见的unit实际上给系统提供了一个边界条件(可见的unit的值由输入的训练数据给定,有点类似于一个open system)。比如数据集合V实际上有一个分布,记做\(P^{+}(V)\),那么我们就希望最终可以让这个玻尔兹曼机通过“拟合”几个参数:\(\omega\)\(\theta\)(热平衡以后的分布和具体的某个unit的状态无关)来学会这个分布。

然后我们知道全局的分布函数最终会因为热平衡而收敛,于是我们可以将这个最终收敛过去的分布函数记作\(P^{-}(V)\)的话,我们的目标就是通过调整参数的值,来使得\(P^{-}(V)\)逼近\(P^{+}(V)\)。然后现在就需要找一个函数来描述两种分布函数的差异,一般我们使用名为Kullback-Leibler距离的函数,一般记作(KL-divergence):

\[ KL(+|-) = \sum_{v} P^+ (v) \ln(\frac{P^{+}(v)}{P^{-}(v)}) \]

这里求和是对整个数据集V求和。KL距离实际上只和权重有关(这也印证了平衡态的分布只和权重有关),然后我们就可以通过一些优化算法比如梯度下降来不断优化KL距离以获得更好的参数。

上面的过程是建立在平衡态统计学上的,实际上最近已经有一些工作开始关注非平衡态统计的应用,比如这一篇:arxiv:1503.03585

 全连接玻尔兹曼机的问题

- 时间复杂度太大,按照上面的训练方法,由于要不停地对每一条边都计算,时间复杂度会指数增长,这也是使用量子计算机来计算玻尔兹曼机的动力之一(Weibe在QIP2016上的talk) - 系统会掉进variance trap里去,这是因为连接的权重可素性很强,使得权重会在激活信号消失前一直随机行走(因为,它们的输出差不多,类似于张量网络,玻尔兹曼机实际上有一些连接会产生同样的输出)

改进

CD-k算法

CD-k算法称为对比散度算法,是上面的抽样方法的一种改进,使得时间复杂度得以变成多项式级别的(在经典的情况下),但是引入了额外的误差,具体算法可以参见这篇post:

对比散度算法

Note: 除了CD-k算法还有一些其它的算法,思路是类似的。

受限玻尔兹曼机

由于上面的问题,在经典计算机上实现玻尔兹曼机就需要对其进行改进,受限玻尔兹曼机是其中使用最广泛的一种改进的方法,并直接导致了深度学习的出现。受限玻尔兹曼机中不允许层内的连边,也就是可见层之间不能有边,隐藏层之间不能有边。其余不变。

这样受限制的玻尔兹曼机可以形成层的结构:可见层->隐藏层

RBM的结构,图来自Deeplearning4j

然后将很多层堆叠起来,也就是将一个RBM的输出作为另外一个RBM的输入,就得到了(Deep Belief Net)。实际上,这也许是一个重整化的过程:An Exact Mapping between the Variational Renormalization Group and Deep Learning

量子化的玻尔兹曼机

Nathan Weibe 曾经就指数增长的时间复杂度尝试使用量子计算来加速,但是由于需要使用量子寄存器而难以实现。Dwave在16年把玻尔兹曼机的自旋状态s替换成Pauli算符以后,在Dwave 的退火机上实现了在同样的迭代次数下相对经典算法更小的KL距离(也就是到达目标更快一些),但是并没有证据显示出有量子加速。

Quantum Boltzmann Machine

应用

上次尤亦庄那篇文章好像还没发,我没在arxiv上找到。他的思路是在这篇文章的基础上继续做 arxiv:1601.01694 (里面哪个RTN只关心连边的话可以当做一个全连接带有隐藏节点的玻尔兹曼机,然后连边的形成可以用玻尔兹曼机的训练过程来解释,输入的数据就是一些量子态)