lecture11-hopfiled网络与玻尔兹曼机

Hinton课程第11课 这部分的课程算是个知识背景,讲述RBM的来源吧,毕竟是按照hopfield--BM-RBM的路线过来的。

因为水平有限,都是直译,如果纠结某句话,肯定看不懂,所以这些课程只需要1、看ppt内容;2、通读下面的说明;3、自己进行理解即可。直译导致的就是感觉词不达意,而且对于水平有限的我来说,虽然直译让人看不懂,但是好歹不会因为添加自己的理解而形成误导。

这部分有个课外读物:http://www.scholarpedia.org/article/Boltzmann_machine


一、Hopfield网络

这部分将会介绍Hopfield网络。和BP一样,这也是在1980年代NN为什么会再次死灰复燃的主要原因之一。Hopfield网络是很美妙的简单的设备,可以被用来作为激活值的分布式模式的形式来存储记忆。


我们现在就来学习一个不同与前馈NN的模型,它们有时候也被称为基于能量的模型,是因为它们的属性是从一个全局能量函数中获得的。Hopfield网络是基于能量模型中最简单的一种。它由二值阈值单元和单元之间的递归连接构成的;通常来说,如果你的神经网络中有非线性单元和递归连接的话,它们是非常难以分析的。它们的行为可以有许多不同的方式:它们可以停留在一个稳定的状态;它们可以是振荡的;它们甚至可以是混乱的,就是除非你知道它们的起始状态和无限的准确推测,否则你不可能预测到很远之后的状态。

幸运的是,John Hopfield 和其他不同的研究组,比如Stephen Grossberg的研究组,发现如果连接是对称的,那么就会有一个全局能量函数。整个网络的每个二值组态都有一个能量在其中。关于二值"组态"意思就是,将二值的值赋予给网络中的每个连接,所以每个网络的组态中都有个具体的值(意思就是某个时刻上这个模型的能量值)。Hopfield发现的是:如果你在二值阈值决策规则下设置了正确的能量函数,也就是事实上会导致这个网络在能量中会有下山的操作,如果你保持这个规则,最终会处在一个能量最小的状态。


所以任何事情都是由能量函数控制的,一个组态的全局能量是一些局部贡献的和,主要的贡献是由一个连接权重和两个神经元的二值状态的积的形式组成的。所以能量函数看上去如上图中一样。

因为能量是不好的,所以低能量才是好的(意思就是求能量的最小状态),而这就是为什么前面有负号的原因(上图第一个式子),如果你看主要的项(第二项),它有一个基于两个神经元的对称连接强度的权重和这个连接两头的神经元的激活值,所以 si 是一个二值变量,它有着值为 1 或者0 ,或者说在另一种hopfield网络中他的值为 1 或者 -1。另外,这个二次项涉及到两个单元的状态,同样的还有一个只涉及到的独立单元的状态偏置项。

这个二次能量函数可以让每个单元能够局部的计算状态的改变能够引起全局能量多大的改变。所以我们先要定义能量间隔:单元 i 的能量间隔是鉴于依赖于单元 i 是否打开的整个组态(某个时刻上这个模型的能量值)的全局能量的差分(如上图最后一行)。所以能量间隔可以不饿定义成单单单元 i 打开和单元i 关闭时刻的能量的差异。而这个差异(也就是差分)就是通过二值阈值决策规则计算出来的。所以如果你看这个能量的式子,你可以进行通过关于第i个单元状态的求导了。这是个有趣的事情,因为它是二值变量;但是如果你对它进行求导,你会发现你得到了二值阈值决策规则,不过却没有负号,这是因为要在能量中下山。


所以,按照二值阈值决策规则,一个Hopfield网络会在它的全局能量中进行下山。在一个hopfield网络中找到一个能量最小的方法就是以一个随机状态作为开始,然后以随机的顺序每次更新一次这些单元。所以我们要做一个连续的更新。对于你挑选的每个单元(针对不同的单元分别计算)来说,你计算它的两个状态哪个能够得到更低的能量值,并用这个状态代替独立于之前的那个状态。这等于说你只是使用了二值阈值决策规则。

所以让我们看看上图右边的这个例子(这时候上图右边的那个只有两个1,其他都是0 而且没有红色的问号),我们以一个随机全局状态开始,这是一个很谨慎选择的随机状态(教课需要),这个模型的能量值为-3,或者说它的goodness为3,我们认为所有负能量都被称之为goodnesses。这里没有任何的偏置项,所以在计算goodness的时候,你只需要所有的单元对,也就是那些开着的单元对极其它们之间的权值。在这个组态中,只有一个单元对被激活了(两个单元都为1的),而且它们的权值为3,所以我们得到的goodness为3。

现在让我们来探索这些单元,让我们随机挑选一个,(上图右边那个有红色问号的那个),并想想,在给定所有其他单元的当前状态的情况下这个单元的状态应该是什么?所以我们观察这时候的总的输入,它得到一个 1×(-4)+0×3+0×3(就是与这个单元相关联的几个单元,通过计算它们的,然后来决定这个单元为1 还是0,只要提取同类项就可以发现),得到的总的输入为-4,这小于0 ,所以我们把它关闭,即它应该处在0的状态。


让我们来探索另一个单元。如果我们观察上图中那个有红色问号的单元(此时里面的是1 还是0 我们不知道),再一次,它的总输入为1×3+0×(-1),所以他得到的总的输入为3,所以按照二值阈值决策规则,这个单元应该打开。


