机器学习算法中怎样选取超參数:学习速率、正则项系数、minibatch size
本文是《Neural networks and deep learning》概览 中第三章的一部分,讲机器学习算法中,怎样选取初始的超參数的值。(本文会不断补充)
学习速率(learning rate,η)
运用梯度下降算法进行优化时。权重的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η。
以下讨论在训练时选取η的策略。
- 固定的学习速率。
假设学习速率太小,则会使收敛过慢。假设学习速率太大。则会导致代价函数振荡,例如以下图所看到的。就下图来说。一个比較好的策略是先将学习速率设置为0.25,然后在训练到第20个Epoch时。学习速率改为0.025。

关于为什么学习速率太大时会振荡,看看这张图就知道了。绿色的球和箭头代表当前所处的位置,以及梯度的方向。学习速率越大,那么往箭头方向前进得越多。假设太大则会导致直接跨过谷底到达还有一端,所谓“步子太大,迈过山谷”。

在实践中。怎么粗略地确定一个比較好的学习速率呢?好像也仅仅能通过尝试。你能够先把学习速率设置为0.01,然后观察training cost的走向。假设cost在减小。那你能够逐步地调大学习速率,试试0.1,1.0….假设cost在增大,那就得减小学习速率,试试0.001,0.0001….经过一番尝试之后,你能够大概确定学习速率的合适的值。
为什么是依据training cost来确定学习速率。而不是依据validation accuracy来确定呢?这里直接引用一段话,有兴趣能够看看:
This all seems quite straightforward. However, using the training cost to pick η appears to contradict what I said earlier in this section, namely, that we’d pick hyper-parameters by evaluating performance using our held-out validation data. In fact, we’ll use validation accuracy to pick the regularization hyper-parameter, the mini-batch size, and network parameters such as the number of layers and hidden neurons, and so on. Why do things differently for the learning rate? Frankly, this choice is my personal aesthetic preference, and is perhaps somewhat idiosyncratic. The reasoning is that the other hyper-parameters are intended to improve the final classification accuracy on the test set, and so it makes sense to select them on the basis of validation accuracy. However, the learning rate is only incidentally meant to impact the final classification accuracy. It’s primary purpose is really to control the step size in gradient descent, and monitoring the training cost is the best way to detect if the step size is too big. With that said, this is a personal aesthetic preference. Early on during learning the training cost usually only decreases if the validation accuracy improves, and so in practice it’s unlikely to make much difference which criterion you use.
Early Stopping
所谓early stopping。即在每个epoch结束时(一个epoch即对全部训练数据的一轮遍历)计算 validation data的accuracy。当accuracy不再提高时,就停止训练。这是非常自然的做法,由于accuracy不再提高了。训练下去也没用。另外。这样做还能防止overfitting。
那么。怎么样才算是validation accuracy不再提高呢?并非说validation accuracy一降下来。它就是“不再提高”,由于可能经过这个epoch后,accuracy减少了,可是随后的epoch又让accuracy升上去了,所以不能依据一两次的连续减少就推断“不再提高”。正确的做法是。在训练的过程中。记录最佳的validation accuracy,当连续10次epoch(或者很多其它次)没达到最佳accuracy时,你能够觉得“不再提高”,此时使用early stopping。
这个策略就叫“ no-improvement-in-n”,n即epoch的次数,能够依据实际情况取10、20、30….
可变的学习速率
在前面我们讲了怎么寻找比較好的learning rate,方法就是不断尝试。在一開始的时候,我们能够将其设大一点。这样就能够使weights快一点发生改变,从而让你看出cost曲线的走向(上升or下降)。进一步地你就能够决定增大还是减小learning rate。
可是问题是,找出这个合适的learning rate之后。我们前面的做法是在训练这个网络的整个过程都使用这个learning rate。这显然不是好的方法,在优化的过程中,learning rate应该是逐步减小的,越接近“山谷”的时候。迈的“步伐”应该越小。
在讲前面那张cost曲线图时,我们说能够先将learning rate设置为0.25,到了第20个epoch时候设置为0.025。这是人工的调节。并且是在画出那张cost曲线图之后做出的决策。能不能让程序在训练过程中自己主动地决定在哪个时候减小learning rate?
答案是肯定的,并且做法非常多。
一个简单有效的做法就是。当validation accuracy满足 no-improvement-in-n规则时,本来我们是要early stopping的,可是我们能够不stop,而是让learning rate减半。之后让程序继续跑。
下一次validation accuracy又满足no-improvement-in-n规则时,我们相同再将learning rate减半(此时变为原始learni rate的四分之中的一个)…继续这个过程,直到learning rate变为原来的1/1024再终止程序。(1/1024还是1/512还是其它能够依据实际确定)。【PS:也能够选择每一次将learning rate除以10,而不是除以2.】
A readable recent paper which demonstrates the benefits of variable learning rates in attacking MNIST.《Deep Big Simple Neural Nets Excel on HandwrittenDigit Recognition》
正则项系数(regularization parameter, λ)
正则项系数初始值应该设置为多少。好像也没有一个比較好的准则。
建议一開始将正则项系数λ设置为0。先确定一个比較好的learning rate。
然后固定该learning rate。给λ一个值(比方1.0),然后依据validation accuracy。将λ增大或者减小10倍(增减10倍是粗调节,当你确定了λ的合适的数量级后,比方λ = 0.01,再进一步地细调节,比方调节为0.02,0.03,0.009之类。)
在《Neural Networks:Tricks of the Trade》中的第三章『A Simple Trick for Estimating the Weight Decay Parameter』中,有关于怎样预计权重衰减项系数的讨论,有基础的读者能够看一下。
Mini-batch size
首先说一下採用mini-batch时的权重更新规则。
比方mini-batch size设为100。则权重更新的规则为:

