zoukankan      html  css  js  c++  java
  • Deep Learning 18:DBM的学习及练习_读论文“Deep Boltzmann Machines”的笔记

    前言

          论文“Deep Boltzmann Machines”是Geoffrey Hinton和他的大牛学生Ruslan Salakhutdinov在论文“Reducing the Dimensionality of Data with Neural Networks”合作后的又一次联合发表的一篇有深远影响的论文,这篇论文第一次提出了DBM及其学习方法,对DBM原理、来源都做了详细讲解。

     

     论文内容

    前面介绍的都是BM原理及其训练,可以不用管它,下面直接从第3节开始……

    3.DBM

          一般情况下,我们很少对复杂的全连接的玻尔兹曼机(BM)感兴趣,而是对一个深度多层的BM感兴趣,具体见图2的左边部分。图中的每一层都能从下一层隐藏特征的激活值中提取出更高阶的特征。我们对DBM感兴趣有如下几个原因。第一,与DBN一样,DBM也有学习内部特征的能力且DBM在目标和语音识别方面的作用非常有前途;第二,DBM能从大量的无标签数量中学习出高阶特征,然后再用少量有标签数据对整个模型微调;第三,与DBN不一样,DBM的逼近推导过程,除了有自底向上的传播之外,还包含了自顶向下的反馈,从而使DBM能更好地传播模糊输入的不确定性,因此它的鲁棒性更好。

    图2. 左图:一个三层的DBN和一个三层的DBM;右图:预训练一系列RBM,然后把它们组合成一个DBM

          对于一个无层内连接的2层的BM(即:RBM),它的能量函数如下:

    可视层向量V的概率密度函数如下:

    对可视单元和两层隐藏单元的条件概率分布如下:

          对于DBM的最大似然函数的逼近学习,仍可用上面提到的普通BM的学习方法,但是学习速率会非常慢,特别是隐含层越多学习速率会越慢。下面一节提出一种快速的算法来初始化模型参数。

    3.1 利用逐层贪婪算法预训练DBM

         hinton在2006年的论文“A Fast Learning Algorithm for Deep Belief Nets”中介绍了一种逐层贪婪无监督学习算法。在一系列堆叠的RBM中,该算法一次只学习一个RBM,依次学习。在学习完整个堆叠的RBM后,可以把这个用RBM堆积起来的模型看作成一个概率模型,叫“深度信念网络(DBN)”。特别注意,这个模型并不是一个DBM。DBN的最上面两层是一个RBM,它是一个无向图模型,但DBN其余下面的层是一个有向生成模型(见图2)。在学习完DBN中的第一个RBM后,生成模型可写成如下形式:

    其中,p(h1;w1)是h1的隐式先验概率。对DBM中的第二个RBM,实际上就是用p(h1;w2)代替原来的p(h1;w1)。如果第2个RBM按照论文A Fast Learning Algorithm for Deep Belief Nets”中的方法进行正确的初始化,p(h1;w2)就会变为一个更好的h1的后验分布模型,在这个模型中,这个后验分布对于所有训练样本都是一个简单的阶乘后验组合成的非阶乘混合。因为第2个RBM用了一个更好地模式取代了p(h1;w1),那么就可能通过对这两个模型中的h1求平均从而推导出p(h1;w1,w2),具体方法就是把自底向上得到的w1的一半和自顶向下得到的w2的一半相加。这里利用的自底向上得到的w1和自顶向下得到的w2,就相当于重复计算了,因为h2对v是独立的。

          为了初始化DBM的模型参数,本文提出了逐层贪婪预训练RBM堆的算法,但是同论文“A Fast Learning Algorithm for Deep Belief Nets”中方法相比,有一个小小的变化,这是为了消除把自顶向下和自底向上联合在一起所带来的重复计算问题。对于最下层的RBM,我们使输入单元加倍且约束住可视层与隐含层间的权值,见图2右边部分。这个用相关参数修改过的RBM对隐藏单元和可视单元的条件概率分布如下:

          CD算法用于这个RBM的预训练可得到非常好的结果,而这个修改过的RBM也能很好地重建训练数据。相反地,可把最顶层的RBM的隐藏单元数加倍。最顶层RBM的条件分布如下:

     当这两个模块组合成一个模型后,进入第一个隐含层的总输入,有如下h1的条件分布:

     对V和h2的条件分布同式16和18一样。

           通过观察可发现,上面现个RBM组合而成的模型的条件分布与DBM的条件分布(式11、12、13)是一样的。因此,用贪婪算法预训练这两个修改过的RBM可得到一个权值对称的无向模型——DBM。当用贪婪算法预训练2个以上RBM时,只需要修改最底和最顶的2个RBM。对所有中间的RBM,只需要在组合成DBM的时候,简单把两个方向上的权值均分即可。

           以上面的贪婪算法预训练DBM的权值,有2个目的。第一,使权值初始化到一个合适的值,见实验结果部分。第二,有一个快速方法进行逼近推导,该方法以通过RBM堆单一向上传播的方式进行。在可视层给一个数据向量,通过自底向上的传递,每个隐含层单元都能被激活,且用自底向上翻倍输入的方式来弥补自上而下反馈的缺乏(除了最高一层没有自上而下的输入外)。这种快速逼近推导方法通常用来初始化平均场方法,该初始化方法比随机初始化法收敛更快。

    3.2 评估DBM

           最近,Salakhutdinov 和Murray在2008年提出了一种利用退火式重要性抽样(AIS,基于蒙特卡罗的算法,Radford M. Neal于1998年在论文“Annealed Importance Sampling”中首次提出)来评估RBM的配分函数的方法(Estimating Partition Functions of RBM's)。本小节介绍了怎样利用AIS来评估DBM的配分函数。与变分推导一起,就会较好地评估出测试数据对数概率的下界。

    3.3 DBM的微调

           完成上面的学习后,DBM中每一层的二值特征由原来的激活值变为一个确定的真实概率。DBM将会以下面的方式初始化为一个层数确定的多层神经网络。对于每个输入向量v,通过平均场推导可得到一个近似后验分布q(h|v)。这个近似后验分布的边缘分布q(h2j=1|v)与样本数据一起作为这个深度多层神经网络的“增广”输入,见图3。然后通过标准的后向传播微调这个模型。

    图3:学习完成后,DBM被初始化为一个多层神经网络。边缘后验概率q(h2|v)作为另外一个输入。这个网络通过后向传播进行微调。

          上面这个不同寻常的输入,实际上只是把DBM转换为一个确定层数的神经网络所得到一个副产品。基于梯度的微调一般会忽略q(h2|v),比如,使第一层的连接权值W2为0就会得到一个标准神经网络模型。相反地,这个模型使第一层的连接权值W1为0就会忽略数据的输入。在我做的实验中,这个模型是用整个增广输入来作预测。

    4 实验结果

         在实验中,利用了MNIST和NORB数据集。为了加快学习速率,数据集被细分为了很多个mini-batches。每个mini-batches包含了100个样本,每完成一个mini-batches的学习就更新一次权值。fantasy particles(理解:就是一对(vi,hi)形成的系统)用于追踪模型的统计,它的数量为100的平方。对于随机逼近算法,本实验用5步Gibbs采样更新fantasy particles。学习速率初始化为0.005,然后逐渐降到0。对于DBM的微调,实验中在5000个mini-batches基础上用共轭梯度算法进行微调,在每次迭代中对每个mini-batches进行3次线性搜索。

    4.1 MNIST数据集

         文章中说,通过这个实验发现DBM比DBN要好。原话:Table 1 shows that the estimates of the lower bound on the average test logprobability were −84.62 and −85.18 for the 2- and 3-layer BM’s respectively. This result is slightly better compared to the lower bound of −85.97, achieved by a two-layer deep belief network (Salakhutdinov and Murray, 2008).

         图4:  左图:实验中的2个DBM;   右图:训练集中随机抽样出的样本和从2个DBM中通过10万步Gibbs采样所得到对应的样本。图中显示的是已知隐藏单元状态条件下的可视单元概率密度。

         2层的BM错误识别率只有0.95%,在该论文之前,这个错误率是最低的。3层的BM的错误识别率为1.01%,而SVM的错误率是1.4%,随机初始化后向传播错误率是1.6%,DBN的错误率是1.2%(hinton  2006)。

    4.2 NORB数据集

          本实验中的2层BM的错误率为10.8%,SVM的错误率是11.6%,逻辑回归的错误率是22.5%,K均值的错误率是18.4%。 

    ——

  • 相关阅读:
    swift 如何给tabBarItem的相关设计
    本地缓存
    Xcode7.2 导入XMPP框架错误解决
    Selenium WebUI自动化测试--PO中传递driver
    【转发】自动化测试中 数据源获取方式
    IntelliJ IDEA 开发环境设置
    Jmeter在csv传参时 请求参数乱码
    XAMPP phpmind Agileone 环境搭建及遇到问题的解决方法
    python浅拷贝和深拷贝
    一套简单的git版本控制代码
  • 原文地址:https://www.cnblogs.com/dmzhuo/p/5110729.html
Copyright © 2011-2022 走看看