七、超参数调节
大多数学习算法都有些超参数需要设定。超参数配置不同,学得的模型性能往往有显著差别,这就是参数调节(
parameter tuning
):对每种超参数配置都训练出模型,然后把对应最好模型的超参数作为结果。由于很多超参数是在实数范围内取值,因此现实中常用做法是对每个超参数选定一个范围和变化步长。如在
[0,1)
范围内以0.2
为步长。这样选出的超参数可能不是最佳的,但是这是在计算开销和性能之间取折中的结果。
当模型选择完成后,学习算法和超参数配置已经选定,此时应该用数据集 重新训练模型。
这个模型在训练过程中使用了 个样本,这才是最终提交的模型。
7.1 搜索策略
超参数搜索有三种常见的策略:
- 手动搜索:手动选择超参数。
- 网格搜索:当超参数的数据相对较少时,这个方法很实用。
- 随机搜索:通常推荐这种方式。
7.1.1 手动搜索
手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的泛化。
手动搜索超参数的任务是:在给定运行时间和内存预算范围的条件下,最小化泛化误差。
手动调整超参数时不要忘记最终目标:提升测试集性能。
加入正则化只是实现这个目标的一种方法。
如果训练误差很低,也可以通过收集更多的训练数据来减少泛化误差。
如果训练误差太大,则收集更多的训练数据就没有意义。
实践中的一种暴力方法是:不断提高模型容量和训练集的大小。
这种方法增加了计算代价,只有在拥有充足的计算资源时才可行
7.1.2 网格搜索
网格搜索的做法是:
- 对于每个超参数,选择一个较小的有限值集合去搜索。
- 然后这些超参数笛卡尔乘积得到多组超参数。
- 网格搜索使用每一组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。
如何确定搜索集合的范围?
- 如果超参数是数值,则搜索集合的最小、最大元素可以基于先前相似实验的经验保守地挑选出来。
- 如果超参数是离散的,则直接使用离散值。
通常重复进行网格搜索时,效果会更好。假设在集合
{-1,0,1}
上网格搜索超参数 :- 如果找到的最佳值是 1,那么说明低估了 的取值范围。此时重新在
{1,2,3}
上搜索。 - 如果找到的最佳值是 0,那么可以细化搜索范围以改进估计。此时重新在
{-0.1,0,0.1}
上搜索。
- 如果找到的最佳值是 1,那么说明低估了 的取值范围。此时重新在
网格搜索的一个明显问题时:计算代价随着超参数数量呈指数级增长。
如果有 个超参数,每个最多取 个值,那么所需的试验数将是 。虽然可以并行试验,但是指数级增长的计算代价仍然不可行。
7.1.3 随机搜索
随机搜索是一种可以替代网格搜索的方法,它编程简单、使用方便、能更快收敛到超参数的良好取值。
- 首先为每个超参数定义一个边缘分布,如伯努利分布(对应着二元超参数)或者对数尺度上的均匀分布(对应着正实值超参数)。
- 然后假设超参数之间相互独立,从各分布中抽样出一组超参数。
- 使用这组超参数训练模型。
- 经过多次抽样 -> 训练过程,挑选验证集误差最小的超参数作为最好的超参数。
随机搜索的优点:
- 不需要离散化超参数的值,也不需要限定超参数的取值范围。这允许我们在一个更大的集合上进行搜索。
- 当某些超参数对于性能没有显著影响时,随机搜索相比于网格搜索指数级地高效,它能更快的减小验证集误差。
与网格搜索一样,通常会基于前一次运行结果来重复运行下一个版本的随机搜索。
随机搜索比网格搜索更快的找到良好超参数的原因是:没有浪费的实验。
在网格搜索中,两次实验之间只会改变一个超参数 (假设为 )的值,而其他超参数的值保持不变。
如果这个超参数 的值对于验证集误差没有明显区别,那么网格搜索相当于进行了两个重复的实验。
在随机搜索中,两次实验之间,所有的超参数值都不会相等,因为每个超参数的值都是从它们的分布函数中随机采样而来。因此不大可能会出现两个重复的实验。
如果 超参数与泛化误差无关,那么不同的 值:
- 在网格搜索中,不同 值、相同的其他超参数值,会导致大量的重复实验。
- 在随机搜索中,其他超参数值每次也都不同,因此不大可能出现两个重复的实验(除非所有的超参数都与泛化误差无关)。
7.2 调整原则
通常先对超参数进行粗调,然后在粗调中表现良好的超参数区域进行精调。
超参数随机搜索,并不意味着是在有效范围内随机均匀取值。需要选择合适的缩放来进行随机选取。
对于学习率,假设其取值范围为
0.000001~1
。如果进行均匀取值,取10个,那么有 90% 的随机值都位于区间
[0.1,1]
。则[0.000001,0.1]
之间没有足够的探索。这种做法明显不合理。此时需要使用对数缩放,在对数轴上均匀随机取点。
对于指数加权移动平均的超参数 。假设其取值范围为
0.9~0.9999
。由于 刻画了结果使用过去多少个周期的数据来加权平均。因此如果进行均匀取值,则:
- 在
0.9~0.9005
之间取值时, 变化不大。 - 在
0.9990~0.9995
之间取值时, 变化非常大。
越接近 1, 对于它的变化越敏感。此时,需要对 使用对数缩放,在对数轴上均匀随机取点。
- 在
如果选择了错误的缩放,如果取值的总量足够大,也可以得到不错的结果。
尤其当配合了
粗调 -> 精调
策略时,最终还是会聚焦到合适的超参数范围上。
通常情况下,建议至少每隔几个月重新评估或者修改超参数。因为随着时间的变化,真实场景的数据会逐渐发生改变:
- 可能是由于用户的行为、偏好发生了改变。
- 可能是采样的方式发生了改变。
- 也可能仅仅是由于数据中心更新了服务器。
由于这些变化,原来设定的超参数可能不再适用。
有两种超参数调整策略:
如果数据足够大且没有足够的计算资源,此时只能一次完成一个试验。
则可以每天观察模型的表现,实时的、动态的调整超参数。
如果数据不大,有足够的计算资源可以同一时间完成大量的试验,则可以设置多组超参数设定,然后选择其中表现最好的那个。