这是Hinton的第14课,主要介绍了RBM和DBN的东西,这一课的课外读物有三篇论文《Self-taught learning- transfer learning from unlabeled data》和《A Fast Learning Algorithm for Deep Belief Nets》以及《To recognize shapes, first learn to generate images》。(ps:在下文中样本和采样来自同一个英文单词,泛化和生成来自同一个单词,在基于自己的理解的情况下选择不同的翻译意思,如果某一个觉得不通顺,可以换另一个意思)

一、通过堆叠RBM来学习层级特征

在这部分,将会介绍一个不同的方法去学习sigmoid置信网,这个不同的方法以一种没法预料的方式来达到目的,Hinton停止了在sigmoid置信网上的研究转而研究玻尔兹曼机了,然后发现了RBM可以以相当高效的方式学习。这样的一个RBM,可以用来学习一层非线性特征。可以将这些学到的特征视为数据,然后采用另一个RBM来对这些特征之间的相关性进行建模。可以接着这样做,进行堆叠RBM来学习许多层级的非线性特征。这最后会导致在DNN中一个巨大的复兴。不过问题也会随之而来,一旦你堆叠了许多RBM,每个RBm学着将之前的玻尔兹曼机生成的激活的特征模式进行建模。如果你只有一组分离的RBM或者他们能够被组合成一个模型吗?现在任何人可以期望说如果你将一组RBM结合起来形成一个模型,你得到的就是一个多层玻尔兹曼机。然而,Hinton的一个聪明的硕士生叫做G.Y.Tay,指出这不是你得到的,你得到的知识一些看上去更像是一个sigmoid置信网的东西罢了。这台令人惊讶了,因为事实上这算是解决了如何学习深度sigmoid置信网的问题,通过先放弃它,然后专注于学习像玻尔兹曼机这样的无向模型。

使用这个对于RBM有效的学习算法,训练一层直接输入像素得到的特征是很容易的。我们可以这些特征检测器的激活的模型作为是否他们是像素,然后在第二个隐藏层中学习另一层特征。我们可以这样重复许多次,每个新的特征层是为了对下层中的特征的相关激活值进行建模的。这被证明是每次我们增加另一层特征,我们就提升了某些结合的模型生成数据的log概率的可变的下限。证明是很复杂的,而且只有你在做一些正确的事情的时候才会用到,在实际操作中你用不到。不过这个证明是非常令人欣慰的,因为这说明某些有意义的事情在当你像这样堆叠RBM的时候会发生。这个证明是基于介于RBM和一个无穷DBN的一个简洁的等式。

所以上图是关于当学习两个RBM的时候发生的事情,其中的RBms是一个在另一个上面,然后将它们结合起来作为一个总的 模型,这被称之为一个DBN。所以首先学习一个玻尔兹曼机极其拥有的权重,一旦训练好了,当这个模型收到数据的时候,我们就得到了这个玻尔兹曼机的隐藏激活模式,我们将每个隐藏激活模式作为数据来训练第二个玻尔兹曼机。所以我们只是复制了这个二值状态到第二个玻尔兹曼机,然后我们在学习另一个玻尔兹曼机。现在一个有趣的事情就是,如果我们学完第二个玻尔兹曼机,W2是W1的转置,而且在V中的单元数和h2中的单元数一样,那么这第二个玻尔兹曼机将可以是h1的一个很好的模型,因为这就是第一个模型的上下颠倒而已。对于一个RBM,不关心哪个叫做可视部分,哪个叫做隐藏部分,这只是一个二分图。在我们学好这两个玻尔兹曼机,我们可以将它们组合起来去形成一个模型,而这个单独的模型如上图右边。他的顶层两层调整成和顶部的RBM一样,所以这是一个有着对称连接的无向模型,不过它的底部的两层是一个类似sigmoid置信网的有向模型。所以我们所做的就是考虑介于v和h1之间的对称连接,然后扔掉这些上行部分,只保留下行部分(往上和往下的方向)。为了理解为什么这么做是很复杂的。生成的结合模型明显不是一个玻尔兹曼机,因为他的底层的连接不是对称的。这是一个图模型,我们称之为DBN,这里的更低层看上去像sigmoid置信网,顶两层形成一个RBM,所以这是一种混合模型。

如果我们要使用3个玻尔兹曼机呢,我们就得到一个如上图右边的混合模型,顶两层仍然是一个RBM,下面的层是想sigmoid置信网的有向层。为了从这个模型中生成数据,正确的处理过程是:首先,在顶层的RBM中的h2和h3之间进行回向和前向操作来达到热平衡,这涉及到交替的Gibbs采用,并行的更新h3中的所有单元和并行的更新h2中的所有单元,然后往回并行的更新h3中的所有单元,然后这样依次往复很长一段时间直到你在顶层的RBM中达到了平衡的采样。所以顶层的RBM是定义h2的先验分布的。一旦完成之后,你简单使用这个生成的连接w2从h2下到h1,然后不论你在h1中得到的二值状态是什么,你接着下行用权重w1去得到生成的数据。所以我们执行一个从h2开始的自顶向下的传播,去得到所有的其他层的状态,就像在一个sigmoid置信网中一样。上图中红色的自底向上的连接不是这个生成模型的部分,他们实际上是对应权重的转置,所以他们是w1的转置和w2的转置,他们被用来影响这个模型的,不过他们却不是这个模型的部分。

