能量模型的概念从统计力学中得来,它描述着整个系统的某种状态,系统越有序,系统能量波动越小,趋近于平衡状态,系统越无序,能量波动越大。例如:一个孤立的物体,其内部各处的温度不尽相同,那么热就从温度较高的地方流向温度较低的地方,最后达到各处温度都相同的状态,也就是热平衡的状态。在统计力学中,系统处于某个状态的相对概率为,即玻尔兹曼因子,其中T表示温度,是玻尔兹曼常数,是状态的能量。玻尔兹曼因子本身并不是一个概率,因为它还没有归一化。为了把玻尔兹曼因子归一化,使其成为一个概率,我们把它除以系统所有可能的状态的玻尔兹曼因子之和Z,称为配分函数(partition function)。这便给出了玻尔兹曼分布。

玻尔兹曼机(Boltzmann Machine,BM)是一种特殊形式的对数线性的马尔科夫随机场(Markov Random Field,MRF),即能量函数是自由变量的线性函数。 通过引入隐含单元,我们可以提升模型的表达能力,表示非常复杂的概率分布。限制性玻尔兹曼机(RBM)进一步加一些约束,在RBM中不存在可见单元与可见单元的链接,也不存在隐含单元与隐含单元的链接,如下图所示

能量函数在限制玻尔兹曼机中定义为,b,c,W为模型的参数,b,c分别为可见层和隐含层的偏置,W为可见层与隐含层的链接权重

有了上述三个公式我们可以使用最大似然估计来求解模型的参数:设 。把概率p(x)改写为

由于可见单元V和不可见单元h条件独立,利用这一性质,我们可以得到:

logistic回归估计v与h取一的概率:

有了以上条件,我们可以推导出参数变化的梯度值:

使用基于马尔可夫链的gibbs抽样,对于一个d维的随机向量x=(x1,x2,…xd),假设我们无法求得x的联合概率分布p(x),但我们知道给定x的其他分量是其第i个分量xi的条件分布,即p(xi|xi-),xi-=(x1,x2,…xi-1,xi+1…xd)。那么,我们可以从x的一个任意状态(如(x1(0),x2(0),…,xd(0)))开始,利用条件分布p(xi|xi-),迭代地对这状态的每个分量进行抽样,随着抽样次数n的增加,随机变量(x1(n),x2(n),…,xd(n))的概率分布将以n的几何级数的速度收敛到x的联合概率分布p(v)。

基于RBM模型的对称结构,以及其中节点的条件独立行,我们可以使用Gibbs抽样方法得到服从RBM定义的分布的随机样本。在RBM中进行k步Gibbs抽样的具体算法为:用一个训练样本(或者可视节点的一个随机初始状态)初始化可视节点的状态v0,交替进行下面的抽样:

理论上,参数的每次更新需要让上面的链条图形遍历一次,这样带来的性能损耗毫无疑问是不能承受的。

Hinton教授提出一种改进方法叫做对比分歧(Contrastive Divergence),即CD-K。他指出CD没有必要等待链收敛,样本可以通过k步 的gibbs抽样完成,仅需要较少的抽样步数(实验中使用一步)就可以得到足够好的效果。

下面给出RBM用到的CD-K算法伪代码。

