lecture12-玻尔兹曼机和受限玻尔兹曼机

这是Hinton的第12课,结合前一课可以知道RBM是来自BM,而BM是来自Hopfield的,因为水*有限,是直译的,虽然有时候会看不懂,但是好歹不会曲解原来的本意,看的话:1、先看ppt;2、通读下面对应的段落;3、不要纠结某句话不通顺,这是个人翻译水*问题,但是可以看出通读整段话,也能够大致知道这个ppt所表述的意思,而且hinton这门课涉及东西很多,肯定不会在几个视频就说的清楚,也就是这是综述一样的介绍,具体的还是得多看论文才是。只是看这个视频,再去看论文,很多东西就不会显得那么陌生了。


一、玻尔兹曼机的学习算法

在上一课中,介绍了玻尔兹曼机可以使用二值数据向量集合的概率模型来解释,在这一课中,会介绍玻尔兹曼机的学习算法,一个非常简单的学习模型,它有着优美的原理解释,但是在实际操作中它不但相当的慢,而且多噪音,简单来说就是不work,所以在许多年来,人们认为玻尔兹曼机不会是一个有实际操作价值的东西。然后Hinton们发现了几个不同的用来加速学习的方法,现在,这个算法能够更好的具有实际意义了,事实上,已经用在了那些为了获得一百万机器学习比赛的获胜算法中了,这个在稍后会介绍。


玻尔兹曼机学习算法是一个无监督学习算法,不像大家典型使用的BP算法,它会涉及到一个输入向量和一个理想的输出(作为目标或者标签),而在玻尔兹曼机学习中我们只需要输入向量即可。该算法试图要做的就是建立一个有关输入向量集合的模型,并通过该集合来考虑输出向量。

我们要做的就是最大化这些概率的积,这些概率也就是在训练集合中玻尔兹曼机指派的二值向量的集合。这等于最大化由玻尔兹曼机指派到训练向量的log概率的和;如果我们按照下面的方式来运行玻尔兹曼机,那么它同样的等于最大化我们获得的N个训练样本的概率:首先,让网络在N次不同的时间上在没有外部输入的情况下稳定到它的*稳分布;然后对可视向量进行采样,然后让网络再次稳定下来,然后接着对可视向量进行采用,以此类推。


那么为什么这个学习是很困难的呢?最主要的可能的原因是,如果你考虑一个单元链,这里是一个隐藏单元链,在两端是两个可视单元。如果我们使用一个训练集合,其中包含着(1,0)和(0,1),换句话说,我们想要这两个可视单元处于相反的状态,那么达到这样的结果的方式是确保所有的这些权重的积是负数。例如,如果所有的权重都是正的,打开W1将会倾向于打开第一个隐藏单元,而这将会倾向于打开第二个隐藏单元,以此类推。第四个隐藏单元将会倾向于打开另一个可视单元;如果这些权重中有一个是负的,那么就可以得到一个介于这两个可视单元之间的反相关,意思就是如果我们考虑学习权重W1,我们需要知道其他的权重。所以假如这是w1(红框框起来),为了知道如何更改这个权重,我们需要知道w3,我们需要知道有关w3的信息,因为如果w3是负的,我们对w1所要做的应该就是当w3为正的时候所做的相反的事情。


所以甚至在正确的方向上,为了能够改变,给定的一个权重却仍需要知道其他权重,令人惊讶的是有一个非常简单的学习算法只需要知道局部信息。所以事实证明,一个权重需要知道所有的其他权重和数据的任何事情都包含在两个相关性的差异之中的。另一个方法是如果你使用这个由玻尔兹曼机指派到可视向量V的log概率,然后对这个进行求关于权重wij的偏导。这就是当这个网络使用夹在可视单元上的v建立的热*衡稳定之后,状态i和状态j的积的期望值之间的差异。也就是当v夹在可视单元中,而该网络处理热*衡的时候,减去同样的数量。但是当V没夹在可视单元上,因为可视向量的log概率的导数是简单的相关性的差,我们可以使得权重之间的变化按照基于训练集合中的所有可视向量的激活均值的期望积成比例改变,这就是我们称之为的数据。当你没有夹紧任何东西,而且网络已经达到了热*衡而没有额外的干扰的时候,减去同样的两个激活值的积。所以这是一个非常有趣的学习规则,规则的第一项说的是当你要表达数据的时候,按与激活的单元的积的比例提升权重。这是所知作为一个hebbian学习规则的最简单的形式。在1940或者1950年代donald hebb 认为大脑中的突触也许会使用类似这样的规则。但是如果你只使用这个规则,突触的强度会变得越来越强,所有的权重都会变成正的,整个系统会被毁掉。你需要某些东西来控制,而这个学习算法通过使用第二项来进行控制的,当你从模型的分布中进行采样的时候,它按照两个经常在一起的单元的频率来降低权重。你同样可以将这个作为第一项就像一个Hopfield网络的存储项一样,而第二项作为逃离伪最小的一项,事实上这也是正确的考虑方式。这个规则准确的告诉你多少程度的非学习。

