主页 模型库 竞赛 学习中心 工具箱 论文库 前沿 建模空间 AI建模
学习中心 探索专题 机器学习 模型选择与调参

本页实验台

  1. 学习曲线
  2. 网格搜索与随机搜索
  3. 贝叶斯优化
  4. 嵌套交叉验证
LAB 01

学习曲线

训练集一点点加大,训练误差与验证误差往哪儿收敛

用满数据时的训练误差—
用满数据时的验证误差—
两者的差—
诊断结论—
学习曲线是调参里最该先画的一张图,因为它直接回答"钱该花在哪儿"。横轴是训练样本数,两条线分别是训练误差和验证误差。把阶数设成 1(一条直线去拟合正弦曲线):两条线很快贴在一起,但都停在 0.78 / 0.75 附近,而噪声下限只有 0.25。这是典型的高偏差:模型本身太弱,再加多少数据都没用——两条线已经收敛了,再加数据只是让它们更贴紧。该做的是换更强的模型。把阶数设成 12:样本只有 8 个时训练误差 0.13、验证误差却高达 20,两条线之间是一道巨大的缝。这是典型的高方差:模型记住了训练集。这时加数据是有用的——把样本数从 20 加到 400,那道缝会肉眼可见地收窄。把阶数设成 6(对这条正弦曲线正好够用):两条线收敛到 0.26 / 0.34,紧贴绿色的噪声下限。这时候就到头了——σ² 是任何模型都不可能越过的地板,因为那是数据本身的随机性,不是模型的缺陷。读数最后一行会自动给出这三种诊断之一。这套判断在实际项目里价值极高:很多团队在高偏差的情况下拼命标数据,或者在高方差的情况下不停换更复杂的模型,而这张图十分钟就能画出来。
LAB 02

网格搜索与随机搜索

同样的预算,随机搜索为什么常常更划算

网格搜索找到的最好值—
随机搜索找到的最好值—
网格在重要维度上试过几个不同的值—
随机在重要维度上试过几个不同的值—
看下面那张图最后两排点,结论一目了然。预算 36 次的话,网格搜索是 6×6,它在重要维度上只试了 6 个不同的值;随机搜索试了 36 个不同的值。同样的预算,随机搜索在真正重要的那个维度上的分辨率高了六倍。这就是 Bergstra 和 Bengio 2012 年那篇论文的全部论点。为什么会这样?因为网格搜索把预算平均分给了每一个维度,而超参数的重要性从来不是平均的——学习率通常极其重要,某个正则项的第三位小数往往毫无影响。网格搜索事先并不知道哪个重要,于是必然在不重要的维度上浪费掉大量试验。把"第二个超参数有多重要"拖到 100%,两者的差距就消失了——因为这时两个维度同等重要,平均分配反而是对的。维数越高,这个效应越夸张。五个超参数、每个试 4 个值就是 1024 次,而这 1024 次在每个维度上仍然只有 4 个分辨率。随机搜索的 1024 次,每个维度都是 1024 个不同的值。(注意读数里随机搜索那一行给了两个数:单次抽样的结果和重复 200 次的平均。单次随机可能运气不好,但平均意义上它稳定地更优。)
LAB 03

贝叶斯优化

用代理模型决定下一个试哪儿,比乱试省一个量级的次数