关于deeplearning的c++实现放到了github上,由于时间关系只是实现了大致框架,细节方面有待改善,也欢迎大家的参与https://github.com/loujiayu/deeplearning

  下面附上Geoff Hinton提供的关于RBM的matlab代码

  1. % Version 1.000
  2. %
  3. % Code provided by Geoff Hinton and Ruslan Salakhutdinov
  4. %
  5. % Permission is granted for anyone to copy, use, modify, or distribute this
  6. % program and accompanying programs and documents for any purpose, provided
  7. % this copyright notice is retained and prominently displayed, along with
  8. % a note saying that the original programs are available from our
  9. % web page.
  10. % The programs and documents are distributed without any warranty, express or
  11. % implied. As the programs were written for research purposes only, they have
  12. % not been tested to the degree that would be advisable in any important
  13. % application. All use of these programs is entirely at the user's own risk.
  14.  
  15. % This program trains Restricted Boltzmann Machine in which
  16. % visible, binary, stochastic pixels are connected to
  17. % hidden, binary, stochastic feature detectors using symmetrically
  18. % weighted connections. Learning is done with -step Contrastive Divergence.
  19. % The program assumes that the following variables are set externally:
  20. % maxepoch -- maximum number of epochs
  21. % numhid -- number of hidden units
  22. % batchdata -- the data that is divided into batches (numcases numdims numbatches)
  23. % restart -- set to if learning starts from beginning
  24.  
  25. epsilonw = 0.1; % Learning rate for weights
  26. epsilonvb = 0.1; % Learning rate for biases of visible units
  27. epsilonhb = 0.1; % Learning rate for biases of hidden units
  28. weightcost = 0.0002;
  29. initialmomentum = 0.5;
  30. finalmomentum = 0.9;
  31.  
  32. [numcases numdims numbatches]=size(batchdata);
  33.  
  34. if restart ==,
  35. restart=;
  36. epoch=;
  37.  
  38. % Initializing symmetric weights and biases.
  39. vishid = 0.1*randn(numdims, numhid);
  40. hidbiases = zeros(,numhid);
  41. visbiases = zeros(,numdims);
  42.  
  43. poshidprobs = zeros(numcases,numhid);
  44. neghidprobs = zeros(numcases,numhid);
  45. posprods = zeros(numdims,numhid);
  46. negprods = zeros(numdims,numhid);
  47. vishidinc = zeros(numdims,numhid);
  48. hidbiasinc = zeros(,numhid);
  49. visbiasinc = zeros(,numdims);
  50. batchposhidprobs=zeros(numcases,numhid,numbatches);
  51. end
  52.  
  53. for epoch = epoch:maxepoch,
  54. fprintf(,'epoch %d\r',epoch);
  55. errsum=;
  56. for batch = :numbatches,
  57. fprintf(,'epoch %d batch %d\r',epoch,batch);
  58.  
  59. %%%%%%%%% START POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  60. data = batchdata(:,:,batch);
  61. poshidprobs = ./( + exp(-data*vishid - repmat(hidbiases,numcases,)));
  62. batchposhidprobs(:,:,batch)=poshidprobs;
  63. posprods = data' * poshidprobs;
  64. poshidact = sum(poshidprobs);
  65. posvisact = sum(data);
  66.  
  67. %%%%%%%%% END OF POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  68. poshidstates = poshidprobs > rand(numcases,numhid);
  69.  
  70. %%%%%%%%% START NEGATIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  71. negdata = ./( + exp(-poshidstates*vishid' - repmat(visbiases,numcases,1)));
  72. neghidprobs = ./( + exp(-negdata*vishid - repmat(hidbiases,numcases,)));
  73. negprods = negdata'*neghidprobs;
  74. neghidact = sum(neghidprobs);
  75. negvisact = sum(negdata);
  76.  
  77. %%%%%%%%% END OF NEGATIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  78. err= sum(sum( (data-negdata).^ ));
  79. errsum = err + errsum;
  80.  
  81. if epoch>,
  82. momentum=finalmomentum;
  83. else
  84. momentum=initialmomentum;
  85. end;
  86.  
  87. %%%%%%%%% UPDATE WEIGHTS AND BIASES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  88. vishidinc = momentum*vishidinc + ...
  89. epsilonw*( (posprods-negprods)/numcases - weightcost*vishid);
  90. visbiasinc = momentum*visbiasinc + (epsilonvb/numcases)*(posvisact-negvisact);
  91. hidbiasinc = momentum*hidbiasinc + (epsilonhb/numcases)*(poshidact-neghidact);
  92.  
  93. vishid = vishid + vishidinc;
  94. visbiases = visbiases + visbiasinc;
  95. hidbiases = hidbiases + hidbiasinc;
  96.  
  97. %%%%%%%%%%%%%%%% END OF UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  98.  
  99. end
  100. fprintf(, 'epoch %4i error %6.1f \n', epoch, errsum);
  101. end;

限制波尔兹曼机(Restricted Boltzmann Machines)的更多相关文章

  1. 受限波兹曼机导论Introduction to Restricted Boltzmann Machines

    Suppose you ask a bunch of users to rate a set of movies on a 0-100 scale. In classical factor analy ...

  2. (六)6.14 Neurons Networks Restricted Boltzmann Machines

    1.RBM简介 受限玻尔兹曼机(Restricted Boltzmann Machines,RBM)最早由hinton提出,是一种无监督学习方法,即对于给定数据,找到最大程度拟合这组数据的参数.RBM ...

  3. CS229 6.14 Neurons Networks Restricted Boltzmann Machines

    1.RBM简介 受限玻尔兹曼机(Restricted Boltzmann Machines,RBM)最早由hinton提出,是一种无监督学习方法,即对于给定数据,找到最大程度拟合这组数据的参数.RBM ...

  4. Convolutional Restricted Boltzmann Machines

    参考论文:1.Stacks of Convolutional Restricted Boltzmann Machines for Shift-Invariant Feature Learning   ...

  5. Introduction to Restricted Boltzmann Machines

    转载,原贴地址:Introduction to Restricted Boltzmann Machines,by Edwin Chen, 2011/07/18. Suppose you ask a b ...

  6. Restricted Boltzmann Machines

    转自:http://deeplearning.net/tutorial/rbm.html http://blog.csdn.net/mytestmy/article/details/9150213 能 ...

  7. 受限玻尔兹曼机(RBM, Restricted Boltzmann machines)和深度信念网络(DBN, Deep Belief Networks)

    受限玻尔兹曼机对于当今的非监督学习有一定的启发意义. 深度信念网络(DBN, Deep Belief Networks)于2006年由Geoffery Hinton提出.

  8. 限制Boltzmann机(Restricted Boltzmann Machine)

    起源:Boltzmann神经网络 Boltzmann神经网络的结构是由Hopfield递归神经网络改良过来的,Hopfield中引入了统计物理学的能量函数的概念. 即,cost函数由统计物理学的能量函 ...

  9. 深度学习读书笔记之RBM(限制波尔兹曼机)

    深度学习读书笔记之RBM 声明: 1)看到其他博客如@zouxy09都有个声明,老衲也抄袭一下这个东西 2)该博文是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的 ...

