入理解深度学习——正则化(Regularization):提前终止(Early Stopping)

news/2024/11/14 22:42:24/

分类目录:《深入理解深度学习》总目录


当训练有足够的表示能力甚至会过拟合的大模型时,我们经常观察到,训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。下图是这些现象的一个例子,这种现象几乎一定会出现。
随着时间的推移逐渐降低但验证集的误差会再次上升

这意味着我们只要返回使验证集误差最低的参数设置,就可以获得验证集误差更低的模型(并且因此有希望获得更好的测试误差)。在每次验证集误差有所改善后,我们存储模型参数的副本。当训练算法终止时,我们返回这些参数而不是最新的参数。当验证集上的误差在事先指定的循环次数内没有进一步改善时,算法就会终止。这种策略被称为提前终止(Early Stopping)。这可能是深度学习中最常用的正则化形式。它的流行主要是因为有效性和简单性。

我们可以认为提前终止是非常高效的超参数选择算法。按照这种观点,训练步数仅是另一个超参数。我们从上图可以看到,这个超参数在验证集上具有U型性能曲线。很多控制模型容量的超参数在验证集上都是这样的U型性能曲线。在提前终止的情况下,我们通过控制拟合训练集的步数来控制模型的有效容量。大多数超参数的选择必须使用高代价的猜测和检查过程,我们需要在训练开始时猜测一个超参数,然后运行几个步骤检查它的训练效果。‘‘训练时间’’ 是唯一只要跑一次训练就能尝试很多值的超参数。通过提前终止自动选择超参数的唯一显著的代价是训练期间要定期评估验证集。在理想情况下,这可以并行在与主训练过程分离的机器上,或独立的CPU,或独立的GPU上完成。如果没有这些额外的资源,可以使用比训练集小的验证集或较不频繁地评估验证集来减小评估代价,较粗略地估算取得最佳的训练时间。

另一个提前终止的额外代价是需要保持最佳的参数副本。这种代价一般是可忽略的,因为可以将它储存在较慢较大的存储器上(例如,在GPU内存中训练,但将最佳参数存储在主存储器或磁盘驱动器上)。由于最佳参数的写入很少发生而且从不在训练过程中读取,这些偶发的慢写入对总训练时间的影响不大。

提前终止是一种非常不显眼的正则化形式,它几乎不需要改变基本训练过程、目标函数或一组允许的参数值。这意味着,无需破坏学习动态就能很容易地使用提前终止。相对于权重衰减,必须小心不能使用太多的权重衰减,以防网络陷入不良局部极小点(对应于病态的小权重)。提前终止可单独使用或与其他的正则化策略结合使用。即使为鼓励更好泛化,使用正则化策略改进目标函数,在训练目标的局部极小点达到最好泛化也是非常罕见的。

提前终止需要验证集,这意味着某些训练数据不能被馈送到模型。为了更好地利用这一额外的数据,我们可以在完成提前终止的首次训练之后,进行额外的训练。在第二轮,即额外的训练步骤中,所有的训练数据都被包括在内。有两个基本的策略都可以用于第二轮训练过程。一个策略是再次初始化模型,然后使用所有数据再次训练。在这个第二轮训练过程中,我们使用第一轮提前终止训练确定的最佳步数。此过程有一些细微之处。例如,我们没有办法知道重新训练时,对参数进行相同次数的更新和对数据集进行相同次数的遍历哪一个更好。由于训练集变大了,在第二轮训练时,每一次遍历数据集将会更多次地更新参数。另一个策略是保持从第一轮训练获得的参数,然后使用全部的数据继续训练。在这个阶段,已经没有验证集指导我们需要在训练多少步后终止。取而代之,我们可以监控验证集的平均损失函数,并继续训练,直到它低于提前终止过程终止时的目标值。此策略避免了重新训练模型的高成本,但表现并没有那么好。例如,验证集的目标不一定能达到之前的目标值,所以这种策略甚至不能保证终止。提前终止对减少训练过程的计算成本也是有用的。除了由于限制训练的迭代次数而明显减少的计算成本,还带来了正则化的益处(不需要添加惩罚项的代价函数或计算这种附加项的梯度)。

目前为止,我们已经声明提前终止是一种正则化策略,但我们只通过展示验证集误差的学习曲线是一个U型曲线来支持这种说法。我们认为提前终止可以将优化过程的参数空间限制在初始参数值 θ 0 \theta_0 θ0的小邻域内。更具体地,想象用学习率 ϵ \epsilon ϵ进行 τ \tau τ个优化步骤(对应于 τ \tau τ个训练迭代)。我们可以将 ϵ τ \epsilon\tau ϵτ作为有效容量的度量。假设梯度有界,限制迭代的次数和学习速率能够限制从 θ 0 \theta_0 θ0到达的参数空间的大小,如下图所示。在这个意义上, ϵ τ \epsilon\tau ϵτ的效果就好像是权重衰减系数的倒数。事实上,在二次误差的简单线性模型和简单的梯度下降情况下,我们可以展示提前终止相当于 L 2 L^2 L2正则化。
: 提前终止效果的示意图

参考文献:
[1] Lecun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015
[2] Aston Zhang, Zack C. Lipton, Mu Li, Alex J. Smola. Dive Into Deep Learning[J]. arXiv preprint arXiv:2106.11342, 2021.


http://www.ppmy.cn/news/99644.html

相关文章

Java数据结构之第十四章、泛型进阶

补充复杂示例&#xff1a; public class MyArray<E extends Comparable<E>> { ... } 表明E必须是实现了Comparable接口的 泛型基础内容 目录 一、通配符 二、通配符上界 三、通配符下界 一、通配符 ? 用于在泛型的使用&#xff0c;即为通配符 示例&#xf…

如何在华为OD机试中获得满分?Java实现【吃到最多的刚好合适的菜】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 入职后,导师会请你吃饭…

JavaScript 进阶 (二)

目录 深入对象 创建对象三种方式 构造函数 实例成员&静态成员 内置构造函数 Object Array String Number 深入对象 创建对象三种方式 1. 利用对象字面量创建对象 const obj { name : abc} 2. 利用 new Object 创建对象 const obj new Object({ uname: 123 }…

【五一创作】自动驾驶技术未来大有可为

本文概要 自动驾驶技术是当今汽车行业的发展热点之一&#xff0c;但其也存在着许多争议。大家也可以从以下几个维度谈谈你对这项技术的看法。 &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&#x1f31f;&#x1f31f; ☀️大家好&#xff01;我是新人小白博…

不要再来问我小学、初中毕业想出去学习编程找到工作的问题了,你要做就去做,结果自己扛着就行了!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

源码角度分析多线程并发情况下数据异常回滚方案

一、 多线程并发情况下数据异常回滚解决方案 在需要多个没有前后顺序的数据操作情况下&#xff0c;一般我们可以选择使用并发的形式去操作&#xff0c;以提高处理的速度&#xff0c;但并发情况下&#xff0c;我们使用 Transactional 还能解决事务回滚问题吗。 例如有下面表结…

ChatGPT使用总结:150个ChatGPT提示词模板(完整版)

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 所有提示词模板功能列表如下&#xff1a; &#x1f4bb; 充当 Linux 终端 i want you to act as a linux terminal. I will typ…

C语言之数组指针2.0

在 C 语言中&#xff0c;数组指针是一种特殊的指针类型&#xff0c;它是一个指向数组的指针。其声明形式为&#xff1a; <数据类型> (*<指针变量名>)[<数组长度>];例如&#xff0c;下面声明了一个指向整型数组的指针变量 arrPtr&#xff1a; int (*arrPtr)…