深度信念网络 (Deep Belief Network, DBN)
深度信念网络 (Deep Belief Network, DBN) 由 Geoffrey Hinton 在 2006 年提出。它是一种生成模型,通过训练其神经元间的权重,我们可以让整个神经网络按照最大概率来生成训练数据。我们不仅可以使用 DBN 识别特征、分类数据,还可以用它来生成数据。
深度信念网络已经推出来后,由于他的有效性,备受无数人的追捧,也引领者机器学习的方向。
DBN是由两部分组成,一部分是底层网络,一部分是顶层网络。底层网络的可以使用RBM(受限玻尔兹曼机)组成,顶层通常来说是一个逻辑层,训练的时候先对底层网络进行训练,在训练顶层网络。
底层结构如下:
可以自定义层数的个数,第一层的h作为第二层的v,如此的层叠下去。
顶层是一个逻辑层,底层最后一层的h作为逻辑层的输入,进行训练。
构建DBN结构:
# construct multi-layer
for i in range(self.n_layers):
# layer_size
if i == 0:
input_size = n_ins
else:
input_size = hidden_layer_sizes[i - 1]
# layer_input
if i == 0:
layer_input = self.x
else:
layer_input = self.sigmoid_layers[-1].sample_h_given_v()
# construct sigmoid_layer
sigmoid_layer = HiddenLayer(input=layer_input,
n_in=input_size,
n_out=hidden_layer_sizes[i],
numpy_rng=numpy_rng,
activation=sigmoid)
self.sigmoid_layers.append(sigmoid_layer)
# construct rbm_layer
rbm_layer = RBM(input=layer_input,
n_visible=input_size,
n_hidden=hidden_layer_sizes[i],
W=sigmoid_layer.W, # W, b are shared
hbias=sigmoid_layer.b)
self.rbm_layers.append(rbm_layer)
# layer for output using Logistic Regression
self.log_layer = LogisticRegression(input=self.sigmoid_layers[-1].sample_h_given_v(),
label=self.y,
n_in=hidden_layer_sizes[-1],
n_out=n_outs)
训练底层,注意底层之间输入和输出的关系:
def pretrain(self, lr=0.1, k=1, epochs=100):
# pre-train layer-wise
for i in range(self.n_layers):
if i == 0:
layer_input = self.x
else:
layer_input = self.sigmoid_layers[i-1].sample_h_given_v(layer_input)
rbm = self.rbm_layers[i]
for epoch in range(epochs):
rbm.contrastive_divergence(lr=lr, k=k, input=layer_input)
# cost = rbm.get_reconstruction_cross_entropy()
# print >> sys.stderr, \
# 'Pre-training layer %d, epoch %d, cost ' %(i, epoch), cost
最后训练逻辑层:
def finetune(self, lr=0.1, epochs=100):
layer_input = self.sigmoid_layers[-1].sample_h_given_v()
# train log_layer
epoch = 0
done_looping = False
while (epoch < epochs) and (not done_looping):
self.log_layer.train(lr=lr, input=layer_input)
# self.finetune_cost = self.log_layer.negative_log_likelihood()
# print >> sys.stderr, 'Training epoch %d, cost is ' % epoch, self.finetune_cost
lr *= 0.95
epoch += 1
因为多了一层逻辑层,使得DBN的使用方式和softmax的用法一样,预测输出结果:
def predict(self, x):
layer_input = x
for i in range(self.n_layers):
sigmoid_layer = self.sigmoid_layers[i]
layer_input = sigmoid_layer.output(input=layer_input)
out = self.log_layer.predict(layer_input)
return out
DBN是机器学习一个重要的方向,也是为何机器学习这么火热的一个原因,在这个过程涉及到的较多的知识点,但在推导的过程中,并没有给出具体的过程,如果需要知道推导过程的话可以参看具体的文献,这里如果推导过程讲多了,并不能把应用的过程讲清楚,可以看出虽然DBN类似于以往的神经网络,但是它理论基础并不一样,从而开创了一个网络学习的新方向。