现在,在解释为什么堆叠玻尔兹曼机是个好idea之前,需要先交代均化两个阶乘分布是什么意思,当均化两个阶乘分布的时候也许会让你惊讶,因为结果得不到一个阶乘分布。这里的均化的意思是得到分布的混合结果,所以先随机的挑一个,然后你从挑选的这个中进行生成,所以你得到的不是一个阶乘分布。假设我们有一个有着4个隐藏单元的RBM,并假设我们有一个可视的向量,在给定这个可视的向量的基础上,基于这四个单元的后验分布是阶乘。我们假设这个分布是的第一和第二个单元的概率是0.9,剩下的两个单元打开的概率是0.1。这里的阶乘是在这个分布中的一个样本上前两个单元同时打开的概率是0.81.现在假设我们有一个不同的可视向量v2,基于同样的四个隐藏单元的后验分布是0.1,0.1,0.9,0.9,这里这么挑是为了计算方便。如果我们对这两个分布进行计算,每个隐藏单元的平均概率就是每个分布的均值的均化结果,也就是0.5,0.5,0.5,0.5,不过你得到的不是一个基于这四个概率定义的阶乘分布。为了见证这个事实,考虑基于隐藏单元的二值向量1,1,0,0。在v1的后验中,概率为0.9^4,这是因为0.9×0.9×(1-0.1)×(1-0.1)=0.43。在v2的后验中,这个向量却完全不一样。它的概率是0.1^4,如果我们对这个具体的向量进行均化这两个概率,我们得到的概率是0.215,这比通过均值为0.5的阶乘分布指派给向量1,1,0,0
的概率大多了,因为它的概率是0.5^4,明显小多了。所以这里的重点是当你均化两个阶乘后验,你得到的混合分布不是阶乘

现在让我们看下为什么贪心学习可以work,这就是为什么这是学习RBM的一个好方法,然后学习第二个RBM,对第一个的隐藏单元的激活模式进行建模。底层RBM的权重实际上是定义了四个不同的分布。当然了,他们以相同的方式来定义。所以第一个分布是在给定隐藏单元的基础上可视单元的概率。第二个就是在给定可视单元的基础上隐藏单元的概率,这就是要使用的两个交替的用来给马尔可夫链在给定隐藏的时候更新可视,在可视的时候更新隐藏。如果我们运行这个链足够长时间,我们可以从v和h 的联合分布上得到采样。所以这个权重清楚的定义着联合分布,同样可以更直接的定义这个联合分布,通过使用(e-能量)这样。不过对已有着许多单元的网络来说,我们没法这样计算,如果你需要联合分布p(v,h),你只需要忽略v,这样就得到了关于h的分布。这就是基于h的先验分布,通过RBM来定义的;同样的,如果我们忽略h,我们就得到了基于v的先验分布,是由RBM定义得到的。现在,我们从这四个分布中提出了一个相当令人惊讶的分布对,我们定义这个由RBM指派给一个可视向量概率,使得该可视向量作为所有隐藏向量概率的和,等于h乘以给定h的情况下v的概率。这看上去像一件愚蠢的事情,因为定义p(h)就和定义p(v)一样难,不过我们还是可以以这种方式来定义p(v)。现在如果我们不管p(v|h),而是学习p(h)的更好的模型,也就是,学习一些新的参数可以让我们得到一个p(h)更好的模型,然后用p(h)更好的模型替代旧的部分。这样我们就能够提升
v 的模型了。我们的意思就是通过一个更好的p(h)的模型,来更好的拟合聚合后验。这个聚合后验是均化所有的基于h得到的后验分布的训练集合中的向量。所以,我们要做的就是使用我们第一个RBM来得到这个聚合后验,然后使用我们第二个RBM来建立一个比第一个RBM的聚合后验更好的模型。如果我们将第二个RBM作为第一个的上下颠倒,它就会和第一个RBM一样有着相同的聚合后验模型。然后,如果我们改变这些权重,我们就可以让结果变得更好。所以这就是一个当我们堆叠起RBM的时候发生的事情的解释。

一旦我们学会了堆叠玻尔兹曼机,然后将它们结合成一个模型形成DBN。然后我们就能对整个模型进行微调,通过使用wake-sleep算法的一个变种来实现微调。所以首先我们通过堆叠RBM来学习层级特征,然后我们想要微调自底向上的识别权重和自顶向下的生成权重来得到更好的生成模型,我们可以通过使用三个不同的学习路线来完成这个事情。

首先,我们使用一个随机自底向上的传播,然后调整更低层中自顶向下的生成权重使得更好的重构下面层中的特征激活值,这就像在标准的wake-sleep算法中一样,然后在顶层的RBM中,我们进行回向和前向调整好几次,从这个RBM中采样隐藏的和RBM的可视的部分,然后接着隐藏部分,以此类推。所以这就像是RBM的学习算法一样。

在完成了多次的这样的迭代之后,我们接着使用对比离散(CD,contrastive divergence)学习。也就是 我们使用相关性之间的差异来更新RBM的权重,也就是RBM的第一次激活时得到的相关性和在迭代了多次之后RBM中得到的相关性。我们通过使用这两个的差异来更新权重。

然后第三阶段,我们通过更低层的单元来得到顶层RBM的可视单元。然后,我们通过做一个自顶向下的随机传播,就像sigmoid置信网一样。然后从这个sigmoiud置信网中得到一些生成的数据,我们调整这个自底向上的比率使得更更好的重构上层中的特征激活值。所以这就像是wake-sleep算法中的sleep阶段。介于标准的wake-sleep算法与该算法之间的差别在于这个顶层的RBM的行为就像是基于顶层有着比之前通过一个sigmoid置信网得到的单一层中的假设独立的单元有更好的先验。同样的,不通过对先验采样来生成数据,而是通过训练样本,上行到顶层RBM,然后在生成数据之前运行一段时间的迭代来得到。

所以现在来介绍一个例子,我们首先学习一些RBM然后堆叠起来,然后使用对比版本的wake-sleep算法来对他进行微调,然后观察得到的结果。如果我们用来识别东西,这还是一个生成模型吗?首先,我们使用500个二值隐藏单元来对28×28大小图片的10个数字类进行建模,一旦学好了第一个RBM(28*28-500),这时候还没用到标签,所以这是无监督学习。接着我们使用这500个隐藏单元中的激活模式,将它们视为数据,然后学习另一个有着500个单元的RBM,这两个RBM的学习都没用到标签。一旦完成之后,我们在告诉整个模型标签是什么,所以前两个隐藏层是没有标签的,然后加一个大的顶层,然后给他10个标签,你可以认为我们将这10个标签和500个用来表示特征的单元级联起来,另外,这10个标签是一个softmax单元。然后我们训练顶层的RBM来对这10个标签的softmax单元和这500个特征激活单元的级联进行建模。一旦我们训练好了顶层的RBM,我们就能通过使用对比wake-sleep对整个系统进行微调了。然后就会有一个非常好的生成模型,在前面引言部分中介绍过了,如果返回头找找的话,你就能看到当我们运行这个模型的时候发生的事情,也可以看到它是如何擅长识别和生成的,在那个部分中,Hinton曾说过最后会解释这个模型是如何work的,现在认为你已经看得足够多了应该知道当这个模型学习的时候发生的事情了。

