lecture13-BP算法的讨论和置信网

这是HInton课程第13课,这一课有两篇论文可以作为课外读物《Connectionist learning of belief networks》和《The wake-sleep algorithm for unsupervised neural networks》,(下文中采样和样本是同一个单词,泛化和生成是同一个单词,我是按照自己的理解在不同的上下文中进行不同的翻译,如果一个理解不通,可以换另一个)。

一、BP算法的Ups和downs

在这部分,将会介绍BP的历史,先介绍在70和80年代它的来源,然后介绍为什么在90年代它失败了,也就是为什么严谨的机器学习研究放弃了它。有一个流行的观点关于为什么这会发生,而且现在我们可以说这个主流观点是错的,真正被放弃的原因是因为当时的计算机太慢了,而数据集也很小。这里会通过介绍简短的文档来进行总结。在1995年两个机器学习研究者之间有个赌注,关于人们相信什么和他们错在哪里了。


BP在70和80年代被独立的发明了好几次,在60年代后期Bryson和Ho随着控制原理发明了BP的线性版本。Paul Werbos听了他们的课,然后发现其实这个可以是非线性的,在1974年他的论文中,他公开了第一个BP合适的版本。Rumelhart和Williams和Hinton在1981年没了解到Paul Werbos的工作的时候也发明了这个方法,不过他们试过了,发现第一次结果不是那么理想,所以他们放弃了。在1985年David Parker 再一次发明了,同年LeCun也发明了一次,同样的在1985年,Hinton回去再试了一次,然后发现其实这个效果还是挺好的。在1986年,他们用一个真实的令人信服的例子来说明该方法可以做的事情,并发表了论文。结果显示BP在学习有着非线性特征检测器的多层上有着很好的前景。不过还是没有像前景想象的那么好,在1990年后期,大多数严谨的研究者开始放弃BP算法。例如在David Mukai的笔记中,他几乎没提到BP,不过对于心理学模型来说,仍然被心理学家广泛的使用着,同样的广泛用在实际的应用中,例如信用卡欺诈检测。不过在机器学习中人们认为它已经被SVM取代了。


主流的解释在90年代后期BP上发生的事情是它没法利用多层和非线性特征,这在卷积网络中站不住脚,不过通常来说,在多层隐藏层的情况下,人们没法使用BP来训练前馈NN来做一些令人印象深刻的事情,除了一些toy的样本。同样的BP在递归(recurrent)NN和深度自动编码器(Deep ae)中不work,这将会在后面介绍。RNN也许是它最兴奋的地方了,所以才成为了最令人失望的地方,因为人们没法让该网络work的很好。通过对比,SVM却work的很好,他们不需要许多的专业知识让它work起来,他们生产可重复的结果,而且他们有着更好的原理。而且他们有着许多令人着迷的理论。所以这就是主流的认为BP被抛弃的解释。从一个更据历史的角度来说,我们可以知道为什么它失败了。计算机是千百倍的慢,而且有标签的数据集却太小或者太少。同样的,对于深度网络来说,网络太小了,而且也没有去有意识的初始化,所以在深度网络上的BP不能很好的work,因为求导的梯度倾向于消失掉了,而且因为初始化的权重通常太小了。这些问题才是阻止BP被重视的原因。对于类似视觉和语音的任务来说,最终它赢得了胜利。


所以我们需要区分不同种类的机器学习任务。有着用统计学来研究更典型的任务,而且有着有着更多的人们用人工智能来研究。所以在统计学的来说,你通常有着低维度的数据,一个统计学家认为100维就是高维度数据了,而在人工智能领域中认为例如图像或者表示语音的系数通常都是超过100维的。对于统计学的来说,通常数据中有着许多的噪音,而在人工智能方面,他们认为噪音不是真正的问题。对于统计学的来说,通常在数据中没有很多结构,而且能够通过一些相当简单的模型来进行抓取结构,而对于人工智能方面,通常在数据中是有着超多的结构的,所以如果你处理一组图片,它有着高度结构化的数据,不过这个结构太复杂以至于没法使用简单的模型来抓取。所以在统计学的来说,主要的问题是从噪音中划分出真正的结构,而不是考虑这个噪音其实也是一些结构,这可以通过贝叶斯NN很好的解决,不过对于通常的非贝叶斯NN来说,这不是它们擅长的问题。所以对于类似这样的问题来说,如果你要做回归的话会考虑使用SVM或者被称为高斯过程(Gaussian Process)的方法解决,这会在稍后介绍,对于人工智能方面,主要的问题是找到一种方法来表示所有的这些复杂的结构使得它可以被学习。显而易见的事情就是试图处理设计合适的表征,不过事实上,让BP来指出什么样的表征被使用更容易,只需要给定一些多层和使用一些计算能力使得决定表征的具体内容。


