RBM(受限玻尔兹曼机)解析

1.RBM结构

RBM包括隐层、可见层和偏置层。与前馈神经网络不一样,RBM在可见层和隐层间的链接方向不定的(值可以双向传播,隐层—>可见层和可见层—>隐层)和完全链接的。

Boltzmann分布:描述理想气体在受保守外力作用、或保守外力场的作用不可忽略时,处于热平衡态下的气体分子按能量的分布规律,它能够代表平衡系统中的一切分布。

这里写图片描述

如上二部图所示,每一层的节点之间没有链接,一层是可见层,及输入层(v),一层是隐藏层(h),如果假设所有节点都是随机二进制变量节点(只能取0或1值),同时假设全概率分布p(v,h)满足Boltzmann分布,这个模型就叫RBM。

数学知识:

全概率公式:

这里写图片描述

贝叶斯公式:

这里写图片描述

全概率公式结合贝叶斯公式:

这里写图片描述

有了先验数学知识就容易了,假设RBM网络结构有n个节点和m个隐藏节点,其中每个可视节点只和m个隐藏节点有关系,其他可视节点是对立的,就是这个可视节点只受m个隐藏节点的影响,对于每个隐藏节点也是,这个特点使得RBM的训练变得容易了。RBM网络有几个参数,一个是可视层与隐藏层之间的权重矩阵Wm x n,一个是可视节点的偏移量b=(b1,b2,…,bn),一个是隐藏节点的偏置值(c1,c2,…,cm),这几个参数决定了RBM网络将一个n维的样本编码成一个什么样的m维样本。

因此,当输入v的时候,通过p(h|v) 可以得到隐藏层h,而得到隐藏层h之后,通过p(v|h)又能得到可视层,通过调整参数,我们就是要使得从隐藏层得到的可视层v1与原来的可视层v如果一样,那么得到的隐藏层就是可视层另外一种表达,因此隐藏层可以作为可视层输入数据的特征,所以它就是一种Deep Learning方法。

2.RBM的用途

(1)对数据进行编码,然后交给监督学习方法进行分类个回归;
这种方法将其当作一个降维的方法使用。这种方式类似于稀疏自动编码器机理。

(2)得到了权重矩阵和偏移量,供BP神经网络初始化训练。
如果直接用BP神经网络,初始值选取不好的话,往往陷入局部极小值,实验结果表明,直接将RBM训练得到的权重矩阵和偏置值作为BP神经网络的初始值,得到效果比较好。

(3)RBM可以估计联合概率p(v,h),如果把v当作训练样本,h当作类别标签(隐藏节点只有一个的情况下,能得到一个隐藏节点为1的概率),就可以用贝叶斯公式求p(h|v),就可以分类,类似朴素贝叶斯、LDA和HMM。RBM可以当作一个生成模型使用。

