受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)是一种可用随机神经网络(stochastic neural network)来解释的概率图模型(probabilistic graphical model)。RBM是Smolensky于1986年在波尔兹曼机(Boltzmann Machine,BM)基础上提出的,所谓“随机”是指网络中的神经元是随机神经元,输出状态只有两种(未激活和激活),状态的具体取值根据概率统计法则来决定。

1 受限玻尔兹曼机(RBM)

假如我们让用户对一些电影进行0到100的打分。从经典的因子分析角度,我们可以试着解释每一部电影和用户之间存在的潜在因子。例如,电影Star Wars和Lord of the Rings与科幻小说和幻想因子有着较强的潜在关系,而喜欢电影Wall-E和Toy Story的用户或许与皮克斯因子有较强的潜在联系。

受限玻尔兹曼机(RBM)可以理解为是因子分析的二进制版本(当然还有其他很多不同的理解,在这篇文章里我们采用这个理解方式)。与用户在连续分值上对电影打分不同,RBM只需要用户简单的指出他们是否喜欢这部电影,就能够发现影响用户做出选择的潜在因子。

从技术上来讲,受限玻尔兹曼机(RBM)是一个随机神经网络(神经网络意味着有类似神经元的单元,其二进制激活依赖于它们所连接的邻居;随机意味着这些激活有一个概率元素)。

RBM由以下几部分组成:

  • 可见神经元层(Visible Layer),已知的用户对电影的喜好状态;

  • 隐藏神经元层(Hidden Layer),将要学习的潜在因子;

  • 偏置神经元(Bias Unit),该神经元一直处于激活状态,用来调节每部电影之间不同的固有知名度。

此外,每一个可见神经元都连接了所有的隐藏神经元(由于连接是无向的,因此每一个隐藏神经元也连接了所有的可见神经元),而偏置神经元则连接了所有的可见神经元和隐藏神经元。为了方便学习,我们限定网络中的可见神经元不会连接其它任何的可见神经元、隐藏神经元也不会连接任何其它的隐藏神经元。

举例,假设我们有六部电影(Harry Potter,Avatar,LOTR 3,Gladiator,Titanic,Glitter),然后让用户告诉我们他喜欢看哪部电影。如果我们想学习到影响电影是否被喜欢的两个潜在神经元,比如,我们的六部电影被分为了科幻/幻想类(containing Harry Potter, Avatar, LOTR 3)和获得奥斯卡奖类(containing LOTR 3,Gladiator,Titanic)两个自然类别,我们希望RBM学习到的两个隐藏神经元能够对应这样的分类,RBM网络如下所示 (注意与因子分析的图形化模型的相似之处): png

2 状态激活

RBM和一般的神经网络一样都是通过更新某些神经元的状态来工作的,因此需要讨论一下单个神经元的状态是如何改变的。假设已知RBM中的连接权重(后面会详细解释),那么更新神经元$i$的状态的方法如下:

  • 通过$ a_i=\sum_{j}w_{ij}x_j$ 计算神经元$i$的激活能,该求和公式里包含了神经元$i$所连接的所有神经元$j$,$w_{ij}$表示神经元$i$的与神经元$j$的的连接权重,$x_{j}$表示神经元$j$的状态,用0或1表示。换句话说,神经元$i$的所有连接点都给它发送了一个信息,而我们要做的就是计算所有信息的和;

  • 设$p_{i}=\sigma(a_{i})$,逻辑函数为$\sigma(x)=1/(1+exp(-x))$。注意$p_i$接近于1是正向激活能,$p_i$接近于0则是反向激活能;

  • 然后根据$p_i$的概率将神经元$i$置为激活状态,根据$1-p_i$的概率将神经元$i$置为未激活状态;

  • (通俗来说,互相连接的神经元会试图共享相同的连接状态,即同为激活或未激活状态),当相连接的神经元处于反向连接时它们可能处于不同的状态。

举个例子,假设我们有两个隐藏的神经元分别对应科幻/幻想类和获得奥斯卡奖类。

  • 如果Alice对六部电影进行了0, 1的选择,那么RBM可以计算出是哪一个隐藏神经元触发了她的喜好选择(即,让RBM根据潜在因子解释她的喜好)。这六部电影向隐藏神经元发送了信息,并让它们自动更新。(注意,即使Alice确定她想看Harry Potter, Avatar, and LOTR 3,RBM也不能保证一定将隐藏神经元科幻/幻想类置为激活状态,但是只有科幻/幻想类隐藏神经元的激活概率较大,这也是有道理的:在真实世界里,Alice想看的这三部电影让我们高度怀疑她一般喜欢科幻/幻想类,但是不排除有很小的可能是因为其他原因而选择这三部电影。因此,RBM允许我们生成人类所生活的复杂的、真实世界模型);

  • 相反,如果我们知道某个人喜欢科幻/幻想类的事物(那么科幻/幻想类神经元被激活),然后让RBM输出与隐藏神经元科幻/幻想类所对应的电影名称。因此隐藏神经元向电影神经元发送信息,让它们进行自我更新。(再次注意,科幻/幻想类神经元并不保证每次都会向我们推荐Harry Potter, Avatar, LOTR 3 这三部电影,因为不是每一个喜欢科幻小说的人都喜欢看Avatar)。

3 连接权重