也就是将100个样本的梯度求均值。替代online learning方法中单个样本的梯度值:

当採用mini-batch时,我们能够将一个batch里的全部样本放在一个矩阵里,利用线性代数库来加速梯度的计算。这是project实现中的一个优化方法。
那么,size要多大?一个大的batch,能够充分利用矩阵、线性代数库来进行计算的加速,batch越小,则加速效果可能越不明显。
当然batch也不是越大越好。太大了,权重的更新就会不那么频繁。导致优化过程太漫长。所以mini-batch size选多少,不是一成不变的,依据你的数据集规模、你的设备计算能力去选。
The way to go is therefore to use some acceptable (but not necessarily optimal) values for the other hyper-parameters, and then trial a number of different mini-batch sizes, scaling η as above. Plot the validation accuracy versus time (as in, real elapsed time, not epoch!), and choose whichever mini-batch size gives you the most rapid improvement in performance. With the mini-batch size chosen you can then proceed to optimize the other hyper-parameters.
很多其它资料
LeCun在1998年的论文《Efficient BackProp》
Bengio在2012年的论文《Practical recommendations for gradient-based training of deep architectures》,给出了一些建议。包含梯度下降、选取超參数的具体细节。
以上两篇论文都被收录在了2012年的书《Neural Networks: Tricks of the Trade》里面,这本书里还给出了非常多其它的tricks。
转载请注明出处:http://blog.csdn.net/u012162613/article/details/44265967
机器学习算法中怎样选取超參数:学习速率、正则项系数、minibatch size的更多相关文章
- 机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size
机器学习算法中如何选取超参数:学习速率.正则项系数.minibatch size 本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器 ...
- 机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)
摘要: 数据挖掘.机器学习和推荐系统中的评测指标—准确率(Precision).召回率(Recall).F值(F-Measure)简介. 引言: 在机器学习.数据挖掘.推荐系统完成建模之后,需要对模型 ...
- 机器学习算法中的网格搜索GridSearch实现(以k-近邻算法参数寻最优为例)
机器学习算法参数的网格搜索实现: //2019.08.031.scikitlearn库中调用网格搜索的方法为:Grid search,它的搜索方式比较统一简单,其对于算法批判的标准比较复杂,是一种复合 ...
- Direcshow中视频捕捉和參数设置报告
Direcshow中视频捕捉和參数设置报告 1. 关于视频捕捉(About Video Capture in Dshow) 1视频捕捉Graph的构建 一个能够捕捉音频或者视频的graph图 ...
- VS2010中使用命令行參数
在Linux下编程习惯了使用命令行參数,故使用VS2010时也尝试了一下. 新建项目,c++编敲代码例如以下: #include<iostream> #include<fstream ...
- struts2中action手动获取參数
struts2中action手动获取Session,jsp页面參数 1. ActionContext 在Struts2开发中,除了将请求參数自己主动设置到Action的字段中,我们往往也须要在Acti ...
- PHP中$_SERVER的具体參数与说明
PHP编程中常常须要用到一些server的一些资料.特把$_SERVER的具体參数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名称,与 document ...
- C#中Out和Ref參数修饰符
在编程过程中对于函数之间的參数的传递一般分为两种:传值和传地址. 以下为大家分析一下. 传值 比方你又一份文档,假设採用传值的话.相当于我复制了一份,因此我对我这份文档的改动都不会影响到你的那份.假设 ...
- C 中 main 函数的參数
看到不同的人写出的 C 或者 C++ 程序时,可能会出现不一样的 main 函数的定义,以下的几种定义方式都是对的: int main(void) int main(int argc) i ...
随机推荐
- IBM将收购Linux发行商红帽公司,继续发力云计算市场
10月29日凌晨消息,IBM和Red Hat当地时间星期日联合宣布,IBM将以340亿美元收购红帽公司(Red Hat).根据两家公司发表的一份联合声明,IBM将以每股190美元的价格,以现金方式收购 ...
- python垃圾回收算法
标准python垃圾回收器由两部分组成,即引用计数回收器和分代垃圾回收器(即python包中的gc module).其中,引用计数模块不能被禁用,而GC模块可以被禁用. 引用计数算法 python中每 ...
- crawlspider抽屉爬取实例+分布
创建项目 scrapy startproject choutiPro 创建爬虫文件 scrapy genspider -t crawl chouti www.xxx.com 进入pycharm 培训 ...
- JAVA多态学习1
多态–概念 所谓多态.就是指一个引用(类型)在不同情况下的多种状态. 也能够理解成:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 实现多态有两种方式:1.继承.2.接口 这一次我们先来演 ...
- HDU - 2254 奥运 (求等比数列和)
Description 北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up! 比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的 ...
- server环境信息【C#代码获取】
server环境信息[C#代码获取] public class ServicesMessage { [DllImport("kernel32", CharSet = CharSet ...
- 9.9递归和动态规划(六)——打印n对括号的所有有效组合(即左右括号正确配对)
/** * 功能:打印n对括号的所有有效组合(即左右括号正确配对). */ 两种方法: 方法一: /** * 思路:在括号的最前面或者原有的每对括号中面插入一对括号. 至于其它任何位置.比方字符串的 ...
- 我的vim配置记录
一 总体介绍 配置路径,/etc/vim/vimrc,这个是系统的vim配置,假设一台PC多个用户使用,每一个用户的习惯不同的话,能够使用不同的配置.在用户文件夹下新建一个.vimrc的文件就能够了. ...
- elasticsearch index 之 create index(-)
从本篇开始,就进入了Index的核心代码部分.这里首先分析一下索引的创建过程.elasticsearch中的索引是多个分片的集合,它只是逻辑上的索引,并不具备实际的索引功能,所有对数据的操作最终还是由 ...
- Kinect 开发 —— 进阶指引 (下)
运动识别 利用运动识别(motion detection)来进行近景识别是最有意思的一种方式.实现运动识别的基本原理是设置一个起始的基准RGB图像,然后将从摄像头获取的每一帧影像和这个基准图像进行比较 ...