您的位置:首页 > 其它

《Neural Network and Deep Learning》学习笔记-hyper-parameters

2016-06-07 15:34 417 查看
本系列笔记为《Neural Network and Deep Learning》学习笔记

本系列笔记汇总

各种待续中……

第一章

第二章

第三章 Improving the way neural networks learn

3.1 交叉熵代价函数

3.2 正则化方法

3.3 权值初始化

3.4 hyper-parameters选取

3.5 一些其他技术

第四章 可视化方式证明神经网络可以近似任意函数

第五章 Why are deep neural networks hard to train?

5.1 引言

5.2 什么是梯度消失问题

5.3 什么引起了梯度消失?深层网络中的梯度不稳定问题

5.4 更加复杂的深度网络中的不稳定梯度

5.5 深度学习中的其他障碍

第六章 深度学习

本文为《Neural Network and Deep Learning》第三章Improving the way neural networks learn:How to choose a neural network’s hyper-parameters(如何选择神经网络中的混合参数)部分的学习笔记;

注:不知道hyper-parameters的正确译法是什么,暂且按照字面意思,称其为混合参数

本笔记目录

1 引言

2Broad strategy

3Learning rate学习率
31 三个网络的小例子

32 震荡原因分析

33 选取一个单独的学习率的方法

34 学习率的一个小例子

35 Learning rate schedule

4epoch

5正则化参数lambda的选取

6mini-batch size的选取

7自动化技术自动化选择hyper-parameters

3.1 引言

在利用神经网络解决实际问题时,hyper-parameters的选择其实是一个比较困难的工作,并且,当hyper-parameters选择不恰当时,会对网络的性能造成非常大的影响。所有,有效的选择hyper-parameters是非常重要的!本节只是讲述hyper-parameters的一些基本问题,实际中要复杂许多。

hyper-parameters:学习率learning rate、正则化系数、mini-batch size、网路的层数、每一层的neurons个数等等

3.2.Broad strategy

一个宗旨:在初始阶段,不要试图直接找到一个复杂的网络去解决问题,最关键的是,保证能够从网络中得到快速的反馈(网络过于复杂,会导致实验进行的非常慢)

下面是书中给出的broad strategy的一个实际例子:

目的:手写字体分类问题

构建一个简单的神经网路,不加隐藏层,[784,10]

validation data只取100个(而不是原来的5000个)

学习率η=10.0\eta = 10.0、λ=1000.0\lambda=1000.0,发现validation data性能并不好,比随机猜测还要差

更改学习率η=1\eta = 1,发现性能还是不好,但比η=10.0\eta = 10.0好一些了,这个是个好的信号

更改λ=100.0\lambda=100.0,发现性能又很差,那么,继续减小λ=1\lambda=1,发现性能有所提高了

继续更改学习率λ\lambda

这样一点点进行hyper-parameters的更改

当得到较为恰当的hyper-parameters后,再去更改网络的结构,比如,添加隐藏层等

3.3.Learning rate学习率

3.3.1 三个网络的小例子

构造三个MNIST networks(对MNIST进行分类的神经网络),除了学习率之外,这三个神经网络的所有其它参数全部一致,它们的学习率分别为:η=0.025\eta = 0.025,η=0.25\eta = 0.25和η=2.5\eta = 2.5;下面分别绘制三个网络在训练过程中前30个epoches的代价函数值变化曲线,如下图所示:



从cost曲线中可以看到:

η=0.025\eta = 0.025所对应的cost曲线变化非常光滑

η=0.25\eta = 0.25所对应的cost曲线在初始阶段一直在下降,但大概经过20个epoches后,就基本接近饱和了,不再发生变化

η=2.5\eta = 2.5所对应的cost曲线从一开始就在发生着强烈的震荡

3.3.2 震荡原因分析

为什么η=2.5\eta = 2.5所对应的cost曲线会发生震荡呢?

实际上,利用SGD可以帮助我们走向代价函数的谷底,如下图所示:



当小球在向谷底走的过程中,如果步长过大,小球可能会越过谷底(overshooting problem),并在谷底周围来回震荡,这其实就是η=2.5\eta = 2.5所对应的cost曲线会发生震荡的原因。

η=0.25\eta = 0.25时,在初始的几步内(20epoches),小球逐渐走向谷底,但当小球接近谷底时,也会发生overshooting的问题

η=0.025\eta = 0.025不会发生overshooting的问题,因为它的步子足够小,但这也会引发另外一个问题:它会导致SGD非常慢

所以,一个比较有利的策略就是:在开始的前20个epoches内,让η=0.25\eta = 0.25,随后,让η=0.025\eta = 0.025,也就是说:开始阶段步子迈大一些,后面阶段步子迈小一些

3.3.3 选取一个单独的学习率的方法

首先,粗略寻找一个能够使cost值快速下降(而非上升或者震荡)的学习率η\eta,不需要很精确,找到大概的数量级即可,具体方法如下:

以η=0.01\eta=0.01开始,观察cost在前几个epoches的情况

如果cost一直在下降,那么,再令η=0.1\eta=0.1,再次观察cost在前几个epoches的情况,同理,如果cost一直在下降,那么,再令η=1\eta=1,……,依次方法,直到找到使cost在在前几个epoches发生震荡或者上升的那个η\eta取值(≥该值的η\eta都会使cost发生震荡或者上升)

如果cost发生了震荡或者上升,那么,令η=0.001\eta=0.001,再次观察cost在前几个epoches的情况, 同理,如果cost发生了震荡或者上升,那么,再令η=0.0001\eta=0.0001,……,依次方法,直到找到使cost在在前几个epoches不再发生上升或者震荡的那个η\eta取值(>该值的η\eta都会使cost发生震荡或者上升)