一个显而易见的问题是为什么这个偏导这么简单。在热*衡上一个全局组态的概率,是一个能量的指数函数,这个概率是相关于E的负能量指数。所以当我们达到了*衡状态,我们获得一个log概率和能量函数之间的线性关系。

现在这个能量函数在权重中是线性的。所以我们有一个介于权重和log概率之间的线性关系。因为我们试图通过对权重进行操作来达到操作log概率的目的,这是一个log线性模型。事实上,这个关系非常简单。这是能够关于一个具体权重wij的偏导等于两个被权值连接起来的激活值的积。

所以这里所发生的是什么呢?是通过传播权重的信息而稳定到热*衡的过程?我们不需要一个显式的BP阶段。我们只需要两个阶段,我们需要解决有数据的时候和没有数据的时候。不过注意到这个网络的行为在这两个阶段中是相当一样的。网络中的深度的内部单元所干的事情是一样的,只是有着不同的边界条件。在BP中,前馈传播和反向传播事实上是相当不同的。


另一个你可能会问的问题是,为什么需要这个负阶段?之前已经说过了这个就像一个Hopfield网络中的非学习,用来逃离伪最小的。更详细的说,上图中的可视向量的概率的等式,(如上图所描述的一样,这里省略不翻译了,说的就如上图解释一般就为了说明这个公式罢了。而且个人觉得,这里用概率统计的角度看看得了。不过的确自己对这里的理解还不够*************)


现在,为了运行这个学习规则,你需要收集这些统计数据。你需要收集我们称之为正的统计数据,这些是当有数据夹在可见单元上的时候;同样的负统计数据,这些是当你没有数据被夹的时候,这时候你会使用非学习(其实可以称之为遗忘)。在1983年Hinton和Terry Sejnowski提出了一个效率低下的方法去收集这些统计数据。该想法是,在正阶段,你通过可视单元来夹逼一个数据向量,然后将隐藏单元设置成随机的二值状态,然后在网络中进行更新这些隐藏单元,一次一个单元,直到这个网络到达了温度为1的热*衡。事实上是通过高温度作为起始,然后开始进行减少的,不过这不是这里的重点。然后一旦你达到了热*衡,你就可以进行采样关于两个单元在一起的频率,所以你需要测量被可视向量夹逼的I和J的相关性。然后你基于所有的可视向量进行重复这样的操作,所以这个在被采样的相关性是基于所有数据上的一个均值。

然后在负阶段中,你无需夹逼任何东西。这个网络已经不受外部干扰的影响了。所以这就算设置好了所有的单元,包括可视单元和隐藏单元到随机的二值状态,然后更新这些单元,一次一个,直到这个网络达到了温度为1的热*衡,就像之前在正阶段做的一样。再一次,对每一对单元i和j的相关性进行采样,然后这样重复许多次,现在是比较困难的知道到底需要重复多少次,不过在负阶段中,你期望这个能量景观能够有许多不同的最小值,但是却分的相当开,而且有着差不多一样的能量。你这样期望的原因是因为我们使用玻尔兹曼机去做类似于对图片集合进行建模的事情。而且你期望这样合理的图片所有都有着差不多一样的能量,然后那些不合理的图片有着非常高的能量,所以你期望有一小部分的空间有着低能量状态,而一个非常大片的空间有着坏的高能量状态。(个人:这就类似于找局部最小一样)如果你有好几个模型,那么其实并不清楚你需要多少次去重复这个过程使得能够对这些模型进行采样。(个人:就是重复到自己认为满意就够了)。

二、得到准确统计的更多有效的方法
这部分将会介绍更多有关如何加速玻尔兹曼机学习的方法,通过使用更聪明的方法使得马尔可夫链能够保持在*稳分布的周围,或者使用被称之为均值场的方法。内容是相当先进的,所以这可以不算是该课程的部分(意思是这部分算是课外知识,不算在他老人家认为的该课程的考核内容),该部分用以让那些感兴趣的如何让深度玻尔兹曼机工作的更好的人看的。

