机器学习算法中怎样选取超參数:学习速率、正则项系数、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 ...
随机推荐
- 参考《Python数据处理》中英文PDF+源代码
在实际操作中掌握数据处理方法,比较实用.采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.E ...
- 紫书 习题 10-16 UVa 1647 (高精度+递推)
这道题我已经推出00和1过两步变成00了,可我没有继续做下去-- 后来看了博客发现自己已经做了90%了-- 可惜了,以后不要轻易放弃. 1的个数有个规律,就是每次都乘以2,因为0和1下一步都会变出1 ...
- Swift学习笔记(8)--函数
1.定义及调用 func sayHelloAgain(personName: String) -> String { return "Hello again, " + per ...
- nio实现文件读取写入数据库或文件
1.nio实现读取大文件,之后分批读取写入数据库 2.nio实现读取大文件,之后分批写入指定文件 package com.ally; import java.io.File; import java. ...
- Cocos2d-x手机游戏开发与项目实践具体解释_随书代码
Cocos2d-x手机游戏开发与项目实战具体解释_随书代码 作者:沈大海 因为原作者共享的资源为UTF-8字符编码.下载后解压在win下显示乱码或还出现文件不全问题,现完整整理,解决全部乱码问题,供 ...
- Cocos2d-x开发的Android应用怎么加入插屏广告
Cocos2d-x系统开发游戏已经变得比較流行,但是用这个开发的游戏.想要加入广告就不是那么理想了.尤其是插屏广告.由于插屏广告通常是要在暂停或者结束游戏的时候展示才比較的合理.但是Cocos2d-x ...
- BZOJ 3210 花神的浇花集会 计算几何- -?
题目大意:给定平面上的n个点,求一个点到这n个点的切比雪夫距离之和最小 与3170不同的是这次选择的点无需是n个点中的一个 首先将每一个点(x,y)变为(x+y,x-y) 这样新点之间的曼哈顿距离的一 ...
- Objective-C_类的扩展
一Category的定义和使用 二Extension的定义和使用 三Protocol的定义和使用 delegate的使用 一.Category的定义和使用 Category,分类或类目.主要作用是为没 ...
- #学习笔记#——JavaScript 数组部分编程(一)
来自牛客网的js编程题 1.移除数组 arr 中的所有值与 item 相等的元素.不要直接修改数组 arr,结果返回新的数组 function remove(arr, item) { if(!Arra ...
- node内容
什么是node? node是一门技术,并不是一门新的语言.是JavaScript运行环境. node在解析JavaScript,依靠的是什么? 依靠的是谷歌浏览器中的v8引擎,所以不需要考虑兼容性,n ...