现在来简短的介绍下SVM。这里不会介绍它是如何工作的,不过这里会说到HInton认为的SVM的局限性所在。所以有好几种方法来理解SVM,这里会给出两种不同的观点。对于第一种观点来说,SVM只是感知机的转世,并且带有一些更加聪明的技巧比如核技巧罢了。所以idea就是通过处理一些输入,然后扩展原始的输入到一个非常大的非线性层,不过同样这是非自适应的特征,所以这只是像有着很大的特征层而没法学习的感知机。然后你只能学习一层自适应权重,该权重来自特征到决策单元之间。SVM有一个非常聪明的方法来避免当学习这些权重的时候过拟合问题。它为了在高维度空间中寻找被称之为最大边界超平面,而且他们可以干的比你认为的更高效,这就是它为什么work的这么好的原因。、

第二个观点关于SVM是作为一个更聪明的感知机,不过它有着完全不同于他们在使用的特征的概念,所以按照第二种观点,训练集合中的每个输入向量都是用来定义一个特征的。这里使用不一样的单词是为了说明这是一种完全不同于第一种的特征。每个特征给出一个标量之用来作为介于测试输入和具体的训练输入之间的全局匹配。所以粗略的来说,它是用来测量测试输入和一个具体的训练样本之间的相似程度。然后这是一种聪明的同时寻找如何权衡这些特征使得做出正确决定和特征选择上的方法,也就是决定哪些特征不需要使用。所以尽管这些观点听起来极端的不同,他们只是两种相互代替的方法来观察同一件事情罢了。在这两种情况中,它使用非自适应特征和一层自适应权重层。这限制了你能做的事情,你没法学习多层的表征


这是1995年的一份历史性的文件。它是Yann LeCun给Hinton的,而且这是larry Jackel(在贝尔实验室领导者自适应系统研究团队)和Vladamir Vapnik(是SVM的支持者)之间的赌局。在2000年的时候Larry Jackel下了这个赌局,人们将会懂得为什么在大型数据集上使用BP算法训练的大型NN可以很好的work。也就是人们会懂得原理上的条件和适用范围。Vapnik认为这不可能,不过他也下了另一个赌局,如果他指出了其中的一个,那么他同样算赢了。而且Vapnik在2005年,认为没人会使用BP来训练大型NN。结果显示,他两都错了。使用Bp训练大型NN的约束在于不是它没有个好的原理或者说它是无用的,而是我们没有足够大的计算机或者足够大的数据集。这是实际操作上的限制而不是原理上的限制。

二、置信网

在1990年Hinton放弃了BP的一个原因是因为它不需要太多的标签,回头来说,其实是因为Hinton没有足够数量有标签的数据集。而且HInton同样受到人们成功的使用几乎没有标签的数据学习的影响。然而,Hinton没有想要放弃使用梯度下降学习一群权重的优势。所以问题就是,是否有另一个目标函数我们可以用来做梯度下降?这个显而易见的地方就是通常的模型的目标函数都是为了输入数据建模而不是预测标签。这种在统计学和人工智能中的很好的网状的运动叫做图模型。图模型的idea是通过结合不同的图结构来表征变量是如何依赖于另一个的。在给定其他变量的观测到的值的情况下推论另一个变量的概率的实数计算,玻尔兹曼机实际上是一个非常早期的图模型的例子,不过它是无向图模型。在1992年,Radford Neal 指出使用在玻尔兹曼机中同样种类的单元,可以用来做有向图模型,比如sigmoid置信网。问题就变成了我们如何来学习sigmoid置信网?