让我们探索另一个单元(上图红色问号的那个单元,此时也不知道里面是1 还是0),这个单元更加的有趣了,它的输入为1×2+1×(-1)+0×3+0×(-1),所以它的总的输入为1,所以这个单元应该打开,之前它是关闭的。所以当这个单元打开的时候,这个全局能量就改变了。

我们现在有着一个等于-4(之前是3)的全局能量,或者说goodness为4,这是一个局部能量最小,如果你试图探索下其他的单元,你会发现它们不会去改变它们当前的状态。接下来要做的就是稳定到一个最小值。


然而,它稳定的最小值不是最深层的能量最小(也就是说不是全局最小,是局部最小),它只是这个网络所拥有的两个最小之一,最深层的能量最小如上图右边的网络所示,另一个单元三角中互相支撑的单元都是开的(个人:这里就是两个三角形,上面用-4的线连接两个三角形,这里说的就是右边那个三角形中的三个单元都是1),有着goodness为3+3+-1等于5,所以有着轻微的比之前的能量最小要好。如果观察这个网络,你可以发现这个网络是有两个单元三角形组成的,这其中的单元都是互相支撑的(所以才形成三角形),尽管在底部有些不同(左边的三角形底部是0和1,右边的三角形底部是1 和1)。而且这两个三角形差不多是讨厌另一个三角形的,因为顶部的连接为-4。

左边的三角形不同于右边的三角形在于一个的权值为2,而右边的为3.所以右边的三角形可以得到最深的最小值。


所以如果你说,为什么这个决策需要.在hopfield网络中是连续的?问题在于如果单元都是同时决策的,它们可能会互相的想它们在使用能量(字面翻译的,所以听起来怪怪的,意思就是同时决策可能会导致整体能量的上升而不是下降,就像cg原理一样,搞定一个在搞定另一个)但是事实上这个能量却在上升。

使用同时并行更新的时候,我们会造成混乱,这总会有个为2的周期。

看上图右边,这里是一个小网络,这里的两个单元有偏置为+5,和它们之间的权值为-100.所以当两个单元都关闭的时候,那么在下一步并行步骤的时候,如果我们将两个单元同时进行更新,就会将两个单元都同时打开,因为两个单元都觉得自己打开可以通过自己的偏置项来改善事情。但是一旦你这么做了,你得到的值为-100,并且实际上是让事情变得更加的糟糕了。所以在下一个并行步骤的时候,两个单元又会再次的一起关闭。

如果我们是通过随机时机来以并行的方式来更新的话,换句话说,我们不会说在考虑下一个更新之前去需要等待这个更新的状态并传递给其他单元,而是我们在基于给定单元的更新之间的时间长度是随机的。所以这样的随机时机会通常毁去(字幕为bi-phase,不过觉得是不是字幕错了,所以省略这个单词不译)这些振荡。这也就是说更新必须是顺序的这样的想法看上去不是和从一个生物学角度那样的糟糕。


现在,hopfield建议的是我们可以使用这种基于能量的模型来解决为了存储记忆的能量的最小值。所以我们有一篇非常具有影响力的论文,发表于1982年,这里面提到记忆可以是一个具有对称权重的nn的能量最小状态。二值阈值决策规则可以获得部分记忆,并在完整记忆中清除它们。所以记忆可以被部分错误所损坏,或者部分可以只是未决定的,而且我们可以使用这个网络去填写这个记忆。

记忆是能量最小值的想法可以追溯到很久以前,第一个所知的例子是一本被称为“Principles of LiteraryCriticism”,由I.A.richards写的,他提出了就像一个大水晶,可以有着不同的面一样。

使用能量最小来表达记忆可以得到一个内容上可处理的记忆,就像Hopfield认为的那样。所以你可以通过获知内容的部分信息来访问其中的一项,Hinton可以告诉我们一些可以在网络中设置许多神经元状态的特性。如果我们以随机状态来安放其他的神经元,,并且现在就应用二值阈值规则。好运的话,我们可以感觉到一些记忆被变成了许多我们已知的存储项。当1982年Hopfield网络被提出的时候,有着一些非常有趣的特性。1982年也是拥有google的16年前,现在我们有google了,我们认为这看上去很完美。另一个Hopfield网络的特性是生物学上的兴趣,是它们在应对硬件损坏上的鲁棒性。你可以移除网络中的一些单元,不像你的电脑的中央处理器一样,任何事情还是能够很好的工作。心里学家对这种记忆有着一个很好的见解:这就像是从化石中重现一只恐龙一样,因为你知道一些有关这些化石如何能够很好匹配的信息,所以网络中的权重给我们一些关于神经元状态如何一起匹配的信息。现在给定一个新的神经元的状态下,就可以填充出整个状态去复原整个记忆。


在Hopfield网络中存储记忆的规则是非常简单的。想法就是,如果我们使用1 和-1的激活值,那么我们可以通过将它们的激活值的乘积作为递增任意两个单元之间的权值来存储一个二值状态向量。所以这是很简单的规则,在上图右边第一个式子。一个有关这个规则的美好的事情是,你只需要将数据穿过一次那么工作就结束了,所以这真的是天才的在线规则,这是因为它不是误差驱动的(现在的模型是误差驱动的)。你不需要将预测的结果与正确的结果做对比,并做微小的调整。事实上它不是一个误差修正规则,它是同时具有强度和弱度。也就是说它可以是在线的,但是同样也不是一个存储记忆的有效的方法。我们同样可以有偏置,像往常一样,我们将这些偏置视为一个永久单元上的权值。如果你想使用0 和1作为单元的状态,(稍后会介绍),更新规则只是稍微的更加复杂罢了。

