1.超参数调试顺序
在训练深度网络最难的事情之一是超参数的选择,如何选择合适的超参数取值?下面我将谈谈,如下是我所理解的超参数调试顺序:
重要性排序 | 超参数 |
Top1梯队 | 学习率a |
Top2梯队 | min-batch大小,隐层神经元个数,动量梯度下降法参数b |
Top3梯队 | 隐层层数,学习衰减率,Adam优化的参数b1、b2、ℇ |
实际上,Adam优化的参数b1、b2、ℇ通常不进行调试,选择默认值就能有很好的效果,即b1=0.9、b2=0.999、ℇ=10^(-8)。
2.核心思想
如何选择合适超参数值?与其说是选择,不如说是实验。核心思想是:由粗到细,随机取值+精准搜索。
以模型只含有两个参数为例:
随机取值就是在上图这样的平面中,随机选择一定数量的点,这些点的值作为超参数的值进行训练,选择其中表现较好的几个参数值。
为什么要随机,而不是均匀的取值?因为对于超参数,我们并不知道超参数之间相对的重要程度,比如学习率a和Adam算法的ℇ,经过试验发现ℇ的值实际对模型影响不大,也就是说均匀的选择了部分点,我们发现模型的效果差别都不大,这就影响到我们对其他参数选择的判断,从而错过最优的参数值选择。
随机取值选择出来比较好的参数值后,我们需要进行精确搜索。假如我们发现右下角的点效果都比较好,那么我们需要对右下角进行方法,重新随机取值,进行更加精确的搜索。
注意:上述我举的例子是两个参数的例子,实际上神经网络的参数有很多,那么随机取值的空间就是高维空间,比如3个参数就是正方体空间,4个参数就是4维空间......
3.搜索范围
搜索参数的方法已经知道了,那搜索范围呢?也就是我们应该如何选择参数的范围进行随机取值?答案是根据不同的参数选择合适的标尺。
上图是标准的数轴(刻度随便画的,能理解就行),比如现在这是学习率a的搜索范围,如果沿数轴随机取值,那么90%的数落在[0.1,1]之间,对于[0.001,0.1]之间只有10%的搜索范围,这显然是不合理的,因为经验主义告诉我们,学习率一般不会特别高,[0.1,1]的区间搜索结果不是最理想的学习率,反而最理想的在更小的区间。因此我们需要放大[0.001,0.1]这一区间的搜索,就需要采用对数标尺。
上图是对数标尺的数轴,即log10(x),则在对数标尺的数轴上,前面我们讨论的学习率就会均匀分布,这样的话[0.001,0.1]区间的搜索概率就会大大增加,从而加快寻找合适参数的速度。
在Python中,可以使用下面的方式生成[0.001,1]之间的数:
r=-3*np.random.rand()
a=10**(r)
选择合理标尺的本质是因为超参数对不同区间的数值敏感度不一样。比如在指数加权移动平均值中的超参数b,b在[0.9,0.9005]和[0.9,0.999]的效果就有很大差别,在[0.9,0.9005]中b变化一点,实际平均值变化不大(0.9相当于大约10个数的平均值,0.9005相当于大约10.05个数的平均值),而在[0.9,0.999]中b变化一点,实际平均值就变化很大(0.999相当于大约1000个数的平均值)。因此对于区间的搜索,就需要加大[0.9,0.999]的搜索概率(范围)。
注意:在运用指数加权移动平均值的优化算法中,对于b的常见取值0.9、0.999取对数不好求,因此可以计算(1-b),此时就转化成0.1、0.001了,方便运用对数标尺进行搜索。
其实,即使不选择合理的标尺,在参数数量多的模型上利用随机取值+精准搜索,也可以达到不错的效果,因为精准搜索的过程也是放大了超参数敏感区间的范围,从而也能寻找到比较合理的超参数取值。
4.超参数训练模式
超参数训练的两种模式:在训练模型的时候,一部分人会选择下图所示的训练模型,即只训练一个模型,对这个模型进行精细化管理,每天随时监督模型的训练情况,根据模型的效果随时调整超参数的值,以便让模型达到很好的效果。这种模式可以比喻成panda模式,即熊猫的孩子很少,且极难成活,于是一胎只养一个,悉心照顾,确保小熊猫的健康成长。这种模式适用于计算资源不多的情况下,没有多余的算力支撑同时训练其他模型。
如下图是第二种模式,根据不同的超参数设置,同时训练多种模型,比较哪一种模型更加好,从而选择性能较好的模型。这种模式可以比喻成caviar模式,即鱼子酱模式,鱼类每次排除多个卵,对于每个卵进行相同的照顾方式,在相同的环境条件下进行生长,表现不良的逐渐淘汰,选择表现良好的幼苗。这种模式适用于计算资源富余的情况下,需要大量算力支撑同时训练多种模型。
但是有时候,某些领域需要实验多种模型,但是数据量太大,同时训练多种模型计算机可能无法实现,那么就需要将两种方式结合起来,即一次训练一种模型,每种模型训练一段时间观察效果,表现差劲的模型就会淘汰,每隔一段时间选择其他超参数训练新的模型。就像熊猫虽然一胎的数量少,但是选择悉心照顾其中一只,如果无法成活,那就再生一胎,用一生的时间繁衍后代,从而哺育多只小熊猫。
最后想说的一点是,对与超参数的值的设定,故步自封是不可取的,我们不应该局限于深度学习领域,而是应该跨专业、跨领域去寻找新的灵感。同时,对于训练的模型,应该每隔一段时间重新测试参数的值是否适用。