深度网络的第二个问题就是学习时间没法很好的缩放。当有许多隐藏层的时候,学习是非常慢的。你可能会问了为什么?我们现在知道其中的一个原因是因为我们没有以一种有意义的方法来很好的初始化权重。然而另一个问题是BP可能会陷入不好的局部最优,不过这通常来说还不错,所以BP还是很有用的,不过我们现在可以说对于深度网络陷入的局部最优的状态来说,如果以很小的权重开始,通常都是远离最优的。有退回到更简单的模型能够使用凸优化的可能性,不过Hinton认为这不是个好idea。数学家喜欢这样做是因为这样他们就可以证明了。不过在实际中,你只是为了远离真实数据的复杂性而已。


所以一个解决Bp的局限性的方法是通过使用无监督学习。idea就是我们想要保持为了调整权重而使用梯度方法和随机mini批量下降方法的有效性和简洁性。不过我们使用这个方法去对感知输入的结构进行建模,而不是对输入和输出之间的关系进行建模。所以idea就是权重是被调整成最大化这个会生成感知输入的生成模型概率,我们已经在学习玻尔兹曼机中看到了。一个考虑这个方法就是,如果你想要做计算机视觉,你可以首先做计算机图形学。首先是因为计算机图形work而计算机视觉不行。正如我们在玻尔兹曼机中看到的,生成模型的学习目标是最大化观测到的数据的概率而不是最大化给定输入的情况下标签的概率。然后问题来了,什么样的生成模型应该被学习?我们可以学习一个基于能量的模型就像玻尔兹曼机,或者我们可以学习一个由理想化神经元组成的因果模型,这就是我们首先看到的。最终,我们会学习一些这两种的混合模型,这就是最后要做的。


所以在介绍由神经元组成的因果置信网之前,先简短的介绍下人工智能和概率的背景。在1970年代和1980早期年代,人工智能的人们都不相信反概率,这时候Hinton是一个硕士生,如果你提到概率,如果你提到概率,那么你就是愚蠢的,而且你没法理解为什么。计算机们都是离散单一处理的,如果你引入概率,那么概率只是用来为了推论任何事情而已。很难去确认多少人反对概率,所以这里是一个测试。上图左边的这段话是Patrick Henry Winston 的第一本AI教科书的第一版。这是当时的普遍观点。Winston是MIT AI 实验室的领导者;而上图的右边是另一个的观点,是由Jhon Von Neumann在1957年在他的没发表的手稿中的。Hinton认为如果Neumann还活着的话,人工智能的历史会有许多不同的。


所以,概率事实上找到了他的方法进入AI,就是被称之为图模型的东西,这是有图论和概率论结合得到的。在1980年代,在AI中有许多专家系统起作用,他们使用规则袋来应对任务,比如药物诊断或者探索矿井。现在因为有着这些实际操作上的问题,使得处理起来变得难以确定,他们不能只使用那些任何事情都确定的toy样本来做实验。AI中的人们不喜欢概率即使当他们在处理不确定事情的时候,他们也不想用概率。所以他们使用他们自己的那些不涉及概率方式来处理这些不确定性。你可以事实上证明这是一个坏赌注。图模型是由Pearl,Heckman,Lauritz,和许多其他人引入的,他们分享的概率实际上比由那些做专家系统提出的ad hoc方法更work。离散图擅长表示依赖于其他变量的变量,不过一旦你使用了这些图,那么你需要对那些表示概率规则的实数值计算,所以你可以在给定其他点的观测的数据的基础上计算图中某些点的期望值。置信网是图模型中的人们给图的一个具体的子集命名的,这个子集中的图都是有向无环图。通常来说,他们使用稀疏连接,如果这些图都是稀疏连接的,那么就有更聪明的推论算法来有效的计算这个未观察到节点的概率。不过这些聪明的算法都是以节点的个数指数级增长来推论每个节点的,所以对于密连接节点来说这不work。