二、在Hopfield网络中处理伪最小

在这部分中,价格会介绍Hopfield网络的存储能力。它们存储许多记忆的能力受到被称之为伪记忆的限制,当两个附近的能量最小值结合成在错误空间中一个新的最小值的时候,就会发生这种事情。试图移除这些伪最小的结果会让网络能够比基本的Hopfield网络学到更复杂的事物。在这部分的最后,会介绍一个关键性的历史性的重新发现,即物理学家试图增大Hopfield网络的能力,重新发现感知机收敛的过程。


发明的Hopfield网络本是作为记忆存储设备的。而且由于Hopfield网络的存储能力而被大家所痴迷。对一个完全连接网络使用Hopfield网络存储规则,它的存储能力大约是0.15N 记忆。也就是说,如果你有N个二值阈值单元,在产生一个网络混乱之前,你所能存储记忆的数量是0.15N。所以你所能存储的数量和并且还希望能够明智的检索它们。每个记忆都是这N个单元的一个随机组态(个人:这里就相当于说总的集合的每个子集一样),所以它有N位的信息。所以总的在一个Hopfield网络中存储的信息大约是0.15N平方位;看得出来,这并不能有效的使用这些位数,因为他们需要存储权重。换句话说,如果你观察计算机用多少位去存储这些权重,它会使用超过0.15N平方位数去存储这些权重。因此,计算机中这种分布式记忆和局部能量最小不能有效的使用这些位数。我们可以分析如果我们想要有效的使用计算机中这些位数的情况下,多少位数可以用来存储。

这些有着N个平方的权重和偏置:在存储M个记忆之后,每个连接权重会有介于【-M,M】之间的一个整数值,这是因为我们每次通过1增加或者通过1减少来存储一个记忆,假设我们使用的状态就是-1和1。当然不是所有的值都等概率的,所以我们会压缩这些信息。但是先不管它们,在以一种最简单的方式去存储一个连接权重的位数是log (2M+1),因为交替连接权重的基数是2。所以我们使用的计算机存储的总的位数是 N^2*(log(2M+1)) ,注意到这里的log是随着M变化的。然而,如果你以Hopfield建议的方法来存储的话,你会得到一个常量0.15,而不是以log来变化。我们担心的不是这个常量远小于2,而是log对数的缩放变化。这说明我们应该去做一些事情让结果更好。


如果我们说,是什么限制了Hopfield网络的能力?是什么让这个网络失败了,那么是它的不同的能力最小的合并。所以每一次我们存储一个二值组态,我们希望我们可以生成一个新的能量最小,所以我们需要一个对于所有网络状态的一个状态空间能够被水平的描述出来(上图第一个蓝绿曲线),而能量以垂直方向来表示(其实就是个二维图说明)。这样的话我们就得到一个在蓝色模式上有个能量最小,另一个在绿色模式上。但是如果两个模式是相近的,而且我们没法得到两个分离的最小值,那么会发生什么事情。它们会在中间位置上合并成一个新的最小。这意味着我们不能区分这两个分离的记忆,的确我们会召回一些东西,也就是它们的混合物而不是独立的记忆。这就是限制一个Hopfield网络的能力的东西,也就是这种近邻最小值的融合。这里需要提到的一件事就是上图中的所画的图是一个很大的误导。一个Hopfield的状态是涉及到一个超立方体的角的。而且它不是很好图示出来,这个超立方体的角在这里是一个连续的一维水平空间。


一个关于如何改善Hopfield网络的波峰的非常有趣的想法是遗忘(unlearning)。这是由Hopfield,Feinstein,Palmer等首次提出的,他们认为应该按照以下策略:通过一个随机初始状态来设置一个网络,然后进行遗忘,也就是不管二值状态会怎样,你需要使用相反的存储规则。Hinton认为按照之前的例子,对于那个红色合并的最小值,如果你让网络稳定在那里,并且在那个合并最小值上进行遗忘,你可以往回的得到两个分离的最小值,因为你将这个红点往上拉高了。所以通过避免深度伪最小,我们事实上可以提高记忆存储能力。Hopfield,Feinstein,和Palmer的实验表明这的确有效,但是他们却没法进行很好的分析为什么会这样。

Francis Crick,DNA结构的发现者之一,和Graham Micherson 提出了遗忘有可能是在REM沉睡的时候发生的事情,也就是快速眼睛移动沉睡(rapid eye movement sleep)。所以这个想法的意思就是说在一天中,你存储了很多东西,然后得到了一个伪最小,然后在晚上的时候,你将这个网络放置在一个随机状态,你会稳定在一个最小值状态,并且你遗忘了你稳定的状态。这事实上解释了一个很大的困惑,不过也没有疑惑住那些研究睡眠的人们。每到晚上,你去睡觉,然后做几个小时的梦。当你早上醒来的时候,这些梦就消失了。不过他们却不是全都消失了。在你醒来之前的梦,你可以有个短期的记忆,并且你可以记住一段时间。如果你想想它们的话,你也许会记住很长一段时间。但是我们知道,如果我们在晚上的另一个时间上醒来的话,你会有其他的梦,而在早上它们就不在那里了。所以简单的说这就像你没有存储你梦到的东西,那么问题来了,为什么?事实上,为什么你完全不会被梦所干扰(个人:这里的意思就是晚上做的梦完全不影响正常的想法)。梦是自相矛盾的,而且你大脑存储的状态看上去极度的像你醒来的时候存储的状态,它不是被真正的输入所推动,它是被一个实际输入之后被称之为丘脑的继电器所推动。。所以Crick和Mitchisoin的理论至少功能上的解释了梦是什么,如何避免伪最小。

