本节摘要:最朴素的两种搜索:全枚举的网格搜索与随机采样。本节对比二者在高维空间上的成本差异,解释"随机搜索为什么常常更划算",并给出何时能用网格、何时必须换随机的判据。
阅读完本节,你应当能够:
聊完旋钮,第一个想到的往往是"把所有组合都试一遍"。这就是网格搜索(Grid Search):为每个旋钮划几个档,然后把所有笛卡尔积组合全跑一遍,取验证最好的。简单、可并行、好理解,但它的成本恐怖。
之所以说它"容易踩坑",是因为它给初次接触的人一个错误的安全感——"我全试过了,答案总不会差"。可它真正的成本上行得最凶:每多加一个旋钮、每个旋钮多加一档,总组合数就指数翻倍,你在"穷举"这个幻象里烧掉了大量算力。
假设 4 个旋钮各有 5 档,组合是 5 的四次方等于 625 组。加到 8 个旋钮,就是 5 的八次方约 39 万组——在昂贵模型上这基本跑不动。问题不在于"试得多",而在于穷举的组合数随维度指数上涨。
维数一高,网格像"把搜索空间均匀铺一层砖"——每个维都只踩到固定那几个点,还不一定踩到最值。而且它有个常被忽略的浪费:大多数组合往往都不好,花在它们身上的算力大多打水漂。
随机搜索不变粒度高,是在每个旋钮定义域里随机采样 N 组去跑。乍看"随机会不会更差?"——其实在高维空间里,它用同样预算覆盖到的"互不相同的取值"更多:因为每个维度都能取到任意值,而不是像网格那样被钉在若干档上。
更深的直觉与贝叶斯优化衔接:很多时候只有少数几个旋钮影响结果。网格把大量组合花在"次要旋钮的排列"上;随机则更自然地让重要旋钮取到多样取值,更可能命中那个好点的邻域。这正是下一节聪明搜索的思想先声。
再说透一点:随机搜索真正的优势在于"无偏地铺满整个空间"。假如学习率是最要紧的旋钮,而它的取值范围横跨四个数量级(从 1e-4 到 1),网格多半只会踩到 1e-4、1e-3……这些整档,未必能踩中 3.5e-3 这种优值;而随机搜索会让 36 个样本里的大多数,其学习率都落在对结果影响最关键的那个区间里,更容易被你后续精修发现。换句话说,随机搜索"平均而言更不亏",这正是它常被文档默认推荐的原因。
# 示意:网格与随机的成本对比(概念性) import itertools, random choices = {"lr": [1e-4,1e-3,1e-2,1e-1], "bs": [32,64,128], "reg": [0,1e-4,1e-3]} grid = list(itertools.product(choices["lr"], choices["bs"], choices["reg"])) # 4*3*3=36 random_cfg = [(random.choice(...) for _ in range(36))] # 同预算但取值更自由
随机搜索还有一个网格最不好复制的好处:它能按你想要的分布来采样。对学习率、正则强度这类跨越多个数量级的旋钮,让它在对数尺度上均匀采样(即随机取 10^n 的指数 n)往往比均匀采样好得多——否则你会把大量样本砸在数值大的一端,而忽略了对数上同样重要的那一端。不少随机搜索实现默认就这么做,但你要知道自己为什么这么设:不是随便"撒点",而是为每个旋钮选一个合理的采样分布,这本身就是一次小的实验设计。
随机搜索在"定范围"这一步特别有用:它不直接给你一个终值,而是帮你把好点的邻域圈出来。所以一套省算力的经典流程是两阶段收口——第一段用随机搜索在很宽的范围内跑前一半预算,把你以为的最佳点邻域摸出来;第二段再在这个更窄的邻域里用小网格或再随机一轮,把答案钉得更准。这样既不浪费宽范围探索的信息,又不会像纯网格在宽范围里浪费一大半算力。很多实际项目就是这么跑的:先用随机把"大概在哪儿"找着,再用精搜把"具体定在哪儿"定下来。这套"粗搜定范围、精搜定终值"的两段式,也是在算力有限时性价比最稳的粗调策略——它既保留了宽范围探索带给你的"何处值得深挖"信息,又避免了在宽范围上整套铺满的浪费。
随机搜索往往胜出,但网格并没过时:
| 情形 | 推荐 | 原因 |
|---|---|---|
| 旋钮少(2-3)且档位是离散枚举 | 网格 | 组合可控、直观 |
| 维数高或取值是连续量 | 随机 | 更划算、覆盖更密 |
| 要严格可复现、逐格报告 | 网格 | 好讲、好审计 |
| 有充足算力可铺开 | 各试 | 网格打底+随机补盲点 |
⚠️ 常见坑:把"搜到的验证最优"当真理。搜索本来就是拿验证信号选点,验证有噪声,审慎起见用多种子或交叉验证复核后再定,别把一次运气当结论(这条全册反复出现)。
💡 直觉:如果你预算只够跑一个数量级的搜索,随机搜索通常会比同预算的网格更快地帮你锁定"学习率先调两个档"。先用随机定范围,再用小网格/后续自适应方法在范围内精修,是省算力的经典起手。
随机搜索已经比网格聪明了,而真正的懂王是让搜索用历史结果反哺下一组——自动化调优。