\[ \begin{align}\begin{aligned}\newcommand{\ba}{\boldsymbol{a}} \newcommand{\bb}{\boldsymbol{b}} \newcommand{\be}{\boldsymbol{e}} \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{\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} \]

模型诊断与训练策略#

学习目标与记号#

  获得较小的训练损失并不意味着模型能够稳定泛化。参数初始化已经在前一章的 网络模型参数的初始化 中介绍,本章不再把它作为独立内容重复讲解,而是集中讨论数据划分、模型诊断、正则化、归一化、优化方法与超参数选择。本章围绕可复现的诊断—实验—验证流程展开;学习目标是能够区分参数与超参数,利用训练集和验证集上的表现定位问题,并在其他条件相同的情况下比较训练策略,根据实验结果分析策略变化可能带来的影响,同时避免测试信息泄漏。

  1. 准确解释参数与超参数,以及训练集、验证集和测试集的不同用途;

  2. 根据训练集与验证集上的表现诊断模型问题,并分析正则化、归一化和优化设置可能带来的影响;

  3. Python 实现或验证超参数搜索;在其他条件相同的情况下,只改变一个需要研究的因素进行比较,并根据实验结果分析该因素可能带来的影响。

  本章沿用统一记号:普通小写字母表示标量,粗体小写字母表示向量,粗体大写字母表示矩阵或高阶张量;层编号写作上标 \([l]\)⁠,样本或时间编号写作下标;转置写作 \(\trans\)⁠。除非另有说明,批量样本按行存放。本章各节的程序均应同时检查数值结果和数组维度。

核心推导与实现核验#

核心关系

\[\widehat\lambda=\argmin_{\lambda\in\Lambda}\widehat R_{\mathrm{valid}}(\widehat\btheta_\lambda).\]

  推导路径。 内层用训练集在给定超参数 \(\lambda\) 下估计模型参数,外层用验证集比较候选;当模型结构、训练方法和所有参数设置都被确定下来后,我们用测试集评价模型的实际表现。这是两类优化变量和三种数据职责的分离。

关键条件

  如果根据测试结果从多个模型中挑选表现最好的模型,就容易选中一个碰巧在当前测试集上表现较好的模型。此时报告的测试结果可能比模型面对其他新数据时的实际表现更好。比较的模型越多,这种现象通常越明显。

数据规模

  模型中的每个参数都需要一个同样大小的梯度:一个标量参数对应一个梯度值,一个矩阵参数对应一个同样大小的梯度矩阵。学习率等超参数通常只是少量数值或训练规则,不会像模型参数那样为每个元素保存梯度。

常见误区

  如果一次改变多个因素,就无法判断结果差异究竟由哪个因素造成;如果只保留最好的一次随机结果,或者依据测试集结果继续调整模型,也会使结论失去可信度。

动手检查

  使用相同的数据划分和随机种子重复运行程序;检查选择超参数时没有读取测试集指标,并记录每次运行的完整设置,确认各方案只在正在比较的因素上不同。

数值稳定性与规模

  学习率、正则化系数等可能跨越多个数量级的参数,应按照不同数量级选择候选值,例如可以考虑 \(10^{-5},10^{-4},\ldots,1,10\) 等。进行多次实验时,应保存每次实验的原始结果;如果某次实验失败,应记录失败情况和原因,不能在计算平均结果前直接将其删除。比较模型之前,还应检查损失、准确率等指标是否为正常的有限数值;出现无穷大或无效数值的实验不能参与排序。

本章小结#

  1. 模型参数和超参数应在概念与程序状态上分离。

  2. 验证集用于选择,测试集用于确定方案后的最终评估。

  3. 诊断应先保证实现和优化正确,再讨论泛化。