但是随着遗忘的另一个问题就是,哪个更具数学性和我们应该有多大程度上的遗忘?现在,介绍下目前为止学校学不到的东西:一个真正的解决这个问题的答案是遗忘是用模型拟合数据的过程中的一部分。而且如果你用最大似然来拟合这个模型的话,那么遗忘会自动跳出来并拟合到这个模型中。更多的,你会准确的指导你需要遗忘的程度是多少。所以我们要做的是从学习上获得正确的方法去最小化一个损失函数。这里的损失函数是你的NN模型在这一天中你所见的数据上建模的程度。


这里先介绍下,那些物理学家发现的如何让Hopfield网络提升能力的方法。正如之前说的,这是这领域的一大着迷的地方。Hinton认为这是因为物理学家真的喜欢这个idea,在基于他们所知道的数学的基础上可以解释大脑如何工作的。也就意味着那些博士后在物理学领域找不到工作或许可以转战神经科学。所以有着非常大量的论文在物理期刊上刊出关于Hopfield和他们的存储能力。最终,一个非常聪明的学生叫Elizabeth Gardner,指出如果你关心存储能力的话,事实上有个更好的存储规则,而且可以使用权重的全部能力。Hinton认为这个存储规则我们很熟悉。

不去试图在one shot中存储向量,而是循环通过训练集很多次,所以我们丢失了我们漂亮的在线属性,也就是只穿过数据一次。但是得到的,却是我们得到更多有效的存储。我们所要做的就是使用感知机收敛过程去训练每个单元使得在给定所有其他单元的存储状态情况下 有个正确的状态,即我们想要存储的全局向量。所以在你的网络中,你将它放在你想要存储的记忆状态下,然后你独立的考虑每个单元,然后观察在给定其他所有单元的状态下,这个单元适应我想要的状态吗?如果是的话,你就不管它引入的权值(输入到这个单元的权值,毕竟输入控制住了,输出就决定了);如果不是的话,你就将他的引入权值通过感知机收敛过程中去修改这些权重。注意到这些应该是整数性的改动。

你也许需要做好几次,当然如果你需要太多的记忆,那么这就不会收敛了,你只能通过一个感知机收敛过程来得到收敛。但是假设有更多有效的方法在Hopfield网络中去存储记忆,这个技术被另一个领域,统计 所提出,而且统计学者称这个技术为pseudo-likehood(伪似然)。这个想法是在给定所有其他事物的情况下得到一个正确的事物。所以随着高维度数据,如果你想要建立一个模型,那么你建立这个模型的想法就是在给定所有其他维度的基础上让这个维度上的数据正确的(很像cg算法)。介于正常的感知机收敛过程和伪似然之间的主要的不同是 在Hopfield网络中,权重是对称的,所以我们会得到两个关于每个权重的的梯度集合并且需要求平均。但是不同于它们,使用Hopfield网络的全部能力的方式是使用感知机收敛过程并且穿过数据好几次。

三、带有隐藏单元的Hopfield网络

在这部分,会介绍一个非常不同的方法去使用Hopfield的能量函数。会增加一些隐藏单元到这个网络中,我们要做的就是让这些隐藏单元的状态表现出一个在可视单元层上感知机输入的解释,所以想法就是介于单元之间的权重代表了在很好的解释上的限制。通过寻找一个低能量状态,我们发现一个有关输入数据的很好的解释。


Hopfield网络结合了两个想法,一个是你可以通过使用一个对称连接二值阈值单元网络来发现一个局部能量最小,另一个就是这些局部能量最小也许是对应于记忆的。有一种不同的方法去使用这种能力去找到局部最小,不通过使用这个网络去存储记忆,我们可以使用它去构建有关感知输入的解释。也就是当我们有了由一些可视单元表示的输入的情况下,我们可以通过一个隐藏单元集合来建立一个有关输入的解释。所以这个输入的解释或者说明是基于这些隐藏单元的一个二值组态。整个系统的能量可以表示这个解释的badness(相对于上面提到的goodness)。所以为了依据我们当前的模型得到好的解释,我们需要找到在给定由可视单元表示的输入基础上的隐藏单元的低能量状态。


这里是一个例子,使得这个想法更清晰。为了得到这个例子,需要先一些细节说明,关于当你在一个图像中看见一个2D线条的时候可以推测到什么?并告诉你有关3维世界的一些东西。所以图像中的一个2D线条可以有世界中许多不同的3维边缘所生成。如果上图中的那个蓝色的点是你的眼球,两条红线是你的视野范围,其中的黑线是一个可能的3d边界,可能会导致在你的视网膜上生成一个2维线条。所有的这些不同的3d边缘在图像中都有着准确的相同的外形。因为我们丢失了一些有关线条的端点沿着视野上的距离的信息,即我们知道它们是沿着视野线的,但是却不知道它们的深度。所以如果我们假设世界中的一个笔直的3d边缘是导致图像中一个笔直的2d线条的原因,那么我们就丢失了3d边缘的两个自由度信息:两个点上的深度。所以相对于同一条2d线条来说,是一个完整的3d边缘家族。你只能一次看见一条3d边缘,是因为它们相互之间都是以这种方式得到的。

