限制波尔兹曼机(Restricted Boltzmann Machines)
能量模型的概念从统计力学中得来,它描述着整个系统的某种状态,系统越有序,系统能量波动越小,趋近于平衡状态,系统越无序,能量波动越大。例如:一个孤立的物体,其内部各处的温度不尽相同,那么热就从温度较高的地方流向温度较低的地方,最后达到各处温度都相同的状态,也就是热平衡的状态。在统计力学中,系统处于某个状态的相对概率为,即玻尔兹曼因子,其中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代码
- % Version 1.000
- %
- % Code provided by Geoff Hinton and Ruslan Salakhutdinov
- %
- % Permission is granted for anyone to copy, use, modify, or distribute this
- % program and accompanying programs and documents for any purpose, provided
- % this copyright notice is retained and prominently displayed, along with
- % a note saying that the original programs are available from our
- % web page.
- % The programs and documents are distributed without any warranty, express or
- % implied. As the programs were written for research purposes only, they have
- % not been tested to the degree that would be advisable in any important
- % application. All use of these programs is entirely at the user's own risk.
- % This program trains Restricted Boltzmann Machine in which
- % visible, binary, stochastic pixels are connected to
- % hidden, binary, stochastic feature detectors using symmetrically
- % weighted connections. Learning is done with -step Contrastive Divergence.
- % The program assumes that the following variables are set externally:
- % maxepoch -- maximum number of epochs
- % numhid -- number of hidden units
- % batchdata -- the data that is divided into batches (numcases numdims numbatches)
- % restart -- set to if learning starts from beginning
- epsilonw = 0.1; % Learning rate for weights
- epsilonvb = 0.1; % Learning rate for biases of visible units
- epsilonhb = 0.1; % Learning rate for biases of hidden units
- weightcost = 0.0002;
- initialmomentum = 0.5;
- finalmomentum = 0.9;
- [numcases numdims numbatches]=size(batchdata);
- if restart ==,
- restart=;
- epoch=;
- % Initializing symmetric weights and biases.
- vishid = 0.1*randn(numdims, numhid);
- hidbiases = zeros(,numhid);
- visbiases = zeros(,numdims);
- poshidprobs = zeros(numcases,numhid);
- neghidprobs = zeros(numcases,numhid);
- posprods = zeros(numdims,numhid);
- negprods = zeros(numdims,numhid);
- vishidinc = zeros(numdims,numhid);
- hidbiasinc = zeros(,numhid);
- visbiasinc = zeros(,numdims);
- batchposhidprobs=zeros(numcases,numhid,numbatches);
- end
- for epoch = epoch:maxepoch,
- fprintf(,'epoch %d\r',epoch);
- errsum=;
- for batch = :numbatches,
- fprintf(,'epoch %d batch %d\r',epoch,batch);
- %%%%%%%%% START POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- data = batchdata(:,:,batch);
- poshidprobs = ./( + exp(-data*vishid - repmat(hidbiases,numcases,)));
- batchposhidprobs(:,:,batch)=poshidprobs;
- posprods = data' * poshidprobs;
- poshidact = sum(poshidprobs);
- posvisact = sum(data);
- %%%%%%%%% END OF POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- poshidstates = poshidprobs > rand(numcases,numhid);
- %%%%%%%%% START NEGATIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- negdata = ./( + exp(-poshidstates*vishid' - repmat(visbiases,numcases,1)));
- neghidprobs = ./( + exp(-negdata*vishid - repmat(hidbiases,numcases,)));
- negprods = negdata'*neghidprobs;
- neghidact = sum(neghidprobs);
- negvisact = sum(negdata);
- %%%%%%%%% END OF NEGATIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- err= sum(sum( (data-negdata).^ ));
- errsum = err + errsum;
- if epoch>,
- momentum=finalmomentum;
- else
- momentum=initialmomentum;
- end;
- %%%%%%%%% UPDATE WEIGHTS AND BIASES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- vishidinc = momentum*vishidinc + ...
- epsilonw*( (posprods-negprods)/numcases - weightcost*vishid);
- visbiasinc = momentum*visbiasinc + (epsilonvb/numcases)*(posvisact-negvisact);
- hidbiasinc = momentum*hidbiasinc + (epsilonhb/numcases)*(poshidact-neghidact);
- vishid = vishid + vishidinc;
- visbiases = visbiases + visbiasinc;
- hidbiases = hidbiases + hidbiasinc;
- %%%%%%%%%%%%%%%% END OF UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- end
- fprintf(, 'epoch %4i error %6.1f \n', epoch, errsum);
- end;
限制波尔兹曼机(Restricted Boltzmann Machines)的更多相关文章
- 受限波兹曼机导论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 ...
- (六)6.14 Neurons Networks Restricted Boltzmann Machines
1.RBM简介 受限玻尔兹曼机(Restricted Boltzmann Machines,RBM)最早由hinton提出,是一种无监督学习方法,即对于给定数据,找到最大程度拟合这组数据的参数.RBM ...
- CS229 6.14 Neurons Networks Restricted Boltzmann Machines
1.RBM简介 受限玻尔兹曼机(Restricted Boltzmann Machines,RBM)最早由hinton提出,是一种无监督学习方法,即对于给定数据,找到最大程度拟合这组数据的参数.RBM ...
- Convolutional Restricted Boltzmann Machines
参考论文:1.Stacks of Convolutional Restricted Boltzmann Machines for Shift-Invariant Feature Learning ...
- Introduction to Restricted Boltzmann Machines
转载,原贴地址:Introduction to Restricted Boltzmann Machines,by Edwin Chen, 2011/07/18. Suppose you ask a b ...
- Restricted Boltzmann Machines
转自:http://deeplearning.net/tutorial/rbm.html http://blog.csdn.net/mytestmy/article/details/9150213 能 ...
- 受限玻尔兹曼机(RBM, Restricted Boltzmann machines)和深度信念网络(DBN, Deep Belief Networks)
受限玻尔兹曼机对于当今的非监督学习有一定的启发意义. 深度信念网络(DBN, Deep Belief Networks)于2006年由Geoffery Hinton提出.
- 限制Boltzmann机(Restricted Boltzmann Machine)
起源:Boltzmann神经网络 Boltzmann神经网络的结构是由Hopfield递归神经网络改良过来的,Hopfield中引入了统计物理学的能量函数的概念. 即,cost函数由统计物理学的能量函 ...
- 深度学习读书笔记之RBM(限制波尔兹曼机)
深度学习读书笔记之RBM 声明: 1)看到其他博客如@zouxy09都有个声明,老衲也抄袭一下这个东西 2)该博文是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的 ...
随机推荐
- Shell 是个什么玩意
Shell的定义: 计算机分为软件和硬件,管理计算机硬件的是操作系统,也就是我们说的kernel,而这个核心是需要被保护起来的. 那我们如何通过软件与硬件进行沟通,让硬件执行我们要完成的指令呢? 这个 ...
- player/stage 学习---安装
环境 ubuntu 14.04 一,工具安装 sudo apt-get install git cmake g++ fltk1.1-dev libjpeg8-dev libpng12-dev libg ...
- 怎么在eclipse里调试WebDriver的源代码
当你看完WebDriver的工作原理这篇博客以后,是不是也跃跃欲试想印证文章里的理论是不是正确,想自己也看下webdriver的源代码,并且调试下,通过代码来更深入的了解WebDriver的工作原理. ...
- HDU-4661 Message Passing 树形DP,排列组合
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4661 题意:有n个人呈树状结构,每个人知道一个独特的消息.每次可以让一个人将他所知的所有消息告诉和他相 ...
- asp.net TreeView与XML配合使用v1.1
刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个 我是这样做的,如果有什么问题请大神指导,我是菜鸟额.. 1: ...
- 在Windows 上的 Python
在 Windows 上, 安装 Python 有两种选择. ActiveState 制作了一个 Windows 上的 Python 安装程序称为 ActivePython, 它包含了一个完整的 Pyt ...
- 结巴分词标注兼容_ICTCLAS2008汉语词性标注集
计算所汉语词性标记集Version 3.0制订人:刘群 张华平 张浩计算所汉语词性标记集... 10. 说明... 11. 名词 (1个一类,7个二类,5个三类) 22. 时间词(1个一类,1个二类) ...
- ExtJs自学教程(2):从DOM看EXTJS
<二> 从DOM看EXTJS 看标题可能有人会问,为啥好好的例子不看,得从DOM看起呢?答案是目标只为了一个:自运行结果把EXTJS看得更清楚点 首先,要看得靠点工具,带点放大镜什么吧?对 ...
- 宏buf_pool_struct
typedef struct buf_pool_struct buf_pool_t; /** @brief The buffer pool structure. NOTE! The definitio ...
- 实现窗口逐渐增大(moveTo(),resizeTo(),resizeBy()方法)
moveTo()方法格式:window.moveTo(x,y); 功能:将窗口移动到指定坐标(x,y)处; resizeTo()方法格式:window.resizeTo(x,y); 功能:将当前窗口改 ...