前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >神经网络体系搭建(二)——深度学习网络

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

作者头像
刘开心_1266679
发布2018-04-17 14:58:25
7860
发布2018-04-17 14:58:25
举报

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

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

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

多层感知器(MLP,Multilayer Perceptron)

Deep and Wide
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来确定学习率、迭代次数等超参数。如果在测试集上做这些,会是网络“记住”测试集,一点点过拟合测试集,因此有了验证集。

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

  • 观察“验证集(注意不是训练集也不是测试集而是验证集)”大的performance,在它停止提高时停止训练。
  • L2正则化:对网络应用人为约束,隐式地减少自有参数的数量,同时不会使其更难优化。 具体做法是将权重的L2范数添加到损失函数乘以一个较小的常数,好处就是不用动网络结构,但是多了一个要调节的超参数。L2范数代表想两种各元素的平方和。
  • dropout:修改网络本身结构,在训练时,随机“删除”一半的隐层单元。
Dropout,图片来源于优达学城课程截图
Dropout,图片来源于优达学城课程截图

问题回答

至此,深度学习网络的骨架搭建完毕。 - 多层感知器是什么? 包含众多中间层的神经网络。 - 深度学习是什么? 通过加深网络层数使网络表现更好。 - 深度学习和神经网络有什么区别? 就是层数深了。 - 深度学习网络模型有哪些参数可以调整(优化)? 选择合适的迭代次数、找合适的学习率、用L2正则化中较小的常数、合适的隐藏层数、合适的分类器数、找合适的初始权重矩阵、找合适的激活函数、找合适的损失函数。


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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年01月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多层感知器(MLP,Multilayer Perceptron)
  • 反向传播
    • 数学原理
      • 代码实现
      • 深度学习网络
        • 过拟合的防止
        • 问题回答
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档