二、DBN的判别式微调

在这部分将会介绍如何通过堆叠RBM来学习DBN,然后将DBN视为DNN来进行判别式的微调,所以不是为了让微调使得像之前介绍的有更好的生成(或者泛化),而是微调来使得更好的在类别之间进行判别,这很work而且引起了在NN中的一个大复兴。在语音识别中,这有着重要的影响,而且在语音识别领域的许多领导团队都转到使用DNN来减小误差率。

现在先介绍微调这些深度网络来更好的判别。所以我们先通过堆叠的RBM一次学习一层特征,然后将这个视为预训练来寻找这些深度网络的一个很好的权重初始化,然后使用一些局部搜索方法来进行微调这些权重。在之前,介绍了如何使用对比版本的wake-sleep算法来微调一个深度网络使得能够更好的泛化他的输入。在这部分中,将会使用BP来微调一个模型使得能够更好的判别。如果我们这样做而且克服了BP的一些标准的局限性,就能使得学习深度网络变得更加简单,而且可以使得这些网络更好的泛化。

我们需要理解为什么BP在我们预训练权重之后能够更好的work。这有着两个影响:一个是在优化上,另一个是在泛化上。所以这个预训练在当我们有很大网络的时候,特别是每一层都有位置(locality)的时候可以很好的缩放(scales)。所以如果我们做的是视觉而且我们在每一层都有着局部感受野,那么在广泛的分离的位置上就没有太多的交互。所以在并行上或多或少的学习一个大层就很容易了。当我们使用预训练的时候,我们在已经学到有意义的特征检测器之前都不会使用BP,这些特征检测器对于判别来说都是很有帮助的。所以这个最初的梯度可以比之前使用随机得到的更有意义。而且BP不需要做全局搜索,它只需要从一个有意义的起始点开始进行局部的搜索。

在为了让优化变得更容易之外,预训练网络可以有更少的过拟合。这也就是因为在最终的权重中大多数的信息来自于输入向量分布的建模。如果你处理的是像图片一样的数据,这些输入向量通常包含许多比标签还多的信息,一个标签通常只包含了一点信息用来约束从输入到输出的映射。然而一个图片包含着信息,它们却会约束任何图像集合的生成模型。在标签中的信息之用来在最终的微调上,因为这个阶段我们已经决定好了特征检测器,我们不会浪费之前从scratch(这个单词也许是字幕有误,忽略的话也不影响理解)中设计的特征检测器的信息。这个微调只会导致在生成的预训练阶段得到的特征检测器的轻微的改变,这些改变需要在正确的空间中得到类别边界。重要的是BP不需要发现新的特征(意思就是BP只是用来微调,我们不产生新的特征,我们只是特征的修改者),所以它不需要和数据一样多的标记(个人:这里意思是许多无标签数据用来预训练,一小部分标签数据用来微调)。事实上,这种类型的学习可以很好的在大多数数据都没有标签的时候work,因为这个生成的预训练可以可以使用这轻量级的数据。无标签数据仍然对寻找好的特征来说非常有用。有一个显而易见的异议就是当我们使用生成预训练的时候,我们会学习许多对于具体的判别式任务来说是无用的特征。例如,考虑你需要网络在形状之间进行判别,或者你想要在一个形状的不同的姿势之间进行判别。他们需要非常不同的特征,如果你预先不知道这个任务,你就会不可避免的学习那些没用的特征。当计算机变得越来越小,就会有个严重的异议。不过现在计算机是足够大的,我们可以满足之前没法使用的特征的学习。我们可以满足是因为几乎所有的学到的特征中许多特征都是比原始输入更多更有用,而且也多于一些对于具体任务来说不感兴趣没有用的特征。

所以让我们用这些来对数字进行建模,我们先完全无监督的学到三层隐藏层的特征,一旦学习完成,当我们要从这个模型中生成的时候,它会生成那些看上去很真实的数字的东西,而且它可以从所有的这些不同类中生成他们。而且它通常在从一个类别转到另一个类别的时候需要一段时间,因为它倾向于在跳跃到另一个峡谷之前停留在同一个峡谷一段时间。不过问题就是,我们学到的这些特征对于判别来说有用吗?所以我们所需要的就是增加一个最终的10通道softmax在顶部,然后用BP来对它进行微调,然后看是否做的比之前纯判别式训练更好。

所以这里就是排列不变的MNIST任务的结果。我们说的排列不变的意思是如果我们使用所有像素的一个固定的随机排列,对于每个测试和训练样本都是同样的排列,我们算法的结果就不会变。很明显这对于CNN来说不正确。一个CNN是会被告知这个任务的一些事情(也就是模型本身包含的信息)。通过音乐这个固定的排列,我们摧毁了所有简单方式,那些用来告诉网络一些有关这个任务空间属性的信息的方式。所以如果你使用标准的BP结果很难超过1.6%错误率。John Platt和Hinton都努力在不同的结构上使用标准的BP,结果显示都还不错。你没法通过在隐藏单元的引入权重向量上加上约束来使结果超过1.6%.。如果你在引入的权重向量的长度上使用一个合适的约束,你就可以做的比1.6%结果更好。SVM可以得到1.4%。这是SVM可以取代BP的一个证明。如果你使用玻尔兹曼机的堆叠来进行预训练一个网络,然后接着进行微调,使得更好的生成数字和图像标签的联合密度,那么你就能得到1.25%的结果。如果你训练一个堆叠RBM,然后简单的加上10-way的softmax,然后进行微调,你就能得到结果为1.15%,在加入更多的周边的摆动(fiddling
around),你可以将 结果达到1%..所以你可以做很多比标准BP更好的结果,同样可以使用生成预训练然后使用判别式微调来比SVM做的更好。

