RBM的分析

Matlab的deep learning 的toolbox,https://github.com/rasmusbergpalm/DeepLearnToolbox代码很简单,比较适合用来学习算法,但是传说中的RBM并没有在toolbox中发现。里面有DBNs(deep belief nets)深度信念网络。
http://blog.csdn.net/dark_scope/article/details/9447967代码的讲解,但是这个代码的讲解跟the guid与其他的代码,比如先前研究的convolutional RBM.m-master
既然没有RBM不如直接去看DBNs好了
代码包括:dbnsetup.m dbntrain.m dbnunfoldtonn.m rbmdown.m rbmtrain.m rbmup.m
rbm = rbmtrain(rbm, x, opts)
输入:x:输入图像数据,介于0,1之间。
Opts,
opts.batchsize 小批量数据尺寸
opts.numepochs 迭代次数
rbm,
rbm.momentum 动量学习率,这个参数在the guid paper里有详细的介绍
rbm.W 连接权重矩阵
rbm.b 可见层的偏置向量
rbm.c 隐层的偏置向量
rbm.alpha 权重更新公式参数
batch = x(kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize), :);
介绍RBM中的知识,参考的PPT
机器学习研究的主要任务是设计和开发计算机可以智能地根据实际数据进行“学习”的算法,从而使这些算法可以自动地发现隐藏在数据中的模式和规律。
Rbm网络结构如图所示:

RBM网络有几个参数,一个是可视层与隐藏层之间的权重矩阵Wn×m,一个是可视节点的偏移量b=(b1,b2⋯bn),一个是隐藏节点的偏移量c=(c1,c2⋯cm),这几个参数决定了RBM网络将一个n维的样本编码成一个什么样的m维的样本。
首先为了描述容易,先假设每个节点取值都在集合{0,1}中,即∀i,j,vi∈ {0,1},ℎj∈ {0,1} 。
一个训练样本x过来了取值为x=(x1,x2⋯xn),根据RBM网络,可以得到这个样本的m维的编码后的样本y=(y1,y2⋯ym),这m维的编码也可以认为是抽取了m个特征的样本。
隐藏节点的第j个特征的取值为1的概率为


其中的v取值就是x,hj的取值就是yj。
利用公式进行编码和反解码:
先利用公式 ,根据x的值计算概率p(hj=1|v),其中vi的取值就是xi的值。
然后产生一个0到1之间的随机数,如果它小于p(hj=1|v) , yj的取值就是1,否则就是0。
反过来,现在知道了一个编码后的样本y,想要知道原来的样本x,即解码过程,跟上面也是同理,过程如下:
先利用公式 ,根据y的值计算概率p(hj=1|v),其中hj的取值就是yj的值。
ii)然后产生一个0到1之间的随机数,如果它小于p(vi=1|h),hi的取值就是1,否则就是0。

Rbm能量:
如果一个RBM有n个可见单元和m个隐单元,用向量v和h分别表示可见单元和隐单元的状态。其中,vi表示第i个可见单元的状态,hj表示第j个隐单元的状态。对于一组给定的状态(v; h), RBM作为一个系统所具备的能量定义为

当参数确定时,基于该能量函数,我们可以得到(v; h)的联合概率分布:

对于一个实际问题,我们最关心的是由RBM所定义的关于观测数据v的分布,即联合概率分布的边际分布,也称为似然函数:

由RBM的特殊结构(即层间有连接,层内无连接)可知:当给定可见单元的状态时,各隐单元的激活状态之间是条件独立的。此时,第j个隐单元的激活概率为


RBM的结构是对称的,当给定隐单元的状态时,各可见单元的激活状态之间也是条件独立的,即第i个可见单元的激活概率为

基于对比散度的RBM快速学习算法
学习RBM的任务是求出参数θ的值,以拟合给定的训练数据。参数可以通过最大化RBM在训练集(假设包含T个样本)上的对数似然函数学习得到,即




