【人工智能】-- 受限玻尔兹曼机

2a20c54b85e042bfa2440367ae4807e9.gif

https://blog.csdn.net/2302_76516899?spm=1000.2115.3001.5343

个人主页:欢迎来到 Papicatch的博客

 课设专栏 :学生成绩管理系统

专业知识专栏: 专业知识 

文章目录

🍉引言

🍉受限玻尔兹曼机

🍈RBM的结构

🍍RBM的架构图

🍍RBM的经典实现

🍍代码实现

🍍代码分析

🍉总结


2a20c54b85e042bfa2440367ae4807e9.gif

🍉引言

        在当今科技飞速发展的时代,人工智能的研究不断取得突破性的进展。其中,受限玻尔兹曼机作为一种重要的模型,正逐渐引起人们的广泛关注。它独特的结构和强大的学习能力,为解决各种复杂的问题提供了新的思路和方法。受限玻尔兹曼机不仅在理论研究上具有深刻的意义,在实际应用中也展现出了巨大的潜力,例如图像识别、语音处理、自然语言处理等领域。

🍉受限玻尔兹曼机

        受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)是一种生成性随机人工神经网络,也是一种无向概率图模型,并且受限为二分图。

        整个模型有两层,即可见层(包含可见单元)和隐藏层(包含隐单元),满足层内无连接,层间全连接。这种限制使得它在神经元之间的连接上有特定的规则,来自两组单元中的每一组的一对节点(通常称为“可见”和“隐藏”单元)可以在它们之间具有对称连接,而组内的节点之间没有连接。相比一般的玻尔兹曼机,这种限制允许使用更有效的训练算法。

RBM 通常由二值隐单元和可见单元组成,其中权重矩阵 W=\left (w_{ij} \right ) 中的每个元素指定了隐单元 h_{i} 和可见层单元 v_{j} 之间边的权重。

        此外,对于每个可见层单元 v_{i} 有偏置项 a_{i},对每个隐层单元 h_{j} 有偏置项 b_{j}。具体来说,需满足以下条件

其能量函数对于一组给定的状态 \left ( v,h \right ) 定义为:

由能量函数可以给出状态 \left ( v,h \right ) 的联合概率分布:

其中,Z 是归一化常数,计算式为 Z=\sum_{v,h}e^{-E\left ( v,h \right )},其计算复杂度为 O(2^{p+q})。可见层的边缘分布: P\left ( v \right )=\sum_{h}^{}P\left ( v,h \right ) ;隐藏层的边缘分布: P\left ( h \right )=\sum_{v}^{}P\left ( v,h \right )

        RBM 的一个重要性质是,由于它是一个二分图,层内没有边相连,因而隐藏层的激活状态在给定可见层节点取值的情况下是条件独立的,类似地,可见层节点的激活状态在给定隐藏层节点取值的情况下也条件独立,用数学公式表示为:

由此可以推导得出在给定可视层 v 的基础上,隐层第 j 个节点为 1 或者为 0 的概率为:

在给定隐层 h 的基础上,可视层第 i 个节点为 1 或者为 0 的概率为:

        在训练 RBM 时,关键是计算模型中的参数 \theta =\left ( W,a,b \right ) 。通常采用对数损失函数,并考虑最大化对数似然函数。但直接按梯度公式计算梯度的复杂度很高,因为其中涉及到归一化常数 Z 的计算,而 Z 的计算复杂度为 O(2^{p+q}) 。

        为解决这个问题,一般使用基于马尔可夫链蒙特卡罗(MCMC)的方法来模拟计算梯度,如 Geoffrey Hinton 提出的对比散度(contrastive divergence,CD)算法。该算法给定样本 x 后,取初始值 v^{\left ( 0 \right )}:=x ,然后执行 k 步 Gibbs 采样,先后采样得到 h^{(t-1)} 和 v^{(t)} 。Gibbs 采样得到的样本服从联合分布 p(v,h) ,利用采样得到的 v^{(k)} 可以估算梯度公式中期望项的近似值,从而得到梯度的近似值,之后在每一步利用梯度上升法进行参数更新。

        RBM 可用于降维、分类、协同过滤、特征学习、生成模型等任务。根据任务的不同,它可以使用监督学习或无监督学习的方法进行训练。例如在推荐系统中,可以把每个用户对各个物品的评分作为可见层神经元的输入,从而进行训练。

        RBM 在深度学习中有重要应用,它可以通过“堆叠”形成深层信念网络等更复杂的结构。但 RBM 也存在一些局限性,例如在处理大规模数据时可能效率不高,对初始值敏感等。不过,研究人员仍在不断探索和改进 RBM 及其相关算法,以拓展其应用领域和提高性能。

