深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践

3.1 调试过程(tuning process)

在训练神经网络过程中,我们会有很多的超参数需要调试,比如学习率\alpha,momentum参数\beta,adam参数\beta _{1}\beta _{2}\varepsilon,神经网络层数(layers),每层神经网络隐藏的神经元(hidden units),如果使用learning rate decay,还会有其他参数,还有mini-batch的大小。

但这些参数重要性有区别,如下图所示:

深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践_第1张图片

红色圈起来的学习率是最重要的,其次是黄色,最后是紫色。吴老师在使用adam方法时直接使用作者论文提出的\beta _{1}\beta _{2}\varepsilon的默认值,并不进行改动。

在同时调试多个参数时,这里教给大家一个提高效率的小trick,如下图所示:

深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践_第2张图片

假设我们要同时调试两个参数,以前我们经常会用的作法是进行网格搜索(grid search),即参数一设定几个固定值,参数二设定几个固定值,然后代入模型训练以找到最优参数组合,但是这种做法在不知道参数重要性的情况下效率不高,举个极端的例子,假设参数一是学习率\alpha,神经网络训练过程中最重要的参数,而参数二是adam中的参数\varepsilon,无关紧要的一个参数,那么我们作25次训练之后,发现对于每一个\alpha,不同的\varepsilon得到的结果都是相同的,因为此时这个结果主要由\alpha决定,这样相当于做了25次训练但只测试了5组参数值。为了避免这种情况,在不知道参数重要性的情况下,我们可以在范围内生成参数的随机组合,这样我们就相当于有25组不同的参数组合。当然这只是二维的情况,三个参数就是在立方体内进行了。

接下来是从粗略到准确(coarse to fine)。

深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践_第3张图片

二维情况下,我们已经随机生成了一些参数的组合,使用训练集或测试集的结果去决定哪些参数组合的结果是最优的,比如图中蓝色圈出的三个点,然后再在这三个点附近缩小区域进行更密集的参数生成,去找到最终我们要的参数值。

3.2 使用适当的尺度选择参数

通过上一小节学习了调试过程,知道了用随机生成去代替网格搜索,但是该怎么随机生成呢?

对于一些参数,我们可以直接在确定的范围内均匀取值,如下图所示:

深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践_第4张图片

但均匀取值的方法并不适用于所有参数,比如学习率的参数范围我们设定为0.0001到1,如果在该区间均匀采样,那么有90%的采样都会在0.1到1之间,而只有10%的采样在0.0001到0.1之间,这样显得我们将学习率参数范围下限设为0.0001意义不大,因为只有10%的概率采样在0.0001到0.1之间,也可以认为说对于学习率,我们关注更多的是学习率的小数点设置,到底是0.0001好,还是0.001,0.01或者是0.1,那么我们就希望能够在这四个区间内等概率取值。即不再在线性尺度(linear scale)内均匀采样,而是在对数尺度内均匀采样。

具体操作是怎样的呢?如下图所示:

深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践_第5张图片

我们希望在0.0001-0.001,0.001-0.01,0.01-0.1,0.1-1这四个区间内等概率采样,而取对数可以达到这样的效果,取对数之后,五个值变为10^{-4}10^{-3}10^{-2}10^{-1}10^{0},即我们在[-4,0]之间均匀采样就可以了。具体操作如上图所示,先生成[0,1]之间随机数,乘上-4表示[-4,0]之间随机数\gamma,然后令\alpha =10^{\gamma },即得到\alpha在0.0001-1之间的对数轴均匀取值。

除了在对学习率需要对数轴均匀采样,指数加权平均的参数\beta也需要对数轴均匀采样,如下图所示:

深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践_第6张图片

我们先介绍具体操作步骤再介绍为什么要这样做。

假设我们的参数\beta调试范围是0.9-0.999,直接在线性轴上均匀采样\beta会有90%的概率落入0.9-0.99之间,仅有10%的概率落入0.99-0.999之间,同之前的\alpha一样,我们希望\beta有50%的概率取0.9-0.99,有50%的概率取0.99-0.999。该怎么实现呢?从\beta这边不太好入手,我们可以从1-\beta作改变,\beta调试范围是0.9-0.999,1-\beta则为0.1-0.001,方法与处理参数\alpha相同, 这里先生成[-3,-1]之间随机数\gamma,然后令\beta =1-10^{\gamma }

为什么要对参数\beta也作对数轴均匀采样呢?因为我们知道\beta=0.9对应近似平均前10天真实值,而\beta=0.95对应平均前20天真实值,翻了一倍,那当\beta越来越大的时候呢?同样是翻一倍,但是这一倍代表的数值已有很大不同。比如\beta=0.99对应平均前100天真实值,但\beta=0.995对应平均前200天真实值,即随着\beta数值增大,指数加权平均值对微小的改变敏感程度增加,所以我们不能仅仅在线性轴上均匀采样。

其实这一小节讲的对数轴均匀采样参数是为了提高效率,同时避免因搜索不均匀而遗漏参数最优值。如果你不作改变直接进行线性轴随机采样也是可以的,但一定要保证进行大量搜索,然后可以通过coarse to fine策略进一步找到更加准确的参数最优值。

3.3 调参实践

老师基于经验提出了两种调参实践,如下图所示:

深度学习笔记(2):3.1 参数调试过程 | 3.2 使用适当的尺度选择参数 | 3.3 调参实践_第7张图片

第一种形式老师形象地称其为panda,指因为单机配置不能平行运行多个模型而只能运行一个模型,并不断调整参数查看其学习曲线去判断模型效果,甚至去改变模型再重新来一遍,就像照顾稀少的熊猫宝宝那样认真对待。对于数据量较大和比较复杂的模型大家一般使用panda形式训练模型。第二种形式老师称之为caviar,因为机器设备可以同时运行多种参数组合下的模型,就像鱼子那么多,我们只需要在模型训练结束后选择效果最好的模型参数就可以了,如右图中黄色和蓝色重合标注的那条曲线。

最后别忘记,要经常性的看一下你的参数是否还适合你的模型。

 

版权声明:尊重博主原创文章,转载请注明出处https://blog.csdn.net/kkkkkiko/article/details/81454335

 

你可能感兴趣的:(深度学习)