一文理解受限玻尔兹曼机(RBM)

2024-01-20 23:38

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

一文理解受限玻尔兹曼机(RBM)

  • 限制性玻尔兹曼机(RBM)原理
    • RBM简单模型
    • RBM能量函数和概率分布
      • 求极大似然
    • 对比散度算法
  • RBM用途
  • 分布式RBM可能遇到的问题

限制性玻尔兹曼机(RBM)原理

限制性玻尔兹曼机在玻尔兹曼机基础上进一步加一些约束,取消了v,h变量内部的联系,即不存在可见单元与可见单元的链接,也不存在隐含单元与隐含单元的链接,如下图所示:
在这里插入图片描述

RBM简单模型

简单 RBM 模型的参数描述如下:可见层与隐层的之间的权值是w_(n×m),注意到上图中h有n个节点,v 有m节点,单个节点用vj和hi描述。该模型∀ⅈ,j,v_j ϵ{0,1},h_i ϵ{0,1},注意{0,1}是个集合,只能取0或者1。还有2个参数是c和b,可以参考神经网络里面的bias,它们都是列向量,每个分量都对应着每个节点的单独偏置量。

RBM能量函数和概率分布

根据前面BM的能量函数以及RBM特性,很容易推出RBM的能量函数为
在这里插入图片描述
利用该能量函数,可以给出状态(v,h)的联合概率分布为
在这里插入图片描述
其中
在这里插入图片描述
对于实际问题,我们最关心的是关于观测数据v的概率分布Pθ(v),它对应Pθ(v, h)的边缘分布,具体为
在这里插入图片描述
类似的有
在这里插入图片描述
由前面KL距离可知,以上真实的边缘概率分布可转为求某种近似分布的极大似然来估计。

求极大似然

在RBM模型中,其似然函数可表示为
在这里插入图片描述
其中θ是要求解的参数,包括w、b、c。
根据前面的能量模型,有:
在这里插入图片描述
而要求极大似然,需对似然函数求导,得到如下
在这里插入图片描述
带入P(v,h)和P(h|v)的表达式,则有
在这里插入图片描述
该式的第一项和第二项是不同的,第一项是求在这里插入图片描述 在P(h|v)下的期望,第二项是求在这里插入图片描述 在P(v,h)下的期望。将θ替换为w、b、c进行分别求导,同时带入E(v,h)表达式,可得:

  1. 对w求导
    在这里插入图片描述
    这里有个小技巧,
    在这里插入图片描述
    最后得到
    在这里插入图片描述

  2. 对b求导
    在这里插入图片描述

  3. 对c求导
    在这里插入图片描述
    我们发现对3个参数求导后,其第二项均需对整个v进行遍历,这明显是不可行的。于是我们就想到了Gibbs采样的方法来估算第二项。假设训练集为{X1,X2,…,Xl},能得到一组对应符合RBM网络表示的Gibbs分布的样本集{Y1,Y2,…Yl},那么梯度就变为以下的近似公式:
    在这里插入图片描述

在这里插入图片描述

其中p(hi=1|v)可变为以下等式,若记
在这里插入图片描述
表示在h中挖掉分量hk后得到的向量,并引入,
在这里插入图片描述
以及
在这里插入图片描述
这样就有:
在这里插入图片描述
那么:
在这里插入图片描述
同理可得,
在这里插入图片描述

至此,我们已经给出单个训练样本情况下的各表达式,对于多个训练集而言,还需带入L似然函数求解,有:
在这里插入图片描述
可得到如下公式,
在这里插入图片描述
然而,我们发现每次进行Gibbs采样都要进行足够多的次数的状态转移才能保证采集到的样本符合目标分布,并且样本集也需要很大才能比较精确的进行。由于上述式子中第二项的复杂度为O(2^(n_v+n_h )),在海量样本集情况下会极大加重RBM算法复杂性,降低其效率,因此需要找到更高效的采样算法。

对比散度算法

