序言
在深度学习的广阔领域中,模型训练与优化的艺术不仅关乎于网络结构的精妙设计,更在于如何高效且智能地控制学习过程,以避免过拟合这一顽疾。提前终止(Early Stopping)便是这样一种行之有效的策略,它基于一种直观而深刻的洞察:随着训练迭代次数的增加,模型在训练数据上的性能通常会持续提升,但在未见过的测试数据上的泛化能力却可能先升后降,即出现过拟合现象。提前终止旨在在模型开始显著过拟合之前,适时中断训练过程,以此保留模型在验证集上表现最佳的状态,从而实现训练效率与泛化能力的良好平衡。
提前终止
-
当训练有足够的表示能力甚至会过度拟合的大模型时,我们经常观察到,训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。下图是这些现象的一个例子,这种现象几乎一定会出现。
-
图例1:学习曲线显示负对数似然损失如何随时间变量(表示为遍历数据集的训练迭代数,或轮数(epochs))
-
图例1说明:
- 我们在 MINST \text{MINST} MINST上训练了一个 maxtout \text{maxtout} maxtout网络。
- 我们可以观察到训练目标随时间持续减小,但验证集上的平均损失最终会再次增加,形成不对称的 U \text{U} U形曲线。
-
这意味着如果我们返回使验证集误差最低的参数设置,就可以获得更好的模型(因此,有希望获得更好的测试误差)。
- 在每次验证集误差有所改善后,我们存储模型参数的副本。
- 当训练算法终止时,我们返回这些参数而不是最新的参数。
- 当验证集上的误差在事先指定的循环内没有进一步改善时,算法就会终止。此过程在算法1更正式的说明。
-
这种策略被称为提前终止 (early stopping)。这可能是深度学习中最常用的正则化形式。它的流行主要是因为有效性和简单性。
-
我们可以认为提前终止是非常高效的超参数选择算法。
- 按照这种观点,训练步数仅是另一个超参数。
- 我们从图例1可以看到的,这个超参数在验证集上的具有 U \text{U} U形性能曲线。
- 很多控制模型容量的超参数在验证集上都是这样的 U \text{U} U型性能曲线,如图例1。
- 在提前终止的情况下,我们通过拟合训练集的步数来控制模型的有效容量。
- 大多数超参数的选择必须使用昂贵的猜测和检查过程,我们需要在训练开始时猜测一个超参数,然后运行几个步骤检查它的训练效果。
- “训练时间”是唯一只要跑一次训练就能尝试很多值的超参数。
- 【提前终止代价1】通过提前终止自动选择超参数的唯一显著的代价是训练期间要定期评估验证集。
- 理想情况下,这可以并行在与主训练过程分离的机器上,或独立的 CPU \text{CPU} CPU,或独立的 GPU \text{GPU} GPU上完成。如果没有这些额外的资源,可以使用比训练集小的验证集或较不频繁地评估验证集来减小评估代价,较粗略地估算取得最佳的训练时间。
- 【提前终止代价2】另一个提前终止的额外代价是需要保持最佳的参数副本。
- 这种代价一般是可忽略的,因为将它储存在较慢较大的存储器上(例如,在 GPU \text{GPU} GPU内存中训练,但将最佳参数存储在主存储器或磁盘驱动器上)。
- 由于最佳参数的写入很少发生而且从不在训练过程中读取,这些偶发的慢写入对总训练时间的影响不大。
-
提前终止是正则化非常不显眼的形式,它几乎不需要对基本训练过程、 目标函数或一组允许的参数值进行变化。
- 这意味着,无需破坏学习动态就能很容易地使用提前终止。
- 相对于权重衰减,必须小心不能使用太多的权重衰减,以防止网络陷入不良局部极小点(对应于病态的小权重)。
-
提前终止可单独使用或与其他的正则化策略相结合。
- 即使为鼓励更好泛化,使用修改目标函数的正则化策略,在训练目标的局部极小点达到最好泛化也是非常罕见的。
-
提前终止需要验证集,这意味着某些训练数据不能被馈送到模型。
- 为了更好地利用这一额外的数据,我们可以使用提前终止进行初步训练之后,进行额外的训练。
- 在第二轮额外的训练步骤中,所有的训练数据都被包括在内。
- 两个基本的策略可以用于第二轮训练过程。
- 一种策略(算法2)是再次初始化模型,然后使用所有数据再次训练。在这个第二轮训练过程中,我们使用第一轮提前终止训练确定的最佳步数。此过程有一些细微之处。例如,我们没有办法知道重新训练时,对参数进行相同次数的更新和对数据集进行相同的遍数哪一个更好。由于训练集变大了,在第二轮训练时,每遍历一次数据集将会对应更多次的参数更新。
- 另一个策略是保持从第一轮训练获得的参数,然后使用全部的数据继续训练。在这个阶段,已经没有验证集指导我们需要在训练多少步后终止。相反,我们可以监控验证集的平均损失函数,并继续训练,直到它低于提前终止过程终止时的目标值。此策略避免了重新训练模型的高成本,但表现并没有那么好。例如,验证集的目标不一定能达到之前的目标值,所以这种策略甚至不能保证终止。这个过程在算法3中更正式地表述。
-
提前终止对减少训练过程的计算成本也是有用的。除了由于限制训练的迭代次数而明显减少的计算成本,还带来了正则化的益处(不需要添加惩罚项的代价函数或计算这种附加项的梯度)。
-
提前终止是如何充当正则化的:
- 目前为止,我们已经声明提前终止是一种正则化策略,但我们只通过展示验证集误差的学习曲线是一个 U \text{U} U形的来支持这种说法。
-
提前终止正则化模型的真正机制是什么?
- Bishop (1995a) 和Sjöberg and Ljung (1995) 认为提前终止可以将优化过程的参数空间限制在初始参数值 θ o \boldsymbol{\theta}_o θo的小邻域内。
- 更具体地,想象用学习率 ϵ \epsilon ϵ进行 τ \tau τ个优化步骤(对应于 τ \tau τ个训练迭代)。
- 我们可以将 ϵ τ \epsilon\tau ϵτ作为有效容量的度量。
- 假设梯度有界,限制迭代的次数和学习速率会限制从 θ o \boldsymbol{\theta}_o θo到达的参数空间大小,如下图例2所示。在这个意义上, ϵ τ \epsilon\tau ϵτ的行为就好像它是权重衰减系数的倒数。
- 事实上,在二次误差的简单线性模型和简单的梯度下降情况下,我们可以展示提前终止相当于 L 2 L^2 L2正则化。
- 为了与经典 L 2 L^2 L2正则化比较,我们考察唯一的参数是线性权重 ( θ = w ) (\boldsymbol{\theta}=\boldsymbol{w}) (θ=w)的简单情形。
- 我们在权重 w \boldsymbol{w} w的经验最佳值 w ∗ \boldsymbol{w}^\ast w∗附近以二次近似建模代价函数 J J J:
J ^ ( θ ) = J ( w ∗ ) + 1 2 ( w − w ∗ ) ⊤ H ( w − w ∗ ) — 公式1 \hat{J}(\boldsymbol{\theta})=J(\boldsymbol{w}^\ast)+\frac{1}{2}(\boldsymbol{w}-\boldsymbol{w}^\ast)^\top\boldsymbol{H}(\boldsymbol{w}-\boldsymbol{w}^\ast)\quad\textbf{---\footnotesize{公式1}} J^(θ)=J(w∗)+21(w−w∗)⊤H(w−w∗)—公式1 - 其中 H \boldsymbol{H} H是 J J J关于 w \boldsymbol{w} w在 w ∗ \boldsymbol{w}^\ast w∗点的 Hessian \text{Hessian} Hessian。鉴于假设 w ∗ \boldsymbol{w}^\ast w∗是 J ( w ) J(\boldsymbol{w}) J(w)的最小点,我们知道 H \boldsymbol{H} H为半正定。在局部泰勒级数逼近下,梯度由下式给出:
∇ w J ^ ( w ) = H ( w − w ∗ ) — 公式2 \nabla_{\boldsymbol{w}}\hat{J}(\boldsymbol{w})=\boldsymbol{H}(\boldsymbol{w}-\boldsymbol{w}^\ast)\quad\textbf{---\footnotesize{公式2}} ∇wJ^(w)=H(w−w∗)—公式2
- 我们在权重 w \boldsymbol{w} w的经验最佳值 w ∗ \boldsymbol{w}^\ast w∗附近以二次近似建模代价函数 J J J:
- 我们要研究训练时参数向量的轨迹。为简化起见,我们参数向量初始化为 原点 注 1 \text{原点}^{注1} 原点注1,也就是 w ( 0 ) = 0 \boldsymbol{w}^{(0)}=0 w(0)=0。我们通过分析 J ^ \hat{J} J^的梯度下降研究 J J J上近似的梯度下降行为:
{ w ( τ ) = w ( τ − 1 ) − ϵ ∇ w J ^ ( w ( τ − 1 ) ) — 公式3 = w ( τ − 1 ) − ϵ H ( w ( τ − 1 ) − w ∗ ) — 公式4 w ( τ ) − w ∗ = ( I − ϵ H ) ( w ( τ − 1 ) − w ∗ ) — 公式5 \begin{cases}\begin{aligned}\boldsymbol{w}^{(\tau)}&=\boldsymbol{w}^{(\tau-1)}-\epsilon\nabla_{\boldsymbol{w}}\hat{J}(\boldsymbol{w}^{(\tau-1)})&\quad\textbf{---\footnotesize{公式3}}\\&=\boldsymbol{w}^{(\tau-1)}-\epsilon\boldsymbol{H}(\boldsymbol{w}^{(\tau-1)}-\boldsymbol{w}^\ast)&\quad\textbf{---\footnotesize{公式4}}\\\boldsymbol{w}^{(\tau)}-\boldsymbol{w}^\ast&=(\boldsymbol{I}-\epsilon\boldsymbol{H})(\boldsymbol{w}^{(\tau-1)}-\boldsymbol{w}^\ast)&\quad\textbf{---\footnotesize{公式5}}\end{aligned}\end{cases} ⎩ ⎨ ⎧w(τ)w(τ)−w∗=w(τ−1)−ϵ∇wJ^(w(τ−1))=w(τ−1)−ϵH(w(τ−1)−w∗)=(I−ϵH)(w(τ−1)−w∗)—公式3—公式4—公式5 - 现在让我们在 H \boldsymbol{H} H特征向量的空间中改写表达式,利用 H \boldsymbol{H} H的特征分解: H = Q Λ Q ⊤ \boldsymbol{H}=\boldsymbol{Q}\Lambda\boldsymbol{Q}^\top H=QΛQ⊤,其中 Λ \Lambda Λ是对角矩阵, Q \boldsymbol{Q} Q是特征向量的一组标准正交基。
{ w ( τ ) − w ∗ = ( I − ϵ Q Λ Q ⊤ ) ( w ( τ − 1 ) − w ∗ ) — 公式6 Q ⊤ ( w ( τ ) − w ∗ ) = ( I − ϵ Λ ) Q ⊤ ( w ( τ − 1 ) − w ∗ ) — 公式7 \begin{cases}\begin{aligned}\boldsymbol{w}^{(\tau)}-\boldsymbol{w}^\ast&=(\boldsymbol{I}-\epsilon\boldsymbol{Q}\Lambda\boldsymbol{Q}^\top)(\boldsymbol{w}^{(\tau-1)}-\boldsymbol{w}^\ast)&\quad\textbf{---\footnotesize{公式6}}\\\boldsymbol{Q}^\top(\boldsymbol{w}^{(\tau)}-\boldsymbol{w}^\ast)&=(\boldsymbol{I}-\epsilon\Lambda)\boldsymbol{Q}^\top(\boldsymbol{w}^{(\tau-1)}-\boldsymbol{w}^\ast)&\quad\textbf{---\footnotesize{公式7}}\end{aligned}\end{cases} {w(τ)−w∗Q⊤(w(τ)−w∗)=(I−ϵQΛQ⊤)(w(τ−1)−w∗)=(I−ϵΛ)Q⊤(w(τ−1)−w∗)—公式6—公式7 - 假定 w ( 0 ) = 0 \boldsymbol{w}^{(0)}=0 w(0)=0并且 ϵ \epsilon ϵ选择得足够小以保证 ∣ 1 − ϵ λ i ∣ < 1 |1-\epsilon\lambda_i|<1 ∣1−ϵλi∣<1,经过 τ \tau τ次参数更新后轨迹如下:
Q ⊤ w ( τ ) = [ I − ( I − ϵ Λ ) τ ] Q ⊤ w ∗ — 公式8 \boldsymbol{Q}^\top\boldsymbol{w}^{(\tau)}=\left[\boldsymbol{I}-(\boldsymbol{I}-\epsilon\Lambda)^{\tau}\right]\boldsymbol{Q}^\top\boldsymbol{w}^\ast\quad\textbf{---\footnotesize{公式8}} Q⊤w(τ)=[I−(I−ϵΛ)τ]Q⊤w∗—公式8 - 现在,参数范数惩罚篇-公式12,即 w ~ = Q ( Λ + α I ) − 1 Λ Q ⊤ w ∗ \tilde{\boldsymbol{w}}=\boldsymbol{Q}(\Lambda+\alpha\boldsymbol{I})^{-1}\Lambda\boldsymbol{Q}^\top\boldsymbol{w}^\ast w~=Q(Λ+αI)−1ΛQ⊤w∗中的 Q ⊤ w ∗ \boldsymbol{Q}^\top\boldsymbol{w}^\ast Q⊤w∗表达式能被重写为:
{ Q ⊤ w ~ = ( Λ + α I ) − 1 Λ Q ⊤ w ∗ — 公式9 Q ⊤ w ~ = [ I − ( Λ + α I ) − 1 α ] Q ⊤ w ∗ — 公式10 \begin{cases}\begin{aligned}\boldsymbol{Q}^\top\tilde{\boldsymbol{w}}&=(\Lambda+\alpha\boldsymbol{I})^{-1}\Lambda\boldsymbol{Q}^\top\boldsymbol{w}^\ast&\quad\textbf{---\footnotesize{公式9}}\\\boldsymbol{Q}^\top\tilde{\boldsymbol{w}}&=\left[\boldsymbol{I}-(\Lambda+\alpha\boldsymbol{I})^{-1}\alpha\right]\boldsymbol{Q}^\top\boldsymbol{w}^\ast&\quad\textbf{---\footnotesize{公式10}}\end{aligned}\end{cases} {Q⊤w~Q⊤w~=(Λ+αI)−1ΛQ⊤w∗=[I−(Λ+αI)−1α]Q⊤w∗—公式9—公式10 - 比较公式8和公式10,我们能够发现,如果超参数 ϵ , α \epsilon,\alpha ϵ,α和 τ \tau τ满足如下:
( I − ϵ Λ ) τ = ( Λ + α I ) − 1 α — 公式11 (\boldsymbol{I}-\epsilon\Lambda)^\tau=(\Lambda+\alpha\boldsymbol{I})^{-1}\alpha\quad\textbf{---\footnotesize{公式11}} (I−ϵΛ)τ=(Λ+αI)−1α—公式11
注1:对于神经网络,我们需要打破隐藏单元间的对称平衡因此不能将所有参数都初始化为 0 0 0(如在基于梯度的学习中所讨论的)。然而,对于其他任何初始值 w ( 0 ) \boldsymbol{w}_{(0)} w(0)该论证都成立。 - 那么 L 2 L^2 L2正则化和权重衰减可以被看做是等价的(至少在目标函数的二次近似下)。进一步取对数,使用 log ( 1 + x ) \log (1+x) log(1+x)的级数展开,我们可以得出结论:如果所有 λ i \lambda_i λi是小的(即 ϵ λ i ≪ 1 \epsilon\lambda_i \ll 1 ϵλi≪1且 λ i α ≪ 1 \frac{\lambda_i}{\alpha} \ll 1 αλi≪1),那么
{ τ ≈ 1 ϵ α — 公式12 α ≈ 1 τ ϵ — 公式13 \begin{cases}\begin{aligned}\tau &\approx \frac{1}{\epsilon\alpha}\quad\textbf{---\footnotesize{公式12}}\\\alpha&\approx\frac{1}{\tau\epsilon}\quad\textbf{---\footnotesize{公式13}}\end{aligned}\end{cases} ⎩ ⎨ ⎧τα≈ϵα1—公式12≈τϵ1—公式13 - 也就是说,在这些假设下,训练迭代次数 τ \tau τ起着与 L 2 L^2 L2参数成反比的作用, τ ϵ \tau\epsilon τϵ的倒数与权重衰减系数的作用类似。
-
对应显著曲率(目标函数)方向的参数值正则化小于小曲率方向。当然,在提前终止的情况下,这实际上意味着对应于显著曲率方向的参数比较小的曲率方向的参数学习得更早。
-
本章中的推导表明长度为 τ \tau τ的轨迹结束于 L 2 L^2 L2正则化目标的极小点。
- 当然,提前终止比简单的轨迹长度限制更丰富;相反,提前终止通常涉及监控验证集的错误,以便在空间特别好的点处终止轨迹。
- 因此提前终止比权重衰减更具有优势,提前终止能自动确定正则化的正确量,而权重衰减需要多个训练实验测试其超参数的不同值。
-
图例2:提前终止效果的示意图。
-
图例2说明:
- 左图:
- 实线轮廓线表示负对数似然的轮廓。
- 虚线表示从原点开始的 SGD \text{SGD} SGD所经过的轨迹。
- 提前终止的轨迹在较早的点 w ~ \tilde{\boldsymbol{w}} w~处停止,而不是停止在最小化代价的点 w ∗ \boldsymbol{w}^\ast w∗处。
- 右图:
- 为了对比,使用 L 2 L^2 L2正则化效果的示意图。
- 虚线圆圈表示 L 2 L^2 L2惩罚的轮廓, L 2 L^2 L2惩罚使得总代价的最小值比非正则化代价的最小值更靠近原点。
- 左图:
-
算法1
用于确定最佳训练时间量的提前终止元算法。这种元算法是一种通用策略,可以很好在各种训练算法和各种量化验证集误差的方法上工作。
伪代码
令 n n n为评估间隔的步数。
令 p p p为“耐心(patience)”,即观察到较坏的验证集表现 p p p次后终止。
令 θ o \boldsymbol{\theta}_o θo为初始参数。
θ ← θ o \boldsymbol{\theta}\gets \boldsymbol{\theta}_o θ←θo
i ← 0 i\gets 0 i←0
j ← 0 j\gets 0 j←0
v ← ∞ v\gets\infty v←∞
θ ∗ ← θ \boldsymbol{\theta}^\ast\gets\boldsymbol{\theta} θ∗←θ
i ∗ ← i i^\ast\gets i i∗←i
w h i l e \bold{while} while j < p j<p j<p d o \bold{do} do
\quad 运行训练算法 n n n步,更新 θ \boldsymbol{\theta} θ
i ← i + n \quad i\gets i+n i←i+n
v ′ ← ValidationSetError ( θ ) \quad v'\gets \text{ValidationSetError}(\boldsymbol{\theta}) v′←ValidationSetError(θ)
\quad i f \bold{if} if v ′ < v v'<v v′<v t h e n \bold{then} then
j ← 0 \qquad j\gets 0 j←0
θ ∗ ← θ \qquad \boldsymbol{\theta}^\ast\gets\boldsymbol{\theta} θ∗←θ
i ∗ ← i \qquad i^\ast\gets i i∗←i
v ← v ′ \qquad v\gets v' v←v′
\quad e l s e \bold{else} else
j ← j + 1 \qquad j\gets j+1 j←j+1
\quad e n d \bold{end} end i f \bold{if} if
e n d \bold{end} end w h i l e \bold{while} while
最佳参数为 θ ∗ \boldsymbol{\theta}^\ast θ∗,最佳训练步数为 i ∗ i^\ast i∗
-
算法2
使用提前终止确定训练步数,然后在所有数据上训练的元算法。
伪代码
令 X ( train ) \boldsymbol{X}^{(\text{train})} X(train)和 y ( train ) \boldsymbol{y}^{(\text{train})} y(train)为训练集。
将 X ( train ) \boldsymbol{X}^{(\text{train})} X(train)和 y ( train ) \boldsymbol{y}^{(\text{train})} y(train)分别分割为( X ( subtrain ) \boldsymbol{X}^{(\text{subtrain})} X(subtrain), X ( valid ) \boldsymbol{X}^{(\text{valid})} X(valid))和( y ( subtrain ) \boldsymbol{y}^{(\text{subtrain})} y(subtrain), y ( valid ) \boldsymbol{y}^{(\text{valid})} y(valid))。
从随机 θ \boldsymbol{\theta} θ开始,使用 X ( subtrain ) \boldsymbol{X}^{(\text{subtrain})} X(subtrain)和 y ( subtrain ) \boldsymbol{y}^{(\text{subtrain})} y(subtrain)作为训练集, X ( valid ) \boldsymbol{X}^{(\text{valid})} X(valid)和 y ( valid ) \boldsymbol{y}^{(\text{valid})} y(valid)作为验证集,运行算法1。这将返回最佳训练步数 i ∗ i^\ast i∗。
将 θ \boldsymbol{\theta} θ再次设为随机值。
最后,在 X ( train ) \boldsymbol{X}^{(\text{train})} X(train)和 y ( train ) \boldsymbol{y}^{(\text{train})} y(train)上训练 i ∗ i^\ast i∗步。
-
算法3
使用提前终止确定将会过拟合的目标值,然后再所有数据上训练直到再次达到该值的元算法。
伪代码
令 X ( train ) \boldsymbol{X}^{(\text{train})} X(train)和 y ( train ) \boldsymbol{y}^{(\text{train})} y(train)为训练集。
将 X ( train ) \boldsymbol{X}^{(\text{train})} X(train)和 y ( train ) \boldsymbol{y}^{(\text{train})} y(train)分别分割为( X ( subtrain ) \boldsymbol{X}^{(\text{subtrain})} X(subtrain), X ( valid ) \boldsymbol{X}^{(\text{valid})} X(valid))和( y ( subtrain ) \boldsymbol{y}^{(\text{subtrain})} y(subtrain), y ( valid ) \boldsymbol{y}^{(\text{valid})} y(valid))。
从随机 θ \boldsymbol{\theta} θ开始,使用 X ( subtrain ) \boldsymbol{X}^{(\text{subtrain})} X(subtrain)和 y ( subtrain ) \boldsymbol{y}^{(\text{subtrain})} y(subtrain)作为训练集, X ( valid ) \boldsymbol{X}^{(\text{valid})} X(valid)和 y ( valid ) \boldsymbol{y}^{(\text{valid})} y(valid)作为验证集,运行算法1。这会更新 θ \boldsymbol{\theta} θ。
ϵ ← J ( θ , X ( subtrain ) , y ( subtrain ) ) \epsilon\gets J(\boldsymbol{\theta},\boldsymbol{X}^{(\text{subtrain})},\boldsymbol{y}^{(\text{subtrain})}) ϵ←J(θ,X(subtrain),y(subtrain))
w h i l e \bold{while} while J ( θ , X ( valid ) , y ( valid ) ) > ϵ J(\boldsymbol{\theta},\boldsymbol{X}^{(\text{valid})},\boldsymbol{y}^{(\text{valid})})>\epsilon J(θ,X(valid),y(valid))>ϵ d o \bold{do} do
\quad 在 X ( train ) \boldsymbol{X}^{(\text{train})} X(train)和 y ( train ) \boldsymbol{y}^{(\text{train})} y(train)上训练 n n n步。
e n d \bold{end} end w h i l e \bold{while} while
总结
- 总而言之,提前终止是深度学习实践中一项简单而强大的技术,它通过监控模型在验证集上的性能变化,智能地决定何时停止训练,有效遏制了过拟合的发生。这一策略不仅简化了模型训练流程,减少了不必要的计算资源消耗,更在提升模型泛化能力方面展现出了显著优势。
- 因此,在追求更高精度与更好泛化性能的深度学习项目中,合理应用提前终止策略无疑是一项值得推荐的最佳实践。
往期内容回顾
应用数学与机器学习基础 - 容量、过拟合和欠拟合篇
应用数学与机器学习基础 - 超参数和验证集篇
深度网络现代实践 - 深度前馈网络之基于梯度的学习篇