深度神经网络需要调试的超参数(Hyperparameters)较多,包括:

  • α\alphaα:学习因子
  • β\betaβ:动量梯度下降因子
  • β1,β2,ϵ\beta_{1},\beta_{2},\epsilonβ1​,β2​,ϵ:Adam算法参数
  • layers:神经网络层数
  • hidden units:隐藏层神经元个数
  • learning rate decay:学习因子下降参数
  • mini-batch-size:批量训练样本包含的样本个数

上面的超参数:

  • β\betaβ:动量梯度下降因子
  • β1,β2,ϵ\beta_{1},\beta_{2},\epsilonβ1​,β2​,ϵ:Adam算法参数

分别对应两种不同的优化算法:动量梯度下降算法与Adam算法
动量梯度下降算法的核心思想是在每次训练时,对梯度进行指数加权平均处理,然后用得到的梯度值更新权重WWW和常数项bbb。对梯度进行指数加权平均,这样使得当前梯度不仅与当前方向有关,还与之前方向有关,这样处理让梯度前进方向更加平滑,保证了梯度下降的平稳性与准确性,减少振荡,能够更快达到最小值处。动量梯度下降算法过程如下:

初始时,令VdW,VdbV_{dW},V_{db}VdW​,Vdb​等于0,一般设置为β=0\beta=0β=0,即指数加权平均前10天的数据。
在理解Adam算法之前,我们还需先了解RMSprop优化算法。
RMSprop优化算法的核心思想是如果哪个方向振荡大,就减小该方向的更新速度,从而减小振荡。
RMSprop优化算法过程如下:

下面介绍Adam算法
Adam算法结合了动量梯度下降算法和RMSprop算法。Adam方法将惯性保持和环境感知这两个优点集于一身。一方面,Adam记录梯度的一阶矩( first moment ) ,即过往梯度与当前梯度的平均,这体现了惯性保持;另一方面,Adam还记录梯度的二阶矩( second moment),即过往梯度平方与当前梯度平方的平均,这类似RMSprop方法,体现了环境感知能力,为不同参数产生自适应的学习速率。一阶矩和二阶矩采用类似于滑动窗口内求平均的思想进行融合,即当前梯度和近一段时间内梯度的平均值,时间久远的梯度对当前平均值的贡献呈指数衰减。Adam优化算法过程如下:

Adam算法的三个参数β1,β2,ϵ\beta_{1},\beta_{2},\epsilonβ1​,β2​,ϵ一般常设置为0.9,0.999和10−810^{-8}10−8,一般只需要对β1和β2\beta_{1}和\beta_{2}β1​和β2​进行调试。

关于mini-batch size的设置
推荐常用的mini-batch size为64,128,256,512,这些都是2的幂,之所以这样设置的原因是计算机存储数据一般是2的幂,这样设置可以提高运算速度。

1.如何选择与调试超参数?

  超参数之间也有重要性差异。通常来说,学习因子α\alphaα是最重要的超参数,也是需要重点调试的超参数。动量梯度下降因子β\betaβ、各隐藏层神经元个数hidden units 和 mini-batch size的重要性仅次于α\alphaα。然后就是神经网络层数layers 和学习因子下降参数 learning rate decay。最后,Adam算法的三个参数β1,β2,ϵ\beta_{1},\beta_{2},\epsilonβ1​,β2​,ϵ一般常设置为0.9,0.999和10−810^{-8}10−8,不需要反复调试。当然,这里超参数重要性的排名并不是绝对的,具体情况,具体分析。
  传统的机器学习中,我们对每个参数等距离选取任意个数的点,然后,分别使用不同点对应的参数组合进行训练,最后根据验证集上的表现好坏,来选定最佳的参数。例如有两个待调试的参数,分别在每个参数上选取5个点,这样构成了5x5=25中参数组合,如下图所示:

这种做法在参数比较少的时候效果较好。但是在深度神经网络模型中,我们一般不采用这种均匀间隔取点的方法,比较好的做法是使用随机选择。也就是说,对于上面这个例子,我们随机选择25个点,作为待调试的超参数,如下图所示:

  随机化选择参数的目的是为了尽可能地得到更多种参数组合。还是上面的例子,如果使用均匀采样的话,每个参数只有5种情况;而使用随机采样的话,每个参数有25种可能的情况,因此更有可能得到最佳的参数组合。
  这种做法带来的另外一个好处就是对重要性不同的参数之间的选择效果更好。假设 hyperparameter1为α\alphaα,hyperparameter2为ϵ\epsilonϵ,显然二者的重要性是不一样的。如果使用第一种均匀采样的方法,ϵ\epsilonϵ的影响很小,相当于只选择了5个α\alphaα值。而如果使用第二种随机采样的方法,α\alphaα和ϵ\epsilonϵ都有可能选择25种不同值。这大大增加了α\alphaα调试的个数,更有可能选择到最优值。其实,在实际应用中完全不知道哪个参数更加重要的情况下,随机采样的方式能有效解决这一问题,但是均匀采样做不到这点。
  在经过随机采样之后,我们可能得到某些区域模型的表现较好。然而,为了得到更精确的最佳参数,我们应该继续对选定的区域进行由粗到细的采样。也就是放大表现较好的区域,再对此区域做更密集的随机采样。例如,对下图中右下角的方形区域再做25点的随机采样,以获得最佳参数。

  上面我们讲的是随机选择在重要性不同的参数组合或者是参数重要性未知情况下进行超参数调试,可以得到更多的超参数组合。
  不过,对于某些超参数是可以进行尺度均匀采样的,但是某些超参数需要选择不同的合适尺度进行随机采样。
  例如:对于超参数layers 和hidden units,都是正整数,是可以进行均匀随机采样的,即超参数每次变化的尺度都是一致的(如每次变化为1,犹如一个刻度尺一样,刻度是均匀的)。但是,对于某些超参数,可能需要非均匀随机采样(即非均匀刻度尺)。例如超参数α\alphaα,待调范围是[0.0001,1]。如果使用均匀随机采样,那么有90%的采样点分布在[0.1,1]之间,只有10%分布在[0.0001.0.1]之间。这在实际应用中是不太好的,因为最佳的α\alphaα值可能主要分布在[0.0001,0.1]之间,而[0.1,1]范围内α\alphaα值效果并不好。因此我们更关注的是区间[0.0001,0.1],应该在这个区间内细分更多刻度。
  通常的做法是将linear scale转换为 log scale,将非均匀尺度转化为均匀尺度,然后再在 log scale进行均匀采样。这样,[0.0001,0.001],[0.001,0.01],[0.01,0.1],[0.1,1]各个区间内随机采样的超参数个数基本一致,也就扩大了之前[0.0001,0.1]区间内采样值个数。

一般解法是,如果线性区间为[a,b],令m=log(a),n=log(b),则对应的 log 区间为[m,n]。对log 区间的[m,n]进行随机均匀采样,然后得到的采样值r,最后反推到线性区间,即10r。10r就是最终采样的超参数。相应的Python语句为:

import numpy as npm = np.log10(a)
n = np.log10(b)
r = np.random.rand()
r = m + (n - m) * r
r = np.power(10, r)

  除了α\alphaα之外,动量梯度因子β\betaβ也是一样,在超参数调试的时候也需要进行非均匀采样。一般β\betaβ的取值范围在[0.9,0.999]之间,那么1-β\betaβ的取值范围就在[0.001,0.1]之间。那么直接对1-β\betaβ在[0.001,0.1]区间内进行log 变换即可。
  这里解释下为什么β\betaβ也需要像α\alphaα那样做非均匀采样。假设β\betaβ从0.9000变化为0.9005,那么11−β\frac{1}{1-\beta}1−β1​基本没有变化。但假设β\betaβ从0.9990变化为0.9995,那么11−β\frac{1}{1-\beta}1−β1​前后差别1000。β越接近1,指数加权平均的个数越多,变化越大。所以对β接近1的区间,应该采集得更密集一些。
  我们需要选择最佳的训练集(Training sets)、验证集(Development sets)、测试集(Test sets)来进行超参数调试。我们很难第一次设置的时候就选择到这些最佳的参数,而是需要通过不断地迭代更新来获得。这个循环迭代的过程是这样的:我们先有个Idea,先选择初始的参数值,构建神经网络模型结构;然后通过代码Code的形式,实现这个神经网络;最后,通过实验Experiment 验证这些参数对应的神经网络的表现性能。根据验证结果,我们对参数进行适当的调整优化,再进行下一次的 Idea->Code->Experiment循环。通过很多次的循环,不断调整参数,选定最佳的参数值,从而让神经网络性能最优化。
  人们通常设置Train sets和 Test sets的数量比例为70%和 30%。如果有Dev sets,则设置比例为60%、20%、20%,分别对应Train/Dev/Test sets。这种比例分配在样本数量不是很大的情况下,例如100,1000,10000,是比较科学的。但是如果数据量很大的时候,例如100万,这种比例分配就不太合适了。科学的做法是要将Dev sets和 Test sets的比例设置得很低。因为 Dev sets 的目标是用来比较验证不同算法的优劣,从而选择更好的算法模型就行了。因此,通常不需要所有样本的20%这么多的数据来进行验证。对于100万的样本,往往只需要10000个样本来做验证就够了。Test scts也是一样,日标是测试已选算法的实际表现,无偏估计。对于100万的样本,往往也只需要10000个样本就够了。因此,对于大数据样本,Train/Dev/Test sets 的比例通常可以设置为98%/1%/1%,或者99%/0.5%/0.5%。样本数据量越大,相应的Dev/Test sets的比例可以设置的越低一些。

参考于:NG笔记


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