有比Terry和Hinton在开始提出的更好的方法来收集统计数据。如果以一个随机状态开始,那么就会花费很长的时间来达到热*衡状态,当然也没那么容易来测试是否已经达到了热*衡状态,所以我们不知道我们需要多久来运行这个中间过程。所以为什么不以你上次结束时遇到的那个具体的数据向量的状态作为开始呢。我们记得隐藏单元中数据向量的解释,那么我们就从那里开始。这个存储的状态,也就是这个数据向量的解释,被称之为一个粒子(particle)。使用粒子可以让我们有一个良好的开始并且有个巨大的优势。如果我们之前处在*稳状态,我们只需要更新权重一点点就够了,只需要在一个粒子中更新一小部分就能返回到*稳状态,我们可以使用粒子在正阶段和负阶段,在正阶段我们会夹逼出一个数据向量,而负阶段就无需夹逼任何东西。


上图就是直接的收集统计数据,该方法由Radford Neal在1992年引入的。在正阶段中,你有一些具体的数据粒子,每个训练样本有一个或者一些这样的粒子,每个粒子的当前的值是隐藏单元们的一个组态加上该粒子涉及到的数据向量 。在每个粒子中你使用相关的夹逼到的数据向量按顺序来更新所有的隐藏单元好几次。然后对于每个连接到的单元对,基于所有的这些粒子来均化的这两个单元的概率。

在负阶段,保留一组fantasy的粒子,这些都是全局组态,再一次,在每个权重更新之后,在每个fantasy粒子中按顺序更新所有的这些单元好几次,现在你同样可以更新这些可视单元。对于每对连接起来的单元对,基于所有的这些fantasy粒子进行均化SiSj。该学习规则按照比例来改变权重来达到均化的数据的目的,均化所有的训练数据,均化当没有东西被夹逼时随着fantasy粒子得到的数据。该方法比Terry Snofsky和Hinton提出的学习规则更work,至少对于全批量学习来说是这样的。


然而,将这个方法用在mini批量上是比较困难的,是因为当我们回到了同样的数据向量,如果我们使用的是mini批量,这些权重将会更新很多回,所以针对于数据向量的存储的具体的数据粒子将不再会在热*衡附*了。在给定新的权重下这些隐藏单元随着粒子的可视单元下将不会处在热*衡中。再一次说明,我们不知道再一次接*热*衡状态的这个过程需要多久,所以我们可以通过做出一个强烈的假设关于我们理解这个世界的程度来解决这个问题。这是一种认识论的假设,我们假设当一个数据向量被夹逼的时候,这些好的解释,也就是隐藏单元的状态,扮演着那个数据向量的解释   是单峰的。意思就是说对于一个给定的数据向量,没有两个非常不同的解释。我们对于感知输入假设只有一个正确的解释,如果我们对这些数据有个很好的模型,我们的模型在这个数据点将会给我们一个能量最小值。这是在我们将要学习的这种模型上的约束,我们使用的学习算法对于一个数据向量有着许多不同的解释的模型是无法学习的。假设我们有着这样的假设,我们可以使用一个非常有效的方法来达到热*衡或者逼*热*衡。


该方法被称之为*均场逼*。所以如果我们想要得到正确的统计数据,我们需要统计的和顺序的更新这些单元。这个更新规则是打开单元 i 的概率(上图第一个式子),是总的来自其他单元和他们的偏置的输入的逻辑函数,这里Sj是另一个单元的状态,是随机二值。

现在不使用这个规则,我们可以说我们不打算保持来自单元 i 的二值状态,我们会保持一个实值基于0和1之间被称之为概率的值。而在时间t+1时的概率是是逻辑函数的输出,更多你需要放入的是这个偏置和在时间t时权重和这些概率积的和,所以我们通过一个实值概率来替换之前的随机二值。不过这还不是那么正确,因为这个随机二值是在非线性函数内部的,如果这是一个线性函数,那么没事,但是因为逻辑非线性,我们当我们使用概率来替换波动的内部二值时得不到正确的答案 。不过,它还是work的很好,它可能在给我们双向振荡的时候发生错误,因为现在我们想要并行的更新任何事物,而且我们正常的使用在计算p(t+1)_i 时被称之为阻尼*均场来处理这些,不过我们不是完全遵从这样的方式的,我们首先选择我们现在所处的一个点,然后更新到我们想要去的地方(上图第三个式子),所以在阻尼*均场,我们使用lambda乘以我们现在的状态并加上(1-lambda)乘以这个更新规则让我们去的地方,这会解决振荡问题。


