我们到目前为止在神经网络中使用了好几个参数,hyper-parameters包括:
学习率(learning rate):
Regularization parameters:λ
之前只是设置了一些合适的值,如何来选择合适的hyper-parameters呢?
例如:
我们设置如下参数:
隐藏层:30个神经元,mini-batch size:10,训练30个epochs,,
代码如下:
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)
结果:
结果差的可以,简直跟随机猜测一样
神经网络中可变化调整的因素很多:
神经网络结构:
层数,每层神经元个数多少
初始化w和b的方法
Cost函数
Regularization
输出层用Sigmoid输出还是Softmax?
是否使用Dropout?
训练集大小
mini-batch size
学习率(learning rate):
Regularization parameter:
总体策略
从简单的出发开始实验,如: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)
结果:
更快得到反馈,之前可能每轮要10秒,现在不到1秒:
之前设置为1000,因为减少了训练集的数量,为了保证weight decay一样,对应的减少
代码:
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)
效果要好一些,现在再来调整一下学习率
是否是学习率太低,应该更高?
增到到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)
结果变得更差了,可能是学习率太高了,现在再来降低一些,使试一下
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)
效果果然比之前要好很多
现在假设保持其他参数不变:30 epochs,mini-batch size:10,
实验学习率=0.025,0.25,2.5
随着学习率的不同,Cost的表现是这样的:
很明显的可以看出,蓝线的表现是最棒的,曲线非常平滑,且浮动较小,一直在减小
如果学习率太大,可能造成越走越高,跳过局部最低点,太小的话,学习可能太慢
对于学习率,可以从0.0001,0.01,0.1,1.0,10.0开始尝试,如果发现cost开始增大,停止,开始更小的微调
对于MNIST,先找到0.1,然后0.5,然后0.25
对于提前停止学习的条件设置,如果accuracy在一段时间内变化很小(不是一两次)
之前一直使用学习率是常数,可以开始设置大一点,后面逐渐减少:比如开始设定常数,直到验证集上准确率开始下降,减少学习率
对于Regularization parameter :
先不设定Regularization,把学习率调整好,然后再开始实验,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)
tanh只是一个重新调节过度量后的sigmoid函数:
在-1到1之间浮动,不像sigmoid在0,1之间,所以输入要转化到-1,1之间
rectified linear 神经元:
max(0,w*x+b)
像sigmoid,tanh一样,也可以模拟任何函数
优势:增加权重不会引起饱和,但加权的输入如果是负数,gradient就为0
要靠实验比较 rectified linear 和sigmoid,tanh的好坏
目前神经网络还有很多方面理论基础需要研究,为什么学习能力强,现在的一些实验表明结果比较好,但发展底层理论还有很长的路要走。