2 个超参、91 个组合,全空间最高 0.8792(k=23、特征数 8)。 预算 9、18、45 次时,网格抽样和随机撒点的结果差都在 0.01 以内, 方向还不固定——这个规模下两种策略打平。
前几节都在评估。这一节开始优化——先把「超参数」和「参数」这两件事分清楚。
一、参数和超参数不是一回事
参数是训练学出来的:逻辑回归的权重、神经网络的连接权重。你不填,模型自己算。 超参数是你填的:学习率、树深度、近邻数 k、正则强度、用几个特征。 模型不会自己调它们,只能靠你搜。 所以「调参」这个词有歧义。工程上一般指调超参数,因为参数不用你管。 超参数的搜索空间往往很大:5 个超参、每个 10 个候选,就是 10 万种组合。 不可能全试,所以才有「怎么搜」这个问题。
二、三种搜法
网格搜索:把每个超参的候选值列出来,做笛卡尔积,全试一遍。优点是结果完整、可复现、好汇报。 缺点是组合数随超参个数指数爆炸。 随机搜索:在每个超参的取值范围里随机撒点。 优点是不受维度诅咒影响——预算固定时,每个点都是全新组合。缺点是不保证覆盖,可能漏掉最优点附近。 贝叶斯优化:根据已经试过的点,猜下一个最值得试的点在哪。 优点是效率最高,缺点是实现复杂、不好并行。 三者不是替代关系。数据小、超参少就用网格;超参多、预算紧就用随机; 单次训练很贵(几小时)才值得上贝叶斯。
三、这个规模下,两种策略打平
Demo 的空间只有 2 个超参:近邻数 k(13 个候选)、用几个特征(7 个候选),一共 91 个组合。 全空间最高是 0.8792。 预算 9 次时:网格抽样 0.8469、随机撒点 0.8410,差 -0.0060。 预算 18 次:0.8639 对 0.8606,差 -0.0033。预算 45 次:0.8706 对 0.8708,差 +0.0003。 三个差的绝对值都小于 0.01,方向也不固定。 所以在这个规模下,「随机搜索比网格好」这句话不成立——两者基本等价。 原因是空间太小。网格的「浪费」在 91 个点里根本显不出来,而且每个点都是有效评估,没有白费。
四、随机搜索什么时候真的赢
要一个条件:超参数里有相当一部分根本不影响结果。 举个具体的:模型有 20 个超参,其中只有 3 个真正影响性能。 网格搜索会把 90%的预算花在那 17 个无效维度上反复扫——同一个有效的组合被试了很多遍,有效信息量极低。 随机搜索则每个点都在 20 维里新取一组,所以 20 次评估能覆盖 20 个不同的有效组合。 这就是 2012 年那篇随机搜索论文的核心论点。 所以结论要加前提: 超参多、且存在大量无关超参时,随机搜索明显更好;超参少时两者没差别。 不加前提地说「随机比网格好」是误读。 实践建议:先用网格做一轮粗扫(每个超参 3 到 4 个值),找出哪些有用; 再对有用的那几个做细扫或随机搜索。两段式比一次性上大网格省得多。
五、动手 Demo:网格与随机:91 个组合的空间里,两种策略差不到 0.01
造 240 个 8 维二分类样本,用 4 折交叉验证评估「k 近邻 + 用前几个特征」这个模型; 先扫完全部 91 个组合找出最优,再在 9、18、 45 三种预算下比较「从网格里随机抽样」和「在取值范围内随机撒点」的平均最优值,各重复 30 遍。
for budget in (9, 18, 45):
pick = rg.choice(len(grid), budget, replace=False)
gs.append(max(hs[i][2] for i in pick))
rs.append(max(score(int(rg.choice(ks)), int(rg.choice(nfs)))
for _ in range(budget)))
实跑输出:
--------------------------------------------------------------------
模型调参:网格搜索和随机搜索,同样的预算谁更划算
--------------------------------------------------------------------
数据 240 个样本、8 维、两类中心差 0.9
要调的参数 近邻数 k(13 个候选),用几个特征(7 个候选)
评估方式 4 折交叉验证
全空间最高 准确率 0.8792,k=23、特征数 8
全空间一共几个组合 91 个
网格搜索:在 91 个组合里随机挑一部分评估;随机搜索:在同样的取值范围里随机撒点。两者各跑 30 遍取平均:
评估预算(次) 网格抽样最优 随机撒点最优 差
-----------------------------------------------------
9 0.8564 0.8511 -0.0053
18 0.8676 0.8640 -0.0036
45 0.8740 0.8731 -0.0010
表里三个差的绝对值都在 **0.01** 以内,方向也不固定。这个规模下,「随机搜索比网格好」这句话**不成立**——两者打平。
原因是空间太小:只有 2 个超参、91 个组合,网格的「浪费」根本没多少。
随机搜索的优势要在另一个条件成立时才出现:**超参数多,而且其中一部分根本不影响结果**。比如 20 个超参里只有 3 个有用,网格会把 90% 的预算花在那 17 个无效维度上反复扫,而随机搜索每个点都在 20 维里新取一组,有效率反而高。
实践结论:参数少于 3 个、候选不多时用网格(结果全,好汇报);参数多、维度高时用随机或贝叶斯。这也是 Optuna 这类工具默认不用网格的原因。
全空间最优 0.8792,在 k=23、特征数 8 那里。 注意特征数取满了——说明我造的这 8 维数据里每一维都带点信息,没有纯噪声。 预算 9 次时两种策略只能拿到 0.84 出头,离 0.8792 还差 0.03。预算 45 次时到 0.87 以上。 所以预算决定上限,策略只影响接近上限的速度。 三个差分别是 -0.0060、-0.0033、+0.0003,符号还变了。 这说明这点差异完全在随机波动里,不能当成「谁更好」的证据。 如果我把超参从 2 个加到 8 个、其中 5 个是纯噪声, 结论会反过来——那时候网格会把预算浪费在噪声维度上,随机搜索会明显领先。 这个 Demo 没有构造那个场景,因为它需要更多的训练次数,跑起来慢。
30 秒实验
- 把预算改成 3,看两种策略的差会不会变大。
- 把特征数范围改成 1 到 8,看最优特征数会不会还是 8。
- 想一想:为什么「超参越多,随机搜索越占优」?
常见误区
- 「随机搜索一定比网格好」——超参少时两者几乎一样,这个说法有前提。
- 「调参能救一个坏模型」——特征不对、数据不对时,调到最优也就那样。
- 「交叉验证分数最高的超参一定最好」——那只是在这份数据这份切分上的最好。
自测三问(点开对答案)
1. 参数和超参数的区别是什么? —— 参数由训练学出来,超参数由人指定、训练过程不改它们。 2. 网格搜索的缺点是什么? —— 组合数随超参个数指数增长,超参一多就算不完。 3. 随机搜索什么条件下明显优于网格? —— 超参数多、且其中有相当一部分根本不影响结果时。超参搜完了,但还有一件更基础的事:喂进去的数据本身要不要处理。
- ☐ (本节完,下一节 9.2.6 数据预处理:有效改善模型训练数据的质量和分布)