🍈RBM的结构

🍍RBM的架构图

🍍RBM的经典实现

🍍代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split# 加载 MNIST 数据集
mnist = fetch_openml('mnist_784', version=1, cache=True)
X = mnist.data
y = mnist.target# 数据预处理
X = preprocessing.MinMaxScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)class RBM:def __init__(self, n_visible, n_hidden, learning_rate=0.1, n_epochs=100):"""初始化 RBM 模型参数:n_visible:可见层神经元数量(输入数据的维度)n_hidden:隐藏层神经元数量learning_rate:学习率n_epochs:训练轮数"""self.n_visible = n_visibleself.n_hidden = n_hiddenself.learning_rate = learning_rateself.n_epochs = n_epochs# 随机初始化权重矩阵 W,偏置向量 bv(可见层)和 bh(隐藏层)self.W = np.random.randn(n_visible, n_hidden) * 0.1self.bv = np.zeros(n_visible)self.bh = np.zeros(n_hidden)def sigmoid(self, x):"""Sigmoid 激活函数参数:x:输入值返回:Sigmoid 函数的输出"""return 1 / (1 + np.exp(-x))def sample_hidden(self, v):"""根据给定的可见层状态 v 采样隐藏层参数:v:可见层状态返回:隐藏层的激活概率 p_hidden 和采样后的隐藏层状态 h"""hidden_activation = np.dot(v, self.W) + self.bhp_hidden = self.sigmoid(hidden_activation)return p_hidden, np.random.binomial(1, p_hidden)def sample_visible(self, h):"""根据给定的隐藏层状态 h 采样可见层参数:h:隐藏层状态返回:可见层的激活概率 p_visible 和采样后的可见层状态 v_prime"""visible_activation = np.dot(h, self.W.T) + self.bvp_visible = self.sigmoid(visible_activation)return p_visible, np.random.binomial(1, p_visible)def train(self, X):"""训练 RBM 模型参数:X:训练数据"""for epoch in range(self.n_epochs):for v in X:# 正向传播:根据输入的可见层状态 v 计算隐藏层的激活概率和采样后的隐藏层状态p_hidden, h = self.sample_hidden(v)# 反向传播:根据采样得到的隐藏层状态 h 计算可见层的激活概率和采样后的可见层状态 v_primep_visible, v_prime = self.sample_visible(h)# 更新参数# 计算权重更新量 dWdW = np.outer(v, p_hidden) - np.outer(v_prime, p_hidden)# 更新权重 Wself.W += self.learning_rate * dW# 更新可见层偏置 bvself.bv += self.learning_rate * (v - v_prime)# 更新隐藏层偏置 bhself.bh += self.learning_rate * (p_hidden - np.mean(p_hidden))def reconstruct(self, X):"""对输入数据进行重建参数:X:输入数据返回:重建后的可见层状态"""h = np.zeros((X.shape[0], self.n_hidden))for i, v in enumerate(X):_, h[i] = self.sample_hidden(v)_, v_prime = self.sample_visible(h)return v_prime# 初始化 RBM 模型,设置可见层神经元数量为 784(MNIST 图像的维度),隐藏层神经元数量为 128
rbm = RBM(n_visible=784, n_hidden=128, learning_rate=0.1, n_epochs=50)# 训练模型
rbm.train(X_train)# 重建测试集图像
reconstructed_images = rbm.reconstruct(X_test)# 展示原始图像和重建图像
n_images = 5
for i in range(n_images):original_image = X_test[i].reshape(28, 28)reconstructed_image = reconstructed_images[i].reshape(28, 28)plt.subplot(2, n_images, i + 1)plt.imshow(original_image, cmap='gray')plt.axis('off')plt.subplot(2, n_images, i + 1 + n_images)plt.imshow(reconstructed_image, cmap='gray')plt.axis('off')plt.show()

🍍代码分析

RBM 类的 __init__ 方法

  • 初始化模型的参数,包括可见层和隐藏层的神经元数量、学习率和训练轮数。
  • 随机初始化权重矩阵 W 、可见层偏置 bv 和隐藏层偏置 bh 。

sigmoid 方法:定义了 Sigmoid 激活函数,用于计算神经元的激活概率。