置信网是有向无环图,由随机变量组成的,上图就是一个例子。通常来说,你也许会观察到任何一个变量。这里先约束这个网络,使得找你能观测到叶子节点。所以我们想象的就是这些未观测到的隐藏causes,他们可能是lead(这个不知道翻译成什么好),然后最后他们会影响到观测到的effects。一旦我们观测到一些变量,那么就有两个问题需要解决。第一个就是推论的问题,为了推论出未观测到的变量的状态。当然我们没法具体的来推论他们,所以我们接下来做的就是用未观测到变量的概率分布。如果在给定观测到的变量的基础上,未观测到的变量之间不是相互独立的,那么这个概率分布可能就是以涉及到的项的数量的指数级别的繁琐了。第二个问题就是学习问题。也就是给定一个由观测到的所有叶子节点状态的向量的训练集合之后,如何调整变量之间的交互使得网络变得更好的泛化(generate)这些训练数据?所以为了调整这个交互,可能会涉及到决定哪个节点会被其他节点影响,同样的决定这个影响的强度。


所以这里先介绍图模型和神经网络之间的关系。早期的图模型使用专家来定义图结构和条件概率,通常需要一个药学专家,然后问他很多问题,然后在做一个图,并理解每个节点的含义。他们通常还有条件概率表,用来描述一组父节点的值如何决定这个节点的值的分布。他们的图都是稀疏连接的。他们关注的初始化问题是如何做正确的推论。最初,他们不关心学习问题,是因为知识都来自于专家。

相比较来说,对于NN,学习总是一个中心问题,而且手工接线(将节点连接起来)这些知识总是不爽。当然了,在例如CNN的这些基本的特性中,接线是一个非常有意义的事情。不过基本上,网络中的知识都是来自于训练数据的学习的,而不是来自于专家。NN的目标不是为了可解释性或者稀疏连接来使得推论变得容易的。然而,还是有置信网的NN版本。


所以,如果我们想考虑如何在理想化的神经元上得到生成模型,基本上有两种生成模型。基于能量的模型,你通过使用对称连接来讲二值随机神经元连接起来,然后你得到了一个玻尔兹曼机。正如我们看到的,一个玻尔兹曼机是很难学习的,不过如果我们限制了他的连接,那么就很容易学习一个RBM了。然而,当我们这么干的时候,我们之学到一层隐藏层。所以我们也放弃了许多有着多层隐藏层的NN的很多特性,就为了让学习变得容易。

另一种模型就是因果模型。这是由二值随机神经元组成的有向无环图。当你这么做之后,就得到了一个sigmoid置信网。在1992年 Neal以unrude模型就稀罕上图下面那个模型一样,然后将其与玻尔兹曼机进行了对比,结果显示sigmoid置信网比较更容易学习。所以一个sigmoid置信网只是一个置信网,不过其中的所有的变量都是二值随机神经元。为了从这个模型中生成数据,你需要考虑顶层中的神经元,你需要在基于他们的偏置的基础上决定他们是1还是0.所以你是随机决定的,然后给定顶层中神经元的状态,做出随机决定关于这些中间层的神经元应该做什么。然后给出他们的二值状态,你做出决定这些可视effects应该是什么。通过这些操作的结果,一个来自于层到层的因果结果,你可以得到一个你的NN相信的可视值向量的无偏估计样本。所以不想玻尔兹曼机,在因果模型中,这是容易生成采样的。

三、学习sigmoid置信网

这部分,将会介绍为什么学习sigmoiud置信网是很困难的。然后在接下来的两节中,将会描述两种不同的方法来进行学习。关于学习好消息是sigmoid置信网不像玻尔兹曼机,我们不需要两个不同的阶段。我们只需要玻尔兹曼机中的正阶段即可。这是因为sigmoid置信网是局部归一化模型,所以我们不需要处理分区(partition)函数或者他的偏导。另一个关于sigmoid置信网的好消息是如果我们在给定数据向量的基础上,基于隐藏单元从后验分布中得到无偏估计样本,那么学习就可以变得容易起来。也就是我们可以用最大似然学习得到的指定的梯度,以mini批量随机的方法进行。问题是很难在基于隐藏单元上从后验分布中得到无偏估计样本,这很大程度上是因为Judeo Po 称之为explaining away这个现象的原因,在这部分中会解释explaining away,理解他很重要。


