一文帮你理解什么是深层置信网络(DBN)

543 篇文章 13 订阅



翻译 | 林椿眄

编辑 | SuiSui



前言


随着机器学习的进步和深度学习的出现,一些工具和图形表示被逐渐用来关联大量的数据。深度置信网络(Deep Belief Networks)本质上是一种具有生成能力的图形表示网络,即它生成当前示例的所有可能值。


深度置信网络是概率统计学与机器学习和神经网络的融合,由多个带有数值的层组成,其中层之间存在关系,而数值之间没有。深层置信网络主要目标是帮助系统将数据分类到不同的类别。



深度信念网络如何演进?


第一代神经网络使用感知器,通过考虑“权重”或预先馈送的目标属性来识别特定的物体或其他物体。然而,感知器只能在更基本的层面上有效,并不能提高识别的技术。


为了解决这些问题,第二代神经网络引入了反向传播的概念,将得到的输出与期望的输出进行比较,最终目标是使误差值减小到零。支持向量机通过引用先前测试用例的输入来创建和理解更多的测试用例。


接下来是针对信念网络的非循环图。这种图能够帮助解决与推理那些和学习问题有关的问题。随后是深度置信网络,它帮助创建存储在叶节点中的无偏值。



受限玻尔兹曼机


深度置信网络由诸如波尔兹曼机无监督网络组成。在这里,每个子网络的不可见层是下一层的可见层。隐藏层或不可见的层并不是相互连接,而是有条件互相独立的。


联合配置网络的可见层和隐藏层上的概率,取决于联合配置网络的能量与其他所有联合配置网络的能量。



训练深度置信网络


训练网络层属性的第一步是直接从像素获取输入信号。下一步是将此图层的值作为像素,并在第二个隐藏层从先前获取的特征中学习特征。每当另一层的属性或特征被添加到深度置信网络时,训练数据集的对数概率的下限就会有所改善。


例如:




实施


MATLAB可以很容易地将可见层,隐藏层和权重表示为矩阵形式并高效地执行矩阵算法。因此,我们选择MATLAB来实现深度置信网络。


选用这些MNIST9的手写数字,然后用作深度置信网络的计算,以便与其他分类器的性能进行比较。


MNIST9可以被描述为是一个手写数字的数据库,有6万个训练样本和1万个数字测试样本。手写数字是从0到9,并且在每个图像表现出各种的形状和位置特征。每一张图像都被标准化,并以28x28像素为中心被标记。


决定这些权重更新频率的方法是-在线学习,或采用小批量和全批量数据大小。


在线学习需要最长的计算时间,因为在每个训练数据实例之后,它才完成权重的更新。全批量处理通过训练数据并更新权重,但是,建议不要将其用于大数据集。


小批量处理是把数据集分成较小的数据块,并对每个数据块进行学习操作,这种方法需要更少的计算时间。因此,我们使用小批量学习来实现。


需要记住的一个重要的问题是,实现一个深层置信网络需要对每层波尔兹曼机进行训练。


为此,首先需要初始化网络单位和参数。其次是对比散度算法的两个阶段--正相和负相阶段。在正相阶段,隐藏层的二进制状态可以通过权重的计算和可见单位的概率来获得。由于增加了训练数据集的概率,因此称为正相。负相阶段会降低模型生成样本的概率。


贪婪学习算法被用来训练整个深度置信网络。它一次训练一个波尔兹曼机,直到所有的波尔兹曼机都被训练为止。


作者 | Icecream Labs

原文链接:

https://medium.com/@kaveri_53280/deep-belief-networks-all-you-need-to-know-cb708774ee3a

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python和TensorFlow实现DBN深度置信网络的代码: ```python import tensorflow as tf import numpy as np class DBN(object): def __init__(self, n_layers, n_nodes, learning_rate=0.01, batch_size=100, n_epochs=10): self.n_layers = n_layers self.n_nodes = n_nodes self.learning_rate = learning_rate self.batch_size = batch_size self.n_epochs = n_epochs self.weights = [] self.biases = [] self.build_model() def build_model(self): self.X = tf.placeholder(tf.float32, shape=[None, self.n_nodes[0]]) self.y = tf.placeholder(tf.float32, shape=[None, self.n_nodes[-1]]) # 构建每一层的权重和偏置 for i in range(self.n_layers-1): w = tf.Variable(tf.random_normal([self.n_nodes[i], self.n_nodes[i+1]], stddev=0.1), name='w'+str(i)) b = tf.Variable(tf.zeros([self.n_nodes[i+1]]), name='b'+str(i)) self.weights.append(w) self.biases.append(b) # 构建前向传播过程 layers = [self.X] for i in range(self.n_layers-1): layer = tf.nn.sigmoid(tf.add(tf.matmul(layers[-1], self.weights[i]), self.biases[i])) layers.append(layer) self.y_pred = layers[-1] # 构建反向传播过程 self.loss = tf.reduce_mean(tf.square(self.y - self.y_pred)) self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(self.loss) self.init_op = tf.global_variables_initializer() def fit(self, X_train, y_train): n_samples = X_train.shape[0] with tf.Session() as sess: sess.run(self.init_op) for epoch in range(self.n_epochs): total_loss = 0 for i in range(n_samples // self.batch_size): batch_X = X_train[i*self.batch_size: (i+1)*self.batch_size] batch_y = y_train[i*self.batch_size: (i+1)*self.batch_size] _, loss = sess.run([self.optimizer, self.loss], feed_dict={self.X: batch_X, self.y: batch_y}) total_loss += loss avg_loss = total_loss / (n_samples // self.batch_size) print("Epoch:", epoch+1, "Loss:", avg_loss) self.weights = sess.run(self.weights) self.biases = sess.run(self.biases) def predict(self, X_test): with tf.Session() as sess: sess.run(self.init_op) for i in range(self.n_layers-1): sess.run([self.weights[i].assign(self.weights[i]), self.biases[i].assign(self.biases[i])]) y_pred = sess.run(self.y_pred, feed_dict={self.X: X_test}) return y_pred ``` 使用方法: ```python import numpy as np from sklearn.datasets import load_boston from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 加载数据并进行预处理 data = load_boston() X = data.data y = data.target.reshape(-1, 1) X = StandardScaler().fit_transform(X) y = StandardScaler().fit_transform(y) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 构建DBN模型 dbn = DBN(n_layers=3, n_nodes=[13, 10, 1], learning_rate=0.01, batch_size=100, n_epochs=50) dbn.fit(X_train, y_train) # 预测 y_pred = dbn.predict(X_test) ``` 其中,`data`是加载的数据集,`X`是特征,`y`是目标变量。首先进行标准化处理,然后将数据划分为训练集和测试集。接着构建DBN模型,其中`n_layers`是层数,`n_nodes`是每一层的节点数,`learning_rate`是学习率,`batch_size`是批次大小,`n_epochs`是训练轮数。调用`fit`方法进行训练,调用`predict`方法进行预测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值