2、搜索空间分类:离散、连续、混合与结构化
大家好,我是你们的老朋友。今天我们来聊聊搜索空间的分类。说实话,这个问题我当年刚入行时也迷糊过一阵子。你想想看,搜索空间说白了就是「我们要在什么范围内找答案」。但这个范围长什么样,直接决定了你用什么策略去搜。
我个人习惯把搜索空间分成四大类:离散、连续、混合、结构化。每一类都有它的脾气。咱们一个一个来盘。
2.1 离散搜索空间
离散搜索空间,说白了就是「有限个选项」。比如你选一个城市、选一个整数、选一个开关状态。这些选项之间没有平滑的过渡,你没法从「北京」慢慢变成「上海」。
典型场景:
- 组合优化问题(旅行商、背包问题)
- 超参数调优中的类别型参数(优化器选 Adam 还是 SGD)
- 离散动作空间(游戏中的上下左右)
核心特点: 空间是有限可数的,但可能非常大(比如 2^100 种组合)。
我在项目中遇到过一个问题:用网格搜索调参,参数组合有 10 万种。跑一次要 3 天。嗯,这时候你就得想,是不是该换个策略了。
我的建议: 离散空间如果规模不大(< 1000 种),暴力枚举最稳。规模大了,用启发式搜索(遗传算法、模拟退火)更靠谱。
2.2 连续搜索空间
连续空间就完全不一样了。这里的变量是实数,比如学习率 0.001 到 0.1,或者神经网络里的权重。你可以从一个点平滑地移动到另一个点。
典型场景:
- 数值优化(梯度下降、牛顿法)
- 超参数调优中的浮点型参数(学习率、正则化系数)
- 物理仿真中的参数标定
为什么会这样?因为连续空间里,你可以利用梯度信息。有梯度,你就能知道往哪个方向走能更快找到最优解。这是离散空间不具备的优势。
注意: 连续空间虽然「连续」,但实际搜索时你只能采样有限个点。所以本质上还是在「离散化」地探索。我曾经踩过一个坑:以为连续空间用随机搜索就够了,结果在高维空间里,随机采样几乎找不到好点。后来改用贝叶斯优化才解决问题。
2.3 混合搜索空间
混合空间,就是既有离散变量又有连续变量。这种最头疼。你想想看,一个变量是「选哪个城市」,另一个变量是「在这个城市里选哪个坐标」。前者是离散的,后者是连续的。
典型场景:
- 神经网络架构搜索(选几层是离散的,每层的神经元数量是连续的)
- 机器人路径规划(选路径点是离散的,路径平滑是连续的)
- AutoML 中的完整超参数空间
我记得有一次做 AutoML 项目,搜索空间里既有「激活函数类型」(离散),又有「学习率」(连续)。一开始我直接用随机搜索,效果很差。后来我学乖了:把离散变量和连续变量分开处理,离散的用枚举,连续的用贝叶斯优化。效果立竿见影。
核心思路: 混合空间的关键是「解耦」。把离散和连续部分分开处理,各自用最合适的策略。
2.4 结构化搜索空间
结构化空间,嗯,这个有点意思。它不是说变量本身是离散还是连续,而是说变量之间有约束关系。比如:变量 A 必须大于变量 B,或者变量 C 和变量 D 不能同时为真。
典型场景:
- 带约束的优化问题(资源分配、调度)
- 图结构搜索(神经网络结构中的层连接关系)
- 规则系统(if-then 规则组合)
说白了,结构化空间就是「加了规矩的搜索空间」。你没法随便选,必须满足某些条件。这其实更贴近真实世界的问题。你想想看,现实中的决策哪有完全自由的?预算有限、时间有限、资源有限,这些都是约束。
我的经验: 处理结构化空间时,我建议先画一个约束图。把变量之间的依赖关系可视化出来。很多时候,你发现约束其实可以简化,甚至有些约束是冗余的。去掉冗余约束,搜索空间能小一大截。
2.5 四种空间的对比
| 类型 | 变量性质 | 典型算法 | 难度 |
|---|---|---|---|
| 离散 | 有限可数 | 枚举、遗传算法、模拟退火 | 中等 |
| 连续 | 实数 | 梯度下降、贝叶斯优化 | 低(有梯度时) |
| 混合 | 离散+连续 | 分层优化、进化策略 | 高 |
| 结构化 | 带约束 | 约束优化、图搜索 | 高 |
2.6 知识体系图
下面这张图是我自己画的,帮你理清这四种空间的关系和适用场景。
2.7 如何选择搜索策略
讲完了分类,你可能会问:那我到底该用哪种策略?
我的建议很简单:
- 先看变量类型:全是离散的,用离散策略。全是连续的,用连续策略。混着的,用混合策略。
- 再看有没有约束:有约束的,优先考虑结构化方法。别一上来就用无约束优化,容易跑飞。
- 最后看规模:空间小,暴力枚举最省事。空间大,上启发式或贝叶斯优化。
避坑指南: 我曾经犯过一个错误——把连续变量强行离散化,然后用离散搜索。结果精度不够,最优解永远找不到。后来改用连续优化,效果好了不止一个量级。所以,不要为了省事而改变变量的本质。
好了,这一章的内容就到这里。记住一句话:搜索空间决定了搜索策略的上限。选对了分类,你就成功了一半。