\[ \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 道题逐题对应。推导题给出主要步骤;编程和实验题给出参考程序和检查方法,并说明结果适用于哪些条件。
变量变换 \(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\),不依赖起点。
一次未命中的概率为 \(1-p\),独立搜索 \(n\) 次均未命中的概率为 \((1-p)^n\),所以至少命中一次的概率为 \(1-(1-p)^n\)。代入得 \(1-0.9^{20}\approx1-0.1216=0.8784\)。独立性和每次具有相同命中概率是该计算的前提。
完整网格有 \(5\times4\times3=60\) 个候选,总训练量为 \(60\times30=1800\) 轮。随机搜索为 \(20\times30=600\) 轮,按训练轮数节省 \(1-600/1800=2/3\)。候选数只表示尝试了多少组参数,不能说明每组参数训练了多久。例如,两种方法即使都尝试 20 组参数,如果一种方法将每组参数训练 10 轮,另一种方法训练 100 轮,它们使用的计算资源就相差很大。因此,比较时应尽量让总训练轮数、总训练时间或计算资源保持相近,并同时报告这些数值。
配置应先规范化再计算稳定哈希:
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}
浮点候选若需要去重,应在搜索空间定义阶段规定精度,不能在记录后随意四舍五入。
三种搜索器都接收同一 train(config, seed, resource) 函数并只返回验证指标。网格搜索依次尝试所有候选组合;随机搜索使用能够重复得到相同结果的随机数生成器采样并去重;逐步缩减 在每一轮为尚未淘汰的配置分配相同的训练资源,再根据预先规定的验证指标和并列处理规则选择进入下一轮的配置。程序应累计记录已经使用的训练资源,并检查总量没有超过上限。测试集评价应放在搜索完成、配置与训练流程确定之后的单独函数中。
可以用 assert 依次完成以下检查:重复采样多次,确认每个超参数都在规定范围内;分别使用相同的随机种子运行两次,确认得到的配置序列完全相同;确认 {"a":1,"b":2} 与 {"b":2,"a":1} 得到相同的配置标识;重复提交同一配置,确认模型训练函数只被调用一次;使用一组预先知道总量的训练轮数,核对程序记录的总训练资源。还可以给测试集评价函数增加调用次数记录,在搜索结束前确认其调用次数始终为 0;如果搜索程序调用了该函数,就立即报告错误。此外,输入 \(a\leq0\) 或 \(a\geq b\) 等不合理的搜索范围时,程序也应给出错误提示。
三种策略应共享完全相同的划分、预处理、种子集合和预算计量方法。搜索后各自只用验证集选一个配置,再按相同规则重训并对测试集评价一次。结果表列出测试指标均值与波动、搜索秒数、最终训练秒数、预先运行后测得的固定批量预测时间、所选参数量和全过程峰值内存。随机搜索通常更灵活,逐步缩减可能节约劣质候选成本但有误淘汰风险;不能预先断言任何策略必胜。
两个采样器必须产生相同数量的候选,并为每个候选分配相同训练轮数和种子。学习率跨多个数量级时,对数采样通常在各数量级覆盖更均衡,线性采样更集中于较大值,可能出现更多发散运行。应把发散计入有效运行比例并报告最佳验证配置的独立测试结果、搜索时间和内存。所选结构若相同,参数量与固定批量预测时间原则上不由采样方法直接决定;若结构也参与搜索,则必须如实报告。
三种 剪枝规则 应使用相同的最大训练资源,并为需要热身的方法设置相同的热身轮数,同时保留每个候选配置在训练早期的指标变化。可以把完整训练结果作为参照,统计哪些配置虽然被提前淘汰,但在完成全部训练后原本可能进入前几名。较早、较多地淘汰配置通常可以节省训练时间,却可能误删训练初期表现一般、后期才逐渐变好的配置;带热身期的逐步缩减在节省计算量和降低误淘汰风险之间进行折中。最终结果还应包含选定模型的测试指标、固定批量预测时间、参数量和峰值内存,不能只根据搜索速度评价一种规则。