sample_hidden 方法:

  • 计算给定可见层状态下隐藏层的激活值。
  • 通过激活值计算隐藏层的激活概率。
  • 基于激活概率进行二项分布采样得到隐藏层的状态。

sample_visible 方法:与 sample_hidden 类似,用于根据隐藏层状态采样可见层状态。

train 方法:

  • 在每一轮训练中,遍历训练数据中的每个样本。
  • 进行正向传播,从可见层到隐藏层的采样。
  • 进行反向传播,从隐藏层到可见层的采样。
  • 根据采样结果计算权重和偏置的更新量,并进行更新。

reconstruct 方法:

  • 首先对输入数据采样得到隐藏层状态。
  • 然后根据隐藏层状态采样重建可见层状态。

在主程序中:

  • 加载 MNIST 数据集并进行预处理和划分。
  • 初始化 RBM 模型并进行训练。
  • 对测试集数据进行重建,并展示原始图像和重建图像的对比。

        这段代码主要实现了一个受限玻尔兹曼机(RBM)模型,并将其应用于 MNIST 数据集的图像重建任务。

        首先,代码从开放数据集中加载 MNIST 数据,进行预处理和划分。然后定义了 RBM 类,在类的初始化方法中,设定了模型的关键参数,包括可见层和隐藏层的神经元数量、学习率以及训练轮数,并随机初始化了权重和偏置。

   RBM 类中包含了 sigmoid 激活函数,以及用于正向和反向传播的 sample_hidden 和 sample_visible 方法。训练方法 train 通过不断的正向和反向传播,并基于采样结果更新权重和偏置来优化模型。reconstruct 方法用于对输入数据进行重建。

        在主程序中,初始化并训练 RBM 模型,最后对测试集数据进行重建,并通过图像展示原始图像和重建图像的对比,以直观评估模型的重建效果。

🍉总结

        受限玻尔兹曼机(RBM)是一种具有独特结构和强大学习能力的概率图模型。

        在结构上,RBM 由两层神经元组成,即可见层和隐藏层。层内神经元无连接,层间神经元全连接。这种结构简化了计算,同时也使得模型能够有效地学习数据中的特征和模式。

        在学习过程中,RBM 通过不断调整参数(包括权重、可见层偏置和隐藏层偏置)来优化模型。常见的学习算法如对比散度(CD)算法,通过采样和近似计算梯度来更新参数。

        RBM 具有多种应用,例如在数据降维方面,它能够将高维数据映射到低维的隐藏层表示;在特征学习中,能够自动从原始数据中提取有意义的特征;在生成模型中,可以生成新的数据样本。

        然而,RBM 也存在一些局限性。例如,训练时间可能较长,尤其是在处理大规模数据时;对初始参数的设置较为敏感;模型的解释性相对较复杂等。

        尽管如此,RBM 在深度学习领域仍然具有重要地位,其思想和方法为后续更复杂的深度模型的发展提供了基础和启发。

2a20c54b85e042bfa2440367ae4807e9.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中对asyncio的实际使用

前言:一般涉及异步编程我都无脑用celery,但是最近在做一个项目,项目不大,也不涉及定时任务,所以就用了asyncio。 asyncio是python自带的模块,比celery轻量,使用起来也简单。以前学习过&#xf…

论文阅读【时空+大模型】ST-LLM(MDM2024)

论文阅读【时空大模型】ST-LLM(MDM2024) 论文链接:Spatial-Temporal Large Language Model for Traffic Prediction 代码仓库:https://github.com/ChenxiLiu-HNU/ST-LLM 发表于MDM2024(Mobile Data Management&#xf…

ArrayList----源码分析

源码中的简介: List接口的可调整数组实现。实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector,只是它是不同…

TC软件许可优化解决方案

TC功能说明 Teamcenter 软件是西门子面向全球范围开发的数字化全生命周期管理(PLM)系统,将人员、产品、流程、知识有机联系在一起,以帮助企业实现数字化协同、数字化赋能、 数字化转型,从而推动企业产品创新与效率提升…

Java链表LinkedList经典题目

一.LinkedList的方法 首先先看一下链表的方法: 方法解释boolean add(E e)尾插void add(int index, E element)将 e 插入到 index 位置boolean addAll(Collection c)尾插 c 中的元素E remove(int index)删除 index 位置元素boolean remove(Object o)删除遇到的第一…

【EIScopus稳检索-高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024)

大会官网:www.icbdss.org 大会时间:2024年8月16-18日 大会地点:中国-上海 接受/拒稿通知:投稿后1-2周内 收录检索:EI,Scopus *所有参会者现场均可获取参会证明,会议通知(邀请函)&…

