BM(玻尔兹曼机)和RBM(受限玻尔兹曼机)

1. 玻尔兹曼机的学习算法

在上一篇中已经讲了玻尔兹曼机:

有着隐藏单元的随机Hopfield网络,被称之为玻尔兹曼机。可以利用它进行二进制数据向量集合的概率模型的构建。

本节讲述一个玻尔兹曼机的学习算法,虽然它非常简单而且原理解释很优美,但是在实际操作中并不好用。(所以后面会有改进的加速算法)

1.1 直观的玻尔兹曼机学习算法

玻尔兹曼机学习算法是一个无监督算法。只需要输入向量即可。
我们需要做的是最大化概率的积,也就是使得所有p(v)相乘的积最大:
Alt text(这个公式可以参考前一篇博文)
让概率乘积最大也相当于概率取log之后再相加的和最大。
我们可以通过让模型这么做:

  • 让网络在N次不同的时间上在没有外部输入的情况下稳定到它的稳态分布
  • 对可视向量进行采样,让网络再次稳定下来
  • 对可视向量再次采样… …

但是这个学习方法是非常困难的,因为如果你要更改某个权重,你可能需要另外边的权重才能调整该边的权重。
Alt text
例如上图你要修改w1,你必须要知道w3才行。

1.2 简单的玻尔兹曼机学习算法

针对上面修改某个权重需要知道所有权重信息的问题,Hinton发现了有一个简单的学习算法只需要知道局部信息就能建立整个模型!
Alt text
对某个可视向量V的概率取log之后关于wij求导,发现结果只跟两个节点i和j的状态有关,分别是加入了可视向量v达到热平衡后和没有任何clamping(没有可视向量v)达到热平衡的差。

  • 公式里面的第一项用来提高权重
  • 公式里面的第二项来减小权重,防止权重变得越来越大从而毁掉整个系统,作为逃离伪最小的一项。

所以如前面这个公式里面提到的这两项,为了运行这个学习规则,需要正的统计数据和负的统计数据。分别用正阶段和负阶段来获得正统计数据和负统计数据:

Alt text
这里如何做sample没有明白。

2. 更有效的玻尔兹曼机学习算法

2.1 Neal’s method

刚才讲的那种收集统计数据的方法太低效了。因此有人提出了一种更高效的方法。思路如下:

既然每次从随机状态开始要很长的时间才能达到热平衡,为什么不从上次使用数据向量夹逼达到热平衡时候的状态开始呢?
我们把用数据向量夹逼达到热平衡时候的状态称为particle(粒子),使用粒子有一个巨大的好处:从粒子状态开始,我们只需要稍微更新权重,就能让整个系统重新达到热平衡。

有了思想之后,具体的实现方式如下:
Alt text
(这里的fantasy particles的意思也没有看懂)

2.2 平均场逼近

Neal’s method在全批量学习中比之前的方法有效,但是应用到mini batch(小批量)上比较困难。这是因为当我们回到了同样的数据向量,如果我们使用的是mini批量,这些权重将会更新很多回,所以针对于数据向量的存储的具体的数据粒子将不再会在热平衡附近了。
于是Hinton又提出了一种叫做平均场逼近的方法。这个方法的思想是这样的:

之前提到过,Hopfield网络可以用来解释数据向量(前一篇文章中2D、3D立方体的例子)。现在我们做一个很强的先验假设:当一个数据向量被逼近的时候,隐藏单元的状态(就是一个解释),是唯一的(或者叫单峰的)。
也就是给定一个数据向量,不存在两个非常不同的解释,而是只存在唯一的一个解释。