所以现在我们可以去了解一些我们接下来可以做的事情,如果你理解了上面说的,那么就可以找到一个二值单元网络的低能量状态,有助于找到感知输入的解释。(其实就是从图中推测三维场景,需要较好的几何想象能力即可知道上面说的是什么)


这里是一个例子,想象我们看见一个线条,并且我们想要按照一个3维的情况来解释它。所以我们首先拥有的数据就是一群2d线条,就像上图中显示的那样(上图中下面的2-dlines 及下面的立方体,不算上面的部分)。对于每个可能的线条来说,我们会在上面设置一个神经元。无需担心现在所说的和事实不符,即不止上图中那点神经元,而是需要超多的神经元。所以对于每个可能的2d线条来说,我们有一个神经元。在任何一张图片中,只有一小撮子集被表示,所以我们只需要激活这些神经元的一小撮子集。所以,在上图中的两个边缘来说,激活了两个神经元。这些神经元是表示2d线条的,它们就是数据。

现在,我们接下来要做的就是在拥有一群3d线单元的基础上,对于每个可能的3d线条或者3d边缘来说。每个2d线条单元是许多不同的可能的3d线条的投影。因此我们需要让2d线条单元在所有的这些3d线条上兴奋起来,但是我们同样需要让所有的单元与其他的产生竞争,因为你只能一次看见它们一个。

(上图两条竖的单元的右边那排)这就是一个例子,这里有着一堆3d线条单元,这个绿色的连接是来自2d线条单元的兴奋连接,所有的权值都相等,也就是说,如果这个线单元被激活,那么就将所有的上面的单元激活。另外,我们需要基于它们之间的竞争,以至于只有一个是激活的,这也是红线连接表示的意义。我们对每个2d线条都这样操作。这里只显示了两个被激活的2d线条。(个人;其实也就是说给出一个图片,当然是2维的,其中的神经元表示所看到的线条,然后上面的是3d维度中的线条,也就是接着找这个2d线条是真实世界中哪个3d线条引起的)再一次,无需担心事实上的需要无穷个单元的问题。现在,这个故事还没完全结束。我们现在将之前说的投影的信息连线到NN中去,即NN中的绿色和红色连接表示每个2d线条可以交叉于许多3d边缘,但是一次只有一个是激活的。但是现在我们知道3d边缘是如何连接的。例如,当我们看见两条2d线条在图中连接的时候,我们会思考它们相对于边缘来说,在交叉点上有着同样的深度。

所以让我们假设这两个3d边缘,上图中绿色双箭头连接的两个3d线条在它们的2d线条联合的点上有着相同的深度,这也就是说它们可以互相的支撑。不过不需要像那样,你可以有一个非常有趣的观点:假设两条线有着不同的深度,但是从某个viewpoint上你的视网膜上刚好呈现出它们重合,这非常的不好。所以我们需要使用这样一个事实:我们期望在图中 重合的2d线条的对应的3d边缘在那个点上有着相同的深度。所以我们会设置许多像那样的连接。但是有个更强的事实是,我们可以使用的是在我们的三维世界中,我们期望3d边缘可以在一个正确的角度相连接,所以对于两条具体的3d边缘来说,它们在深度上达成协议并且在一个正确的角度上相连接,我们会设置一个具体的强连接(上图中粗的双头绿线)。所以设置许多像这样的连接,我们就能指明我们期望的3d边界一起可以形成一个连贯的3d对象。现在我们有个一网络,包含着关于边缘在世界中如何走向一起的和边缘如何投影到图中的二维线的信息,所以如果我们给出一个图的这种网络,它就可以得到一个这幅图的解释。而上图,是两个相当不同的解释。被称之为Necker 立方体,如果你观察的足够久,你就可以在深度上让它进行翻转。这个网络有两个相当相等的深度能量最小值,对应于这个Necker立方体的两个解释。记得这些都只是一个分析,为了让你理解使用低能量状态来作为数据的解释的原理。为了事实上建立一个合适的模型关于当Necker立方体翻转的时候会发生什么是比这还复杂的。


所以如果我们觉得使用低能量状态来表示好的解释,那么我们就有两个问题:1、搜索,会在下面介绍;搜索问题就是,如何避免让隐藏单元陷入能量函数的poor局部最小。这个poor最小表示在给定我们的当前模型和模型的权值的情况下的子最优。我们能够做一些比从随机初始状态开始简单的在能量中采取下山操作更好的操作吗?;

2、第二个问题更加的困难,关于如何在基于隐藏单元的连接上和基于隐藏单元与可视单元之间的连接上学习权值。有简单的调整所有权值的学习算法从而得到有意义的感知解释吗?注意到我们这里没有有监督学习。我们只是具有输入,然后我们想要建立在隐藏单元中成吨的激活来表示有意义解释。这看上去像一个相当间距的任务。

四、使用随机单元来改善搜索

这部分将会介绍增加的噪音有助于系统摆脱局部最小。并且介绍在Hopfield网络中用一种合适的方法来增加噪音。