现在,我们得到了一个对于玻尔兹曼机来说有效的mini批量学习方法,这是Russ Salakhutdinov发现的。在正阶段,我们可以初始化所有的概率为0.5,我们可以在可视单元上夹逼一个数据向量,然后使用*均场的方法来并行的更新所有的隐藏单元直到收敛。对于*均场,你可以发现当概率停止改变的时候就是收敛了。一旦我们收敛了,我们就对每一对连接起来的单元对进行记录PiPj。

在负阶段,我们做我们之前做过的,我们保持一组fantasy粒子,每个粒子拥有的值是一个全局组态。在每一次权重更新后,我们在每一个fantasy粒子中按顺序更新所有的单元好几次。然后在基于所有的fantasy粒子上对于每一对连接的单元对,我们均化SiSj这些随机二值,这些均化之间的不同在于学习规则。也就是我们通过对这些差异的量成比例来改变权重。


如果我们想要更并行的使用这些fantasy粒子来更新,我们可以改变玻尔兹曼机的结构,所以我们有一个特殊的结构允许交替的对这些fantasy粒子进行并行更新,在层内我们没有连接,而且也没有跨越层的连接,不过我们允许有许多的隐藏层。所以这个结构看上去像上图所示,我们称这个为深度玻尔兹曼机(deep boltzmann machine)。其实这就是一个普通的玻尔兹曼机有着许多消失的连接罢了,如果它们表现出来的话,所有的这些就是跨越层的连接。如果没有层次的话,它也只是一个普通的玻尔兹曼机。但是在这特殊的结构中,有些nice的事情还是可以做的。


(这时候上图的从上往下数第一行第三行有问号),例如我们可以更新第一个隐藏层和第三个隐藏层,给定可视单元的当前的状态和第二层隐藏层的状态,然后我们可以在第二个隐藏层中更新可视单元(这时候从上往下是第二和第四行有问号)。然后我们可以回头然后更新其他状态(这时候是第一行第三行有问号,其实也就是交替的更新),我们可以回向和前向像这样,我们可以并行的更新所有单元的一半状态,而这可以是正确的更新。


所以一个问题就是,如果我们有一个DBM,通过使用*均场进行训练正阶段然后通过基于奇数层和偶数层交替的使用fantasy例子更新的负阶段得到的,我们可以为了MNIST数字学到好的模型,或者一个更复杂的事物吗?所以一个告诉是否你得到的是一个好的模型的方法,是在学习之后,你移除所有的输入然后只是从这个模型中进行生成样本,所以你运行马尔可夫链很长时间直到它起效果了,然后你观察你得到的采样结果。所以Russ Salakhutdinov使用一个DBM去对MNIST进行建模,对正阶段使用*均场,然后为负阶段交替的更新粒子的层。真实的数据如上图右边所示,从模型中的得到的数据如上图左边所示,你可以发现,他们事实上相当相似。这个模型生成的东西非常MNIST所以这是一个相当好的模型。


所以这里有个谜题,当他在学习的时候,他使用带有100个数据样本的mini批量和同样适用100个fantasy粒子,同样的100fantasy粒子针对每一个mini批量,问题就是,我们如何使用这100个负样本去特征化整个空间来评估这些负的统计数据?对于所有的有趣的问题来说,这个全局组态空间是高度多峰的。我们如何成功的找到和表示所有的这些节点,在只是用100个粒子的情况下


这里是一个有趣的答案,用马尔可夫链交互的学习用来收集负统计数据,不论是否用来更新fantasy粒子的,它交互是为了有更好更有效的混合率。也就是说,我们不可能通过认为这是一个更新权值的外部循环,和一个内部训练来收集固定的权重集合的统计数据一样来分析这个学习。这个学习影响着内部循环的有效程度。

原因是不论何时这个fantasy粒子超过正数据,能量表面都是增长的,而且这会影响到马尔可夫链的混合率。它使得fantasy超激活的,而且它们比马尔可夫链的混合率更快的进行周围的移动去寻找更好的当前的静态权重。


所以这图是展示发生的事情。如果在能量表面有一个模式,它有着比数据更多的fantasy 粒子,这个能量表面将会上升直到fantasy粒子逃离这个模式。所以上图右边的左边的模式有四个fantasy粒子(四个红色箭头)和两个数据点。所以学习的影响是为了提升这里的能量。而这个能量障碍对于马尔可夫链来说太高了,使得不能跨越,所以混合率会变得很慢。但是这个学习事实上通过提升这个最小值来让红的粒子逃出这个能量最小,在填充的时候这个fantasy粒子将会逃离到到其他更深的最小值。所以我们可以逃出最小值使得马尔可夫链无法逃出,至少不再一个合理的时间上逃出。所以这里发生的就是这个能量表面是真的用来作为两个不同的目的的。这个能量表面表示我们的模型,可是他同样通过学习算法操作使得马尔可夫链混合得更快;或者 影响一个更快混合的马尔可夫链。一旦这个fantasy粒子填满了一个洞,它们将会冲到其他地方,然后处理下一个问题。一个针对它们的分析就是他们看上去像调查的记者,冲去调查一些严重的问题,一旦公布了结果使得问题解决了,他们又冲去找下一个严重的问题。