有了这个先验假设之后,就有一个非常有效的方法来达到热平衡或者逼近热平衡,也就是平均场逼近的方法:
Alt text

  • 第一个式子说,如果我们想要准确地获得统计数据,那么就必须按部就班的来,也就是随机地(应该指每一个单元状态随机选取)、按序的(应该指一个一个单元进行更新)更新。
  • 第二个式子说,现在我们想快一点,也就是做加速,那么我们把第一个式子里面的状态sj(取值为0或者1)变成概率$p_j$(0-1的范围),加入了时序,同时并行更新单元。
  • 第三个式子说,按照第二个式子来,用概率来代替随机二值会出现震荡问题,为了解决这个问题,我们通过改进第二个式子,来解决震荡问题。

如此一来,我们得到了也适用于mini-batch的玻尔兹曼机学习算法:
Alt text
(PS:从1983年到2012年,过了整整30年的时间,才把这个算法不断完善起来)

2.3 Deep Boltzmann Machine 深度玻尔兹曼机

把之前的玻尔兹曼机改进一下,增加隐藏层数目,同时增加一些限制,就得到了Deep Boltzmann Machine:
Alt text

  • 增加了隐藏层数目
  • 同一层之间没有连接
  • 不存在跨层连接,只存在相邻层连接

DBM模型有一个好处,就是可以让并行更加有效。
举个例子,对于上面那个DBM模型,我们先更新第一个隐藏层和第三个隐藏层:
Alt text
然后更新可视层和第二个隐藏层:
Alt text
如此不断交替往复,相当于每次更新一般的节点

后面讲的A puzzle也没有看懂,因为不知道fantasy粒子具体代表的意思是什么。

3. Restricted Boltzmann Machines

3.1 RBM模型

前面讲了DBM,其实RBM(Restricted Boltzmann Machines)就是只有一个隐藏层的DBM:
Alt text

  • 只有一个隐藏层
  • 层间无连接

这样做的目的是让推导和学习模型更加容易。具体怎么个容易法呢?

  • 当你在可视单元夹逼一个数据向量的时候,只要一步就可以达到热平衡,也就是可以一步到位的计算出$\_v$的准确值
  • 由于层间无连接,例如计算上图单元j的概率的时候与同层的其他节点无关,所以同层的所有节点可以并行的计算概率,不会出错。

下面这页说明了使用RBM进行建模的过程:
Alt text

3.2 A very surprising short-cut

首先我们来看看RBM的学习算法:
Alt text

  • 这里引入了时间来标记,表示的是马尔可夫链中的步骤。
  • 注意每一个时刻,对于可视层和隐藏层都是并行更新的(图中只画出了一个,但其实是并行的,前面已经提到过了)
  • 以t=0时刻作为例子,首先保持可视层不变,并行更新隐藏层(up);然后保持隐藏层不变,并行更新可视层(down)。
  • 当时间过了很久趋近无穷的时候,整个系统就会处于热平衡状态
  • 最后我们计算$\Delta w_{ij} = \epsilon (^0 - ^\infty)$

理论上来说,我们需要很长很长的时间才能到达热平衡状态。但是在实际中,只运行一段时间就能近似出热平衡的效果。更加变态的是,Hinton发现了一个bug,只需要一次操作就可以接近热平衡状态了:
Alt text
如上图,仅仅做了up-down-up操作,就可以近似出热平衡状态了。

为什么会有这样便捷的short cut存在?下图给出了一个合理的解释:
Alt text

  • 绿色的点是数据点,包含可视向量和具体的通过随机更新隐藏单元得到的隐藏向量
  • 运行一次完整的马尔可夫链之后,得到红色的点,包含重建和隐藏向量
  • 然后我们改变权重,效果就是上图的下面那个能量表面,绿色点的位置被下拉了,红色点的位置被上升了
  • 注意到变化的这块区域是离数据点比较近的区域(上升和下降的那部分区域),构建了一个能量最小值,而远离数据的能量表面没有发生什么变化

所以当得到的重构在它原理数据的地方,这个short cut会失败。

4 & 5 RBM应用在数字识别和协同过滤

最后的4和5两节阐述了将RBM应用在数字识别和协同过滤(打分推荐系统)的问题上,取得了良好的效果。