Mackerie Yerenzato 在Yann LeCun的团队工作,同样显示,使用轻微的不同的预训练模型,这个预训练有助于对更多的数据和更好的先验进行建模,所以他们使用额外的60000个扭曲的数字图像,所以他们有更多的训练数据。他们同样使用卷积多层网络。yan的团队在调整参数上是最好的团队,通过BP,他们成功的将结果降到了0.49%。但他们通过来做无监督逐层预训练,然后使用BP之后,结果达到了0.39%,这是一个记录。

所以你可以记住这张图,这是第一课中的,这是一个在NN上成功的例子。之前说,可以通过预训练然后进行BP微调使得结果降到20.7%,之前,在这个上面的记录是24.4%,而这实际上是需要均化好几个不同的模型才得到的。微软研究院的li deng立马提升了这个结果,然后一起合作来提升它,这使得在语音识别中有很大的改进。如果你看过这个新闻,(上图中的链接),它可以让你连接到一个博客上,微软的首席研究员的谈话,关于语音识别上由于DNN带来的的巨大提升。

三、在判别微调的时候发生了什么

这部分将会介绍当一个NN在进行判别式微调的时候的时候发生的事情。我们将会看到在下层中的权重几乎没改变。不过然而这些微小的改变还是会在NN分类效果上有着巨大的影响,因为他们将决策面放到了正确的位置上。我们同样可以看到预训练的影响是让更深的网络比浅层网络更有效。在没有预训练的情况下它通常就是另一个情况了。最终,得到了一个相当普遍的想法就是为什么开始通过生成式训练,然后只在这样很好的完成之后使用判别式的训练是有意义的。

现在来看下Yoshua Bengio他们实验室的工作,检查了在网络已经被生成的预训练之后微调发生的事情,如果观察上图左边,是第一层隐藏层也就是特征检测器的感受野,在生成预训练(generative pre-training)之后,而在微调之前;右边的是同样的感受野,不过是在微调之后,你可以发现几乎没有什么改变。不过这些改变有助于判别。

这是一个关于预训练如何减少只有一层隐藏层网络的测试误差的例子(上图左边部分),任务是判别一个非常大的扭曲数字集合里面的数字。可以发现在微调自豪,这个通过预训练得到的网络几乎总是比没有预训练的网络效果要好。如果使用的网络层数越深,影响越明显。(接着来看上图右边)你可以发现基本上在两个分布之间几乎没有重叠。预训练的深度网络比浅层网络更好,而没有预训练的深度网络却比浅层网络更糟糕。

(上图左边)这是展示在不同的层数下分类的错误和错误的变化,你可以发现有两层是最好的,观察有4层的结果,你发现结果更差了。通过对比(上图右边)如果你使用了预训练,4层的结果会好于2层的结果,有着更少的变化而且错误率更低。

这是有Teeson制作的可视化图,关于在有预训练和没有预训练的时候网络的权重,他们都被画在了同一个空间中,不过你可以发现他们在网络中形成了两个不同的类别。顶层的那个是没有预训练的,下面那个是有预训练的,每一个点显示函数空间中的一个模型,比较权重向量是没意义的,因为两个网络可以通过循环的交换两个隐藏单元来区分。所以他们的行为都是一样的方式,不过权重看上去非常的不同。为了将它们进行对比,你需要比较执行函数。一种方法是使用一个合适的测试样本然后观察网络在这些测试样本上的输出结果。然后将这些输出连接到一个长向量中。所以如果两个网络生成非常的相似,那么这个链接的向量将会非常相似,现在你使用这些连接的输出向量然后用t-SNE画在2d上。颜色说明了训练的阶段,所以观察顶部这个网络,是黑蓝为初始,然后看到他们都吵着同一个方向粗略的移动。换句话说,网络在一个epoch的训练之后,会比初始化的时候更像另一个网络(意思就是殊途同归)。从底部这个网络上能够看出,这个现象更加的明显。所以颜色是为了说明你现在处在哪个epoch中。顶部的这个没有预训练的轨迹显示不同的网络会在函数空间中以不同的位置结束,而且他们相当的分开,底部的这个有预训练的轨迹显示,是以一个相当不同的函数空间区域结束的。这个网络倾向于它们之间更加的相似。不过这里的重点是他们没有重叠,如果你生成式的预训练这个网络,你会发现这种答案是相当不同于你以随机权重开始的。

最后想要说的就是解释为什么预训练是有意义的。先想象下我们生成一个图像和标签对的方法,是通过在真实世界中从stuff中得到的,使用这个来生成一张图片,例如拍照。然后在有了一张图片之后,我们给它贴上标签,而这个标签不是由stuff来决定的,所以对于图片自身来说,世界中的stuff是与这个标签相关的,因此依赖于图片中的像素。例如,如果标签告诉我们关于顶部左边的像素相似于右下角的像素,现在如果以这种方式来生成图片,那么就可以有意识的试着学习图片到标签的映射。(上图右边)因为标签直接依赖于图片,不过事实上,这是直接有我们生成图片标签对的方式决定的,通过世界中的stuff直接得到的图片。这个图片有名字的原因是因为世界中的stuff,而不是因为图片中的像素。所以你看到一个奶牛,然后拍照,你称这个图片为奶牛,因为你拿着图片的时候看到一个奶牛。现在重点是,有一个stuff的高带宽从世界到图片上,而且有一个stuff的低带宽从世界到标签。例如,如果说奶牛,你不知道这个奶牛是否是上下颠倒的,它是否是棕色的,黑色的,还是白色的,是否是活的还是死的,多大,图片中还有其他什么东西,它是面对着你还是背对着你。这些事情都不是从标签上看得出来的。如果你观察一张千乘以千像素大小的图片,你通常会知道所有的这些疑问。你得到的很多信息是因为一张图片,通过观察图片,然后观察图片的标签。所以在这种情况下,对于有着从世界到图片的高带宽路径和从世界到标签的低带宽来说,因为标签通常包含的信息很少。试着还原标签是很有意义的,首先通过将高带宽路径转换回到引起这个图片的真实世界中的stuff,然后再来决定应该用什么标签。所以这所以一个更合理的模型关于如何将名字赋予图片中的东西。这交代了一个你试着从图像到他潜在的原因的预训练阶段,然后跟着一个你试着从前在原有到标签的判别阶段。接着轻微的微调这个从图片到潜在的原因的映射。