(4)RBM可以直接计算条件概率p(h|v),如果把v当作训练样本,把h当作类别标签(隐藏节点只有一个的情况下,能得到一个隐藏节点为1的概率),RBM就可以就行分类。RBM可以作为一个判别模型使用。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RBM(Restricted Boltzmann Machine)是一种基于能量的概率模型,常用于无监督学习任务中。下面给出RBM的公式推导及Matlab代码实现。 一、RBM的公式推导 RBM是一个两层神经网络,包括输入层和隐藏层。假设输入层有m个节点,隐藏层有n个节点。RBM的网络结构如下图所示: ![RBM网络结构](https://img-blog.csdn.net/20180320235415595?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1bmd5b25n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) RBM的能量函数为: $$ E(v,h)=-\sum_{i=1}^{m}\sum_{j=1}^{n}v_iw_{ij}h_j-\sum_{i=1}^{m}v_ib_i-\sum_{j=1}^{n}h_jc_j $$ 其中,$v$表示输入层的节点状态,$h$表示隐藏层的节点状态,$w_{ij}$表示第$i$个输入节点和第$j$个隐藏节点之间的连接权重,$b_i$表示第$i$个输入节点的偏置,$c_j$表示第$j$个隐藏节点的偏置。 RBM的概率分布为: $$ P(v,h)=\frac{1}{Z}e^{-E(v,h)} $$ 其中,$Z$为归一化因子,可以表示为: $$ Z=\sum_{v}\sum_{h}e^{-E(v,h)} $$ RBM的训练目标是最大化样本出现的概率,即最大化对数似然函数。对于一个训练样本$v$,其对应的对数似然函数为: $$ \log P(v)=\log\sum_{h}e^{-E(v,h)} $$ 使用对比散度(Contrastive Divergence,CD)算法来学习RBM的参数。CD算法的核心思想是通过采样来估计对数似然函数的梯度。具体地,对于一个训练样本$v$,按照以下步骤进行: 1. 将$v$作为输入层的状态,通过前向传播计算出隐藏层的状态$h_0$; 2. 从隐藏层的概率分布中采样出一个样本$h_1$; 3. 将$h_1$作为隐藏层的状态,通过反向传播计算出输入层的状态$v_1$; 4. 从输入层的概率分布中采样出一个样本$v_2$; 5. 将$v_2$作为输入层的状态,通过前向传播计算出隐藏层的状态$h_2$。 最后,更新参数$w_{ij}$、$b_i$和$c_j$,使得对数似然函数的梯度最大化。 具体地,对于一个样本$v$,其对应的参数梯度为: $$ \frac{\partial\log P(v)}{\partial w_{ij}}=v_ih_{0j}-v_ih_{1j} $$ $$ \frac{\partial\log P(v)}{\partial b_i}=v_i-v_{2i} $$ $$ \frac{\partial\log P(v)}{\partial c_j}=h_{0j}-h_{2j} $$ 其中,$h_{0}$、$h_{1}$和$h_{2}$分别表示通过前向传播计算出的隐藏层状态。 二、RBM的Matlab代码实现 以下是使用Matlab实现RBM的代码示例,其中使用了CD算法来训练RBM模型。 ```matlab % RBM的Matlab代码实现 % 数据集:MNIST手写数字数据集,训练集60000个样本,测试集10000个样本 % 神经网络结构:输入层784个节点,隐藏层100个节点 % CD算法的参数:k=1,学习率lr=0.1 % 加载数据集 load mnist_train_data.mat load mnist_test_data.mat % 初始化RBM模型参数 input_size = 784; % 输入层节点数 hidden_size = 100; % 隐藏层节点数 w = 0.1 * randn(input_size, hidden_size); % 输入层和隐藏层之间的连接权重 b = zeros(1, input_size); % 输入层的偏置 c = zeros(1, hidden_size); % 隐藏层的偏置 % 训练RBM模型 batch_size = 100; % 每个batch的样本数 num_epochs = 10; % 迭代次数 k = 1; % CD算法的参数 lr = 0.1; % 学习率 % 对训练集进行预处理,将像素值归一化到[0,1]之间 train_data = double(train_data) / 255; for epoch = 1:num_epochs % 迭代训练 for batch = 1:floor(size(train_data, 1) / batch_size) % 逐个batch训练 % 选取一个batch的样本 batch_data = train_data((batch - 1) * batch_size + 1 : batch * batch_size, :); % 正向传播 h0_prob = sigmoid(batch_data * w + repmat(c, batch_size, 1)); % 隐藏层的概率分布 h0_sample = double(h0_prob > rand(size(h0_prob))); % 从概率分布中采样出隐藏层的状态 v1_prob = sigmoid(h0_sample * w' + repmat(b, batch_size, 1)); % 重构输入层的概率分布 v1_sample = double(v1_prob > rand(size(v1_prob))); % 从概率分布中采样出重构的输入层状态 % 反向传播 h1_prob = sigmoid(v1_sample * w + repmat(c, batch_size, 1)); % 重构的隐藏层的概率分布 h1_sample = double(h1_prob > rand(size(h1_prob))); % 从概率分布中采样出重构的隐藏层状态 % 计算参数梯度 w_grad = batch_data' * h0_prob - v1_sample' * h1_prob; % 输入层和隐藏层之间的连接权重的梯度 b_grad = sum(batch_data - v1_sample); % 输入层的偏置的梯度 c_grad = sum(h0_prob - h1_prob); % 隐藏层的偏置的梯度 % 更新参数 w = w + lr * w_grad / batch_size; b = b + lr * b_grad / batch_size; c = c + lr * c_grad / batch_size; end % 每个epoch结束后,计算一次对数似然函数的值 error = zeros(size(train_data, 1), 1); for i = 1:size(train_data, 1) v = train_data(i, :); h_prob = sigmoid(v * w + repmat(c, 1, 1)); % 隐藏层的概率分布 v_recon = sigmoid(h_prob * w' + repmat(b, 1, 1)); % 重构的输入层的概率分布 error(i) = -sum(v .* log(v_recon) + (1 - v) .* log(1 - v_recon)); end fprintf('Epoch %d, error = %f\n', epoch, mean(error)); end % 测试RBM模型 test_data = double(test_data) / 255; % 对测试集进行预处理 h_prob = sigmoid(test_data * w + repmat(c, size(test_data, 1), 1)); % 隐藏层的概率分布 v_recon = sigmoid(h_prob * w' + repmat(b, size(test_data, 1), 1)); % 重构的输入层的概率分布 error = -sum(sum(test_data .* log(v_recon) + (1 - test_data) .* log(1 - v_recon), 2)); % 计算对数似然函数的值 fprintf('Test error = %f\n', error); % 定义sigmoid函数 function y = sigmoid(x) y = 1 ./ (1 + exp(-x)); end ``` 参考文献: [1] Hinton G E, Salakhutdinov R R. Restricted Boltzmann machines for collaborative filtering[C]//Proceedings of the 25th international conference on Machine learning. ACM, 2008: 448-455. [2] Fischer A, Igel C. An introduction to restricted Boltzmann machines[J]. Progress in Pattern Recognition, Image Analysis, Computer Vision, and Applications, 2012, 7441: 14-36.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值