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

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_visible
        self.n_hidden = n_hidden
        self.learning_rate = learning_rate
        self.n_epochs = n_epochs

        # 随机初始化权重矩阵 W,偏置向量 bv(可见层)和 bh(隐藏层)
        self.W = np.random.randn(n_visible, n_hidden) * 0.1
        self.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.bh
        p_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.bv
        p_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_prime
                p_visible, v_prime = self.sample_visible(h)

                # 更新参数
                # 计算权重更新量 dW
                dW = np.outer(v, p_hidden) - np.outer(v_prime, p_hidden)
                # 更新权重 W
                self.W += self.learning_rate * dW
                # 更新可见层偏置 bv
                self.bv += self.learning_rate * (v - v_prime)
                # 更新隐藏层偏置 bh
                self.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.mfbz.cn/a/793408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode HOT100(二)双指针

移动0 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 解法1:双指针交换 指针L&…

达梦数据库中的线程和进程

达梦数据库中的线程和进程 在达梦数据库中,线程和进程的概念与操作系统中的定义类似,但有一些特定的实现细节和用途。以下是达梦数据库中线程和进程的一些关键点: 进程(Process): 在达梦数据库中&#x…

三分钟看懂马尔可夫链(Markov Chain)是什么

马尔可夫链(Markov Chain)是一种数学模型,用于描述系统在不同状态之间的转移过程。简单来说,马尔可夫链描述了一个系统在各个状态之间转移的概率,这种转移是随机的,但遵循特定的概率规则。它有两个重要特性…

SD卡讲解

SD 卡 (Secure Digital Memory Card) 在我们生活中已经非常普遍了,控制器对 SD 卡进行读写通信 操作一般有两种通信接口可选,一种是 SPI 接口,另外一种就是 SDIO 接口。SDIO 全称是安全数 字输入/输出接口,多媒体卡 (MMC)、SD 卡、…

财务RPA的ROI——如何计算财务RPA的回报率

近几年各企业纷纷利用RPA加速推进数字化转型进程,从企业效益角度来看,RPA能够帮助企业节省人力和运营成本,实现提质增效,但是每个企业运营管理的实际情况多有不同,在实施RPA前,还是要仔细评估投资和效益的问…

【鸿蒙学习笔记】元服务

官方文档:元服务规格 目录标题 什么是元服务特征第一个元服务-案例介绍创建项目源码启动模拟器启动entry创建卡片出发元服务 什么是元服务 特征 免安装分包预加载老化和更新机制 第一个元服务-案例介绍 创建项目 源码 Entry Component struct WidgetCard {buil…

33 IRF配置思路

IRF配置思路网络括谱图 主 Ten-GigabitEthernet 1/0/49 Ten-GigabitEthernet 1/0/50 Ten-GigabitEthernet 1/0/51 备 Ten-GigabitEthernet 2/0/49 Ten-GigabitEthernet 2/0/50 Ten-GigabitEthernet 2/0/51 思路 主 1 利用console线进入设备的命令行页面去更改…

SpringBoot入门(解决JDK8不存在问题)

1、什么是SpringBoot SpringBoot是一个用于创建独立的、基于Spring的Java应用程序框架。它通过约定优于配置的方式来简化Spring应用程序的开发过程,使开发者能够更快速地搭建和部署应用程序。Spring Boot 提供了自动化配置,减少了手动配置的工作量&#…

大数据专业创新人才培养体系的探索与实践

一、引言 随着大数据技术的迅猛发展,其在各行各业中的应用日益广泛,对大数据专业人才的需求也日益增长。我国高度重视大数据产业的发展,将大数据作为国家战略资源,推动大数据与各行业的深度融合。教育部也积极响应国家战略&#…

202-502SF 同轴连接器

型号简介 202-502SF是Southwest Microwave的连接器。这款连接器外壳采用不锈钢,接触件采用 BeCu 并进行金镀处理,绝缘体采用聚四氟乙烯,防尘环采用 UltiFume 1000,电缆适配器采用黄铜并进行金镀处理,电缆螺母也采用不锈…

跨境电商API的全球视野:打破地域限制,连接全球消费者与商家

在全球化日益加深的今天,跨境电商已成为推动全球经济一体化的重要力量。它不仅为消费者提供了前所未有的购物体验,让世界各地的商品触手可及,更为商家开辟了全新的市场蓝海,实现了业务的全球化拓展。在这一进程中,跨境…

基于vue的地图特效(飞线和标注)

这段代码的主要功能是在页面加载完成后,初始化一个 echarts 地图图表,并配置了相关的地理数据、散点数据、线条数据以及样式效果,最后在指定的 div 元素中进行展示。 需要再vue中的框架实现,不能单独直接运行。 标注 type: effe…

使用simulink进行esp32开发,进行串口收发数据需要注意的地方,为什么收发不成功

1,主要是因为simulink里的配置文件配置的波特率和串口接受软件配置的波特不一致导致的 2,主要有以下三个界面 a.配置文件 b.模型 模型直接选择使用的是那组串口就行了,一般情况下我们收发使用同一组就可以,这样收发模块填写的端…

浪潮服务器内存物理插槽位置

浪潮服务器内存物理插槽位置 如下图所示

光伏电站逆变器选型方法

前言:光伏逆变器是光伏发电系统两大主要部件之一,光伏逆变器的核心任务是跟踪光伏阵列的最大输出功率,并将其能量以最小的变换损耗、最佳的电能质量馈入电网。由于逆变器是串联在光伏方阵和电网之间,逆变器的选择将成为光伏电站能…

Socks5代理为何比HTTP代理快?

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

探索 Electron:窗口菜单以及生命周期和对话框讲解

Electron是一个开源的桌面应用程序开发框架,它允许开发者使用Web技术(如 HTML、CSS 和 JavaScript)构建跨平台的桌面应用程序,它的出现极大地简化了桌面应用程序的开发流程,让更多的开发者能够利用已有的 Web 开发技能…

小程序问题

1.获取节点 wx.createSelectorQuery() wx.createSelectorQuery().in(this) //组件中加in(this),不然获取不到 2.使用实例 wx.createSelectorQuery().in(this).select(#share).fields({node: true,size: true}).exec(async (res) > {const canvas res[0].node;…

【栈和队列OJ题】

栈和队列OJ题 文章目录 栈和队列OJ题1. 用队列实现栈2. 用栈实现队列3. 括号匹配问题4. 循环队列 1. 用队列实现栈 OJ链接:225. 用队列实现栈 - 力扣(LeetCode) 好的,我们一起来看一下题目,题目是这样说的 思路&…

【斯坦福因果推断课程全集】2_无混淆和倾向分1

目录 Beyond a single randomized controlled trial Aggregating difference-in-means estimators Continuous X and the propensity score 随机试验的一个最简单的扩展是无约束下的干预效果估计。从定性上讲,当我们想估计一种并非随机的治疗效果,但一…