现在,先来说下为什么学习sigmoid置信网是很难的。正如我们看到的,生成一个无偏估计样本是很容易的,一旦你完成了学习。也就是一旦我们决定了权重和这个网络,我们可以容易的通过让这个模型生成样本来观察这个网络相信的事情。这是自上而下的操作,一次一层。这很容易是因为这是因果模型。然而,即使如果我们知道这些权重,还是很难去当我们观测到可视effects的时候基于隐藏causes去推论这个后验分布。原因是因为这些隐藏causes的可能的模式的数量是以隐藏节点数量的指数级的。甚至从这个后验中得到一个采样也是很困难的,这是我们在做随机梯度下降的时候需要的。所以在给定这些从后验中采样的困难,很难说我们如何学习一个有着百万级参数的sigmoid置信网。这对于来自一个正常使用的图模型来说是一个非常困难的regime。有着可解释性的模型,而且这些模型试图学习成打的或者上百的参数,不过他们通常也不用来学习百万级的参数。


在介绍我们可以使用的方法和从后验分布中采样之前。先说下如果我们可以得到这些样本的情况下,学习规则应该是什么,所以如果我们在给定观测到的数据的基础上从隐藏状态的后验分布得到了一个无偏估计样本,然后学习就变得简单了。上图右上那个图就是一个sigmoid置信网的一部分,并假设每个节点都有一个二值。所以对于节点j 来说,他的二值就是Sj,这个向量二值是节点的全局组态,是从后验分布中采样得到的。为了使用最大似然学习,我们所要做的就是最大化推论单元二值状态概率的法则,可以从他的父节点的推论得到的二值状态进行生成。所以这个学习规则是局部而且简单的。单元i 的父节点将单元 i 打开的概率是由一个逻辑函数给出的,这个函数设计到父节点的二值状态,我们需要做的就是让这个概率相似于实际观测到的单元i的二值,这里就不推导了。关于权重wji的最大似然学习规则是简单的按比例进行改变,按照单元 j  的状态乘以单元 i 的二值状态和i 的父节点会打开的二值状态的概率之间的差异。所以总结下,如果我们有对所有隐藏节点的二值状态的赋值,那么在我们通常的随机方法上就很容易进行最大似然学习。我们从后验上进行采样,然后基于这个采样结果来更新权重。然后我们均化这个基于mini批量样本上的更新。


所以我们回到之前的问题,为什么从后验中进行采样是很困难的。原因是因为在给定观测到叶子节点的数据向量的情况下,从基于隐藏节点上得到的后验上得到一个无偏估计样本是很困难的,有一种现象叫做explaining away。所以如果观察上图中那个图,它有着两个隐藏causes,和一个观测到的effect,如果看到这个偏置,你可以知道这个房子跳跃的可观测的effect是不会发生的,除非有任何一个causes发生了,不过如果其中的一个causes发生了,那么20-20,房子跳跃由于任何一个causes引起的概率就为一半。每一个causes自身看上去不会同时发生而使得房子跳跃,所以如果你发现房子跳跃了,一个可说的通的解释就是一辆卡车撞击了房子,而另一个不同的可说的通的解释就是发生地震了,每一个的概率都是差不多e-10,然而,房子自发跳跃的概率差不多为e-20.然而,如果你假设两个隐藏causes有概率为e-20,这看上去极端的不可能,即使房子确实跳跃了。所以假设发生了一个地震,减去因为卡车撞击引起的概率,然后我们在观测到房子跳跃的时候,就得到了一个介于两个隐藏causes的反相关。注意到这个模型自身,在先验中,这两个隐藏causes是相当相互独立,所以如果房子跳跃了,基本的一个原因就是卡车撞击或者地震。事实上,后验看上去如上图右下角部分。在给定房子已经跳跃的基础上,有四个隐藏causes的可能的模式,其中两个是极端不可能的,即卡车撞击房子的同时发生了地震和房子自己没事跳跃这两个,其余的两个结合体有着相等的概率,你可以注意到他们形成了一个没法分辨的情况。我们有两个可能的causes模式,而他们之间却刚好相反,这就是explaining away。现在我们知道了explaining away,让我们考虑下,回到之前有关学习一个深度sigmoid置信网的学习问题。