三、受限玻尔兹曼机
在这部分,将会介绍受限玻尔兹曼机。它们有着更简单的结构,其中层内无连接,层间有链接,这使得在给定可视单元的基础上它非常容易的达到隐藏单元的*稳分布。也就是一旦你在可视单元上夹逼到数据向量,这个隐藏单元的*稳分布可以准确的在下一步中计算得到。因为在给定可视单元基础上,它们之间是相互独立的,更合适的玻尔兹曼机学习算法对于RBM来说仍然很慢,不过在1998年,Hinton发现一个非常令人惊讶的快捷方式,可以使得它成为玻尔兹曼机第一有效的学习算法,即使这个算法在原理上有些问题,不过在实际操作中它仍然work的很好,而且这算是玻尔兹曼机学习中的一个复兴。

在RBM中,我们约束了网络的连接为了使得在推论上和学习上都变得更加简单。所以,它只有一层隐藏单元,而且在隐藏单元之间没有连接,同样在可视单元之间也没有链接,所以这个结构看上去如上图右上角所示,它就是计算机科学家称之为一个二分图,它有着两部分,在每个部分中没有连接。关于RBM的好事是如果你在可视单元上夹逼一个数据向量,你可以在下一步达到热*衡,意思就是随着一个夹逼得到的数据向量,我们可以快速的计算ViHj的期望值,因为我们可以计算每个打开的单元J的准确的概率,而这在隐藏层中它是与其他单元之间独立的。单元J打开的概率是从可视单元得到的输入的逻辑函数,而且这与其他隐藏单元之间相互独立。所以我们可以并行的计算这个概率。这是巨大的胜利。


如果你想要一个关于二值向量的好的模型,那么正确的使用RBM的算法是有Tieleman在2008年引入的方法,该方法是基于更早的Neal的方法。在正阶段,你从可视单元上夹逼数据向量,然后计算在隐藏单元中不可见的所有对的vihj准确的期望值,你可以这么做是因为vi是固定的,而且你可以准确的计算vj,然后对于每一对连接的单元对,在mini批量中基于所有的数据向量来均化vihj的期望值。

在负阶段,保持的一组fantasy粒子是全局组态,然后通过交替的并行更新来更新每个fantasy粒子好几次。所以在每个权重更新后,更新fantasy粒子会使得它们更加接**稳,然后对于每一对连接的单元对,基于所有的fantasy粒子来均化vihj,这会得到负统计数据。该算法事实上work的很好,并且允许RBM建立很好的密度模型或者生成二值向量集合。


现在,来说说学习算法,该算法不擅长建立密度模型,不过却更快,所以先以一张对于RBM来说低效的学习算法的图片开始。(上图t=0)先基于可视单元夹逼数据向量,然后称该时刻为t=0,所以现在是使用时间来标记,而不是意味着权重的更新,而是指在马尔可夫链中的步骤。给定这个可视向量,现在来更新隐藏单元,所以我们对隐藏单元来选择二值状态,然后对于所有连接的可视和隐藏单元对测量这个期望值,vihj,称之为vihj0 来指明这是在t=0的时候测量到的,这时候是可视单元决定着隐藏单元。当然,可以并行的更新所有的隐藏单元,然后使用这个隐藏向量来并行的更新所有的可视单元(这时候t=1),然后再一次并行的更新所有的隐藏单元,所以这时候可视单元向量t = 1,我们称这个为重构,或者说是一步重构,我们可以一直这样交替这个链以这种方式,更新可视单元,然后隐藏单元,每一组都能并行更新。在我们运行很长一段时间之后,我们就得到了可视单元的某个状态,或者称之为t=infinity来指明这是在很长一段时间之后,然后该系统将会处于热*衡了,现在我们可以测量vi和hj的相关性了,这时候称之为vihj_infinity,这时候的可视状态被称之为fantasy。所以现在这个学习算法看上去很简单,通过学习率乘以t=0时刻的vihj和在infinity时候的vihj之间的差异来改变权重。当然问题是在达到热*衡之前需要运行这个链很长一段时间,如果我们运行的时间不够长的话,这个学习最后可能会犯错。事实上最后的状态是非常有误导性的。结果证明即使我们只运行这个链很短的时间,该学习算法依然work。


所以这里就是非常令人惊讶的快捷方式,你只是运行这个链up,down,up这样。所以从数据中,你生成一个隐藏状态,然后你生成一个重构,然后接着生成另一个隐藏状态。一旦结束后,你也许会有一个统计数据,所以不通过在*稳状态测量得到这个统计数据,而是使用在一个完整的马尔可夫链之后测量得到的统计数据。该学习规则希望计算能够更加的快速,这很清楚的这不是最大似然学习,因为我们为了负统计数据使用的这一项是错的。不过这个学习算法还是很work,后面的课会介绍它为什么work。


所以一个显而易见的问题是为什么这个快捷方式会work?,这就是原因,如果我们在数据上开始这个链,该马尔可夫链将会离开数据并朝着他的*稳状态前进,目标是初始化的权重更加像这些数据。我们可以观察到在一些步骤之后游荡到哪里了,如果我们知道初始化的权重不好的话,那么就是在浪费时间,现在我们知道如何改变他们来阻止它远离数据而不朝着*衡状态前进的情况。所有我们需要的就是降低这个像心理学家称呼的虚构事件的重构概率,这支在一个完整的步骤之后就产生,然后提升数据的概率,这可以阻止它远离数据,一旦这个数据和在一个完整的步骤之后的位置有着同样的分布,那么这个学习就会停止。


所以这就是一张到底发生了什么的图片。(上图上面的红绿点的部分图),这是在全局组态空间中能量表面。绿点是在能量表面上的数据点,数据点的意思是包括了可视向量和具体的通过随机更新隐藏单元得到的隐藏向量。所以这个隐藏向量是一个该数据点是什么的函数。所以从这个数据点开始,我们运行马尔可夫链一个完整的步骤来得到一个新的可视向量,然后隐藏向量就到了上图红点部分。所以一个数据点的重构加上从重构得到的隐藏向量。然后改变这个权重去将能量降低到这个数据点,然后接着通过重构来提升这个能量。这样做的结果是能量表面如上图下面那个曲线图所示。你可以注意到在开始的时候数据部分在构建一个能量最小值,你同时注意到它在远离数据,而且前往和之前差不多的状态。


所以这个只做一次完整的步骤的快捷方式得到的重构会在它远离数据的地方失败。我们需要担心这个模型很像的数据空间却非常远离数据点的区域。这些低能量洞导致这个归一项变得很大,以至于在使用快捷方式的时候无法感知到他们。如果我们使用持续不断的粒子,这其中我们会记得他们的状态,然后在每一次更新后,我们更新它们(粒子)更多次,然后它们最终会找到这些洞。它们会移动到这些洞内部,然后学习着将这些洞补起来。一个介于速度和正确性之间的权衡是开始于非常小的权重,然后使用CD1(也就是一个完整的步骤)来得到负数据。一旦这个权重增长了,马尔可夫链就会混合的更慢,现在我们可以使用CD3.一旦这个权重增长的更多,我们可以使用CD5,或者9 或者10.所以这是按照权重的增长而增加的,我们可以保持这个学习work的更合理,即使这个马尔可夫链的混合率下降了。

四、对比散度学习的例子
这部分,将会介绍一个有关RBM的简单的例子,关于学习手写数字2图片的模型。在模型学习结束后,我们可以观察它是如何重构这个2的。然后观察如果我们给它一些不同的数据,然后要求模型重构会发生什么。我们同样在所有的数字上训练一个更大的RBM,来观察我们得到的权重,这会生成各式各样的图片,在这其中可以更好的重构所有的不同的数字类,同样的也是这些数字类的一个相当好的模型。也就是如果你使用一个二值向量,这上百的图片的基础上,这个模型可以找到低能量状态,兼容这些图片。如果你给它一张十分不像这上百张图片的数字的图片,这个模型就可能没法找到兼容这张图片的低能量状态了。