贝叶斯优化找到的最好值—
同样次数随机搜索的结果—
随机搜索赢过贝叶斯优化的比例—
真正的最大值在哪儿—
一共评估了多少次—
按 EI 下一步该去试的位置—
当每试一组超参数要训练几小时的时候,"多试几次"就不是一个选项了。贝叶斯优化的想法是:先用已有的几个点拟合一个便宜的代理模型(这里是高斯过程),再用这个代理去决定下一次该试哪儿。图上橙线是代理模型的均值,阴影是它的不确定;灰虚线是真实曲线——在现实里你是看不见它的,这里画出来只是为了让你判断算法做得对不对。把步数从 1 加到 15,看红点落在哪儿。你会发现它们不是均匀铺开的,也不是全挤在当前最高点附近,而是一部分落在"看起来很高"的地方(利用),一部分落在"完全没试过、不确定很大"的地方(探索)。这个取舍由采集函数控制,这里用的是期望改进(EI):它同时奖励"均值高"和"方差大"。把探索倾向 ξ 从 0 拖到 0.5:算法会明显更愿意去远处看看,短期内找到的值可能更差,但不容易卡在局部最优里。再看长度尺度 ℓ。调得太小,代理模型认为函数到处乱跳,于是几乎退化成随机搜索;调得太大,代理模型过于自信,可能整片区域都不去看。这是贝叶斯优化最实际的一个坑:代理模型本身也有超参数。(好在它的超参数可以用边缘似然自动定——见上一页的高斯过程。) 新加的第二张图,是这个算法的全部决策依据。贝叶斯优化根本不在优化上面那条真实曲线(它看不见那条线),它每一步都在最大化采集函数 EI(x),峰顶就是它下一步要去试的位置。右上角把公式 EI = (μ − best − ξ)·Φ(z) + σ·φ(z) 里的每个量都摆了出来,可以自己验算一遍。拖 ξ 这个滑杆,看峰往哪儿跳。ξ=0 时它去 x=8.90(紧挨着当前最好点),ξ=0.20 时跳到 x=2.90,ξ=0.50 时跳到 x=5.08——都是些代理模型没什么把握的地方。ξ 调大,灰虚线(ξ=0 的参照)和实线就分开,那道缝隙就是「更想去没人去过的地方」这句话的量。顺便留意右上角那个「开发项」,它几乎永远是负数。道理不难想:一旦找到一个不错的点,代理模型的均值就几乎处处低于这个最好值,(μ − best − ξ) 自然是负的。所以在搜索的中后期,EI 的动力几乎全部来自不确定性那一项——「贝叶斯优化在开发与探索之间平衡」这句流传很广的话,在这个阶段其实名不副实。最后看读数里的随机搜索对照。它跑了 200 次取中位数,还给了最差和最好。同样 5 次评估,贝叶斯优化拿到 3.1944,随机搜索的中位只有 2.0170;就算给到 18 次评估,随机搜索的中位也才 3.0111,仍然不如贝叶斯优化。但那 200 次里确实有几次正好摸到了真最大值 3.2000——如果只跑一次随机搜索、又恰好抽中那几次,你会得出「随机搜索更强」的结论。这也是本页那条规矩的又一个例子:比较带随机性的算法,一次运行的结果什么都不能说明。
LAB 04

嵌套交叉验证

调参也会过拟合:不套两层,报出来的分数就是虚的

单层 CV 报出来的准确率—
嵌套 CV 报出来的准确率—
单层 CV 的乐观偏差—
嵌套 CV 的偏差—
这个实验里的数据是纯噪声:标签和特征完全独立,任何模型的真实准确率都只能是 50%。可是看第一根柱子——在 20 个候选模型里挑分数最高的那个,单层交叉验证会报出 58.8% 的"准确率"。把候选数加到 50,它会报 62.3%。这个数完全是假的,但它长得像一个像模像样的结果,足以让人写进报告里。问题出在哪儿?出在用同一份数据既选了模型又报了分数。交叉验证的分数本身是有波动的;在很多候选里挑最大的那个,挑到的往往是"运气最好"的那个,而不是"最好"的那个。这和"在一百个指标里找显著性"是同一类错误。嵌套交叉验证的做法是把两件事分开:外层留出一折完全不碰,内层在剩下的数据里选模型,选完以后拿外层那一折来报分数。第二根柱子给出的是 49.8%——诚实地回到了真相。把候选模型数、样本数、折数各拖一遍,你会看到规律:候选越多、样本越少,乐观偏差越大;而嵌套 CV 的偏差始终在零附近。实践里的三条建议:报告分数一定要用没参与过任何选择的数据;"我试了 200 组超参数,最好的那组交叉验证 0.93"这句话本身不构成证据;如果算力不够做嵌套 CV,至少要在最开始就切出一份从头到尾不碰的测试集。

这一页想说的

调参可以做得很讲道理。学习曲线告诉你缺的是数据还是模型,而噪声下限告诉你到哪儿就该收手;同样的预算下随机搜索通常优于网格,因为超参数的重要性从不均匀;评估很贵时用贝叶斯优化,但别忘了代理模型自己也有超参数;最后也是最重要的一条:用来选模型的数据,不能再用来报分数。

接着看

← 返回模块 ← 返回探索专题