随机推荐

  1. QTP之delphi试用感想一(自动化测试)

    这两天一直在琢磨自动化测试,自动化测试,其实与单元测试有一些相同之处,单元测试的目的也是可以一次写,多次运行,对于测试驱动及后期维护真是有非常多的好处,用自动化测试工具也是如何,主要目的是为了回归测试 ...

  2. PostMessage与SendMessage各自的问题

     深入解析SendMessage.PostMessage 本文将使用C++语言,在MFC框架的配合下给出PostMessage.SendMessage等的使用方式与使用不当造成的后果(讨论均针对自定义 ...

  3. JDK,JRE,JVM区别与联系

    JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...

  4. C++:类的创建

    类的创建 #include<iostream> #include<cmath> using namespace std; class Complex //声明一个名为Compl ...

  5. [Mongo] error inserting documents: BSONObj size is invalid (mongoimport mongorestore 数据备份恢复)

    解决办法如下, ./mongoimport -port 6066 -d xxx -c xxx --batchSize=10 /root/mong_data/test/xxx 原因转自 http://b ...

  6. css link和@import区别用法

    这里link与@import介绍的是html引入css的语法单词.两者均是引入css到html的单词. 1.link语法结构<link rel="stylesheet" ty ...

  7. SharePoint2010安装文档

    最低配置要求 操作系统 X64 Window Server 2008 R2 Standard 数据库 X64 SQL Server 2008 R2 CPU X64,4核 内存 8G 硬盘 100G 安 ...

  8. 3D图形渲染管线

    3D图形渲染管线 什么是渲染(Rendering)    渲染简单的理解可能可以是这样:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景(如图1):    ...

  9. UVa 10652 (简单凸包) Board Wrapping

    题意: 有n块互不重叠的矩形木板,用尽量小的凸多边形将它们包起来,并输出并输出木板总面积占凸多边形面积的百分比. 分析: 几乎是凸包和多边形面积的裸题. 注意:最后输出的百分号前面有个空格,第一次交P ...

  10. Windows SDK 实现不规则窗口介绍

    不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...