超参数搜索策略:参考答案

目录

\[ \begin{align}\begin{aligned}\newcommand{\ba}{\boldsymbol{a}} \newcommand{\bb}{\boldsymbol{b}} \newcommand{\be}{\boldsymbol{e}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \newcommand{\bw}{\boldsymbol{w}} \newcommand{\bx}{\boldsymbol{x}} \newcommand{\by}{\boldsymbol{y}} \newcommand{\bz}{\boldsymbol{z}} \newcommand{\bd}{\boldsymbol{d}} \newcommand{\bv}{\boldsymbol{v}} \newcommand{\bs}{\boldsymbol{s}}\\\newcommand{\btheta}{\boldsymbol{\theta}} \newcommand{\bbeta}{\boldsymbol{\beta}} \newcommand{\bgamma}{\boldsymbol{\gamma}} \newcommand{\bsigma}{\boldsymbol{\sigma}} \newcommand{\md}{\mbox{d}} \newcommand{\bmu}{\boldsymbol{\mu}} \newcommand{\bone}{\boldsymbol{1}} \newcommand{\bzero}{\boldsymbol{0}} \newcommand{\bepsilon}{\boldsymbol{\epsilon}} \newcommand{\bphi}{\boldsymbol{\phi}} \newcommand{\bh}{\boldsymbol{h}} \newcommand{\bc}{\boldsymbol{c}} \newcommand{\br}{\boldsymbol{r}} \newcommand{\bQ}{\boldsymbol{Q}} \newcommand{\bK}{\boldsymbol{K}} \newcommand{\bV}{\boldsymbol{V}} \newcommand{\bSigma}{\boldsymbol{\Sigma}} \newcommand{\bg}{\boldsymbol{g}} \newcommand{\bxi}{\boldsymbol{\xi}} \newcommand{\bvarepsilon}{\boldsymbol{\varepsilon}} \newcommand{\bdelta}{\boldsymbol{\delta}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \newcommand{\bJ}{\boldsymbol{J}} \newcommand{\bp}{\boldsymbol{p}} \newcommand{\bi}{\boldsymbol{i}} \newcommand{\bo}{\boldsymbol{o}} \newcommand{\bE}{\boldsymbol{E}} \newcommand{\bH}{\boldsymbol{H}} \newcommand{\bL}{\boldsymbol{L}} \newcommand{\bu}{\boldsymbol{u}} \newcommand{\bLambda}{\boldsymbol{\Lambda}} \newcommand{\trans}{^{\rm\scriptsize T}} \newcommand{\var}{\mathrm{var}}\\\newcommand{\bA}{\boldsymbol{A}} \newcommand{\bB}{\boldsymbol{B}} \newcommand{\bC}{\boldsymbol{C}} \newcommand{\bD}{\boldsymbol{D}} \newcommand{\bG}{\boldsymbol{G}} \newcommand{\bI}{\boldsymbol{I}} \newcommand{\bM}{\boldsymbol{M}} \newcommand{\bP}{\boldsymbol{P}} \newcommand{\bS}{\boldsymbol{S}} \newcommand{\bU}{\boldsymbol{U}} \newcommand{\bW}{\boldsymbol{W}} \newcommand{\bX}{\boldsymbol{X}} \newcommand{\bY}{\boldsymbol{Y}} \newcommand{\bZ}{\boldsymbol{Z}} \newcommand{\cotp}{\textcolor[RGB]{48,209,88}{TP}} \newcommand{\cotn}{\textcolor[RGB]{100,210,255}{TN}} \newcommand{\cofp}{\textcolor[RGB]{94,92,230}{FP}} \newcommand{\cofn}{\textcolor[RGB]{191,90,242}{FN}}\\\newcommand{\numcotp}{\textcolor[RGB]{48,209,88}{50}} \newcommand{\numcotn}{\textcolor[RGB]{100,210,255}{30}} \newcommand{\numcofp}{\textcolor[RGB]{94,92,230}{10}} \newcommand{\numcofn}{\textcolor[RGB]{191,90,242}{10}} \DeclareMathOperator*{\argmin}{arg\,min}\end{aligned}\end{align} \]

超参数搜索策略:参考答案#

返回正文练习 · 返回答案索引

说明#

以下答案与正文 9 道题逐题对应。推导题给出主要步骤;编程和实验题给出参考程序和检查方法,并说明结果适用于哪些条件。

  1. 变量变换 \(u=\log\lambda\) 的雅可比为 \(|du/d\lambda|=1/\lambda\)⁠,故 \(f_\Lambda(\lambda)=1/[\lambda\log(b/a)]\)⁠,\(a\leq\lambda\leq b\)⁠,区间外为 0。对任意 \(c>0\)\([x,cx]\subseteq[a,b]\)⁠,其概率为 \(\int_x^{cx}d\lambda/[\lambda\log(b/a)]=\log c/\log(b/a)\)⁠,只依赖倍率 \(c\)⁠,不依赖起点。

  2. 一次未命中的概率为 \(1-p\)⁠,独立搜索 \(n\) 次均未命中的概率为 \((1-p)^n\)⁠,所以至少命中一次的概率为 \(1-(1-p)^n\)⁠。代入得 \(1-0.9^{20}\approx1-0.1216=0.8784\)⁠。独立性和每次具有相同命中概率是该计算的前提。

  3. 完整网格有 \(5\times4\times3=60\) 个候选,总训练量为 \(60\times30=1800\) 轮。随机搜索为 \(20\times30=600\) 轮,按训练轮数节省 \(1-600/1800=2/3\)⁠。候选数只表示尝试了多少组参数,不能说明每组参数训练了多久。例如,两种方法即使都尝试 20 组参数,如果一种方法将每组参数训练 10 轮,另一种方法训练 100 轮,它们使用的计算资源就相差很大。因此,比较时应尽量让总训练轮数、总训练时间或计算资源保持相近,并同时报告这些数值。

  4. 配置应先规范化再计算稳定哈希:

    def sample_config(rng, low, high, optimizers):
        lr = np.exp(rng.uniform(np.log(low), np.log(high)))
        return {"lr": float(lr), "optimizer": str(rng.choice(optimizers))}
    
    def config_id(config):
        payload = json.dumps(config, sort_keys=True, separators=(",", ":"))
        return hashlib.sha256(payload.encode()).hexdigest()[:16]
    
    record = {"config": config, "id": config_id(config), "seed": seed,
              "epochs": epochs, "valid_metric": metric,
              "seconds": elapsed, "status": status}
    

    浮点候选若需要去重,应在搜索空间定义阶段规定精度,不能在记录后随意四舍五入。

  5. 三种搜索器都接收同一 train(config, seed, resource) 函数并只返回验证指标。网格搜索依次尝试所有候选组合;随机搜索使用能够重复得到相同结果的随机数生成器采样并去重;逐步缩减 在每一轮为尚未淘汰的配置分配相同的训练资源,再根据预先规定的验证指标和并列处理规则选择进入下一轮的配置。程序应累计记录已经使用的训练资源,并检查总量没有超过上限。测试集评价应放在搜索完成、配置与训练流程确定之后的单独函数中。

  6. 可以用 assert 依次完成以下检查:重复采样多次,确认每个超参数都在规定范围内;分别使用相同的随机种子运行两次,确认得到的配置序列完全相同;确认 {"a":1,"b":2}{"b":2,"a":1} 得到相同的配置标识;重复提交同一配置,确认模型训练函数只被调用一次;使用一组预先知道总量的训练轮数,核对程序记录的总训练资源。还可以给测试集评价函数增加调用次数记录,在搜索结束前确认其调用次数始终为 0;如果搜索程序调用了该函数,就立即报告错误。此外,输入 \(a\leq0\)\(a\geq b\) 等不合理的搜索范围时,程序也应给出错误提示。

  7. 三种策略应共享完全相同的划分、预处理、种子集合和预算计量方法。搜索后各自只用验证集选一个配置,再按相同规则重训并对测试集评价一次。结果表列出测试指标均值与波动、搜索秒数、最终训练秒数、预先运行后测得的固定批量预测时间、所选参数量和全过程峰值内存。随机搜索通常更灵活,逐步缩减可能节约劣质候选成本但有误淘汰风险;不能预先断言任何策略必胜。

  8. 两个采样器必须产生相同数量的候选,并为每个候选分配相同训练轮数和种子。学习率跨多个数量级时,对数采样通常在各数量级覆盖更均衡,线性采样更集中于较大值,可能出现更多发散运行。应把发散计入有效运行比例并报告最佳验证配置的独立测试结果、搜索时间和内存。所选结构若相同,参数量与固定批量预测时间原则上不由采样方法直接决定;若结构也参与搜索,则必须如实报告。

  9. 三种 剪枝规则 应使用相同的最大训练资源,并为需要热身的方法设置相同的热身轮数,同时保留每个候选配置在训练早期的指标变化。可以把完整训练结果作为参照,统计哪些配置虽然被提前淘汰,但在完成全部训练后原本可能进入前几名。较早、较多地淘汰配置通常可以节省训练时间,却可能误删训练初期表现一般、后期才逐渐变好的配置;带热身期的逐步缩减在节省计算量和降低误淘汰风险之间进行折中。最终结果还应包含选定模型的测试指标、固定批量预测时间、参数量和峰值内存,不能只根据搜索速度评价一种规则。