再求参数的过程中, P(v,h|θ)所表示可见单元与隐层单元的联合分布,由于归一化因子Z(θ)的存在,该分部很难获得 ,导致我们无法计算公式的第二项,只能通过一些采样方法(比如一直提到的Gibbs采样)来获得其近似值。值得注意的是,在最大化似然函数的过程中,为了加快计算速度,上述偏导数在每一步的迭代中计算一般只是基于部分而非所有的训练样本进行,关于这部分内容我们将在后面讨论RBM的参数设置时详细阐述。
下面,假设只有一个训练样本,我们分别用“data”和“model” 来简记和这两个概率分布,则对数似然函数关于连接权重Wij、可见层单元的偏置ai 和隐层单元的偏置bj 的偏导数分别为


Gibbs是一种基于马尔可夫链蒙特卡罗策略的采样方法。对于一个K维随机向量X =(X1;X2; … ;XK),假设我们无法求得关于X的联合分布P(X),但我们知道给定X的其他分量时,其第k个分量Xk的条件分布:


那么我们可以从X的一个任意状态开始,
[x_1 (0),x_2 (0),…,x_k (0)]
利用上述条件分布,迭代地对其分量依次采样,随着采样次数的增加,随机变量
[x_1 (n),x_2 (n),…,x_k (n)]
的概率分布将以n的几何级数的速度收敛于X的联合概率分布P(X)。换句话说,我们可以在未知联合概率分布P(X)的条件下对其进行采样。
随机模拟的基本思想和常用采样方法
现在假设我们有一个矩形的区域R(大小已知),在这个区域中有一个不规则的区域M(即不能通过公式直接计算出来),现在要求取M的面积? 怎么求?近似的方法很多,例如:把这个不规则的区域M划分为很多很多个小的规则区域,用这些规则区域的面积求和来近似M,另外一个近似的方法就是采样的方法,我们抓一把黄豆,把它们均匀地铺在矩形区域,如果我们知道黄豆的总个数S,那么只要我们数数位于不规则区域M中的黄豆个数S1,那么我们就可以求出M的面积:M=S1*R/S。
MCMC方法是关联采样,即下一个样本与这个样本有关系,从而使得采样效率高。MCMC方法的基本思想是:通过构建一个markov chain使得该markov chain的稳定分布是我们所要采样的分布f(x)。如果这个markov chain达到稳定状态,那么来自这个chain的每个样本都是f(x)的样本,从而实现抽样的目的。
Gibbs采样算法的步骤
1. 给定一个初始样本X0={x10,x20,...,xn0}
2.已知一个样本Xi={x1i,x2i,...,xni},对于x1_{i+1}进行抽样, x1_{i+1} ~ p(x1|Xi_{-1})
3. 对于x2_{i+1}进行抽样,x2_{i+1} ~ p(x2|x1_{i+1}, x3i,...xni)
4.对于xn_{i+1}进行抽样, xn_{i+1} ~ p(xn|x1_{i+1}, x2_{i+1},... x_{n-1}_{i+1})
5.步骤2~4可以得到X的一个样本,然后重复步骤2~4可以不断地得到X的样本。
基于RBM模型的对称结构,以及其中神经元状态的条件独立性,我们可以使用Gibbs采样方法得到服从RBM定义的分布的随机样本。在RBM中进行k步吉布斯采样的具体算法为:用一个训练样本(或可见层的任何随机化状态)初始化可见层的状态v0,交替进行如下采样:

在采样步数k足够大的情况下,我们可以得到服从RBM所定义的分布的样本。此外,使用Gibbs采样我们也可以得到式RBM中第二项的一个近似。
基于对比散度的快速学习算法:
与吉布斯采样不同,Hinton指出当使用训练数据初始化v0时,我们仅需要使用k(通常k =1)步吉布斯采样便可以得到足够好的近似。CD算法一开始,可见单元的状态被设置成一个训练样本,并利用计算所有隐层单元的二值状态。

在所有隐层单元的状态确定之后,根据式

来确定第i个可见单元vi取值为1的概率,进而产生可见层的一个重构。各参数的更新准则为


