深度学习进阶课程14---神经网络参数hyper-parameters选择

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

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

例如:
我们设置如下参数:
隐藏层:30个神经元,mini-batch size:10,训练30个epochs, η = 10.0 \eta=10.0 η=10.0, λ = 1000.0 \lambda=1000.0 λ=1000.0
代码如下:

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): η \eta η
Regularization parameter: λ \lambda λ
总体策略
从简单的出发开始实验,如: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秒:
λ \lambda λ之前设置为1000,因为减少了训练集的数量, λ \lambda λ为了保证weight decay一样,对应的减少 λ = 20.0 \lambda=20.0 λ=20.0
代码:

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)

在这里插入图片描述
效果要好一些,现在再来调整一下学习率
是否是学习率 η \eta η太低,应该更高?
增到到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)

在这里插入图片描述
结果变得更差了,可能是学习率 η \eta η太高了,现在再来降低一些,使 η = 1.0 \eta=1.0 η=1.0试一下

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, η = 5.0 \eta=5.0 η=5.0
实验学习率=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 λ \lambda λ:
先不设定Regularization,把学习率调整好,然后再开始实验 λ \lambda λ,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的好坏
目前神经网络还有很多方面理论基础需要研究,为什么学习能力强,现在的一些实验表明结果比较好,但发展底层理论还有很长的路要走。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值