热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【RBM受限玻尔兹曼机DBM深度玻尔兹曼机】

转载https:blog.csdn.netfjssharpswordarticledetails79352222参考https:www.cnblogs.comkemaswillp3

转载 https://blog.csdn.net/fjssharpsword/article/details/79352222
参考
https://www.cnblogs.com/kemaswill/p/3269138.html
https://blog.csdn.net/weixin_42137700/article/details/81610145
https://baijiahao.baidu.com/s?id=1599798281463567369&wfr=spider&for=pc

受限玻尔兹曼机(RBM)多见深度学习,不过笔者发现推荐系统也有相关专家开始应用RBM。实际上,作为一种概率图模型,用在那,只要场景和数据合适都可以。有必要就RBM做一个初步了解。

1、 RBM定义

RBM记住三个要诀:1)两层结构图,可视层和隐藏层;2)同层无边,上下层全连接;3)二值状态值,前向反馈和逆向传播求权参。定义如下:

RBM包含两个层,可见层(visible layer)和隐藏层(hidden layer)。神经元之间的连接具有如下特点:层内无连接,层间全连接,显然RBM对应的图是一个二分图。一般来说,可见层单元用来描述观察数据的一个方面或一个特征,而隐藏层单元的意义一般来说并不明确,可以看作特征提取层。RBM和BM的不同之处在于,BM允许层内神经元之间有连接,而RBM则要求层内神经元之间没有连接,因此RBM的性质:当给定可见层神经元的状态时,各隐藏层神经元的激活条件独立;反之当给定隐藏层神经元的状态是,可见层神经元的激活也条件独立


如图给出了一个RBM网络结构示意图。其中:n_{v},n_{h}分别表示可见层和隐藏层中包含神经元的数目,下标v,h代表visible和hidden;v=(v_{1},v_{2},...,v_{n_{v}},)^{T}表示可见层的状态向量;h=(h_{1},h_{2},...,h_{n_{h}},)^{T}表示隐藏层的状态向量;a=(a_{1},a_{2},...,a_{n_{v}},)^{T}表示可见层的偏置向量;b=(b_{1},b_{2},...,b_{n_{h}},)^{T}表示隐藏层的偏置向量;W=(w_{i,j})\in \Re ^{n_{h}\times n_{v}}表示隐藏层和可见层之间的权值矩阵,w_{i,j}表示隐藏层中第i个神经元与可见层中第j个神经元之间的连接权重。记\theta =(W,a,b)表示RBM中的参数,可将其视为把W,a,b中的所有分量拼接起来得到的长向量。

RBM的求解也是基于梯度求对数自然函数。

给定训练样本,RBM的训练意味着调整参数\theta,从而拟合给定的训练样本,使得参数条件下对应RBM表示的概率分布尽可能符合训练数据。

假定训练样本集合为S=\{v_1,v_2,...,v^{n_s}\},其中n_s为训练样本的数目,v^i=(v_1^i,v_2^i,...,v_{n_v}^i)^T,i=1,2,...,n_s,它们是独立同分布的,则训练RBM的目标就是最大化如下似然L_{\theta,S}=\prod_{i=1}^{n_s}P(v^i),一般通过对数转化为连加的形式,其等价形式:lnL_{\theta,S}=ln\prod_{i=1}^{n_s}P(v^i) =\sum_{i=1}^{n_s}lnP(v^i)。简洁起见,将L_{\theta,S}简记为L_S

最大化L_S常用的数值方法是梯度上升法(Gradient Ascent),通过迭代的方法进行逼近,迭代形式:\theta:=\theta+\eta\frac{\partial lnL_S}{\partial\theta},其中\eta>0表示学习速率。其关键就是计算梯度\frac{\partial lnL_S}{\partial\theta}(lnL_S关于各个参数的偏导数\frac{\partial lnL_S}{\partial w_{i,j}},\frac{\partial lnL_S}{\partial a_i},\frac{\partial lnL_S}{\partial b_i})。一般采用MCMC采样来估计,但由于常规的MCMC需要经过许多步的状态转移才能保证采集到的样本符合目标分布。若我们以训练样本作为起点,就可以仅需要很少次的状态转移抵达RBM的分布。Hinton教授2002年基于这个上想法发明了对比散度(Contrastive Divergence,CD)算法,目前已经成为训练RBM的标准算法。

2、RBM DEMO

引自很好的一个介绍RBM文章,还有python demo,参考:

