目录
1.RBM概述
受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)是一种基于神经网络的机器学习模型,用于无监督学习和特征学习。它在各种应用领域,如自然语言处理、计算机视觉、协同过滤、特征提取等方面都取得了很大的成功。
RBM由两层神经元组成,分别是可见层(Visible Layer)和隐藏层(Hidden Layer)。这两层之间没有同层之间的连接,这是“受限”之处,即限制了连接的方式。
可见层(Visible Layer):这一层包含了输入数据的特征或观察值。每个可见层神经元对应输入数据的一个维度。这些神经元是可见的,因为它们直接接受和表示输入数据。
隐藏层(Hidden Layer):隐藏层是RBM的核心。它包含了一组特征检测器或隐藏特征,用于捕捉输入数据中的高阶特征和关联。每个隐藏层神经元对应一个隐藏特征。这些隐藏层神经元不直接与输入数据连接,而是通过权重来连接到可见层。
2.RBM实现原理
RBM的核心原理是学习数据的分布,以便对数据进行建模和生成。它的学习过程基于能量函数(Energy Function)和概率分布。
能量函数(Energy Function):RBM使用能量函数来定义模型中的状态。对于给定的可见层状态(数据)和隐藏层状态(特征),能量函数E的计算如下:
V表示可见层的状态。
H表示隐藏层的状态。
W是权重矩阵,它表示连接可见层和隐藏层的权重。
a和b是可见层和隐藏层的偏置。
概率分布:RBM的学习基于两个概率分布,一个是数据的真实分布(通常是训练数据集的分布),另一个是模型的分布(RBM学习得到的分布)。这两个分布之间的差异通过最大似然估计等方法来最小化。
数据的真实分布P_data(V):表示观察到的数据在可见层上的概率分布。
模型的分布P_model(V):表示RBM生成的数据在可见层上的概率分布。它由能量函数E定义。
通过最大似然估计,RBM的目标是最小化两个分布之间的KL散度(Kullback-Leibler Divergence),从而使模型的分布P_model尽可能接近数据的真实分布P_data。
学习算法:RBM的学习过程通常使用马尔可夫链蒙特卡洛(Markov Chain Monte Carlo,MCMC)方法,如Gibbs采样。在训练过程中,通过Gibbs采样从模型中抽取样本,然后根据抽样的样本来更新权重和偏置,以减小两个分布之间的差距。
RBM的学习算法涉及到能量函数、概率分布以及权重和偏置的更新。以下是一些关键公式:可见层到隐藏层的条件概率:
权重和偏置的更新规则:
3.RBM应用领域
特征学习:RBM可以自动地学习输入数据中的特征表示,这对于计算机视觉和自然语言处理等任务非常有用。
协同过滤:在推荐系统中,RBM可以用于协同过滤,以发现用户和物品之间的关联,从而提供个性化的推荐。
数据降维:RBM可以用于将高维数据降维到低维表示,以便进行可视化或更高效的处理。
生成模型:RBM可以用作生成模型,用于生成与训练数据分布相似的新数据样本,如图像生成、音乐生成等。
无监督预训练:RBM可以在深度学习中用于无监督预训练深度神经网络的初始权重,从而改善网络的性能。
总的来说,受限玻尔兹曼机是一种强大的机器学习工具,能够捕捉数据中的复杂特征和关系,适用于多种应用领域。其无监督学习的能力使其在处理大规模数据和高维数据时特别有优势。
4.MATLAB核心程序
.......................................................................
% 使用1步对比散度(CD-1)和随机批次梯度上升算法
for i = 1:timesteps
ordering = randperm(m);
I = I(ordering, :);
for j = 1:m
% 通过采样找到隐藏层单元
hidden_p = sigmoid(I(j,:) * W + h_bias);
% 通过从隐藏层中采样找到可见层单元
H = zeros(size(hidden_p));
H(hidden_p >= rand(size(hidden_p))) = 1;
% 找到最后一步的kth
visible_p = sigmoid(H * W' +v_bias);
%repmat(v_bias,[m,1])
V = zeros(size(visible_p));
V(visible_p >= rand(size(visible_p))) = 1;
% 正差异(Positive Divergence)
bP = sigmoid(visible_p * W + h_bias);
last_H = zeros(size(bP));
last_H(bP >= rand(size(bP))) = 1;
% Positive Divergence
% <v_i * p(h_i)>
pD = I(j,:)'*hidden_p;
% 负差异(Negative Divergence)
nD = V'*bP;
% 使用对比散度(contrastive divergence)更新权重
W = W + eps*(pD - nD)/m;
% 更新偏置
v_bias = v_bias + eps*(sum(I(j,:)-V));
h_bias = h_bias + eps*(sum(hidden_p-bP));
% 通过检查偏置和权重的变化来估计误差
format long;
errvec(i) = errvec(i) + sum(sum((I(j,:)-visible_p).^2));
end
errvec(i) = sqrt(errvec(i));
end
up3036