DBN(深度置信网络)

受限玻尔兹曼机:提取特征用的,两层的结构。

可见层和隐藏层,可见层输入以后,通过权值和偏置的叠加,变成概率的计算,决定隐藏层出现什么样的数据。而隐藏层可以反过来重构可见层,一直以这样的规则继续下去。这个过程就是吉布斯采样,吉布斯采样是一个逐渐逼近玻尔兹曼分布,最终的理想结果是最终迭代的结果和预先训练好的向量,达到分类的目的。

除了分类的用途,另一个用途是,因为隐藏层在不断的迭代过程中会逐渐在一个概率范围内,这些概率就是输入进去的特征,在隐藏层抽取的特征是计算的概率。这些抽取的概率可以达到压缩数据的目的。

受限玻尔兹曼机(RBM)

玻尔兹曼机是什么东西?

他就是一个无向图模型,在这个无向图当中节点分成两类,一类是观测变量,另一类是隐藏变量。关于一个无向图来讲最重要的就是因子分解。因为玻尔兹曼机是一个特殊的马尔可夫随机场。先来回顾一下马尔科夫随机场的因子分解。这个因子分解就是基于最大团的概念。

假设这个无向图模型的变量是x,他的概率密度函数写作:

 

其中K指的是无向图分成的最大团的个数,Ci代表的是最大团的节点集合,Xci由最大团对应的随机变量的集合。\varphi _{i}\left ( x_{ci} \right )势函数。Z是归一化因子(配分函数)

上面的函数表达式是由条件的,

 Z是归一化因子,就是对x求积分(因为Z 是离散的,关于概率统计模型,无论是有向图还是无向图在不加说明的情况下默认是随机变量都是离散随机变量,所以在上面的Z公式当中用的是连加),如1式:

对于\varphi _{i}严格大于0,在一般情况下取指数型函数,(因为指数函数就能保证是严格大于0 的)

E是能量函数(用来描述稳定状态的),是关于x_{ci}的一个集合或者是说最大团。

对于一个无向图,取到的势函数是指数型函数,它整个的概率分布就是玻尔兹曼分布。这个玻尔兹曼分布并不是机器学习固有的而是脱胎于统计物理学。

玻尔兹曼机

把随机变量x分成两组来表示:{h,v}

现在画一个无向图,阴影部分的是观测变量,那这个图可以看作是一个玻尔兹曼机。玻尔兹曼机的问题在于:精确是不可能的,近似时计算量太大。所以要对玻尔兹曼机这个模型进行简化,这就引出了受限玻尔兹曼机模型。做的简化是:只有在{h,v}之间由连接,{h,v}内部无连接

 出现这个模型就可以对上面的概率密度函数做简化了。

对于给定的状态向量h和v,则RBM当前的能量函数可以表示为:

 

 将能量函数带入到概率密度函数当中得到最终的结果是:

 RBM的最终形式:

 玻尔兹曼机的特点:无向的引入了隐变量,沿虚线切开,阴影部分是观测变量,其余的是隐变量。下面的这个模型就是玻尔兹曼机的特点。就是在无向图的基础上引入了隐变量,并且另一个特点是他的概率密度函数是指数族分布(或者是玻尔兹曼分布)。并且他的随机变量可以分成两类,一类是观测变量,另一类是隐变量。

 但是玻尔兹曼机还是存在局限性的,就对这个模型做了简化形成了受限玻尔兹曼机。满足的条件是:首先是个BM,另一个是条件独立性

概率图模型的特点:

受限玻尔兹曼机的模型推断

 之前学习得到的上面的结论。

这节课将的目的是:

 求边缘概率:P(v)

玻尔兹曼机是一大类的神经网络模型,但是在实际应用当中,RBM本身模型很简单,是一个两层的神经网络,在严格意义上不属于深度学习的范畴,不过DBM可以看作是RBM的推广。

RBM和DNN的区别是:RBM不区分前向和反向,可见层的状态可以作用与隐藏层,而隐藏层的状态也可以作用在可见层,隐藏层的是向量b,而可见层的偏倚系数是向量a。

常见的RBM 一般是二值的,就是不管是隐藏层还是可见层,他们的神经元的取值是0或1。

 DBN的训练过程:

第一步:分别单独无监督的训练每一层RBM网络,确保特征向映射到不同特征空间时,都尽可能多的保留特征信息。(预训练)

第二步:在DBN的最后一层设置BP网络,接受RBM的输出特征向量作为他的输入,有监督地训练实体关系分类器,并且每一层的RBM网络只能确保自身层的权值对该层特征向量映射达到最优,不是对整个DBN的特征向量映射达到最优,所以反向传播网络还将错误信息自上向下传播至每一层DBM,微调整个DBN网络,RBM网络训练模型的过程可以看作对一个深层 BP 网络权值参数的初始化,使DBN 克服了 BP 网络因随机初始化权值参数而容易陷入局部最优和训练时间长的缺点。(微调)

上面的步骤二:这可以很直观的解释,DBNs的BP算法只需要对权值参数空间进行一个局部的搜索,这相比前向神经网络来说,训练是要快的,而且收敛的时间也少

下面的这个图是DBN的训练过程:

 DBN的构成是多个RBM堆叠起来,前一个RBM的隐藏层作为下一个RBM的可视层,每次训练时,将下层的RBM训练好后再训练上层的RBM,每次训练一层,直至最后。

DBN的训练过程是使用非监督贪婪逐层方法去预训练获得权值。训练DBN的过程是一层一层进行

的。

DBN算法是机器学习之神经网络的一种,即可以用于非监督学习,也可用于无监督学习,DBN是一个概率生成模型,与传统的判别模型相对,生成模型是建立一个观察数据和标签之间的联合分布。通过训练神经元之间的权重,可以让整个神经网络按照最大概率来生成训练数据

 DBN的用途:解决深层神经网络的训练问题。解决了深层次神经网络的优化问题,通过逐层训练为整个网络赋予较好的初始权值,使得神经网络只要通过微调就能达到最优解。

DBN是一种生成模型,通过训练神经元之间的权重,让整个神经网络按照最大概率来生成训练数据,不仅可以使用DBN来识别特征,分类数据,还可以用它来生成数据。

和传统的神经网络相比较,具有以下的问题:

1、传统的神经网络一般都是单隐层,最多两个隐层,因为一旦神经元个数太多、隐层太多,模型的参数数量迅速增长,模型训练的时间非常之久;
2、传统的神经网络,随着层数的增加,采用随机梯度下降的话一般很难找到最优解,容易陷入局部最优解。在反向传播过程中也容易出现梯度弥散或梯度饱和的情况,导致模型结果不理想;
3、随着神经网络层数的增加,深度神经网络的模型参数很多,就要求在训练时需要有很大的标签数据,因为训练数据少的时候很难找到最优解,也就是说深度神经网络不具备解决小样本问题的能力。 

RBM的训练

实际上就是求出一个最能产生训练样本的概率分布,也就是说,要求一个分布,在这个分布里,训练样本的概率最大,由于这个分布的决定因素在于权值,所以训练RBM的目的就是寻找最佳的权值

以下是使用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、付费专栏及课程。

余额充值