四、用RBM来对实值数据进行建模

在这部分中,将会介绍如何用RBM来对实值数据进行建模。idea就是让可视单元中用带有高斯噪音的线性单元替换原来的二值随机单元。当我们想要这么做的时候,我们就会遇到有关学习的问题,结果显示一个很好的解决方法就是让隐藏单元变成ReLU。在对于可视部分的线性高斯单元,和隐藏层的ReLU,学习一个对于实值数值很好的建模的RBM是相当容易的。

我们首先使用RBM来对手写数字图像建模,对于这些图像来说,由那些部分被着色的像素引起的中等的强度可以通过概率来很好的建模,也就是用介于1和0之间的数值,也就是用来表示这个逻辑单元被打开的概率。所以我们将部分着色的像素作为着色的概率,虽然这不正确,不过却work。然而,对于真实图片来说,这就不work了,在真实图片中,一个像素的强度几乎总是差不多等于它的周边的均值。所以会有很大的概率是与这个均值很接近,很小的概率是与离他很远的地方很接近,而且你没法通过一个逻辑单元来获得这样的结果。平均场逻辑单元没法表达像强度这样的东西,比如要表达0.69,而不是0.71或者0.67.所以我们需要另一种单元。

显而易见的事情是使用一个带有高斯噪音的线性单元。所以我们将像素作为高斯变量来建模,我们仍然可以使用交替的,采样来运行需要交叉发散学习的马尔可夫链。不过我们需要使用一个更小的学习范围,否而它就会倾向于爆炸。等式就如上图所示,等式右边的第一项是一种包含抛物线的函数,它阻止事情的爆炸,所以通过第i 个可是单元来决定这个的和分布是一个抛物线形状。它看上去如上图红线。这是一个在第i 个单元的偏置处有这最小值的抛物线。如果第i 个单元原理这个值,我们就二次增加能量,所以这是为了保持第i 个可是单元能够靠近bi,这个介于可视单元和隐藏单元之间的交互项如公式最后一项,如果你对他关于i
的微分,你可以发现,结果是常量。就是基于所有的hj wiji乘以vi /sigma  j 的和。所以这一项的常量梯度如上图蓝色线。当你将他们加起来的时候,这个自顶向下的分布到能量的结果是线性的,你得到的一个抛物线函数不过他的均值是远离bi 的。不过到底远离多少是由蓝线的坡度决定的,所以隐藏单元的影响是为了将均值推送到另一边。

可以很容易的写下一个能量函数,而且很容易对他进行求导,不过当我们要对他进行学习的时候,我们通常会遇到问题。在文献中有许多的报告显示人们没法让高斯二值RBM工作起来,的确,对可视单元的紧凑方差进行学习是很困难的。需要花很长时间来指出为什么学习这些可视方差是这么困难。这张图片会有帮助的,如果你考虑在隐藏单元 j 上的这个可是单元 i 的影响,当这个可视单元 i 有一个很强的标准差sigma i ,这会放大自底向上的权重的影响,这是因为我们需要测量带有标准差的 i 的激活值。所以当这个标准差很小,我们需要用较大的数乘以这个权重。如果观察在单元i
上单元 j 的自顶向下的影响,这是通过sigma i与之相乘的,所以当这个可视单元 i 的标准差很小,自底向上的影响会放大,自顶向下的影响会缩小。结果就是我们会有一个争论,是自底向上的影响太大还是自顶向下的影响太小。结果就是这个隐藏单元倾向于一直固定打开或者关闭,这会影响学习的进程,所以解决方案就是使用比可视单元更多的隐藏单元,这允许介于可视单元和隐藏单元之间的小权重可以有着很大的自顶向下的影响,不过当然,我们真的需要隐藏单元的数量改变使得标准差sigma i 变得更消耗。在下面这个ppt,我们可以看到我们如何做到的。

这里介绍加强sigmoid单元,idea就是我们会对每个随机二值隐藏单元进行多次的复制。所有的复制品都有相同的权重,相同的偏置,不过这个自适应偏置b,有一个固定的偏移,第一个单元的偏移是-0.5,第二个单元的偏移是-1.5,第三个单元的偏移是-2.5,以此类推。如果你有整个像这样的的sigmoid家族,它的偏置是通过介于周边成员按照1 来改变的。响应代码如上图的曲线所示。如果结果中的总和是非常低的,那么就没有单元会被开启。随着增长,打开的单元的数量也在线性增长。意思就是就像之前的ppt中说的标准差越来越小,每个隐藏单元的复制数量,那些打开的单元数就会越来越多,而且我们获得了我们想要的effect,我们会得到更多的自顶向下的影响来驱动这些有着小的标准差的可视单元。

现在,使用一个大的有着偏移偏置的二值随机单元群体是非常不划算的,因为对于每个单元来说,我们需要把总的输入给这个逻辑函数。但是我们可以使用一些快速的逼近值,它们一样可以很好的work。所以整个有着偏移偏置的sigmoid单元群体的激活值的和,如上图中的那个公式一样,等于逼近log(1+ex),而这又等于逼近max(0,x+noise)。如果我们想的话,可以对x增加一些噪音。所以这个等式中的第一项看上去上图中第一个图(就是第一个是多条曲线,第二个是单条曲线,第三个是绿色曲线)第二项像上图中第二个图,你可以发现在第一项中所有的这些sigmoid的和像第二个图,我们可以通过一个线性的有着阈值的单元来逼近,这个单元有着0的阈值,如上图绿色的曲线,他是按照他的输入线性增长的。

