神经网络体系搭建(二)——深度学习网络
本篇是神经网络体系搭建的第二篇,解决体系搭建的深度学习网络相关问题,详见神经网络体系搭建(序)
深度学习是一个已经被说烂了的词,几乎说起人工智能,非专业人士也会说出深度学习这个词,甚至有时候觉得神经网络,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来确定学习率、迭代次数等超参数。如果在测试集上做这些,会是网络“记住”测试集,一点点过拟合测试集,因此有了验证集。
为了防止网络过拟合,通常有以下三个办法:
- 观察“验证集(注意不是训练集也不是测试集而是验证集)”大的performance,在它停止提高时停止训练。
- L2正则化:对网络应用人为约束,隐式地减少自有参数的数量,同时不会使其更难优化。
具体做法是将权重的L2范数添加到损失函数,乘以一个较小的常数,好处就是不用动网络结构,但是多了一个要调节的超参数。L2范数代表想两种各元素的平方和。 -
dropout:修改网络本身结构,在训练时,随机“删除”一半的隐层单元。
Dropout,图片来源于优达学城课程截图
问题回答
至此,深度学习网络的骨架搭建完毕。
-
多层感知器是什么?
包含众多中间层的神经网络。 -
深度学习是什么?
通过加深网络层数使网络表现更好。 -
深度学习和神经网络有什么区别?
就是层数深了。 -
深度学习网络模型有哪些参数可以调整(优化)?
选择合适的迭代次数、找合适的学习率、用L2正则化中较小的常数、合适的隐藏层数、合适的分类器数、找合适的初始权重矩阵、找合适的激活函数、找合适的损失函数。
以上内容来自822实验室神经网络知识分享
我们的822,我们的青春
欢迎所有热爱知识热爱生活的朋友和822思享实验室一起成长,吃喝玩乐,享受知识。