这里介绍通过使用噪音得到更好的最小值的idea。Hopfield网络总是会做出让减小能量的决策,如果它不改变单元的状态,那么能量就会一直保持那个状态。这也是的想要在一个局部最小上爬出来(下山操作的相反操作)变得不可能。所以如果你观察上图的下面那个曲线图。如果我们处在局部最小值A,那么我们就没法跳过这个最小值去找到另一个更好的最小值B,因为我们没法在能量中采取上山操作。

如果我们增加了一些随机噪音,我们可以从这一一个poor最小上逃脱出来,特别是这个最小值还很浅,也就是在这个最小值周围没有多大的能量障碍阻碍着。不使用一个固定的噪音等级,结果显示最有效的策略就是以许多噪音作为初始化,这些噪音能够让你以粗尺度的探索这个空间并找到通常来说这个空间的一个很好的区域,然后降低噪音的等级。有着许多的噪音,你可以穿过大的障碍。随着你降低噪音的等级,你开始聚焦于最好的附近的最小值。如果你很缓慢的减小噪音,这个系统会最后落在一个深度最小,这也被称之为模拟退火。正如这个idea的意思,是Kirkpatrick与Hopfield同一时期被提出的。


模拟退火的原理是与温度密切相关的,在一个物理系统中,或者一个有着能量函数的模拟系统中,温度影响着这个转移概率。所以在一个高温度系统中,从上图中的一个曲线来说,从B到A的这样一个上山操作的概率是低于从A到B的下山操作的概率的,不过也不是很低。实际上,温度扁平了这个能量格局。这里小黑点就是代表粒子,我们想象的就是这些粒子按照转移概率进行移动,从而得到一个能量函数和温度值。这是一个典型的分布,如果你的系统处在一个高温度情况下,也就是 它很容易穿过这些障碍,但是同样的一旦你处在一个深度最小 也很难保持稳定。

如果你的系统处在一个相对较低的温度下,那么你的穿过障碍的概率就会变得很小很小,但是你的ratio(就是开始的0.2与0.1到现在有着1000倍的比例)会变得更好。所以从A到B的概率与从B到A的概率两者的比例在一个低温度系统中是更好的。所以如果我们运行的足够长时间,我们可以期望所有的粒子最后都能稳定在B上。但是如果我们在低温度状态下运行一段长时间,那么就需要花费非常长的时间让粒子从A处逃脱。结果显示一个很好的权衡就是先以高温度初始化,然后逐渐的减少温度。

让在Hopfield网络中拥有噪音的方法是通过二值随机单元来替换这些二值阈值单元,然后让偏置随机决策。噪音的数量是由被称之为温度的控制的。提高噪音的等级就相当于减少介于组态之间的所有能量间隔。上图就是一个通常使用的logsitic等式,但是这个能量间隙的缩放因子是温度。如果温度非常高,那么这个指数就大约等于0,所以等号右边就是为(1/(1+1))=0.5。所以这个单元被打开的概率就差不多是0.5了。它会处在开或者关闭的状态,不过差不多应该是关闭的。随着我们降低温度,按照deltaE的符号来说,这个单元会变得越来越趋向于打开,或者越来越趋向于关闭;当到了0温度的时候,就是我们在Hopfield网络中使用的地方,这个deltaE的符号决定着等号右边趋向于0或者趋向于1.。但是在T= 0的时候,它就等于0 或者1,这个单元就会具有决策性,而且变成了一个二值阈值单元。当最低能量的时候,不论这两个状态是什么,它总会适应的。

所以在之前看到的能量间隔(上图最后一行),它是整个系统基于单元I 是打开还是关闭的能量之差。


尽管模拟退火是一个非常有力的方法去提升搜索,特别是当我们陷入局部最优的时候。

尽管它是受到Terry Sejnowski和Hinton的影响成为了玻尔兹曼机背后的原理支撑部分,它实际上是关于理解玻尔兹曼机的一个巨大的误解。所以在这个课程中不会去介绍它,即使是它是一个非常有趣的idea。

从现在开始,Hinton通过使用二值随机单元,其中的温度是1,也就是它是一个在能量间隔中的标准的logsitic函数。


在理解玻尔兹曼机的学习过程中一个你需要知道的概念是热平衡概念。因为我们设置温度为1,也就是在一个固定温度下的热平衡的概念。

这是一个困难的概念,大多数人认为这意味着系统是趋于稳定而且不会再改变的。这也是通常热平衡的意思,但是这不是代表那些稳定下来的独立单元的状态。这些独立的单元仍然在热平衡周围盘旋,而且小于温度0。趋于稳定的是基于组态的概率分布。你第一次听说这概念的时候是觉得很难理解的,所以这里会举个例子。概率分布稳定到一个具体的分布被称之为Stationary Distribution,(稳定分布)。这个稳定分布是有系统的能量函数决定的。而且事实上,在这个稳定分布中,任何组态的概率是正比于它的每个负能量的。

一个很好的直观的去考虑这个热平衡的方法是想象一个巨大的相同系统的集合(很多相同系统组合而成),其中每个系统都有相同的能量函数,也即是想象一大群随机Hopfield网络,它们都有着相同的权值。在这个巨大的集合中,我们可以定义组态的概率作为在这个组态中这些系统的部分。