现在介绍一个相当简单的RBM如何学习建立一个图像数字2的模型。该图像是16×16像素的图片,这个模型有着50个二值隐藏单元来作为特征检测器。所以当它为了表现数据情况的时候,第一件要做的事情就是使用这个权重和像素与特征之间的连接像上图绿色箭头一样,去激活这些特征。这是对于每个二值神经元如此的,做出决定关于是否将这个特征检测器的状态为1还是0.。然后使用这些为了激活的二值神经元来重构这个数据(上图淡蓝色箭头),也就是对于每一个像素,它做出决定关于是否为1还是0的决定,然后重新激活这个二值特征检测器,通过使用重构来激活而不是之前的原始数据,这样权重通过基于一个激活像素和激活的特征检测器之间的增量权重来更新,在观察数据的时候这会降低数据的全局组态的能量,不论隐藏模式会变成什么,而且在观察重构的时候它减量基于一个激活像素和一个激活的特征检测器之间的权重,这会提升重构的能量。在学习开始的附*,当权重随机时,这个重构几乎总是会降低能量到数据以下(意思就是降低能量),因为这个重构是在给定激活的隐藏模式基础上重新基于可视单元来重新生成。明显的这是基于他的能量函数重新生成有着低能量的模式,你可以认为这个学习是改变权重使得数据有着低能量,而崇高是通常有着更高的能量。


所以让我们以有着50个特征检测器且是随机权重开始,我们使用非常小的权重,而且这每一个方块表示权重的样子。这个很小的随机权重是用来打破对称性的。因为这个更新是随机的,所以其实我们也不需要这样。


在输入了几百张图片之后,这些权重开始形成一些模式了


如果接着这么干,你可以发现许多特征检测器开始检测一个2的洞了这些都是相当的全局特征检测器。而且这些特征检测器变得更强大了


许多特征检测器开始局部化了,变得更加的局部,


这就是最终的权重,你可以发现每个神经元变成一个不同的特征检测器,大部分特征检测器都相当局部化了。如果观察上图红框中的特征检测器,他是检测2的顶部的,而且当2的顶部是白色像素而且没有黑色像素的时候这个特征检测器会兴奋起来,所以它是表示2的顶部的


一旦我们学好了这个模型,我们可以观察它重构的如何,然后我们给它一些测试数字,一些之前没见过的数字,这里先给它一个2的测试例子,(上图左边),他的崇高看上去相当像测试例子。这个测试例子在顶部有个回勾,而在重构之后就被*滑掉了,不过这还是一个很不错的重构。更有趣的是给它一个不同的数字类,如果我们给它一个数字3来进行重构,它重构的事实上看上去更像是一个2而不是3,所有的这些学好的特征检测器都是很好的表现2的,而不是为了检测3中间的那个尖端的。所以结束重构之后,它还是遵从2的规则的,而不是3的规则。事实上,这个网络试图表示作为2的事情。


所以这里是一些特征检测器,在这个模型的第一层隐藏层中,使用了500个隐藏单元去对所有的这10个数字类进行建模。这个模型被使用CD算法训练很长时间。它有着非常不同的特征检测器。如果观察从上往下数第6行,左边第二个,这是显而易见的用来检测数字8的。如果接着看第8行左数第5个,这不是你期望看到的,这看上去是为了检测底部的像素的,而它看上去不像是检测像素,而却有21个底部的像素,其实这是数据被归一化了,所以这个数字不会有比20个像素更大的高度,意思就是如果你知道有一个像素在这些大的正权重上,也就是在负权重上这个像素不太可能被打开。所以这是挑选出的归一化后安排好的规律。观察倒数第二行左数第二个,它做的是一样的事情,数据不可能有大于20个像素的宽度;观察第二行左数6个,它是为了检测一个竖直拐弯的底部的,它检测一些不同的位置并且然后拒绝检测那些中间位置。所以这非常像一个明显的二值数字中的数字,当你增加数字的强度,它会on 然后off,然后on  然后off。这是为了找到表达这些数据更复杂的方法。

五、应用在协同过滤下的RBM

在这部分,会介绍将RBM应用在协调过滤上。协同过滤意思是试图指出一个用户在基于喜欢其他产品的程度和有多少用户喜欢这个产品上,该用户有多喜欢这个产品。具体的情况可以在Netflix比赛中看到,在这其中,一个机器学习算法可以预测一个具体的永辉将会喜欢一个具体的电影。这个比赛的训练数据包括了50万个用户的18000个电影的100百万个评级,所以这是一个相当大的数据集。这任何人都不认为RBM可以处理的了。我们可以看到,有一个非常重要的技巧可以使得RBM来处理所有的这些几乎消失的电影评级(就是为了预测这些消失的评级)。但是当我们使用这个技巧的时候,我们可以训练这个模型,在实际操作中,这非常的实用,而且获得了胜利。