所以我们先引入多层隐藏变量。这会在我们的因果模型中得到许多数据,我们想要学习这些权重W,介于第一层隐藏层和数据之间。让我们来看看是什么来学习W的。首先,基于第一层隐藏变量的后验分布不是一个阶乘,在后验中他们不是相互独立的,这是因为explaining away。所以即使如果我们有隐藏变量层,一旦我们观测到了数据,他们不再相互独立,不过因为我们有着更高层的隐藏变量,他们甚至在先验中也不相互独立了。在这其中的隐藏变量产生了先验,而这个先验自身又会引起第一层隐藏变量之间有相关性。为了学习W,我们需要学习第一层隐藏层中的后验,或者至少逼近它。即使如果你只能逼近它,我们还是需要知道更高层中的所有权重使得能够计算这些先验项。事实上,有更坏的事情,因为为了计算这先验项,我们需要积分出所有的隐藏变量和更高的层。也就是我们需要考虑所有的可能在更高层中的激活模式,然后结合所有的来计算先验,其中更高层是为了第一层而创建的。计算这个先验是一项非常复杂的事情,所以这三个问题说明了学习这些权重W是极端的困难的。具体的,我们也没法在没有更高层中计算先验的基础上来学习他们。


现在我们来考虑下一些学习深度置信网(deep belief net)的方法。第一个就是蒙特卡罗方法(Monte Carlo),由Radford Neal 提出的,这个MC方法基本上一直都是work的,也就是如果我们回到之前的ppt,它会在基于所有的隐藏变量上考虑父节点的激活 ,然后在给定数据向量的基础上,使用马尔可夫链在通过很长一段时候之后让他稳定下来,一旦稳定了下来达到了热平衡,你就可以从后验中进行采样了。所以在DBN中,这个方法相当的慢。

在1990年热门呢提出了更快的方法来学习DBN,称之为可变方法,事实上至少在AI社区中这是可变方法的发源地,该方法放弃从后验和上得到无偏估计样本,是只通过得到对逼近的后验上的分布上进行逼近的采样。

正如我们之前看到的,如果我们有了从后验上得到的样本,最大似然学习就很简单了,如果我们从其他分布上进行采样,我们仍然可以使用最大似然学习规则,不过并不清楚之后会发生什么。表面上来说,如果我们使用错误的分布来得到样本,那么奇怪的事情就会发生,所以这没法保证事情一定会有提升和改善。事实上还是有个保证能让事情提升的,它不是模型可以生成数据的log概率,不过却和这个相关。事实上在在这个log概率上有个下限,通过提升这个下限,我们可以提升这个log概率。

四、wake-sleep算法

这部分,将会介绍第一次有效的学习sigmoid置信网的方法。该方法被称之为wake-sleep算法,记得不要与玻尔兹曼机混淆起来。它有着两个阶段,一个正的和一个负的,可以合理的通过wake和sleep来解释,不过wake-sleep算法是一个非常不同的学习方法,主要是因为这是对于像sigmoid置信网这样的有向图模型来说的,而不是对于像玻尔兹曼机这样的无向图模型来说的。在wake-sleep算法背后的idea可以有着一个完整的机器学习的新领域叫做可变学习(variational learning),这在1990后期之前还没有成型,即使有早期的例子比如wake-sleep算法,不过现在这成了机器学习中学习复杂图模型主要的方法之一。在这些可变方法背后的基本idea听起来很疯狂,也就是既然计算正确的后验分布是很困难的,那么就计算个容易计算的来逼近就好,然后接着使用最大似然学习,也就是如果我们从正确的后验中得到样本的话,我们可以正确的使用学习规则了,并且希望这能work,即使我们之前没有work。现在你可以合理的认为这是个灾难,不过事实上,这个学习变得可能了。所以如果你观察当你使用一个逼近后验的时候,在学习的时候从权重中得到的东西,会发现有两项可以从权重中得到。一项是驱动他们是的得到一个更好的数据模型,也就是让sigmoid置信网在训练的中心部分更好的泛化观测到的数据。不过另一个项是驱动这些权重朝着很好的逼近真实后验的似然后验的权重前进,这通过操作真实的后验试图来拟合这些似然后验来完成。因为这个影响,这些模型的可变学习可以很好的work。回到90年代中期,当HInton第一次提出这个的时候,他们认为这是一个关于大脑如何学习的新理论。这个idea被Karl Friston提出来了,他强烈的认为这是真正的神经元的学习。


