全局搜索算法基础:穷举搜索、随机搜索、网格搜索的原理与适用场景
说到全局搜索,很多人第一反应就是「把所有可能性都试一遍」。嗯,这个直觉没错,但实际做起来,你会发现「全试一遍」这件事本身就有很多门道。我这些年调过不少模型,踩过不少坑,今天就把这三种最基础的搜索算法掰开揉碎了讲清楚。
穷举搜索:最笨也最可靠的方法
穷举搜索,说白了就是把所有候选解挨个儿检查一遍。你想想看,这就像找钥匙——你把家里每个抽屉都翻一遍,总能找到。
核心思想:遍历整个搜索空间,不遗漏任何一个可能解。
我在做特征选择时经常用穷举。比如有10个特征,我想找出最优的5个特征组合。穷举会列出所有C(10,5)=252种组合,逐个评估。结果肯定是最优的,但代价也很明显——特征数一多,组合数就爆炸了。
| 维度 | 穷举搜索 |
|---|---|
| 搜索空间 | 全部 |
| 最优性保证 | 100% |
| 时间复杂度 | O(n) ~ O(n!) |
| 适用场景 | 小规模、离散、确定性 |
避坑指南:我曾经在一个超参数调优项目里用了穷举,搜索空间只有1000个点,跑了整整两天。后来发现其实用随机搜索,10分钟就能找到差不多的结果。穷举虽好,别滥用。
随机搜索:用概率换效率
随机搜索就更有意思了。它不遍历所有可能,而是在搜索空间里随机采样。你可能会问:「随机出来的结果靠谱吗?」
我刚开始做算法时也觉得随机搜索不靠谱。直到有一次,一个高维优化问题,穷举根本算不完,网格搜索又太稀疏,最后是随机搜索救了我。它虽然不能保证找到全局最优,但在有限时间内,找到「足够好」的解的概率非常高。
个人经验:随机搜索在高维空间里表现往往比网格搜索好。为什么?因为高维空间里,网格的采样点太稀疏了,而随机采样能更均匀地覆盖整个空间。
# 随机搜索的简单实现
import random
def random_search(objective, bounds, n_iterations):
best_solution = None
best_score = float('inf')
for i in range(n_iterations):
# 在边界内随机采样
solution = [random.uniform(b[0], b[1]) for b in bounds]
score = objective(solution)
if score < best_score:
best_score = score
best_solution = solution
return best_solution, best_score
网格搜索:结构化地试探
网格搜索介于穷举和随机之间。它把搜索空间划分成网格,然后在每个网格点上做评估。说白了,就是「有规律地抽样」。
我记得有一次做SVM的参数调优,C和gamma两个参数,我用网格搜索设了10×10=100个点。结果跑完发现,最优参数就在网格的某个交点附近。虽然没找到精确最优,但已经够用了。
| 对比维度 | 穷举搜索 | 随机搜索 | 网格搜索 |
|---|---|---|---|
| 采样方式 | 全部 | 随机 | 均匀网格 |
| 最优性 | 保证全局最优 | 概率性接近最优 | 网格精度内最优 |
| 计算成本 | 极高 | 可控 | 中等 |
| 维度扩展性 | 差 | 好 | 中等 |
| 典型应用 | 小规模组合优化 | 高维超参数调优 | 低维参数搜索 |
关键区别:网格搜索的采样点是确定的、均匀的;随机搜索的采样点是随机的、概率均匀的。在低维空间(≤3维),网格搜索效率更高;在高维空间,随机搜索更实用。
三种算法的核心逻辑对比
为了让你更直观地理解,我画了一张对比图。这张图展示了三种搜索策略在二维空间里的采样方式。
实际项目中的选择策略
说了这么多理论,到底怎么选?我总结了一个简单的决策流程:
- 先看搜索空间大小:如果小于1000个点,直接穷举,省心。
- 再看维度:1-3维用网格搜索,4维以上用随机搜索。
- 最后看时间预算:时间充裕用网格,时间紧张用随机。
我的习惯:做超参数调优时,我通常会先用随机搜索跑一轮(比如100次采样),找到大概的「好区域」,然后再用网格搜索在那个区域里精细搜索。这叫「粗搜+细搜」策略,效率很高。
一个真实的案例
去年我做了一个文本分类模型,需要调优5个超参数。如果用穷举,每个参数10个值,就是10^5=10万次实验,根本跑不完。网格搜索的话,每个参数取5个值,也有3125次,还是太多。
最后我用了随机搜索,只跑了200次。你猜怎么着?找到的参数组合比团队之前手工调了两个月的结果还要好。这就是随机搜索的魅力——用少量的采样,覆盖足够大的空间。
注意:随机搜索不是万能的。如果你的搜索空间非常崎岖(有很多局部最优),随机搜索可能会错过真正的好点。这时候可以考虑后面章节要讲的贝叶斯优化或遗传算法。
好了,三种基础搜索算法就讲到这里。记住一个核心原则:没有最好的算法,只有最合适的算法。根据你的问题规模、维度、时间预算来选,比盲目追求「最优」要实在得多。