在RBM中,可见单元数一般等于训练数据的特征维数,而隐单元数需要事先给定。假设可见单元数和隐单元数分别为n和m。令W表示可见层与隐层间的连接权重矩阵(m*n阶),a(n维列向量)和b(m维列向量)分别表示可见层与隐层的偏置向量。
输入和输出如刚开始的介绍
训练的步骤为:
初始化:令可见层单元的初始状态V_1=X_0;W,a,b为随机的较小数值。
For t=1,2,…T
For j=1,2,…,m(对所有隐层)
计算P(h_1j=1│V_1 ),即P(h_1j=1│V_1 )=σ(b_j+∑_i▒〖v_1i W_ij 〗)
从条件分布P(h_1j│V_1 )中抽取h_1j∈{0,1}
Endfor
For i=1,2,…,n(对所有可见层)
计算P(h_2i=1│h_1 ),即P(h_2i=1│h)=σ(a_j+∑_j▒〖W_ij h_1j 〗)
从条件分布P(V_2i│h_1 )中抽取V_2j∈{0,1}
Endfor
继续迭代…
然后按照参数更新的公式进行update


CD的学习算法是针对RBM的可见单元和隐层单元均为二值变量的情形提出。但很容易推广到可见层单元为高斯变量、可见层和隐层单元均为高斯变量等其他情形。
下面假设已经训练好了RBM
假设我们现在已经得到一个训练好的 RBM,每个隐元与显元间的权重用矩阵W表示
当我们把一条新来的数据 ,首先,将每个隐元的激励值 (activation) 计算出来,然后,将每个隐元的激励值都用 S 形函数进行标准化,变成它们处于开启状 (用 1 表示) 的概率值,至此,每个隐元hj开启的概率被计算出来了。那么到底这个元开启还是关闭,我们需要将开启的概率与一个从 0, 1 均匀分布中抽取的随机值 进行比较 。
Rbm参数的设置
RBM的训练通常是基于CD的方法,但如何设置其中的一些参数,如隐单元个数、学习率、参数的初始值等是需要有一定经验的。
对于连接权重、可见层和隐层偏置的更新,虽然可以基于一个训练样本进行(类似于在线学习的方式),但计算量将很大。将训练集事先分成包含几十或几百个样本的小批量数据进行计算将更高效;同时为了避免在小批量数据的样本容量发生改变时,学习率也必须做相应的修改,通常的做法是在参数的更新过程中,使用参数的平均梯度(即总梯度除以数据容量)

这里,B 表示小批量数据的容量,其值不应设得太大。B =1表示参数更新以在线学习的方式进行,而B =T则表示传统的批处理方式。一般而言,若训练集是包含来自不同类(具有同等概率)的样本,理想的B 应为总类数,使得每批数据中都包含来自每个类的一个样本,以减小梯度估计的抽样误差。
学习率若过大,将导致重构误差急剧增加,权重也会变得异常大。设置学习率的一般做法是先做权重更新和权重的直方图,令权重更新量为权重的10-3 倍左右。如果有一个单元的输入值很大,则权重更新应再小一些,因为同一方向上较多小的波动很容易改变梯度的符号。相反,对于偏置,其权重更新可以大一些。
动量学习率:学习率ε的选择至关重要,ε大收敛速度比较快,但是过大可能引起算法不稳定,ε小可避免不稳定情况的出现,但是收敛速度较慢。为克服这一矛盾,一种具有代表性的思想是在参数更新式中增加动量项momentum,使得本次参数值修改的方向不完全由当前样本下的似然函数梯度方向决定,而采用上一次参数值修改方向与本次梯度方向的组合。在某些情况下,这可以避免算法过早的收敛到局部最优点,
W_ij=k*W_ij+ϵ*ϑL/(ϑW_ij )
其中K为动量项学习率,开始时k可以设置为0.5,在重构误差处于平稳增加状态是,k可取0.9
隐单元个数:如果我们关心的主要目标是避免过拟合而不是计算复杂度,则可以先估算一下用一个好的模型描述一个数据所需的比特数,用其乘上训练集容量。基于所得的数,选择比其低一个数量级的值作为隐元个数。如果训练数据是高度冗余的,比如数据集容量非常大,则可以使用更少一些的隐元。
重构误差:所谓“重构误差”就是以训练数据作为初始状态,根据RBM的分布进行一次Gibbs采样后所获样本与原数据的差异(一般用一范数或二范数来评估)

你可能感兴趣的:(保存)