所以,现在我们更详细的介绍下如何使用一个逼近的后验分布来进行学习。总结下,学习项sigmoid置信网这样的复杂模型是很困难的,因为在给定一个数据向量的基础上,基于隐藏组态从真实的后验分布中进行推论是很困难的。甚至从这个后验中进行采样也是很困难的,也就是没法轻松的得到一个无偏估计样本。所以这个疯狂的idea就是使用从其他分布中得到的样本,然后希望这个学习能够work。正如我们看到则,对于sigmoid置信网来说,这行得通。所以我们使用的分布是可以忽略explaining away的分布,我们假设(这是错误的)这个基于隐藏组态的后验可以分解成分离的隐藏单元分布的积。换句话说,我们假设给定数据基础上,每个隐藏层中的单元都是相互独立的,正如RBM中一样。不过在RBM中,这是正确的,然而在sigmoid置信网中,这是错的。


所以,让我们快速的观察下阶乘分布是什么,在阶乘分布中,整个向量的概率只是他的独立项概率的积。所以假设一层中三个隐藏单元,然后有三个对应的概率为0.3,0.6,0.8.如果我们想要计算隐藏层的状态为(1,0,1)的概率,我们可以通过0.3x(1-0.6)x0.8来得到。所以隐藏层的一个组态的概率是独立概率的乘积,这就是为什么称之为阶乘的原因。通车来说长度为 n 的二值向量的分布有着2^n个自由度。事实上,只有2^(n-1)个,因为概率加起来必须等于1。通过对比可以知道,一个阶乘分布只有n个自由度。这是一个更简单的情况。


所以现在来介绍下使用错误的分布的idea的wake-sleep算法,在这个算法中,我们有一个NN,其中有着两组不同的权重。这是一个生成模型,所以在上图中绿色表示的权重是该模型为了生成的权重,这些权重定义着基于数据向量的基础上的概率分布。我们也得到了许多额外的权重,上图中红色的权重是为了模型的识别的权重,这些权重是用来逼近得到这个后验分布的,也就是我们使用这些权重在每一个隐藏层中为了逼近这个后验而得到一个阶乘分布,不过结果不是很好。

在这个算法中,有一个wake阶段,在这个阶段,你可以将数据放入可视层中,也就是上图的底层,然后使用这个识别权重来进行前馈传播,在每个隐藏层中,每个独立的隐藏单元上你得到个随机二值决策,关于该单元该打开还是关闭。所以前馈得到的所有隐藏单元的随机二值状态,然后一旦我们有了这些随机二值状态,我们视他们为在给定数据的基础上从真实后验分布中得到的采样,然后就可以使用最大似然学习了,不过在做最大似然学习的时候不是为了这个识别权重,这个只是为了得到似然样本。是生成权重来决定我们的模型的,所以在前馈传播中你是通过识别权重驱动着这个系统,但是是为了学习这个生成权重的。

