斐讯路由器做网站映射,郑州建网站哪家好,东莞做网站注意事项,网络营销专业介绍及就业方向个人主页#xff1a;欢迎来到 Papicatch的博客 课设专栏 #xff1a;学生成绩管理系统
专业知识专栏#xff1a; 专业知识 文章目录
#x1f349;引言
#x1f349;受限玻尔兹曼机
#x1f348;RBM的结构
#x1f34d;RBM的架构图
#x1f34d;RBM的经典实现
欢迎来到 Papicatch的博客 课设专栏 学生成绩管理系统
专业知识专栏 专业知识 文章目录
引言
受限玻尔兹曼机
RBM的结构
RBM的架构图
RBM的经典实现
代码实现
代码分析
总结 引言 在当今科技飞速发展的时代人工智能的研究不断取得突破性的进展。其中受限玻尔兹曼机作为一种重要的模型正逐渐引起人们的广泛关注。它独特的结构和强大的学习能力为解决各种复杂的问题提供了新的思路和方法。受限玻尔兹曼机不仅在理论研究上具有深刻的意义在实际应用中也展现出了巨大的潜力例如图像识别、语音处理、自然语言处理等领域。
受限玻尔兹曼机 受限玻尔兹曼机Restricted Boltzmann MachineRBM是一种生成性随机人工神经网络也是一种无向概率图模型并且受限为二分图。 整个模型有两层即可见层包含可见单元和隐藏层包含隐单元满足层内无连接层间全连接。这种限制使得它在神经元之间的连接上有特定的规则来自两组单元中的每一组的一对节点通常称为“可见”和“隐藏”单元可以在它们之间具有对称连接而组内的节点之间没有连接。相比一般的玻尔兹曼机这种限制允许使用更有效的训练算法。
RBM 通常由二值隐单元和可见单元组成其中权重矩阵 中的每个元素指定了隐单元 和可见层单元 之间边的权重。 此外对于每个可见层单元 有偏置项 对每个隐层单元 有偏置项 。具体来说需满足以下条件 其能量函数对于一组给定的状态 定义为 由能量函数可以给出状态 的联合概率分布 其中 是归一化常数计算式为 其计算复杂度为 。可见层的边缘分布: ;隐藏层的边缘分布: 。 RBM 的一个重要性质是由于它是一个二分图层内没有边相连因而隐藏层的激活状态在给定可见层节点取值的情况下是条件独立的类似地可见层节点的激活状态在给定隐藏层节点取值的情况下也条件独立用数学公式表示为 由此可以推导得出在给定可视层 的基础上隐层第 个节点为 1 或者为 0 的概率为 在给定隐层 的基础上可视层第 个节点为 1 或者为 0 的概率为 在训练 RBM 时关键是计算模型中的参数 。通常采用对数损失函数并考虑最大化对数似然函数。但直接按梯度公式计算梯度的复杂度很高因为其中涉及到归一化常数 的计算而 的计算复杂度为 。 为解决这个问题一般使用基于马尔可夫链蒙特卡罗MCMC的方法来模拟计算梯度如 Geoffrey Hinton 提出的对比散度contrastive divergenceCD算法。该算法给定样本 后取初始值 然后执行 步 Gibbs 采样先后采样得到 和 。Gibbs 采样得到的样本服从联合分布 利用采样得到的 可以估算梯度公式中期望项的近似值从而得到梯度的近似值之后在每一步利用梯度上升法进行参数更新。 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, version1, cacheTrue)
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_size0.2, random_state42)class RBM:def __init__(self, n_visible, n_hidden, learning_rate0.1, n_epochs100):初始化 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 和采样后的隐藏层状态 hhidden_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_primevisible_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 模型设置可见层神经元数量为 784MNIST 图像的维度隐藏层神经元数量为 128
rbm RBM(n_visible784, n_hidden128, learning_rate0.1, n_epochs50)# 训练模型
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, cmapgray)plt.axis(off)plt.subplot(2, n_images, i 1 n_images)plt.imshow(reconstructed_image, cmapgray)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 在深度学习领域仍然具有重要地位其思想和方法为后续更复杂的深度模型的发展提供了基础和启发。