Deep Learning Note: 2-5 超参数调优

1. 调优过程

  神经网络的训练涉及众多的超参数,按照调整的优先级,可以划分如下:

  对于 Adam 优化算法中的超参数,通常会直接使用默认值($\beta_1 = 0.9$,$\beta_2 = 0.999$,$\epsilon=10^{-8}$),几乎不会去调优。

  在早期的机器学习算法中,通常使用网格来对超参数进行取样,如图 1 所示,使用 5 * 5 的网格,等间距地选择出 25 个超参数组合,从中选出最好的一组。

图 1

图 1

  使用网格对超参数取样的方法适用于超参数较少的场景。在深度学习时代,通常会随机选择超参数,如图 2 所示,然后依次尝试这些参数。

图 2

图 2

  像图 2 那样随机选择超参数的原因是,我们很难事先知道哪个超参数对模型的影响更大,随机选择可以得到更多样化的参数组合。比如说,超参数 1 是学习率 $\alpha$,超参数 2 是 Adam 算法中的 $\epsilon$,$\alpha$ 会对模型有显著的影响,而 $\epsilon$ 对模型几乎没有影响,如果使用图 1 的等间距网格,实际上只有纵向的 5 个不同的 $\alpha$ 的值会对模型产生影响,虽然有 25 个超参数组合,实际只会得到 5 个不同的结果。而像图 2 那样随机选择超参数,25 个超参数组合的 $\alpha$ 都不同,可以得到更多的结果,更容易找到最佳的参数值。

  在选择超参数时,通常会使用由粗到精(Coarse to Fine)的选择过程,如图 3 所示,在一轮随机采样后,得到一系列参数(黑点),通过试验,发现了几个参数具有较好的性能(红圈),接下来就缩小搜索范围(蓝色矩形),围绕性能较好的参数,进行更多的采样(蓝点),如此反复。

图 3

图 3

2. 使用合适的尺度选取超参数

  前面所说的“随机”选择超参数,并不仅仅意味着在一个特定范围内均匀地随机选择,有时还需要使用合适的比例。

  例如想要选择第 $l$ 层隐藏单元的数量 $n^{[l]}$,想要搜索的范围是 $[50, 100]$;或者想要选择网络的层数 $L$,想要搜索的范围是 $[2, 4]$,对于这两种情况,可以在对应区间内均匀地选择若干个值进行试验,甚至可以使用网格搜索。

  但并不是所有的参数都适合在其范围内均匀地选择。例如对于学习率 $\alpha$,想要搜索的范围是 $[0.0001, 1]$,如果还均匀地进行采样,比如以 $0.1$ 为间隔,选择 $0.0001$、$0.1$、$0.2$、…、$1$,在 $[0.0001, 0.1]$ 范围内只搜索了两次,大部分时间都在搜索较大的尺度 $[0.1, 0.9]$ ,而忽视了小尺度 $[0.0001, 0.1]$ 上的搜索。

  对于 $[0.0001, 1]$ 这个范围,应该在对数的尺度上进行搜索,如 $0.0001$、$0.001$、$0.01$、$0.1$、$1$。在 Python 和 NumPy 中可以实现为:

r = -4 * np.random.rand()
alpha = 10 ** r

其中的 -4 取自 $\log_{10}0.0001 = -4$。

  参数搜索的另一种特殊情况是对于如指数加权平均的参数 $\beta$,搜索范围是 $[0.9, 0.999]$,代表平均过去的 $[10, 1000]$ 个值,显然仍不适合使用线性的采样。此时的采样方式是,对 $1 – beta$ 进行采样,$1 – beta$ 的搜索范围是 $[0.001, 0.1]$,就像上面对学习率的采样,在对数尺度,选择 $0.001$、$0.01$、$0.1$ 比较合适,得到 $\beta$ 的取值为 $0.9$、$0.99$、$0.999$。

3. Pandas vs. Caviar

  随着环境的变化,最优的超参数不是一成不变的,即便在某一个时间找到了最好的参数,随着时间的推移,环境发生改变,例如硬件升级、计算环境发生变化等,一些参数可能无法再发挥原有的作用。因此每隔一段时间,比如几个月,需要重新对超参数进行搜索,保持参数的配置能达到最优的性能。

  常见的超参数的搜索方式主要可以分为两种。一种是悉心调优一个模型,适用于数据量很大或计算资源不足,只能同时训练一个或少量几个模型的情况,此时需要在模型的训练过程中手动调整各项参数。例如在初始化了参数、开始训练后,第一天发现学习速度不错,可以调大学习率;训练了几天后,发现学习率过高,于是载入之前的模型,降低学习率继续训练…如此严格监控模型的学习过程,手动调整各个参数,保证模型能够顺利的学习。这种训练方式就像熊猫照顾孩子,熊猫产子很少,每个孩子都会得到悉心的照料,以保证其存活。

  另一种方式时,并行地训练多个模型,每个模型使用不同的参数,训练一段时间后,检查各个模型的学习情况,选择最好的那个。这种方式更像是鱼类产子,某些鱼类在交配季节会产出上亿的卵,但并不会怎么照料,存活率很低。

  以上两种方式的选择,取决于可用的计算资源和计算的复杂度。如果计算能力足够,可以并行训练多个模型从中选择。如果数据量非常大、模型非常复杂,例如在线广告、计算机视觉领域的一些场景,通常需要悉心照料单个模型的训练。