基于RBM模型的对称结构,以及其中节点的条件独立行,我们可以使用Gibbs抽样方法得到服从RBM定义的分布的随机样本。在RBM中进行k步Gibbs抽样的具体算法为:用一个训练样本(或者可视节点的一个随机初始状态)初始化可视节点的状态v0,交替进行下面的抽样:
在这里插入图片描述
在抽样步数n足够大的情况下,就可以得到RBM所定义的分布的样本(即符合参数确定的Gibbs分布的样本)了,得到这些样本我们就可以拿去计算梯度的第二项了。
可以看到,上面进行了k步的抽样,这个k一般还要比较大,所以是比较费时间的,尤其是在训练样本的特征数比较多(可视节点数大)的时候,所以hinton教授就给出一个简化的版本,叫做CD-k,也就是对比散度。
对比散度是英文ContrastiveDivergence(CD)的中文翻译。与Gibbs抽样不同,hinton教授指出当使用训练样本初始化v0的时候,仅需要较少的抽样步数(一般就一步)就可以得到足够好的近似了。
在CD算法一开始,可见单元的状态就被设置为一个训练样本,并用上面的几个条件概率来对隐藏节点的每个单元都从{0,1}中抽取到相应的值,然后再利用 来对可视节点的每个单元都从{0,1}中抽取相应的值,这样就得到了v1了,一般v1就够了,就可以拿来估算梯度了。
下面给出RBM的基于CD-k的快速学习的主要步骤。
在这里插入图片描述
图中的从条件分布抽取{0,1}是按如下方式进行:用程序产生一个 0~1的随机数,如果这个随机数小于P(hi=1|v),那么这个隐层节点就取1,反之则取0。假设P(hi=1|v) = 0.6,这时由上面的规则可知,只要随机数小于0.6,这个隐层节点就取1,而恰巧这个随机数小于 0.6 的概率是 0.6(因为0~1的随机数是均匀分布),那么这个事件发生了,就可以认为这个隐层节点取值是1的事件也发生了,所以将隐层取值为1。
上述基于CD的学习算法是针对RBM的可见单元和隐层单元均为二值变量的情形,我们还可以推广到可见单元和隐单元为高斯变量的情形。

RBM用途

RBM的用途主要是两种,一是对数据进行编码,然后交给监督学习方法去进行分类或回归,二是得到了权重矩阵和偏移量,供BP神经网络初始化训练。
第一种可以说是把它当做一个降维的方法来使用。当使用RBM解决分类任务时,最常见的做法是将RBM视为一个特征提取器,使用观测数据(忽略类别标签)训练RBM,然后用训练好的RBM的隐单元的激活概率和原有的类别标签组成心得训练集,进而使用其他的分类算法训练分类器。
第二种就用途比较奇怪。其中的原因就是神经网络也是要训练一个权重矩阵和偏移量,但是如果直接用BP神经网络,初始值选得不好的话,往往会陷入局部极小值。根据实际应用结果表明,直接把RBM训练得到的权重矩阵和偏移量作为BP神经网络初始值,得到的结果会非常地好。
这就类似爬山,如果一个风景点里面有很多个山峰,如果让你随便选个山就爬,希望你能爬上最高那个山的山顶,但是你的精力是有限的,只能爬一座山,而你也不知道哪座山最高,这样,你就很容易爬到一座不是最高的山上。但是,如果用直升机把你送到最高的那个山上的靠近山顶处,那你就能很容易地爬上最高的那座山。这个时候,RBM就的角色就是那个直升机。
其实还有两种用途的,下面说说。
第三种,RBM可以估计联合概率p(v,h),如果把v当做训练样本,h当成类别标签(隐藏节点只有一个的情况,能得到一个隐藏节点取值为1的概率),就可以利用利用贝叶斯公式求p(h|v),然后就可以进行分类,类似朴素贝叶斯、LDA、HMM。说得专业点,RBM可以作为一个生成模型(Generative model)使用。
第四种,RBM可以直接计算条件概率p(h|v),如果把v当做训练样本,h当成类别标签(隐藏节点只有一个的情况,能得到一个隐藏节点取值为1的概率),RBM就可以用来进行分类。说得专业点,RBM可以作为一个判别模型(Discriminative model)使用。

分布式RBM可能遇到的问题

根据CD-K采样算法来进行的RBM,由于采样过程中,每次迭代均需前一次的抽样结果作为输入,所以该算法模型内部是无法进行模型并行的。
数据并行的设计需要考虑样本数据如何分割以及每次迭代最后的权值更新。

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



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

相关文章

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

一文带你搞懂Nginx中的配置文件

《一文带你搞懂Nginx中的配置文件》Nginx(发音为“engine-x”)是一款高性能的Web服务器、反向代理服务器和负载均衡器,广泛应用于全球各类网站和应用中,下面就跟随小编一起来了解下如何... 目录摘要一、Nginx 配置文件结构概述二、全局配置(Global Configuration)1. w

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