http://blog.echen.me/2011/07/18/introduction-to-restricted-boltzmann-machines/

为怕链接失效,还是复制过来比较靠谱。

文中demo地址:https://github.com/echen/restricted-boltzmann-machines


3、RBM预备知识

理解RBM,需要一些预备知识:

  • sigmiod函数,神经网络中常用的激活函数之一,sigmoid(x)=\frac{1}{1+e^{-x}}
  • Bayes定理,P(A|B)=\frac{P(A,B)}{P(B)},P(B|A)=\frac{P(A,B)}{P(A)}推出P(A|B)=P(A)\frac{P(B|A)}{P(B)},P(A)先验概率(Prior probability)、P(A|B)后验概率(Posterior probability),\frac{P(B|A)}{P(B)}可能性函数(Likelyhood)。
  • 二分图(bipartite graph),图论中一种特殊模型,如果无向图中顶点可分割为两个互不相交的子集,而且图中的每条边关联的两个顶点分别属于这两个不同的顶点集。
  • MCMC,蒙特卡罗方法最初用于通过随机化的方法计算积分,假设计算\int_{a}^{b} h(x)dx,如果无法通过数学推导直接求出解析解,一般不可能对区间(a,b)上所有的x值进行枚举,我们可以将h(x)分解为某个函数f(x)和一个定义在(a,b)上的概率密度函数p(x)的乘积,则整个积分可以写成\int_{a}^{b}h(x)dx=\int_{a}^{b}f(x)p(x)dx=E_{p(x)}[f(x)],这样原积分等同于f(x)在p(x)这个分布上的均值。这时,如果我们从分布p(x)上采集大量的样本点,这些样本符合分布p(x),即有\frac{x_{i}}{\sum_{i=1}^{n}x_{i}}\approx p(x_{i})。那么我们就可以通过这些样本来逼近这个均值\int_{a}^{b}h(x)dx=\int_{a}^{b}f(x)p(x)dx=E_{p(x)}[f(x)]\approx \frac{1}{n}\sum_{i=1}^{n}f(x_{i}),这就是蒙特卡罗方法的基本思想。蒙特卡罗方法的核心问题是如何从分布上随机采集样本,一般采用马尔可夫链蒙特卡罗方法(Markov Chain Monte Carlo,MCMC)产生指定分布下的样本。
  • 马尔可夫链,离散时间上随机变量随时间变化的转移概率仅仅依赖于当前值的序列,MCMC建立的理论基础:如果我们想在某个分布下采样,只需要模拟以其为平稳分布的马尔科夫过程,经过足够多次转移之后,我们的样本分布就会充分接近于该平稳分布,也就意味着我们近似地采集目标分布下的样本。
  • 正则分布,统计力学的一个基本结论:当系统与外界达到热平衡时,系统处于状态i的概率p_{i}具有以下形式p_{i}=\frac{1}{Z_{T}} e^{-\frac{E_{i}}{T}},其中Z_{T}=\sum_{i}{e^{-\frac{E_{i}}{T}}}被称作归一化常数,T为正数,表示系统所处的温度,这种概率分布的形式叫做正则分布。
  • Metropolis-Hasting采样,MCMC算法中,为了在一个指定的分布上采样,先从系统的任意一个状态出发,然后模拟马尔可夫过程,不断进行状态转移,根据马尔可夫的性质,经过足够的转移次数之后,我们所处的状态即符合目标分布,此时的状态就可以作为一个采集到的样本。算法的关键就是设计出合理的状态转移过程。Metropolist-Hastings是一个非常重要的MCMC采样算法,并且对于设计状态转移过程建立了统一的框架。
对于采样的特定数据场景还是需要进一步理解的。




RBM推广到DBM

RBM很容易推广到深层的RBM,即我们的DBM。推广的方法就是加入更多的隐藏层,当然隐藏层的层数可以是任意的,随着层数越来越复杂,那模型怎么表示呢?其实DBM也可以看做是一个RBM,稍微加以变换就可以看做是一个DBM。将可见层和偶数隐藏层放在一边,将奇数隐藏层放在另一边,我们就得到了RBM,和RBM的细微区别只是现在的RBM并不是全连接的,其实也可以看做部分权重为0的全连接RBM。RBM的算法思想可以在DBM上使用。只是此时我们的模型参数更加的多,而且迭代求解参数也更加复杂了。


推荐阅读
author-avatar
袁韦伦世彦琬育
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有