所以现在我们可以理解当我们接近热平衡的时候会发生什么了。我们可以以任何我们想要的分布在所有的这些相同的系统上来初始化,我们让它们都处在相同的组态上,所以这也是有着组态上为1,而其他上为0的属性的分布。或者我们可以在每个可能的组态中有着相等数量的系统。所以这就是一个均匀分布,然后一直使用随机更新规则。在一个随机Hopfield网络中,这意味着你挑选一个单元,然后观察它的能量间隔,然后你做出在基于这个能量间隔上是否打开还是关闭的一个随机决策。然后挑选另一个单元,然后同样的操作。

一直使用这个随机规则,在以正确的方式来随机的运行这个系统之后,最后会达到一个状态:在每个组态中这个系统的部分一直是保持不变。事实上,这也就是在有着对称连接的情况下会发生的事情,即稳定分布,被物理学家称之为热平衡。任在何给定的系统,一直改变它的组态,通过使用更新规则,它的单元的状态会一直在0 与1之间翻转。但是在任何具体的组态中这个系统的部分却不会改变,这是因为我们有着远比我们拥有的组态数量要多的系统。


这是一个类比,有助于我们理解这个概念。想象在Las Vegas中有一个非常大的赌场,有着许多的荷官,而且我们有着超过52阶乘的荷官。在开始的时候,让所有的扑克牌以标准顺序打包,然后假设有黑桃A,黑桃K和黑桃Q,然后荷官开始洗牌,他们是随机洗牌的,他们的洗牌方式不会让牌都再一次(只有初始的时候相同)有着相同的顺序。在洗牌之后,仍然有机会使得在任何打包中黑桃K的下一个是黑桃Q。所以这个打包还是没有忘记它们是从哪里开始的信息。它们的初始化顺序仍然影响它们当前的顺序,如果我们一直洗牌,最后初始化顺序会变得无关紧要。这个打包就会忘记它们从哪开始的。在这个例子中,事实上,它们在这52!可能的顺序中每个顺序上都有着相同数量的打包(个人:就是在每个可能的排序上洗牌的次数相同,这里说的应该是概率)。一旦这样发生了(个人:也就是达到平衡了),如果我们接着洗牌,那么仍然在这52!顺序中每个顺序上还是有着相同数量的打包,这也就是为什么被称之为平衡的原因,因为在任何一个组态中的每个部分都没有改变,即使这些独立的系统仍然还在改变。

这个类比的一个错误在于一旦我们达到了平衡,所有的就有相同的能量,所以它们都有着相同的概率。通常来说,我们感兴趣于那些有着比其他更低能量结构的系统达到平衡。

五、玻尔兹曼机如何对数据进行建模

在这部分将会介绍玻尔兹曼机如何对二值数据向量进行建模。首先介绍为什么我们想要对二值数据向量集合进行建模,和如果我们有着这么一个模型我们该做什么?然后说明指派给二值数据向量的概率都是由玻尔兹曼机中的权重决定的。


有着隐藏单元的随机Hopfield网络,也被称之为玻尔兹曼机,是擅长于对二值数据向量进行建模的。给定一个二值训练数据向量集合,它们可以用隐藏单元来将模型去拟合每个可能的二值向量的概率。这里介绍几个原因,为什么你可以这么干。例如,如果你有几个不同的二值向量的分布,你可以得到一个新的二值向量,然后决定这个向量来自于哪个分布。所以你会有几个不同的文档,而且你需要用一些二值特征向量来表示这些文档,这些向量是用来说明在这些文档中是否有某个具体的单词出现的频率超过1(个人:参考BoW模型),对于不同类型的文档,你也许会得到不同的单词,也许你会发现在单词之间有着不同的相关性,所以你可以使用隐藏单元集合去对每个文档的分布进行建模。然后你可以挑选那些最可能的文档,然后你可以使用一个具有某个具体类别标签的测试文档,通过观察生成的二值向量来得知哪个类别最与这个测试文档相似。你同样可以使用玻尔兹曼机监视复杂系统去检测异常行为。假设你有一个核电站,所有的信号都是二值的,所以你得到了一群二值数字,可以用来告诉你核电站的状态,你想要做的就是注意它们是否处在一个异常状态下,一个你之前从来没看过的状态。而且你不想使用监督学习来干这事情(个人:估计没那么多标签和可用数据)因为你没有任何的坏结果状态的例子,你希望检测那些你之前没看过的状态,也就是异常检测。你可以通过建立一个正常状态的模型然后注意哪些不同于正常状态的状态。如果你几个不同的分布的模型,你可以完成后验概率,即通过使用bayes理论在基于观测的数据的基础上得到的一个具体的分布。如上图的式子,给定观测的数据,从模型 I 中的概率是(上图中式子的左边),基于假设它来自于你众多模型中的一个模型,等于模型 I 生成这些数据的概率除以所有的模型的这样的概率的和。

 

这里介绍两种在具体的二值向量中生成数据模型的方法。最自然的生成一个二值向量的方法就是首先生成一些潜在变量的状态,然后使用这些潜在变量去生成二值向量。所以在一个因果(causal)模型中,我们使用两个连续的步骤。(上图中第一行的两个0 1单元)这是一些潜在变量,或者说是隐藏单元,首先,我们从他们的先验分布中得到这些潜在变量的状态。通常在这个因果模型中,它们是独立于先验的。所以如果他们是二值潜在变量,它们打开的概率只是依赖于一些它们各自拥有的偏置。然后一旦我们得到了这些单元的状态,我们使用这些通过使用模型中的权重化的连接去生成可视单元的状态(上图中的101 三个可是单元)。所以这是一种NN、因果、生成模型。它使用逻辑单元并且使用隐藏单元的偏置和基于隐藏与可视之间的连接上的权重 去对每个可能的可视化的向量指派一个概率。

