机器学习入门:第十九章 深度信念网络

深度信念网络 (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类似于以往的神经网络,但是它理论基础并不一样,从而开创了一个网络学习的新方向。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值