受限制玻尔兹曼机RBM原理简介

2024-05-09 07:48

本文主要是介绍受限制玻尔兹曼机RBM原理简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

受限玻尔兹曼机RBM在深度学习领域一直有重要的应用,之前一直没有接触过RBM,觉得太复杂,公式太多,这几天在Google上找到些好的turtorial,可以在这里做一个总结。

玻尔兹曼机BM

BM背景

Boltzmann machines(BM)是Markov Random Fields with pairwise interaction potentials. 这里的potential,也就是势能,是来源于物理的应用。BM和多层神经网络有着相似的结构,而且BM中的节点值是二值的(非0即1),BM的节点是成对作用的,Hinton使用了基于采样的方法用于BM的训练,使得BM能够被应用到具体问题。

玻尔兹曼分布(Boltzmann Distribution)

玻尔兹曼分布最开始是由Gibbs在统计原理里面提出来的,

P(x)=1Zexp(E(x))
,其中 E(x) 是变量 x 能量,这里的能量仅仅是对应了物理学的概念,并没有额外的意义。
E(x)=θTf(x)=j=1mθjfj(x)
,在统计原理里面, x 经常是成对的,所以E(x)是描述了 x 对的“势能”。

玻尔兹曼机结构

玻尔兹曼机是二值的马尔科夫随机场(Markov Random Filed),一个玻尔兹曼机可以表示为带权重的无向图:
这里写图片描述
如上图所示,对于有n个节点的无向图,由于每个节点是二值的,所以一共有2n个状态,对于一个节点 xi ,其值为1 的时候表示这个节点是’on’,其值为1的时候表示这个节点是’off’,对于一个状态向量 x ,也就是长度为n的向量,表示这个图 n 个节点的状态,其能量值为:

E(x)=bTxxTWx=j=1nbjxji,jxiWi,jxj
x 的概率分布为:
P(x)=1Zexp(E(x))Z=xexp(E(x))
,在这里, b 表示的长度为n的偏置向量, W nn的连接矩阵, Wi,j 表示的是节点 i 和节点j的连接权值,当然这里的矩阵乘积有几点需要注意,因为无向图的两个节点的连接权值只有一个,因此严格意义上来说,
E(x)=j=1nbjxji<jxixjwi,j
.

可见节点和隐含节点

典型的BM有可见节点(Visible Node)和隐含节点(Hidden Node), 可见节点后面使用 v 表示,隐含节点用h表示,接着上文, x 可以表示为

x=vh
其中 表示的是向量连接操作,在这里我们可以把 v 理解为我们可见的训练参数,h理解为我们在训练数据里面的一些未知隐变量,如LDA里面的隐藏话题,现在的问题是,给定一组可见节点的训练数据 v1,v2,,,vn ,现在的问题是,寻找参数 W b是的训练预料的最大似然函数最大:

Wˆ,bˆ=argmaxW,bD(W,b)
,其中
D(W,b)=i=1nP(vi)P(v)=hP(vh)=hexp(E(vh))h,vexp(E(vh))
,其中
E(x)=bTxxTWx
,这里的 v 是训练数据可见节点的状态序列,h表示的是隐含节点的状态序列, v 表示的是所以可能的可见节点序列状态。

学习BM的参数

在上一节中,已经给出了 p(v) 的最大似然函数,现在是如何训练。按照套路,根据最大似然函数的对数,我们对参数进行求导:

(logP(v))θ=ni=1log(p(vi))θ=ni=1(loghexp(E(vh))log(h,vexp(E(vh))))θ=i=1n{h(exp(E(vh))E(vh)θ)hexp(E(vh))h,v(exp(E(vh))E(vh)θ)h,vexp(E(vh))}=i=1n{hp(h|v)E(vh)θh,vp(h,v)E(vh)θ}(1)

而:
Ewj,k=xjxkEbj=xj

因此:
log(P(v))wj,k=i=1n{h(P(h|v)xjxk)h,v(P(h,v)xjxk)}(2)

log(P(v))bj=i=1n{h(P(h|v)xj)h,v(P(h,v)xj)}(3)

其实可以看出的是这个训练有个巨大的问题是, h v 都是未知的,如果对全部可能的状态进行计算,无疑其计算量将会是巨大的,这个训练是不可接受的。这里就要用到采样的方法了.常用的采样方法有MCMC和Gibbs采样,因为本人非数学专业出身,所以也就不想太钻研这些理论,这里直接上玻尔兹曼机的Gibbs采样的方法。