2022 RoboCom省赛题目解析

题目解析&#xff1a;这就是一题很简单的模拟&#xff0c;直接上代码&#xff1b; #include<iostream> using namespace std; const int N 10010; int arr[N]; int main() {int n , m;cin >> n >> m;int sum 0;int res 0;for(int i 0; i < n;i ) cin…

系统服务综合作业01

题目&#xff1a; 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 no…

程序使用多进程,打包.exe后,程序陷入死循环

最近写了一个深度学习程序&#xff0c;用cxfreezee打包exe后&#xff0c;在本地运行突然出现死循环&#xff0c;明明在pycharm运行一切正常。 排查了问题&#xff0c;怀疑是多进程的原因&#xff0c;解决办法&#xff1a; 在你的主程序前添加一行代码&#xff1a; if __name_…

Pandas数学函数大揭秘:让数据处理变得如此简单高效,轻松玩转数据分析新纪元!

1.导包 # 导包 import numpy as np import pandas as pd2.聚合函数 df pd.DataFrame(datanp.random.randint(0,100,size(5,3))) df01203550281552376231419335895434679917 # 列非空元素的数量 df.count()0 5 1 5 2 5 dtype: int64# 行非空元素的数量 df.count(ax…

多输入多输出 | Matlab实现Transformer多输入多输出预测

多输入多输出 | Matlab实现Transformer多输入多输出预测 目录 多输入多输出 | Matlab实现Transformer多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现Transformer多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.da…

二分查找算法——部分OJ题详解

目录 关于二分查找算法 部分OJ题详解 704.二分查找 一&#xff0c;分析题目 二&#xff0c;细节处理 三&#xff0c;题目代码 四&#xff0c;*总结朴素模板 *34.在排序数组中查找元素的第一个和最后一个位置 一&#xff0c;查找左端点 二&#xff0c;处理左端点细…

Socks5代理为何比HTTP代理快?

在网络世界中&#xff0c;代理服务器扮演着重要的角色&#xff0c;它们能够帮助我们访问被限制的网站、提高网络安全性以及优化网络性能。其中&#xff0c;Socks5代理和HTTP代理是两种常见的代理类型。然而&#xff0c;很多用户发现&#xff0c;相较于HTTP代理&#xff0c;Sock…

【两大3D转换SDK对比】HOOPS Exchange VS. CAD Exchanger

在现代工业和工程设计领域&#xff0c;CAD数据转换工具是确保不同软件系统间数据互通的关键环节。HOOPS Exchange和CAD Exchanger是两款备受关注的工具&#xff0c;它们在功能、支持格式、性能和应用场景等方面有着显著差异。 本文将从背景、支持格式、功能和性能、应用场景等…

嵌入式ARM控制器在AGV里的应用

随着ARM技术以及芯片加工工艺的迅猛发展&#xff0c; ARM工业计算机得到了越来越广泛的应用&#xff0c;尤其在工业智慧城市、智能设备以及工业自动化控制等领域。本文将为大家详细介绍ARM控制器在AGV控制系统中的应用&#xff0c;来供大家学习和参考&#xff0c;欢迎大家一起来…

Linux磁盘-创建分区

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux磁盘涉及到的命令不是很多&#xff0c;但是在实际运维中的作用却很大&#xff0c;因为Linux系统及业务都会承载到硬盘…

【PTA天梯赛】L1-003 个位数统计(15分)

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法刷题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录 题目题解总结 题目 题目链接 题解 使用string把长度达1000位的数字存起来开一个代表个位数的数组 a[11]倒序计算最后一位&#xff0c;…

进度条提示-在python程序中使用避免我误以为挂掉了

使用库tqdm 你还可以手写一点&#xff0c;反正只要是输出点什么东西都可以&#xff1b; Demo from chatgpt import time from tqdm import tqdm# 示例函数&#xff0c;模拟长时间运行的任务 def long_running_task():total_steps 100for step in tqdm(range(total_steps), …

mac下mysql无法登陆的问题

用如下命令登录出现错误。 sudo mysql.server start解决方案 使用如下命令登录 sudo /usr/local/MySQL/support-files/mysql.server start

利用 Plotly.js 创建交互式条形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 利用 Plotly.js 创建交互式条形图 应用场景介绍 交互式条形图广泛应用于数据可视化和分析领域。它可以直观地展示不同类别或分组之间的数值差异&#xff0c;并允许用户通过交互操作探索数据。 代码基本功能介…