Machine Learning & Data Analysis822思享实验室大数据,机器学习,人工智能

神经网络体系搭建(二)——深度学习网络

2018-01-12  本文已影响195人  刘开心_8a6c

本篇是神经网络体系搭建的第二篇,解决体系搭建的深度学习网络相关问题,详见神经网络体系搭建(序)

深度学习是一个已经被说烂了的词,几乎说起人工智能,非专业人士也会说出深度学习这个词,甚至有时候觉得神经网络,low爆了,深度学习才流行。
我也一度以为深度学习是多么神奇的一个技术,其实说到底,还是神经网络,没啥高大上的,只不过深了很多层,注意,是“深”,而不是“宽”。但是呢,就是深了很多层,确实让它的表现好了很多,所以它才有了一个专有名字,叫做深度学习。

深入了解深度学习,先从多层感知器说起。

多层感知器(MLP,Multilayer Perceptron)

Deep and Wide

多层感知器的多层到底是指wide还是deep,看了一些例子,发现只要wide了,就可以叫一个多层感知器,那些中间层就被成为隐藏层。这里其实是有疑问的,因为除了这里,其他地方的“多层”指的都是Deep方向的层,我也表示很迷糊……

反向传播

神经网络体系搭建(一)中的权重求法,是单层神经网络或者单层网络的堆叠权重矩阵的求法,如果有多层,就需要用反向传播来求出每层的权重矩阵。

反向传播的到底是什么?是误差项,也就是神经网络体系搭建(一)中提到的error_term

要使用梯度下降法更新隐藏层的权重,你需要知道各隐藏层节点的误差对最终输出的影响。每层的输出是由两层间的权重决定的,两层之间产生的误差,按权重缩放后在网络中向前传播。既然我们知道输出误差,便可以用权重来反向传播到隐藏层。
——来自优达学城

我们的目的是更新每一层的权重矩阵,更新的重点是求delta_w,求delta_w的重点是找到误差项,我们可以正向传播找到输出节点的误差项,但是隐藏层的误差项各是什么我们不知道,但是把网络倒过来看,就可以把误差项传播回去,找到隐藏层的误差项,这就是反向传播。

数学原理

除去输入层和输出层,剩下几层就代表几层的网络。反向传播详细的计算过程见下图(可查看原图放大)。


反向传播计算过程

代码实现

下面实现有一个隐藏层的神经网路。

import numpy as np
# 设置超参数
n_hidden = 2  # number of hidden units
epochs = 900
learnrate = 0.005

# 设置数据数量及每条数据的特征数量
n_records, n_features = features.shape
last_loss = None

# 初始化权重
weights_input_hidden = np.random.normal(scale=1 / n_features ** .5,
                                        size=(n_features, n_hidden))
weights_hidden_output = np.random.normal(scale=1 / n_features ** .5,
                                         size=n_hidden)
# 迭代e次
for e in range(epochs):
     # 将各层的delta_w矩阵置零
    del_w_input_hidden = np.zeros(weights_input_hidden.shape)
    del_w_hidden_output = np.zeros(weights_hidden_output.shape)
    # 对每一条数据
    for x, y in zip(features.values, targets):
        ## 正向传播 ##
        # 计算隐藏层节点的输入
        hidden_input = np.dot(x, weights_input_hidden)
        # 计算隐藏层节点的输出
        hidden_output = sigmoid(hidden_input)
        # 计算输出
        output = sigmoid(np.dot(hidden_output, weights_hidden_output))

        ## 反向传播 ##
        # 计算误差
        error = y - output

        # 计算输出节点误差项
        output_error_term = error * output * (1 - output)

        # 计算隐藏节点误差项
        hidden_error_term = np.dot(output_error_term, weights_hidden_output)  * hidden_output * (1 - hidden_output)
        
        # 更新所有delta_w
        del_w_hidden_output +=  output_error_term * hidden_output 
        del_w_input_hidden += hidden_error_term * x[:, None]

    # 更新所有权重矩阵
    weights_input_hidden += learnrate * del_w_input_hidden / n_records
    weights_hidden_output += learnrate * del_w_hidden_output / n_records

深度学习网络

掌握了反向传播,就掌握了深度学习网路的基础,对整个网络的实现也就都明白了。剩下的其实就是根据具体要解决的问题设置网络,调整迭代次数,调整隐藏层数,调整分类器数等等。

过拟合的防止

通常将数据分为训练集、验证集和测试集,为什么会多出来一个“验证集”?就是为了防止过拟合。在训练时,我们通常用它的accuracy来确定学习率、迭代次数等超参数。如果在测试集上做这些,会是网络“记住”测试集,一点点过拟合测试集,因此有了验证集。

为了防止网络过拟合,通常有以下三个办法:

问题回答

至此,深度学习网络的骨架搭建完毕。


以上内容来自822实验室神经网络知识分享
我们的822,我们的青春
欢迎所有热爱知识热爱生活的朋友和822思享实验室一起成长,吃喝玩乐,享受知识。

上一篇下一篇

猜你喜欢

热点阅读