生成一个具体向量 V 的的概率是所有生成这些隐藏状态的概率的可能隐藏状态的概率(这里就是这么长的句子,其实就是上图中最下面的那个式子)乘以在给定已经生成隐藏状态下生成 v 的概率的和。所以这是一个因果模型,例如,因子分析就是一个使用连续值的因果模型。这可能就是最自然的生成数据的方法,事实上,当许多人说生成模型的时候,就是说像这样的因果模型,只不过是一种完全不同的模型。(个人:本质上是因果模型,表现的是不同模型)。


一个玻尔兹曼机是一个基于能量的模型,在这种模型中,你不能因果式的生成数据。

它不是一个因果生成模型;相反,任何事情都是以可视单元和隐藏单元的联合结构的能量来定义的;有两种关于一个联合结构的能量映射到它的概率的方式:你可以简单的定义概率为一个基于可视和隐藏单元的联合结构的概率,正比与上图中那个指数部分。或者你可以过程化的定义它:我们将这个概率作为在寻找在我们更新所有的随机二值单元足够长时间后达到的热平衡之后的那种状态的网络的概率。好消息是这两个方法可以达成一致。


一个关于可视化和隐藏单元的联合结构的能量有五项,(上图中5个项)。所以这里通过使用负能量来说明,这联合结构(v,h)的负能量如上图等式左边所示,等号右边vi 表示 向量v 中第i 个单元的二值状态,而bk就是第k个隐藏单元的偏置,这就是这前两项。然后有着可视-可视交互(第三项),为了避免计算两次,通过让 i < j 来避免,这样可以避免自我相乘和乘了两次,所以我们没有在前面加上一个 1/2 。然后就是第四项,可视-隐藏交互,其中的wik就是介于它们之间的权值,。。。。


所以这种使用能量来定义概率的方法是(上图右边的一个联合概率),下面的是为了归一化的才求和的,归一化项也叫做配分函数,这是物理学家这么叫的。注意到它有许多指数项。

为了得到一个可视化单元的结构的概率,我么需要将所有基于隐藏单元的可能的结构加起来,就得到了上图中右边下面那个概率。


这里是一个例子,关于我们如何计算不不同的可视化向量的概率,因为这会让你思路更清晰。直接说公式是很好的,但是Hinton发现当逐步计算的时候可以更好的理解。所以让我们假设一个有着两个隐藏单元和两个可视单元的网络(上图那个网络),这里先忽略偏置,所以只有3条权重。为了让事情变得更简单,这里就不将可视单元互相连接了(个人:突然忘了这里说的是BM,而非RBM,所以隐藏单元之间可以有连接的)。所以第一件事就是写下所有的可能状态结果,以四种颜色 写四遍,因为对于可视单元的每个状态来说,隐藏单元有四种状态。所以得到了上图的第二列 (h),所以就有着16个可能的联合结构。现在对于每个联合结构来说,都进行计算他们的负能量:所以观察这个表的第一行,所有的单元都是打开的,结构的负能量等于+2-1+1 = +2,按照这样计算完所有的16个结构的负能量,然后对它们取幂,这样就得到了非归一化的概率,上图第四列就是非归一化的结构的概率,它们的概率与这个是成正比的,求和结果为39.7,那么进行归一化结果就得到了第五列。现在如果我们想要一个具体的可视层的结构的概率,那就将基于所有不同的隐藏单元的概率加起来,得到了最后一列。


现在,那么当网络比上面那个例子还大的时候,如何从模型中采样呢。明显的,在我们刚刚计算的网络中,我们可以找出每个事件的概率,因为它是很小的网络;但是当网络变大的时候,我们没法使用这些指数级别的大计算。

所以如果有较多的隐藏单元,我们事实上不能计算那个配分函数,因为在里面有太多的项了,但是我们可以使用马尔可夫链蒙特卡罗方法去从一个随机全局结构初始化模型中采样,然后随机挑选单元和基于他们的能量间隔来随机更新它们,这些能量间隔是有网络中所有的其他单元的状态决定的。

如果我们一直这么操作指导马尔可夫链达到了他的稳定分布,然后就可以从这个模型中进行采样了(所以采用kcd进行不断的采样让模型稳定下来),采样的概率是有关于它的玻尔兹曼分布的能量的,也就是这个采样的概率是正比于它们的负能量的。


当给定数据向量的基础上,从基于隐藏结构的后验分布中得到采样。结果显示我们需要学习。

所以可能的隐藏结构的数量再一次是指数级的,所以我们需要使用马尔可夫链蒙特卡罗(MCMC),这和从模型中进行采样是一样的,除了我们需要一直让可视单元逼近到给定的数据向量上。所以我们只更新隐藏单元。

我们需要从给定一个数据向量的基础上的后验分布上进行采样的原因是 我们想要知道对于观察到的数据的一个很好的说明,而且我们想要让我们的行为是基于良好的说明的,不过我们同样知道这需要学习(learning)。




posted @ 2014-12-22 14:27  仙守  阅读(1768)  评论(1编辑  收藏  举报