玻尔兹曼机的Gibbs采样方法

  1. 使用 xj 更新 xj : P(xj|xj)P(xj,xj)
  2. 使用 P(xj,xj) 带入计算

玻尔兹曼机wake-sleep算法

*. wake 步:根据 P(h|v) 采样生成 h
*. sleep步:根据 P(vh) 采样生成 vh ,也叫”dream”步骤
*. 计算求导
*. 重复上述步骤
其实wake步就是对应公式(1)的前半部分采样,sleep步就是对应公式(1)的后半部分采样。

受限制玻尔兹曼机RBM

受限制玻尔兹曼机是一种特殊的玻尔兹曼机,之所以是受限的,是因为,在RBM中,所有的连接都是在隐含节点和可见节点之间的,而在隐含节点内部和可见节点内部并没有连接,一个典型的RBM的结构就是一个二分图:
这里写图片描述
RBM的能量函数和之前的BM是一样的:

E(v,h)=bTvcThhTWv

其中 c b是隐含节点和可见节点的偏置参数, w 是连接权重参数矩阵

RBM的wake-sleep方法

*. wake步骤,因为在RBM中,可见节点和隐含节点都是相互独立的,因此RBM的wake步骤可以直接计算,不需要采样
*. sleep步骤,在sleep步骤中仍然需要采样,但是有更加结构化的采样方法:Blocked Gibbs:
1. 利用可见节点数据采样隐含节点
2. 利用采样出来的隐含节点,采样隐含节点
这里每个采样步骤都可以并行!

对比分歧:Contrastive Divergence

上面提到了Blocked Gibbs,那么如何初始化采样器呢?对比分歧采样的是使用训练可见的数据进行初始化,而且不需要多次Blocked Gibbs采样。这种做法的启发是一个好的模型的采样器应该尽可能的接近可见的训练数据。
具体的操作步骤可以表示为:
这里写图片描述
上图表明了受限玻尔兹曼机中的采样方法,我们根据公式(2)算过的求取wi,j的方法:

h(P(h|v)xjxk)h,v(P(h,v)xjxk) =<hk0(vj0vj1)>+<hk1(vj1vj2)>+...=<vj0hk0><vjhk><vj0hk0><vj1hk1>(4)

其实可以看出,只需采样两个Blocked Gibbs即可。如果这两次采样的结果是一致的,参数将不会进行更新。采样这种方法,我们就可以使用熟悉的随机梯度下降的方法来进行训练了.
文字性的描述RBM 的采样和更新方法:
1. 使用训练数据可视化可见节点
2. 使用可见节点数据更新隐含节点
3. 使用隐含节点再次更新可见节点数据
4. 使用新的可见节点数据再次更新新的隐含节点序列
到这一步,我们可以很容易的对RBM的参数进行更新了,我们将P(h^{‘}|v)和P(v^{‘}\odot h^{‘})设置成相同的值,可以设置成 1N ,那么我们将得到RBM的参数更新公式:
log(p(v))wi,j1Nn=1N[v(n)ih(n)iv(n)i^h(n)i^]

这个式子可以具体对应到公式(4),那么如何更新值呢?在RBM中按照下面的步骤进行更新RBM网络的值:
1. 使用输入可见节点数据更新隐含节点:
hj=11+exp(iviwi,jbj)hj=0,otherwise1,ifhj>rand(0,1)

2. 使用步骤1中的 hj 更新新的可见节点:
vi^=11+exp(jwi,jhjbi)
,然后使用 vi^ 更新新的隐含节点:
hj^=11+exp(iwi,jvi^bj)

至此我们可以得到各个参数更新的方法:
log(p(v|θ))wi,j1Nn=1N[vnih(n)jvni^h(n)j^]log(p(v|θ))bi1Nn=1N[vnivni^]log(p(v|θ))bj1Nn=1N[hnjhnj^]

到这里我们应该也能够明白,这篇传阅度很广的博客: Introduction to Restricted Boltzmann Machines的里面的参数更新原理了。

[注:本渣硕的数学功底有限,简单的推导已经是穷尽高数的知识了,不对的地方请勘正,也可以联系我的邮箱:luchi727@qq.com

这篇关于受限制玻尔兹曼机RBM原理简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972810

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe