谁更胜一筹?--随机搜索 V.S. 网格搜索
在进行超参数优化工作时,我不断思考该使用随机搜索还是网格搜索呢?这时候,一个同事给我介绍了一篇由Bergstra和Bengio编写的随机搜索超参数优化论文(链接),文中认为在进行参数优化时随机搜索比网格搜索更有效。
我想通过测试来得到自己的答案,我的实验设置如下。给定空间为(1024,1024)的超参数空间,可由相同形状的矩阵表示。我们为寻找最佳超参数设置的预算是25个实验。因此,这将允许我们进行网格搜索,其中我们设置每个超参数有5个值的组合,或者在该空间中的25个随机搜索。此外,我设置了一个“批量”版本的随机搜索,执行5批次每批次5次随机搜索,优化调整每次批次后的搜索。生成多个这样的随机超参数空间后,计算两种随机搜索优于网格搜索的次数。
生成空间
这一步是生成随机2D超参数空间,例如某种地形。 我使用了Hill地形算法(链接)。 它是一个简单而优雅的算法。 代码如下:
从上面代码生成的一个可能的地形如下所示。 我还为它生成了一个等高线图。
网格搜索
如您所见,地形只是一个形状矩阵(1024,1024)。 由于我们的预算是25个实验,我们将在这个地形上进行一次5x5的网格搜索。 意即在x和y轴上选择5个等距点,并读取这些(x,y)位置处的地形矩阵值。 执行此操作的代码如下所示。 在轮廓图上的点的最佳值以蓝色标示。
网格搜索中最优点坐标为(767,767),值为109。
随机搜索
接下来进行实验的是纯随机搜索。由于实验预设为25个,所以这里仅随机生成x值和y值,然后在这些点中搜索地形矩阵值。
在该测试中,随机搜索做得更好一些,找到坐标为(663,618)值为103的点。
批量随机搜索
在这种方法中,我决定将我的25个实验预算分成5批,每批5个实验。 查找(x,y)值在每个批次内是随机的。 同时,在每个批次结束时,优胜者会被挑出来进行特殊处理。 采用对象不是在空间中任何地方生成的点,而是在这些点周围绘制一个窗口,并且仅从这些空间进行采样。 在每次迭代时,窗口会进行几何收缩。我试图寻找到目前为止找到的最优点的邻域中的点,希望这个搜索将产生更多的最优点。 同时,我保留剩余的实验探索空间,希望我可能找到另一个最佳点。 其代码如下所示:
结束时此空间中的全局最小点坐标(707,682),值为20。
显然,并不是所有的运行都是如此顺利的,也很有可能从上述任何方法发现的点只是一个局部最小值。 此外,没有理由假定网格搜索可能不优于随机搜索,因为随机地形可能在其中一个均匀布置的点下面具有其全局最小点,并且随机搜索可能错过该点。
为了检查这个假设,我对1000个随机地形批量运行上面的代码。 对于每个地形,我为3种方法中的每一种运行25个实验,并为每个方法找到最低(最优)点。我这样做了两次,以确保结果的客观性。代码如下:
执行结果如下:
结果表明随机搜索似乎比网格搜索稍好(因为第一个数字超过500)。 此外,批量版本不一定更好,因为纯随机搜索在第二次运行有更好的结果。
以上是我实验的结果。在这个过程中,我学习了一个有趣的算法来生成地形,也为自己解除了困惑。如果你想亲自尝试,不妨阅读本文核心笔记以及批处理运行Python版本代码。
作者简介:
Sujit Pal是一名程序员,在Healline Networks担任技术管理。喜好研究编程语言Java和Python,喜欢从多角度研究和解决问题。
本文由阿里云云栖社区组织翻译。
文章原标题《Random vs Grid Search: Which is Better?》