CD学习在这群有着偏移偏置随机二值逻辑单元的和上可以很好的work,在这个情况中,你可以得到一个噪音方差,该方差等于这个逻辑函数,而不是这个和的输出。或者,我们可以使用这个绿色曲线和使用ReLU,这个可以更快的计算,因为你不需要使用这个逻辑很多次,可以相信用这些的基础上,离散可以很好的work。

一个ReLU的很好的特性是如果他们有一个为0的偏置,他们可以表现出缩放同变性,这对于图片来说是一个非常好的特性,缩放同变性意思就是如果你有图片x而且你通过一个缩放因子a来乘以所有的这些像素强度,那么在ReLU中的ax的表征可以只是a乘以x的表征,换句话说当我们对图像中所有的强度进行缩放的时候,我们缩放所有的隐藏的那袁的激活值,不过所有的比率还是一样的。ReLU不是全线性的,因为如果你将两个图片加起来,你得到的表征不是每个独立单元的表征的和。这个缩放同变性的特性相似于CNN中的平移同变性,所以如果我们忽略CNN中的池化(pooling),如果我们平移一张图片,然后观察他的表征,这个平移后的表征其实等于未平移图片的表征的平移。所以在一个没有池化的CNN中,输入的平移就像是流过网络的每一层而没有真正的影响任何东西,每一层的表征只是平移了下罢了。

五、RBM是无限sigmoid置信网

在这部分中,将会介绍一些超前的东西。这对于NN的第一次课程来说不合适(就是接受一次NN的教育不能理解本部分的内容),不过Hinton这部分就是专门为那些对DL特别感兴趣的人留的。这部分的内容非常的具有数学性,所以就不坚持放入教学中了。之前层说过堆叠RBM可以得到例如sigmoid置信网一样的东西,在那个介绍中没有任何的数学部分,不过注意,RBM事实上就是一个有着共享权重的无限深度sigmoid置信网。再一次,权重共享可以导致很多有趣的事情。

这里介绍一个非常有趣的关于为什么逐层学习会work的解释。这依赖于一个事实,在像RBM这样的对称连接的无向网络与每一层使用相同的权重的无限深度有向网络之间有个等价。这个等价同样让 我们知道为什么CD学习会work。所以一个RBM真的只是一个有着许多共享权重的无限深度sigmoid置信网,当我们想要从RBM中采样的时候使用的马尔可夫链可以被视为和sigmoid置信网一样的东西。

所以这就是所需要的图片,我们有一个非常深的sigmoid置信网,事实上是无限深度。我们在每一层使用相同的权重,并且让所有的v层都有相同的size,而且所有的h层都有相同的size。不过v和h之间可以有不同的size。通过这样有着重复权重的非常深的网络生成的分布是,你可以通过使用相同的权重矩阵W在交替的P(v|h)和P(h)|v得到的概率值而达到的平衡分布。这就是但你使用RBM的时候,然后使用马尔可夫链从这个平衡分布中得到一个采样所作的事情。所以自顶向下的传播开始变得无限增大,在这个有向网络中,也就是让一个RBM稳定到平衡状态,不过这会定义同一个分布.如果你使用这个无限有向网络,那么你从v0得到的采样将会是一个等价RBM的平稳采样。

现在,让我们看看在无限深度sigmoid置信网中的推理。我们先从v0开始,然后推论出h0的状态。正常情况下,这是一个非常困难的事情,因为explaining away的存在,如果隐藏单元k和j 同时都有与可视单元i 相连的很大的正权重,那么我们就期望当我们观察到 i 打开的时候,单元k 和j 在后验分布中是反相关的,这就是explaining away。然而在这个网络中,单元k 和 j 在当给定v0的时候推导过程中是完全之间相互独立的。所以这个推论是可以忽略的,我们只是通过W的转置来乘以V0,然后将我们得到的传给这个逻辑sigmoid,然后采样。这可以得到h0中单元的二值状态,不过问题是他们在给定explaining
away现象的时候如何是相互独立的。这个问题的答案在于这个基于h0上的模型执行的是互补先验,即执行一个基于h0的先验分布,这可以完全抵消explaining away中的相关性。所以对于这里举的例子,这个先验将会执行单元k 和 j 之间的 正相关,explaining away会导致负相关,所以两者会抵消。所以真正发生的就是当我们使用w的转置乘以v0的时候,我们不是只计算这个似然项而已,我们是计算一个似然项和先验项的积,这就是为了得到后验所需要的。这对于人们来说非常让人惊讶。当你通过wT来相乘的时候,这就是你计算的后验中的先验的积。所以在这个网络中发生的就是这个通过基于h0上的所有的stuff
执行的互补先验,准确的抵消了explaining away ,从而使得推导变得非常简单。所以我们可以对每一层来进行推导,然后通过简单的WT乘以V0来得到无偏估计样本。一旦我们计算了h0的二值状态,我们用W与之相称,然后将结果传给逻辑sigmoid然后进行采样,这会得到一个关于v1的二值状态,以此类推。假设从这个模型中生成等于在RBM上交替的运行马尔可夫链到平衡状态。在这个模型上推论与其相反的方向是有着一样的处理过程。这是一个非常特殊的sigmoid置信网,其中的推论是与生成一样非常简单的。