深度神经网络—超参数调试相关推荐

  1. 使用贝叶斯优化进行深度神经网络超参数优化

    在本文中,我们将深入研究超参数优化. 为了方便起见本文将使用 Tensorflow 中包含的 Fashion MNIST[1] 数据集.该数据集在训练集中包含 60,000 张灰度图像,在测试集中包含 ...

  2. 吴恩达《优化深度神经网络》精炼笔记(3)-- 超参数调试、Batch正则化和编程框架...

    AI有道 不可错过的AI技术公众号 关注 重要通知 本公众号原名"红色石头的机器学习之路"已经改名为"AI有道",请大家留意并继续关注本公众号!谢谢! 上节课我 ...

  3. 深度学习笔记第二门课 改善深层神经网络 第三周 超参数调试、Batch正则化和程序框架...

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  4. 02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)

    文章目录 作业1:初始化 1. 神经网络模型 2. 使用 0 初始化 3. 随机初始化 4. He 初始化 作业2:正则化 1. 无正则化模型 2. L2 正则化 3. DropOut 正则化 3.1 ...

  5. 02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面

    文章目录 1. 训练,验证,测试集 2. 偏差,方差 3. 机器学习基础 4. 正则化 5. 为什么正则化预防过拟合 6. dropout(随机失活)正则化 7. 理解 dropout 8. 其他正则 ...

  6. 吴恩达深度学习之二《改善深层神经网络:超参数调试、正则化以及优化》学习笔记

    一.深度学习的实用层面 1.1 训练/开发/测试集 机器学习时代,数据集很小,可能100.1000.10000条,这种级别.可以按 70%.30% 划分训练集和测试集,训练后直接用测试集评估.或者按 ...

  7. 2-3 Coursera吴恩达《改善深度神经网络》第三周课程笔记-超参数调试、Batch正则化和编程框架

    上节课2-2 Coursera吴恩达<改善深度神经网络>第二周课程笔记-优化算法我们主要介绍了深度神经网络的优化算法.包括对原始数据集进行分割,使用mini-batch 梯度下降(mini ...

  8. Coursera吴恩达《优化深度神经网络》课程笔记(3)-- 超参数调试、Batch正则化和编程框架

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了深度神经网络的优化算法.包括对原始数据集进行分割,使用mini-batch gradient descent.然后介绍了指数加 ...

  9. 深度学习(二)吴恩达给你的人工智能第一课: 02.改善深层神经网络:超参数调试、正则化以及优化

    目录 第一周 深度学习的实用层面 1.1 训练 / 开发 / 测试集 1.1.1. 训练集.验证集.测试集 ​         1.2 偏差 / 方差 1.3 机器学习基础 1.3.1.降低偏差/降低 ...

  10. 吴恩达深度学习笔记7-Course2-Week3【超参数调试、Batch 正则化和程序框架】

    超参数调试.Batch 正则化和程序框架 一.超参数调试(hyperparameter tuning) 推荐的超参数重要性排序: 1.学习率(learning rate): α 2.隐藏神经单元(hi ...

最新文章

  1. 最新全球自由职业技能单日排行
  2. chrome浏览器net::ERR_TOO_MANY_REDIRECTS
  3. python腾讯语音合成
  4. 手把手教你用Matplotlib进行数据可视化
  5. hive报错:Call from hostname/127.0.1.1 to localhost:9000 failed on connection exception.主节点9000端口拒绝访问.
  6. android udt协议,接口和软件包  |  Android 开源项目  |  Android Open Source Project
  7. NYOJ 305 表达式求值 (字符串处理)
  8. coin3D中导入机器人模型
  9. 09年最好看的电影大全_09年最经典的电影大全
  10. Android Studio Design界面不显示控件的解决方法
  11. 求无序数组的中位数(c语言版本)
  12. 机器学习数学基础十:相关分析
  13. 安卓谷歌地图 Google Maps不显示地图
  14. 快速复制移动文件_如何使用F2快速移动或复制Word中的内容
  15. java计算机毕业设计二手车商城源码+mysql数据库+系统+lw文档+部署
  16. windows server 2008R2怎么设置活动但空闲的远程桌面服务会话时间的限制
  17. 舞台机械-舞台灯光-上海腾享舞台灯光概述
  18. MOSS同步AD账户(三)
  19. 计算机对未来和生活,从计算机的进化引发对未来生活的展望
  20. [搜索引擎友好之路]搜索引擎优化常见问题与回答

热门文章

  1. CMS 系统之 iframe 结构
  2. VMware复制Centos6虚拟机要改的地方
  3. 用正则验证用户输入文本框的内容是否是中文汉字
  4. 【JOURNAL】Salles de SV Toulouse
  5. 关于Linux下使用Windows应用程序的尝试总结
  6. BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
  7. python 笔记数据类型
  8. jquery 之for 循环
  9. js实现的笛卡尔乘积-商品发布
  10. ZK框架笔记3、窗体组件