深度神经网络—超参数调试

  深度神经网络需要调试的超参数(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算法
动量梯度下降算法的核心思想是在每次训练时,对梯度进行指数加权平均处理,然后用得到的梯度值更新权重 W W W和常数项 b b b。对梯度进行指数加权平均,这样使得当前梯度不仅与当前方向有关,还与之前方向有关,这样处理让梯度前进方向更加平滑,保证了梯度下降的平稳性与准确性,减少振荡,能够更快达到最小值处。动量梯度下降算法过程如下:
深度神经网络—超参数调试_第1张图片
初始时,令 V d W , V d b V_{dW},V_{db} VdWVdb等于0,一般设置为 β = 0 \beta=0 β=0,即指数加权平均前10天的数据。
在理解Adam算法之前,我们还需先了解RMSprop优化算法。
RMSprop优化算法的核心思想是如果哪个方向振荡大,就减小该方向的更新速度,从而减小振荡。
RMSprop优化算法过程如下:
深度神经网络—超参数调试_第2张图片
下面介绍Adam算法
Adam算法结合了动量梯度下降算法和RMSprop算法。Adam方法将惯性保持和环境感知这两个优点集于一身。一方面,Adam记录梯度的一阶矩( first moment ) ,即过往梯度与当前梯度的平均,这体现了惯性保持;另一方面,Adam还记录梯度的二阶矩( second moment),即过往梯度平方与当前梯度平方的平均,这类似RMSprop方法,体现了环境感知能力,为不同参数产生自适应的学习速率。一阶矩和二阶矩采用类似于滑动窗口内求平均的思想进行融合,即当前梯度和近一段时间内梯度的平均值,时间久远的梯度对当前平均值的贡献呈指数衰减。Adam优化算法过程如下:
深度神经网络—超参数调试_第3张图片
Adam算法的三个参数 β 1 , β 2 , ϵ \beta_{1},\beta_{2},\epsilon β1,β2,ϵ一般常设置为0.9,0.999和 1 0 − 8 10^{-8} 108,一般只需要对 β 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和 1 0 − 8 10^{-8} 108,不需要反复调试。当然,这里超参数重要性的排名并不是绝对的,具体情况,具体分析。
  传统的机器学习中,我们对每个参数等距离选取任意个数的点,然后,分别使用不同点对应的参数组合进行训练,最后根据验证集上的表现好坏,来选定最佳的参数。例如有两个待调试的参数,分别在每个参数上选取5个点,这样构成了5x5=25中参数组合,如下图所示:
深度神经网络—超参数调试_第4张图片
这种做法在参数比较少的时候效果较好。但是在深度神经网络模型中,我们一般不采用这种均匀间隔取点的方法,比较好的做法是使用随机选择。也就是说,对于上面这个例子,我们随机选择25个点,作为待调试的超参数,如下图所示:
深度神经网络—超参数调试_第5张图片
  随机化选择参数的目的是为了尽可能地得到更多种参数组合。还是上面的例子,如果使用均匀采样的话,每个参数只有5种情况;而使用随机采样的话,每个参数有25种可能的情况,因此更有可能得到最佳的参数组合。
  这种做法带来的另外一个好处就是对重要性不同的参数之间的选择效果更好。假设 hyperparameter1为 α \alpha α,hyperparameter2为 ϵ \epsilon ϵ,显然二者的重要性是不一样的。如果使用第一种均匀采样的方法, ϵ \epsilon ϵ的影响很小,相当于只选择了5个 α \alpha α值。而如果使用第二种随机采样的方法, α \alpha α ϵ \epsilon ϵ都有可能选择25种不同值。这大大增加了 α \alpha α调试的个数,更有可能选择到最优值。其实,在实际应用中完全不知道哪个参数更加重要的情况下,随机采样的方式能有效解决这一问题,但是均匀采样做不到这点。
  在经过随机采样之后,我们可能得到某些区域模型的表现较好。然而,为了得到更精确的最佳参数,我们应该继续对选定的区域进行由粗到细的采样。也就是放大表现较好的区域,再对此区域做更密集的随机采样。例如,对下图中右下角的方形区域再做25点的随机采样,以获得最佳参数。
深度神经网络—超参数调试_第6张图片

  上面我们讲的是随机选择在重要性不同的参数组合或者是参数重要性未知情况下进行超参数调试,可以得到更多的超参数组合。
  不过,对于某些超参数是可以进行尺度均匀采样的,但是某些超参数需要选择不同的合适尺度进行随机采样。
  例如:对于超参数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]区间内采样值个数。
深度神经网络—超参数调试_第7张图片
一般解法是,如果线性区间为[a,b],令m=log(a),n=log(b),则对应的 log 区间为[m,n]。对log 区间的[m,n]进行随机均匀采样,然后得到的采样值r,最后反推到线性区间,即10r。10r就是最终采样的超参数。相应的Python语句为:

import numpy as np

m = 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,那么 1 1 − β \frac{1}{1-\beta} 1β1基本没有变化。但假设 β \beta β从0.9990变化为0.9995,那么 1 1 − β \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笔记


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!
在这里插入图片描述


你可能感兴趣的:(深度神经网络,新星计划,超参数调试,深度神经网络)