这里介绍这个定义这个模型的生成权重,和他们的转置,这就是我们推论的方法。现在这里先介绍下如何从为了有向sigmoid置信网的学习算法中得到玻尔兹曼机学习算法。所以这个sigmoid置信网的学习规则表示应该首先从后验中得到一个采样,也就是sj 和si的值,都是从后验分布中采样得到的。然后改变生成权重,按照上图第一个式子的形式,成比例的改变,其中是在给定所有二值状态的基础上 j 的激活值和 i 的激活值与i打开的概率之间的差异的积。现在如果说如何计算Pi ,如果看上图右边网络中的这个推论,我们首先为h0推论出一个二值状态,一旦我们选择了这个二值状态,我们接着为v1通过w×h0来推论出二值状态,将这个结果给逻辑函数,然后进行采样。所以如果想考虑s(1)_i
是如何生成的?这是一个当你将h0给权重矩阵w,然后给逻辑函数之后得到的采样。这就是我们所要做的,为了计算p(0)_i .我们需要h0中的二值激活值,然后下行通过上图中绿色箭头表示的权重w,接着计算在给停他的父节点的二值状态后单元i 打开的概率。所以重点就是,从h0到v1 的这个过程等于从h0到v0之间的过程。所以s(1)_i 是一个关于p(0)_i 的无偏估计采样。也就是我们可以在学习规则中替换它。

所以在学习规则的最后,就如上图的几个阶梯式的式子,因为有重复的权重,这些每一个线都是学习规则中的一项,来自于这些绿色权重矩阵中的对应的部分。对于第一个绿色权重矩阵,(上图右边蓝色框起来的绿色箭头),学习规则是突触前的状态s(0)_ j 乘以突触后的状态s(0)_ i 与在h0中 s i 将会打开的二值状态的概率之间的差异,我们可以叫这个二值状态的概率做p(0)
_i ,不过这个的一个采样的概率是s(i)_ i ,所以与之相关的无偏估计可以通过在学习规则的第一行中插入s(1)_ i 得到。相似的,对于第二个权重矩阵,(上图右边的紫色框),学习规则是s(1)_ i 乘以(s(0)_ j - p(0) _ j),p(0)_ j 的一个无偏估计是s(1)_ j 。所以这是这个学习规则中,对于第二个权重矩阵的无偏估计(上图左下角紫色框)。如果你接着为了所有的权重矩阵这样下去,你就可以得到无限系列(如上图左下角的无穷)。所有的这些项,除了非常前面的项和非常后面的项,其他项可以互相抵消,所以在玻尔兹曼机学习规则的最后,是s(0)_
j * (s(0)_ i - s(∞)_ i *s(∞)_  j )。

所以回头看如何学习一个无限深度sigmoid置信网,先将所有的权重都弄成一样的。然后将所有的权重矩阵捆绑起来,然后用这些捆绑好的权重来学习。现在这等价于学习一个RBM。上图右边的那个图和左边的这个图是一回事。我们可以认为左图中这个对称的箭头,就是一个对有着绑定权重的有向网的便利的速记方式,所以我们首先学习RBM,然后就该去使用最大似然来学习,不过实际上使用的是CD算法。

一旦我们学好了第一个RBM,接下来就是冻结底层的权重。也就是冻结定义模型的生成权重。同样会冻结用来推论的权重使他们成为生成权重的转置。所以在冻结之后,我们让所有的其他权重绑定在一起,不过现在可以让他们不同于底层的权重了,不过他们仍然是全部绑定的。所以学习剩下的绑定的权重是等价于学习另一个RBM,即一个有着h0和他的可视单元v1 的RBM,而这时候v1作为他的隐藏单元,这里数据是通过h0的聚合后的 后验,也就是,如果我们想要采样一个数据向量来训练这个网络,我们要做的就是将真实数据向量输入到v0中,然后通过这些冻结的权重,然后在h0处得到一个二值向量,然后将这个向量视为数据来训练下一个RBM。可以以此类推自己觉得足够多的层数,当叠加起来之后,在顶层的RBM的最后也就等价于这个无限有向网络之上的其他所有权重还是绑定的(其实上面之上的那些层不存在,不过在无限角度来看就是未训练,未改变而已),不过下层的这些权重现在都变的不同了。

现在一个解释为什么这个推论过程是正确的,涉及到关于由上面层中的这些权重生成的互补先验的idea,不过当然,当我们改变上面层的这些权重的时候,底层的权重是固定的,由这些改变的权重生成的先验不再完全互补了。所以现在,我们的推论过程,使用底层中的这些冻结的权重,就不再正确了。好消息是,通过这个不正确的推论过程,结果却总是接近于正确,我们仍然可以得到在这个数据的低概率上一个可变的范围。

那些改变了的更高层因为他们已经对底层那些接近于聚合后的后验分布的隐藏层学习了一个先验,这会让模型变得更好。所以改变这些隐藏权重会让在底层隐藏层上的推论不正确,不过却能得到一个更好的模型,如果看这两个effects,我们可以证明从更好的模型中的可变范围内得到的提升总是比从这个不是很正确的推论中得到损失要多(就是好处大于坏处)。所以在这个可变范围中,假设是用正确的最大似然学习,当学习隐藏层中的权重的时候就win了。

现在回头看看在CD学习中会发生什么。我们在上图右边有个无限网络和左边有一个RBM,他们是等价的。如果我们对RBM采用最大似然学习,那么就相当于对这个无限sigmoid置信网进行最大似然学习。不过接下来要做的就是将东西切分开。忽略从无限sigmoid置信网的更高层中得到的权重的小导数,也就是在上图右边在红虚线的地方切开。现在如果看这个导数,那么就像上图的那个式子一样,有两项,第一项来自于这个网络的底层。途中蓝色框出来的这项是相互对应的,第二项来自于上图中紫色框出来的部分,我们需要计算h1中的激活值,为了计算第二项中的s(1)_
 j ,不过这里不计算第三层的权重导数。当计算出前两项的时候,就将他们结合起来,这样就得到了一次CD学习规则。所以在CD上,就是将低层的权重导数结合起来,然后忽略更高层中的权重导数(derivatives)