如何计算网络中的连接权重?假设我们有很多的训练样本,每一个训练样本都是一个二进制的向量,分别包含六个元素,对应一个用户对这六部电影的喜好选择。对每一个样本集,进行如下计算:

  • 取一条样本(六个电影喜好值的集合),设置对应可见神经元的状态;

  • 然后,使用上面描述的逻辑激活规则更新隐藏神经元的状态:计算第$j$个隐藏神经元的激活能$a_j=\sum_iw_{ij}v_i$,$v_i$是用0,1表示的可见神经元$i$的状态,对应的,我们用$h_j$表示隐藏层神经元$j$的状态。将$h_j$置为1的概率为$\sigma(a_j)$,将$h_j$置为0的概率为$1-\sigma(a_j)$。对于每一条边$e_{ij}$,计算$Positive(e_{ij})=v_i*h_j$(确定每一对神经元是否相同);

  • 现在以相似的方法更新可见神经元的状态:计算每一个可见神经元$i$的激活能,然后更新它的状态。(注意,此更新结果可能与原始的电影喜好不相符。)。再次更新隐藏神经元,对于每一条边$e_{ij}$,计算$Negative(e_{ij})=v_i*h_j$;

  • 通过设置$w_{ij}=w_{ij}+\eta(Positive(e_{ij})-Negative(e_{ij}))$来更新每一条边$e_{ij}$的权重,其中$\eta$是学习率;

  • 重复训练所有的样本数据,直到网络收敛(即,训练样本与它们更新之后的值之间误差小于某一阈值)或者达到了样本子集的最大数量。

为什么说这样的更新规则是有道理的?注意以下几点:

  • 在第一阶段,通过计算$Positive(e_{ij})$对训练样本中第$i$个神经元和第$j$个神经元之间的联系进行了衡量;

  • 在第二阶段,RBM通过隐藏神经元是独立的这一假设生成了可见神经元的状态。通过计算$Negative(e_{ij})$衡量在没有任何神经元被对应到训练样本时网络本身所产生的联系。

因此,为每一条边的权重加上$Positive(e_{ij})-Negative(e_{ij})$能够帮助网络更好的与真实的训练样本相匹配。

(也许你对对比散度更新规则也有所了解,它其实是类似于“近似梯度下降”的另一种术语)

4 案例

我使用Python编写了一个简单的RBM实施案例 (代码有大量的注释,有疑惑的地方可以参考),现在我们用RBM来处理一些样本:

首先,使用一些人为构造的样本数据来训练RBM。

  • Alice:(Harry Potter = 1, Avatar = 1, LOTR 3 = 1, Gladiator = 0, Titanic = 0, Glitter = 0),科幻/幻想类的超级粉丝;

  • Bob: (Harry Potter = 1, Avatar = 0, LOTR 3 = 1, Gladiator = 0, Titanic = 0, Glitter = 0),科幻/幻想类粉丝,但是不喜欢Avatar;

  • Carol: (Harry Potter = 1, Avatar = 1, LOTR 3 = 1, Gladiator = 0, Titanic = 0, Glitter = 0),科幻/幻想类的超级粉丝;

  • David: (Harry Potter = 0, Avatar = 0, LOTR 3 = 1, Gladiator = 1, Titanic = 1, Glitter = 0),获得奥斯卡奖类的超级粉丝;

  • Eric: (Harry Potter = 0, Avatar = 0, LOTR 3 = 1, Gladiator = 1, Titanic = 0, Glitter = 0),获得奥斯卡奖类的粉丝,除了 Titanic;

  • Fred: (Harry Potter = 0, Avatar = 0, LOTR 3 = 1, Gladiator = 1, Titanic = 1, Glitter = 0),获得奥斯卡奖类的超级粉丝。

RBM网络学习到了如下的值:

png

我们注意到第一个隐藏神经元的值似乎与奥斯卡奖的相对应,第二个隐藏单元与科幻/幻想类电影相对应,结果和我们希望的一样。

现在我们给RBM网络一个新的用户George,他的电影喜好向量为(Harry Potter = 0, Avatar = 0, LOTR 3 = 0, Gladiator = 1, Titanic = 1, Glitter = 0),RBM网络的激活结果为获得奥斯卡奖类(而不是科幻/幻想类),正确的猜测出了George喜欢获得奥斯卡奖的电影。

假如我们只使用科幻/幻想类神经元,然后多次运行RBM会怎样?结果,激活Harry Potter, Avatar, LOTR 3神经元的有三次;激活Avatar, LOTR 3神经元,没有激活 Harry Potter神经元的有一次;激活Harry Potter, LOTR 3神经元,没有激活Avatar神经元的有两次。说明,根据我们的训练样本,RBM生成的结果与科幻/幻想迷想看的电影相符。

5 改进

这里有一些实际运用中经常会出现的改进点:

  • $Negative(e_{ij})$是更新可见神经元并且再次更新隐藏神经元之后由第$i$个神经元和第$j$个神经元的乘积确定的。我们也可以在大量的更新之后计算该乘积(即,重复更新可见神经元、隐藏神经元,再次更新可见神经元等等);这种方法比较慢但是能更准确的匹配网络的目标;

  • 我们可以使用$v_i$和$h_j$的激活概率计算$Positive(e_{ij})$,而不是用二进制0, 1所表示的$v_i$,$h_j$状态,$Negative(e_{ij})$的计算也一样;

  • 为了得到一个稀疏模型,或者更加正则化的模型我们可以惩罚较大的边权重;

  • 更新边权重的时候,我们可以使用动量因子:为每一条边添加当前步骤(即,$\eta*(Positive(e_{ij})-Negative(e_{ij}))$以及之前步骤的加权和;

  • 与之前每一个样本子集只包含一条训练样本不同,每一个样本子集可以包含一批训练样本,只有在计算完一批样本之后才能更新网络的权重。通过快速矩阵乘法算法加快学习速度。


译者:丁媛媛
源自:Edwin Chen(作者)——Introduction to Restricted Boltzmann Machines

注:请勿在数据嗨客之外的平台分享此案例