所以现在我们来解释如何将RBM用在Netflix比赛中的协同过滤吧。在这个比赛中,给你的数据是50万个用户写的给18000个电影的评级,每个电影的评级是从1到5.当然,每个用户只评级一部分电影。但是即使这样,还是有1百万个评级,所以这也是个相当大的数据集。你需要预测用户对给出的电影的评级,如果你干的好,奖励也是很丰厚的。如果你赢了,就可以得到1百万的奖励。所以你可以在一个巨大的表格中划出这个评级结果,顶部是电影编号,左边是用户编号。上图中数字都是评级,问题就是如何预测出那个问号的数字,你可能觉得结果和用户2差不多,因为看上去他两是以同一个思想来评级电影的,另一方面,用户4喜欢电影6,这次你可以预测的更合理,因为你发现可以使用更多的统计数据。


让我们使用一个语言模型来说明,乍一听很奇怪,不过可以发现其实相当于一个标准的方法。所以我们可以按照三元组字符串的形式来写数据,更像是一个家族树。每个三元组有用户,电影和评级三个内容。上图左边就是上上图的数据内容,我们只预测三元组的第三个值,所以如果我们建立一个语言模型,我们要做的就是转换每一个用户到这个用户的向量特征上,这是我们学到的向量,而且我们将电影转换到这个电影的向量特征,从这两个特征向量上,我们试图进行预测评级。现在这个显而易见的方法就是将它放在一个大的隐藏层中,然后将特征向量馈送到这个隐藏层,然后用这个隐藏层来预测这个评级。我们的结果显示我们并不比一个非常简单的方法结果更好,这个方法是简单的使用用户的特征向量和电影的特征向量的标量积,你只需要将它们逐点乘起来,加起来,然后就像你的评级一样输出。这甚至不是一个softmax,事实上输出的是你从这个标量积得来的实数。现在这相当于做一个被称之为矩阵分解模型的事情。如果我们安排用户的特征为行,电影特征为列,我们可以发现如果我们将它们乘起来,这个用户的矩阵乘以电影的特征,然后我们就得到了评级的预测。这准确的等于隔壁这个语言模型。所以这个矩阵分解模型是最通用的作为协同过滤,而且它work的很好。


现在,让我们考虑一个可代替的模型,使用我们的RBM,用RBM来解决这个问题看上去不是很明显。所以我们需要一些思考。在最后我们决定我们可以将每个用户视为一个训练样本。所以一个用户是一个电影评级的向量,对于每个电影,我们有一个可视单元,有着5个可代替的值。所以可视单元不再是二值,而是5种softmax.所以我们的RBM的网络如上图右边所示。每个可视单元是一个5方式的softmax,一个电影一个可视单元,你可能会担心会有18000个可视单元存在。然后我们有大约100个隐藏单元,每个隐藏单元链接着softmax的5个输出,同样的它还有一个偏置。你可以发现参数的数量是非常巨多的。对于softmax的cd算法是与二值单元一样的,就像之前说的有100个单元。我们要做的学习一个模型,然后试图填满那些消失的数据。


现在,使用这个方法来解决这个问题,我们不想要一个RBM有着18000个可视单元,而且只有一小部分是有值的。这是一个非常巨大的消失的数据量。有一个整洁的方法,对于每个用户,我们使用一个RBM,它有着和用户评级过的电影数量一样多的可视单元。所以,每个用户都可能对应一个不同的RBM,有着一个不同的子集和可视单元。现在所有的这些RBM共享同样的权重。也就是我们知道哪个电影是哪个,所以如果两个用户看同一部电影,而且评级了同一部电影,来自这个电影到这个隐藏单元的权重将会针对这两个用户来说是一样的。所以我们有着许多权重共享。非常的幸运,因为对于每个用户来说,我们只有一个训练样本。我们让具体的有着正确结构的RBM对应每一个用户,也就是可视单元正确的数量对应用户评级过的电影。现在只有一个训练样本,也就是这个评级向量,但是这50万的训练样本共享到隐藏单元的权重,所以学习算法work的很好,该模型使用cd1训练,然后过段时间使用cd3训练,然后使用cd5和cd9,那么它们的效果如何呢?


这个RBM的效果和之前的矩阵分解的方法效果一样好,不过它给出的是完全不同的错误,意思就是如果你均化RBM的预测结果和矩阵分解模型的预测结果,你得到一个很大的胜利,而冠军团队实际上使用多个不同的RBM模型,然后进行均化,而且使用了多个不同的矩阵分解模型。据Hinton所知他们使用的主要模型就是矩阵分解模型和RBM模型。



posted @ 2015-01-13 17:14  仙守  阅读(2577)  评论(0编辑  收藏  举报