问题就是为什么忽略了更高的导数的时候结果还ok?当权重很小的时候,这个马尔科夫链的混合速度很快。如果权重是0,他就可以在一步之内混合,如果马尔科夫链混合的很快,更高层将会更靠近平稳分布,即他们忘记了在底层上的输入是什么了。现在我们有一个很好的特性,如果更高层是从平稳分布中采样的道德,那么这个关于权重的数据的log概率的导数,肯定均化成0 了,这是因为模型中当前的权重是一个平稳分布的完美模型。这个平稳分布使用这些权重而生成的。如果你想从这个平稳分布中生成采样,这就是你可以得到的最好的权重。所以我们知道开根号结果是0,随着权重变得越来越大,可以使用更多次的CD,这是考虑到这个无限sigmoid置信网有着更多层的情况的。这可以让CD连续的成为一个最大似然的很好的逼近,所以如果试着去学习一个密度模型,就更有意义了。当权重在增长,运行的CD次数会越来越多。如果有一个环绕的统计数据(就是很多数据都在这个数据周围),先给他一个保证(个人:不知道什么意思)然后在这个无限的约束下,运行CD差不多无限次。然后得到一个逐渐收敛的结果。当然这是完全不相关的,因为你没法达到一个完全收敛的点。然后这是一个有趣的点,如果我们的目的是使用CD来建立一个堆叠RBM,来学习多层特征,结果显示我们不需要一个最大似然的逼近。对于学习多层特征来说,CD已经很好了。事实上,它可能做的会比最大似然更好。

lecture14-RBM的堆叠、修改以及DBN的决策学习和微调的更多相关文章

  1. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  2. hinton教授的本科生课程CSC321-机器学习中的神经网的笔记

    最近一直在看仙守博友所记录的笔记 Hinton的CSC321课程(完结,待文字润色): 1.lecture1-NN的简介 2.lecture2-NN结构的主要类型的概述和感知机 3.lecture3- ...

  3. 基于深度学习的安卓恶意应用检测----------android manfest.xml + run time opcode, use 深度置信网络(DBN)

    基于深度学习的安卓恶意应用检测 from:http://www.xml-data.org/JSJYY/2017-6-1650.htm 苏志达, 祝跃飞, 刘龙     摘要: 针对传统安卓恶意程序检测 ...

  4. 【deep learning学习笔记】注释yusugomori的RBM代码 --- 头文件

    百度了半天yusugomori,也不知道他是谁.不过这位老兄写了deep learning的代码,包括RBM.逻辑回归.DBN.autoencoder等,实现语言包括c.c++.java.python ...

  5. 深度学习(二)--深度信念网络(DBN)

    深度学习(二)--深度信念网络(Deep Belief Network,DBN) 一.受限玻尔兹曼机(Restricted Boltzmann Machine,RBM) 在介绍深度信念网络之前需要先了 ...

  6. JMeter学习-033-JMeter BeanShell 脚本应用实例之参数变量修改

    BeanShell脚本是JMeter自动化测试过程中不可或缺的提升技能之一,BeanShell脚本编写类似于Java脚本.它可以获取.修改系统定义或用户定义的变量值,同时也可以进行一些相应的测试数据处 ...

  7. python进程之间修改数据[Manager]与进程池[Pool]

    #前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据 #Mnager就可以实现 import multiprocess ...

  8. PyCharm 配置远程python解释器和在本地修改服务器代码

    PyCharm 配置远程python解释器和在本地修改服务器代码 最近在学习机器学习的过程中,常常需要将本地写的代码传到GPU服务器中,然后在服务器上运行.之前的做法一直是先在本地写好代码,然后通过F ...

  9. 32.修改IK分词器源码来基于mysql热更新词库

    主要知识点, 修改IK分词器源码来基于mysql热更新词库     一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...

随机推荐

  1. JAVA中的字符串小结

    String字符串是只读的,不可变的 查看String类的源码,可以发现String类是被final关键字修饰的: 另外还可以看下String类源码中的其它方法实现,随便举个可以修改String值的方 ...

  2. linux下svn命令使用大全(share)

     转自:http://blog.chinaunix.net/uid-22566367-id-1965771.html 1.将文件checkout到本地目录 svn checkout path(path ...

  3. mysql online ddl

        大家知道,互联网业务是典型的OLTP(online transaction process)应用,这种应用访问数据库的特点是大量的短事务高并发运行.因此任何限制高并发的动作都是不可接受的,甚至 ...

  4. Linux nm命令

    一.简介 显示关于对象文件.可执行文件以及对象文件库里的符号信息. 二.选项 http://www.cnblogs.com/wangkangluo1/archive/2012/07/02/257243 ...

  5. keepalived高可用反向代理的nginx

    实验系统: (1)CentOS 6.6_x86_64: (2)共有三台主机,本实验以ip地址来命名主机,即131主机.132主机.133主机. 实验前提:防火墙和selinux都关闭,主机之间时间同步 ...

  6. 网管把握市场需求,其实一点都不可怜 转载于 [http://tonyxiaohome.blog.51cto.com/925273/955589]

    呵呵,这是我到51CTO做实习斑竹,回复的第一篇帖子,原帖在这里: http://bbs.51cto.com/thread-940532-1.html 这位朋友可能最近受到点挫折,所以有点小灰心,我呢 ...

  7. 【原创Android游戏】--猜数字游戏Version 0.1

    想当年高中时经常和小伙伴在纸上或者黑板上或者学习机上玩猜数字的游戏,在当年那个手机等娱乐设备在我们那还不是很普遍的时候是很好的一个消遣的游戏,去年的时候便写了一个Android版的猜数字游戏,只是当时 ...

  8. VIM的强大功能

    转发地址:http://coolshell.cn/articles/5426.html 简明 Vim 练级攻略   vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是 ...

  9. Java线上应用故障排查之二:高内存占用

    搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java ...

  10. [No000025]停止自嘲—IT 技术人必须思考的 15 个问题

    行内的人自嘲是程序猿.屌丝和码农,行外的人也经常拿IT人调侃,那么究竟是IT人没有价值,还是没有仔细思考过自身的价值? 1.搞 IT 的是屌丝.码农.程序猿? 人们提到IT人的时候,总会想到他们呆板. ...