超参数优化方法之网格优化
超参数优化是机器学习中提升模型性能的关键步骤。在众多优化方法中,网格搜索(Grid Search)以其直观和系统性的特点脱颖而出。作为一种穷举搜索策略,网格搜索通过遍历给定参数网格中的所有可能组合,寻找最优的超参数设置。
文章目录
- 超参数优化方法之网格优化
- 一、枚举网格搜索(GridSearchCV)
- 二、随机网格搜索(RandomizedSearchCV)
- 三、对半网格搜索(HalvingSearchCV)
- 总结
一、枚举网格搜索(GridSearchCV)
在所有超参数优化的算法当中,枚举网格搜索是最为基础和经典的方法。在搜索开始之前,需要人工将每个超参数的备选值一一列出,多个不同超参数的不同取值之间排列组合,最终将组成一个参数空间(parameter space)。枚举网格搜索算法会将这个参数空间当中所有的参数组合带入模型进行训练,最终选出泛化能力最强的组合作为模型的最终超参数。
对网格搜索而言,如果参数空间中的某一个点指向了损失函数真正的最小值,那枚举网格搜索时一定能够捕捉到该最小值以及对应的参数(相对的,假如参数空间中没有任意一点指向损失函数真正的最小值,那网格搜索就一定无法找到最小值对应的参数组合)。
参数空间越大、越密,参数空间中的组合刚好覆盖损失函数最小值点的可能性就会越大。这是说,极端情况下,当参数空间穷尽了所有可能的取值时,网格搜索一定能够找到损失函数的最小值所对应的最优参数组合,且该参数组合的泛化能力一定是强于人工调参(人工是不可能穷尽所有的取值的)的。
但是,参数空间越大,网格搜索所需的算力和时间也会越大,当参数维度上升时,网格搜索所需的计算量更是程指数级上升的。同时,参数优化的目标是找出令模型泛化能力最强的组合,因此需要交叉验证来体现模型的泛化能力,假设交叉验证次数为5,则三个参数可能就需要建模几百次。在面对超参数众多、且超参数取值可能无限的人工神经网络、融合模型、集成模型时,伴随着数据和模型的复杂度提升,网格搜索所需要的时间会急剧增加,完成一次枚举网格搜索可能需要耗费几天几夜。
二、随机网格搜索(RandomizedSearchCV)
根据上文所述,当所使用的算法确定时,决定枚举网格搜索运算速度的因子一共有两个:第一个是参数空间的大小,参数空间越大,需要建模的次数越多;第二个是数据量的大小,数据量越大,每次建模时需要的算力和时间越多。
因此,sklearn中的网格搜索优化方法主要包括两类,其一是调整搜索空间,其二是调整每次训练的数据。其中,调整参数空间的具体方法,是放弃原本的搜索中必须使用的全域超参数空间,改为挑选出部分参数组合,构造超参数子空间,并只在子空间中进行搜索。
在sklearn中,随机抽取参数子空间并在子空间中进行搜索的方法即为随机网格搜索RandomizedSearchCV。由于搜索空间的缩小,需要枚举和对比的参数组的数量也对应减少,整体搜索耗时也将随之减少,因此:
- 当设置相同的全域空间时,随机搜索的运算速度比枚举网格搜索快很多。
- 当设置相同的训练次数时,随机搜索可以覆盖的空间比枚举网格搜索大很多。
- 随机网格搜索得出的最小损失与枚举网格搜索得出的最小损失(一般来说)很接近。
相比枚举网格搜索,随机网格搜索可以说是既提升了运算速度,又没有过多地伤害搜索的精度,不过,需要注意的是,随机网格搜索在实际运行时,并不是先抽样出子空间,再对子空间进行搜索,而是仿佛“循环迭代”一般,在这一次迭代中随机抽取1组参数进行建模,下一次迭代再随机抽取1组参数进行建模,由于这种随机抽样是不放回的,因此不会出现两次抽中同一组参数的问题。我们可以控制随机网格搜索的迭代次数,来控制整体被抽出的参数子空间的大小,这种做法往往被称为“赋予随机网格搜索固定的计算量,当全部计算量被消耗完毕之后,随机网格搜索就停止”实际执行代码的时候是用循环的方式执行的。
完整实现代码以及枚举网格搜索与随机网格搜索区别
三、对半网格搜索(HalvingSearchCV)
随机网格搜索时通过调整搜索空间来提高搜索速度,对半网格搜索就是通过调整每次训练的数据来提高搜索速度。
假设现在存在数据集 ,从数据集 中随机抽样出一个子集𝑑。如果一组参数在整个数据集𝐷 上表现较差,那大概率这组参数在数据集的子集𝑑上表现也不会太好。反之,如果一组参数在子集𝑑 上表现不好,也不会信任这组参数在全数据集𝐷 上的表现。参数在子集与全数据集上反馈出的表现一致,如果这一假设成立,那在网格搜索中,比起每次都使用全部数据来验证一组参数,或许可以考虑只带入训练数据的子集来对超参数进行筛选,这样可以极大程度地加速运算。
完整实现代码以及对半网格搜索与随机网格搜索区别