在sleep阶段中,做着相反的事情,你通过生成权重来驱动这个系统,也就是,先以顶层隐藏层的随机向量开始,然后生成在先验中相互独立的隐藏单元的二值状态,然后,往下通过这个系统,一次生成一层的状态,这里可以正确的使用生成模型,这就是生成模型所能生成的你所希望的数据,所以你能从这个模型中生成一个无偏估计样本。在使用生成权重来生成一个无偏估计样本之后,你可以说,让我们看看是否我们能够从数据中还原隐藏状态。所以,让我们看下是否我们可以从L1层的隐藏状态中还原L2层的隐藏状态。所以在训练好了识别权重后,试图还原事实上生成了下面层状态的隐藏状态。所以这只是和wake阶段相反,我们现在使用生成权重来驱动系统,然后学习识别权重。结果显示,如果以随机权重开始,然后进行交替的wak和sleep,就能学到一个很好的模型。


在这个算法中还是有缺陷的,第一个缺陷就是一个相当小的,也就是这个识别权重是学习用来转化这个生成模型的,不过在学习的开始,它们学习着在没有任何数据的空间上转化这个生成模型,因为当你从这个模型中进行生成,你生成的东西看上去与真实的数据非常的不同,因为权重不够好。这是一种浪费,不过这不是一个大问题。该算法严重的问题是这个识别权重不止是不遵循数据的log概率梯度,他们甚至不遵循这个概率的可变边界的梯度。因为他们没有遵循正确的梯度,就会得到的错误的模式均化,这会在下面解释。最后一个问题就是我们知道基于顶层隐藏层的真实的后验是被限制成非独立的,这是因为explaining away 的影响,而且,我们强制的假设独立性来使用一个分布来逼近他的,这个独立性的逼近对于中间层的隐藏层来说,也没有那么糟糕,因为如果我们够幸运,这个来自于下层的explaining away影响会部分的被上层的先验影响所抵消掉。后续可以看到更详细的解释。在无视所有的这些问题下,karl Friston 认为这就是大脑工作的原理。当我们最初提出这个算法的时候,我们认为这是有关大脑的一个新的理论。不过现在Hinton认为这个算法有着太多的问题了,所以需要找到更好的算法。


所以现在来解释下mode averaging吧,使用之前那个地震和卡车撞房子的小型模型来说明。假设我们处在sleep阶段,然后我们从这个模型中生成数据。大部分的时间上,顶端的两个单元都是off 的,因为在基于他们的先验下看上去不可能是on的,因为他们都是off的这个可视单元也就是固定的off的,因为他的偏置可是-20。巧合情况下,1 × e-10,这两个单元中的一个就会打开,左边这个和右边这个是相等的。当这个单元(上层两个中任意一个)打开的,就会有一半的概率这个可视单元会打开。所以如果考虑下这个可视单元打开的场景,一半的场景是左手的这个隐藏单元打开了,另一半的场景是右手的这个隐藏单元打开了,几乎没有场景是有关两个单元同时打开或者同时关闭的。所以现在考虑学习能为识别权重做什么。一半的时间上,我们在可视层上有一个1,顶层最左边的单元就会打开,所以我们学者预测这个单元以0.5的概率来打开的情况,同样的对于右边这个单元也是一样。所以这个识别权重会学着基于隐藏层上生成一个阶乘分布,这个阶乘分布的1/4的组态(1,1),另一个1/4的组态是(0,0),这两个是极度不可能的让可视单元来打开的。

只挑选一个mode的话会更好,也就是,只由于卡车撞击或者地震使得可视单元打开会更好,这就是当你强制有一个阶乘模型的时候你可以有的最好的识别模型。所以即使这个我们处理的隐藏组态是可以最好的表达成一个方形的角,事实上显示他就像他是一个一维的连续值,这个真实的后验是单峰的,被强制成(1,0)或者(0,1),就是上图右下角的黑色显示的。如果你使用wake-sleep算法中的sleep阶段中逼近的窗口,是这个红色曲线,这个是给出了所有的相等概率的隐藏单元的四个状态。最好的解决方案是挑选出其中的一个状态,然后给他所有的概率mass。这就是最好的解决方案,因为在可变学习中,我们操作这个真实的后验来拟合我们在使用的似然后验。正常的,在学习中,我们是操作似然来拟合这个真实的东西,不过这里是相反的。




posted @ 2015-03-08 13:35  仙守  阅读(1013)  评论(0编辑  收藏  举报