整理自:http://blog.echen.me/2011/07/18/introduction-to-restricted-boltzmann-machines/

0x01 intro

假设我们让一群用户给一堆电影进行评分(满分100)。在经典的因子分析中,我们可以试着用一堆潜在因素来解释用户和因子的关系。比如,像《星球大战》和《指环王》这样的电影和科幻高度相关,而《Wall-E》和《玩具总动员》的用户可能与潜在的“皮克斯”因素有很强的联系。

限制玻尔兹曼机可以理解为是因子分析的二进制版本,比如一个电影有没有科幻/搞笑/动作元素啥的。用户的输入只是它喜不喜欢啥电影,然后输出告诉我们这个用户可能是二次元/科幻/blablabla,相当于是用特定电影的喜好与否给用户画像。

技术上理解,受限玻尔兹曼机是随机神经网络。它由两层东西构成:

  • 一层可视化层(对电影的评价)
  • 一层隐藏层(这个用户喜欢啥风格)

当然,隐藏层和可见层的每个神经元都有偏置项。

一个典型的例子如下所示:
机器学习笔记——受限玻尔兹曼机简介-编程知识网
(这里,右边的那个黑点子是偏置项)

0x02 工作原理

和神经网络的全连接类似,受限玻尔兹曼机的两层之间也是全连接的,但是层内的神经元是不连接的。下面,我们来介绍一下受限玻尔兹曼机的使用原理。

以上图所示,我们输入用户对六个电影的打分结果(0-100分)。然后,我以分数百分比为概率对输入进行0-1取样,比如用户给哈利波特打90分,咱们就以90%的可能性把这个点取成1,10%的可能性取成0。

对每个输入点取过样之后,我们和神经网络前向传播一样,计算一个线性组合∑wijxj+bi\sum w_{ij} x_j + b_iwijxj+bi,这里xjx_jxj就是我们的每个输入,bib_ibi是输出节点的bias。

得到的线性组合扔到sigmoid函数里,得到一个0-1之间的连续值。我们再以这个值为概率做一手前面说的0-1取样。

(概括一手,如果wijw_{ij}wij是正的,那么前后两个神经元就想共享同一个状态,比如《流浪地球》和科幻之间的wijw_{ij}wij肯定得是个超大的正数)

0x03 学习权重

可以发现,这里对网络的输出起作用的就是权重和偏置bias了。假设我们的测试用例是1行6列的二进制向量。在每个训练epoch,做下面的操作:

  1. 把测试用例扔到输入层里。
  2. 正向传播,并且以sigmoid函数值对每个隐藏层神经元做取样。
  3. 计算一下eije_{ij}eij,其定义为输入层第iii个单元和输出层第jjj个单元是否都被激活(即值为1)。都被激活则为1,否则为0.
  4. 下面,我们把3中隐藏层算出的值当成隐藏层的输入,根据这个输入向可见层做一个传播,做法仍然是线性组合之后再套一个sigmoid函数,只不过和2中的方向是反的。
  5. 再计算一个新的fijf_{ij}fij,定义和3中类似。
  6. 更新:wij=wij+γ(eij−fij)w_{ij} = w_{ij} + \gamma (e_{ij} – f_{ij})wij=wij+γ(eijfij)

这个步骤叫对比散度(contrastive divergence),但是本质上还是近似梯度下降。

0x04 why?

这里就放一个直观的理解:

  • eije_{ij}eij表示的是我们希望网络学到的东西,学到哪些东西是要激活的。
  • 在反向传播的阶段,RBM只是根据咱们正向传播的假设来生成可见层的值。fijf_{ij}fij就表示没有固定输入的情况下测量网络本身生成的训练样本。

一个特殊的情况是,假设根据隐藏层构建的东西和原本输入的东西严格相等,这个时候网络就不用更新了,观察e和f,则有e和f严格相等。