第十八章 深度信念网络

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

PS: 如本文对您有帮助,不妨通过一下方式支持一下博主噢 ^_^

官方
微信
官方微信
Q Q
咨询
意见
反馈
返回
顶部