我们到目前为止在神经网络中使用了好几个参数,hyper-parameters包括:
学习率(learning rate):神经网络的学习率 神经网络learning rate_参数选择
Regularization parameters:λ

之前只是设置了一些合适的值,如何来选择合适的hyper-parameters呢?

例如:
我们设置如下参数:
隐藏层:30个神经元,mini-batch size:10,训练30个epochs,神经网络的学习率 神经网络learning rate_深度学习_02,神经网络的学习率 神经网络learning rate_深度学习_03
代码如下:

mport  mnist_loader  #下载数据模块
import network2  #刚才实现好的network
import matplotlib.pyplot as plt

training_data,validation_data,test_data=mnist_loader.load_data_wrapper()

net=network2.Network([784,30,10],cost=network2.CrossEntropyCost)

net.SGD(training_data,30,10,10.0,lmbda=1000.0,evaluation_data=validation_data,monitor_evaluation_accuracy=True)

结果:

神经网络的学习率 神经网络learning rate_神经网络_04


结果差的可以,简直跟随机猜测一样

神经网络中可变化调整的因素很多:

神经网络结构:

层数,每层神经元个数多少

初始化w和b的方法

Cost函数

Regularization

输出层用Sigmoid输出还是Softmax?

是否使用Dropout?

训练集大小

mini-batch size

学习率(learning rate):神经网络的学习率 神经网络learning rate_参数选择

Regularization parameter:神经网络的学习率 神经网络learning rate_神经网络的学习率_06

总体策略

从简单的出发开始实验,如:MNIST数据集,开始不知如何设置,可以先简化使用0,1两类图,减少80%数据量,用两层神经网络[784,10](比[784,30,10]快)

更快的获取反馈:之前每个epoch来检测准确率,可以替换为每1000个图之后,或者减少validation set 的量,比如用100代替10000

重复实验:

只用1000个训练集,validation_data只取前100个

import  mnist_loader  #下载数据模块
import network2  #刚才实现好的network
import matplotlib.pyplot as plt

training_data,validation_data,test_data=mnist_loader.load_data_wrapper()

net=network2.Network([784,10])
net.SGD(training_data[:1000],30,10,10.0,lmbda=1000.0,evaluation_data=validation_data[:100],
        monitor_evaluation_accuracy=True)

结果:

神经网络的学习率 神经网络learning rate_神经网络的学习率_07


更快得到反馈,之前可能每轮要10秒,现在不到1秒:

神经网络的学习率 神经网络learning rate_神经网络的学习率_06之前设置为1000,因为减少了训练集的数量,神经网络的学习率 神经网络learning rate_神经网络的学习率_06为了保证weight decay一样,对应的减少神经网络的学习率 神经网络learning rate_深度学习_10

代码:

training_data,validation_data,test_data=mnist_loader.load_data_wrapper()

net=network2.Network([784,10])
net.SGD(training_data[:1000],30,10,10.0,lmbda=20.0,evaluation_data=validation_data[:100],
        monitor_evaluation_accuracy=True)

神经网络的学习率 神经网络learning rate_神经网络的学习率_11


效果要好一些,现在再来调整一下学习率

是否是学习率神经网络的学习率 神经网络learning rate_参数选择太低,应该更高?

增到到100试一下:

net=network2.Network([784,10])
net.SGD(training_data[:1000],30,10,100.0,lmbda=20.0,evaluation_data=validation_data[:100],
        monitor_evaluation_accuracy=True)

神经网络的学习率 神经网络learning rate_深度学习_13


结果变得更差了,可能是学习率神经网络的学习率 神经网络learning rate_参数选择太高了,现在再来降低一些,使神经网络的学习率 神经网络learning rate_参数选择_15试一下

net=network2.Network([784,10])
net.SGD(training_data[:1000],30,10,1.0,lmbda=20.0,evaluation_data=validation_data[:100],
        monitor_evaluation_accuracy=True)

神经网络的学习率 神经网络learning rate_神经网络的学习率_16


效果果然比之前要好很多

现在假设保持其他参数不变:30 epochs,mini-batch size:10,神经网络的学习率 神经网络learning rate_lua_17

实验学习率=0.025,0.25,2.5

随着学习率的不同,Cost的表现是这样的:

神经网络的学习率 神经网络learning rate_神经网络_18


很明显的可以看出,蓝线的表现是最棒的,曲线非常平滑,且浮动较小,一直在减小

如果学习率太大,可能造成越走越高,跳过局部最低点,太小的话,学习可能太慢

神经网络的学习率 神经网络learning rate_神经网络_19

对于学习率,可以从0.0001,0.01,0.1,1.0,10.0开始尝试,如果发现cost开始增大,停止,开始更小的微调
对于MNIST,先找到0.1,然后0.5,然后0.25
对于提前停止学习的条件设置,如果accuracy在一段时间内变化很小(不是一两次)
之前一直使用学习率是常数,可以开始设置大一点,后面逐渐减少:比如开始设定常数,直到验证集上准确率开始下降,减少学习率
对于Regularization parameter 神经网络的学习率 神经网络learning rate_神经网络的学习率_06:
先不设定Regularization,把学习率调整好,然后再开始实验神经网络的学习率 神经网络learning rate_神经网络的学习率_06,1.0,10.0,100…,找到合适的,再微调

对于mini-batch size:
太小:没有充分利用矩阵计算的library和硬件的整合的快速计算
太大:更新权重和偏向不够频繁

好在mini-batch size和其他参数变化相对独立,所以一旦选定,不用重新尝试

自动搜素:
网格状搜索各种参数组合(grid search)
比如53,55等多种组合,这种方法对于参数之间会相互影响的情况处理的比较好

如何选择hyper-parameters仍是一个正在研究的课题

随机梯度下降有没有其他变种,Hessian 优化,Momentum-based gradient descent

除了sigmoid,有没有其他人工神经网络的模型呢?

(1)tanh,tanh(w*x+b)

神经网络的学习率 神经网络learning rate_lua_22

tanh只是一个重新调节过度量后的sigmoid函数:

神经网络的学习率 神经网络learning rate_参数选择_23

在-1到1之间浮动,不像sigmoid在0,1之间,所以输入要转化到-1,1之间

rectified linear 神经元:

max(0,w*x+b)

神经网络的学习率 神经网络learning rate_神经网络的学习率_24


像sigmoid,tanh一样,也可以模拟任何函数

优势:增加权重不会引起饱和,但加权的输入如果是负数,gradient就为0

要靠实验比较 rectified linear 和sigmoid,tanh的好坏
目前神经网络还有很多方面理论基础需要研究,为什么学习能力强,现在的一些实验表明结果比较好,但发展底层理论还有很长的路要走。