超参数调优(hyperparameter tuning)
/ HY-per-puh-RAM-uh-ter TOON-ing /
超参数,是你在训练开始之前就要选定的设置——学习率、批量大小、多少层、权重衰减多强——它们与权重相对,而权重是模型自己学出来的。超参数调优,就是去搜寻这些设置的一个好组合。想象烤面包:菜谱里的炉温和烤制时间是你必须拨准的超参数,而面团最终的口感,则是在这些定下之后才自己「学」出来的。
因为你通常算不出最佳设置,你就得做实验。网格搜索(grid search)在一张预先定好的数值网格上试遍每一种组合——周到,却昂贵,因为每多加一个旋钮,组合数就爆炸式增长。随机搜索(random search)则随机抽取组合,而且——也许出人意料——往往比网格更快找到好设置,因为它不会把力气浪费在穷举那些其实无关紧要的旋钮上。更高级的方法(如贝叶斯优化)会用早先的结果来决定下一步试什么。
每个候选都在验证集上评判,绝不用测试集——测试集要留作最后那个诚实的估计。现实的图景是调优代价高昂:每一次试验都是一整次(或部分)训练,所以人们倚重好的默认值,只调那几个最要紧的超参数(先调学习率),并为搜索定好预算。一个微妙的陷阱,是针对验证集调得太狠,以至于对它过拟合了,这正是为什么必须另留一份从不碰的测试集,没有商量余地。
调两个旋钮——学习率(试0.1、0.01、0.001)和批量大小(试32、128)。网格搜索把全部 3×2 = 6 种组合都跑一遍。随机搜索则可能从连续区间里随机抽6组(学习率,批量)的搭配,往往落得离真正的最佳更近,因为它探索了更多互不相同的学习率取值——而学习率正是这里最要紧的旋钮。
按每一块钱的算力来算,随机搜索往往胜过网格搜索。
永远在验证集上挑超参数,并在留出的测试集上报告最终数字。针对测试集来调,会悄悄泄露信息、虚高你的结果——这是一种常见而代价高昂的自欺。