利用上述方法,可以大致找到η\eta所在的数量级,然后,可以继续利用上述方法对该值进行细化,从而找到不会使cost曲线发生震荡或者上升的最大的η\eta取值,实际使用时,只要学习率η\eta小于该阈值即可,实际中,也可以在刚刚开始时,使用这种方法选取的阈值η\eta,再训练多个epoches后,改变该学习率η\eta,使其变为原来的1/2

3.3.4 学习率的一个小例子

下面给出一个例子,假如,利用上述方法,找到了阈值η=0.1\eta=0.1(即η=1时cost曲线会发生震荡或者上升\eta=1时cost曲线会发生震荡或者上升);然后,再通过进一步细化,最终得到η=0.5\eta=0.5;实际使用时,可以在开始阶段令η=0.5\eta=0.5,训练多个epoches后,令η=0.25\eta=0.25,……

(1)其实,前文有提到,在选取hyper-parameters时,需要利用held-out validation data,但这里在选取learning rate时,并没有利用held-out validation data,这其实是作者的偏好,作者给出了他这样做的原因:

(2)调整其他的hyper-parameters的目的都是为了使网络能够在test data上具有比较高的精度,所以,需要利用validation data去选择;

(3)而调整学习率的目的是为了控制梯度下降法的步长,通过监控训练cost值,使学习率不至于太大;并且,在实际中,只要在前一些epoches期间training cost在下降,那么,validation data的性能总是会得到改善,所以,到底用什么学习率区别不大

3.3.5 Learning rate schedule

实际中到底应该如何选择学习率呢?

其实,随着训练的进行,更改学习率是一个比较好的办法(对比与使用单一的学习率);有许多方法可用,作者并没有介绍太多,因为实际中,不同人会有不同的策略;选择learning其实是一件比较让人头疼的事情!

作者只是给出了一个建议:

在开始阶段使用单一的学习率,当validation data开始恶化时,减小学习率(每次变为原来的1/2或者1/10)

另外:

实际中,先不要太纠结与学习率,可以先利用某一个单一的学习率,只要它能够使网络得到比较好的性能即可;随后,当网络结果全部确定,再慢慢修订learning rate

3.4.epoch

主要利用early stopping策略进行epoches的确定。

训练过程中,如果epoches取值过大,可能会导致overfitting;epoches过小,又会是网络不能得到很好的学习,所以,选择一个好的epoches非常重要!

作者只要介绍了no-improvement-in-n rule:当validation data的分类精度在n个epoches内都没有得到改善,那么,即停止训练。

开始实验时,可以利用no-improvement-in-10 rule

当对网络的性能掌握后,再逐步使用no-improvement-in-20 rule或者no-improvement-in-30 rule

3.5.正则化参数λ\lambda的选取

作者给出的选择正则化参数λ\lambda的方法:

(1)先令λ=0\lambda=0

(2)找到比较合适的学习率η\eta

(3)在确定学习率η\eta后,利用validattion data确定比较合适的λ\lambda

具体地:

① 令λ=1\lambda=1,考察网络在validation data上的performance

② 以10的倍数增大或者减小λ\lambda,考察网络在validation data上的performance

③ 按照这种方法,粗略地找到比较好的λ\lambda的大概取值

④ 再进一步对λ\lambda值进行细化

3.6.mini-batch size的选取

online leaning,在线学习,就是指mini-batch size =1

为了研究mini-batch size到底取多大合适,这里首先讨论mini-batch size=1的情况;

只利用一个训练样本进行学习会不会使模型的性能变得很差呢?其实,不会发生这样的情况,因为在实际训练中,并不要求每一次梯度下降都非常精确,只要大致方向没有问题就可以了,这样就可以保证模型的精度不会发生恶化(当然,也不会是最优的情况);

从这个角度较,似乎我们应该使用online learning,但实际上,online learning的计算量比较大,不能利用一些非常好的矩阵运算库去进行计算;

另外一个角度:不使用online learning,又不以较高的频率去更新权值

综上,可以得到一对儿矛盾的结论

- mini-batch size太小,不利于计算的优化,不能使用高效的矩阵运算

- mini-batch size太大,权值不能得到快速的更新(更新频率低)

那么,实际中如何选择mini-batch size呢?

好在mini-batch size并不依赖于其他的hyper-parameters,所以,可以在初步选定其他hyper-parameters后(不需要是最优的),再对mini-batch size进行选择,方法为:绘制在validation data上,网络的精度随着时间的变化情况(不是epeoch),选择能够使网络的performance得到最快改善的mini-batch size。

注:其实不是很理解这里的time时间指什么?难道是程序的运行时间?希望大家可以指点

3.7.自动化技术(自动化选择hyper-parameters)

其实,上文所述的hyper-parameters选择方法都是手动方法,实际中,有许多学者研究hyper-parameters的自动化选择方法,比如:网络方法和贝叶斯方法,但对这两种方法没有深入接触,所以也不太理解。

grid search:应该就是在一个给定的hyper-parameters空间内,计算所有可能的hyper-parameters的组合所对应的performance,找到最好那组,计算量应该很大;James Bergstra and Yoshua Bengio在他们2012年的一篇文章《Random search for hyper-parameter optimization》中有对grid search的优缺点进行总结

Bayesian方法:真心没看懂,见原文《Practical Bayesian optimization of machine learning algorithms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: