原文:
towardsdatascience.com/i-used-to-hate-overfitting-but-now-im-grokking-it-e6e1dcfbdfd8
作为一位在计算机科学各个主题上花费了大量时间的人,其中数学抽象有时可能非常枯燥和抽象,我发现数据科学的实用性和动手操作性质就像一股清新的空气。它总是让我惊叹,即使是 simplest 的想法也能导致令人着迷的结果。
这篇文章面临了我刚刚偶然发现的这些令人惊讶的发现之一。
令人沮丧的介绍
我永远不会忘记我的学士学位论文的完成过程。虽然它不是关于机器学习的,但它对我产生了深远的影响,并且我会在尝试调整神经网络时不断提醒自己。那是一段紧张的时间,因为论文是关于声音传播的分析模型,旨在在浏览器中运行,因此性能非常有限,导致长时间运行的模拟。它经常在运行数小时后无法完成。但最糟糕的经历是解释错误配置的模拟,结果令人困惑,这通常让我认为整个模型都是无意义的。
当我实际训练神经网络时,这种情况有时也会发生。确定终止标准、分析错误或准确度指标可能会非常累人,只是为了得出模型未能泛化的结论。幸运的是,我现在不是数据科学家,失败也可以是一种乐趣。一个很好的例子是 Stable Diffusion 的微调。当微调出错时,它可以在图像生成过程中导致模糊而有趣的结果。
话虽如此,我想以一个众所周知的现象开始这篇文章,这个现象是在考虑学习理论时出现的。
一些基础知识
我想大多数读者都熟悉过拟合这个术语,但让我快速定义一下,以确保我们都在同一页上。过拟合基本上意味着模型过于复杂,并且学会了拟合训练数据中的噪声和特定模式,而不是学习潜在的通用模式。换句话说,它过度拟合了其训练数据。因此,过拟合的模型在训练数据上表现良好,但无法泛化到未见数据。
另一方面,当模型过于简单,无法捕捉训练数据的复杂性或潜在模式时,就会发生欠拟合。欠拟合的模型在训练数据和未见数据上的表现都较差。在我的经验中,过拟合是更常见且相关的问题。欠拟合通常是由于为给定问题选择了不合适的模型架构或模型参数所导致的,并且可以通过训练早期表现不佳轻松识别。
过度拟合需要仔细评估,即使模型在训练数据上表现出良好的结果。它可能由于训练参数或正则化技术的次优选择而出现。文献通常通过分类或回归任务来说明这个问题。想象一个与训练数据过于精确对齐的决策边界,这使得它对未来预测无效——它对训练数据的拟合过于完美。
作为旁注,这次讨论侧重于过度拟合训练数据,但同样的原则适用于超参数优化和过度拟合验证集。记住过度拟合与泛化的通用原则是有用的,这涉及到已见和未见的数据,而无需陷入数据集分解的具体细节。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/78df5e807de76b6ec5b5a498de013290.png
过度拟合的迹象(图片由作者提供)
一种在训练期间可视化问题的实用方法,这对本文的叙述有益,就是通过检查模型在训练数据上的准确率与验证集上的准确率。当训练准确率提高,但验证准确率保持不变或下降时,表明存在过度拟合。
前方的路
你是否有过这种感觉,在你了解一些新事物之后,你到处都能认出它,并问自己为什么以前从未注意到?对我来说,类似的感受导致了这篇文章。我无法确切地回忆起是在哪个场合发生的,但我确信不止一次,我有一些玩具模型,它们意外地得到了非常好的准确率,这远远超出了我预测它们会失败的时候。
最近,我偶然发现了一篇[论文](https://arxiv.org/abs/2405.20233),它不仅为这种现象提供了一个术语,而且还提出了一种几乎实用的变体——即掌握。这个术语对我来说当然很熟悉,因为我经常在技术领域使用和阅读这个短语。“我掌握了它”这个说法来自科幻小说,意思是理解到直观的程度。这篇论文中用 Grokking 来命名的机器学习现象,在摘要中得到了完美的描述:
对过度参数化神经网络的泛化,超出了对有限训练数据集的记忆。
让我们分解这个陈述。
首先,一个过参数化的模型指的是它对于训练数据来说过于复杂,以至于能够完全记住训练数据。进一步来说,在神经网络的情况下,“过于复杂”意味着模型对于训练集的大小来说输入参数太多。对于这类模型的一个非常常见的预期是它们会过拟合。这就是“对有限训练数据集的记忆”这个概念的含义——模型记住的是训练集,而不是为了在未见过的数据上表现良好而进行泛化。参考上一节中过拟合的可视化,模型对于训练数据的准确率接近完美,而验证集的准确率仍然可以忽略不计。此外,在这个背景下,另一个合理的概念是,一旦训练误差接近零,正在训练的模型变化不会很大。换句话说,过参数化的神经网络记住它们的训练集,之后变化不大。至少,这与我的经验是一致的。
现在的一个大惊喜是,接近完美训练准确率的神经网络,在进一步训练后,突然开始实现泛化。2022 年,在这篇论文中,研究人员通过在有限模数群上的二进制运算上训练一个 transformer,首次观察到了 grokking。除了关于二进制运算特征和正则化技术的影响的观察外,特别有趣的是,即使减少训练集大小,也可以实现泛化。这只是我个人的感觉吗?似乎缩减训练集实际上可以提高模型泛化性能,这似乎是反直觉的。从这个发现的一个明显含义是,理解和应用 grokking 可能是减少训练阶段资源消耗的好方法。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/db6c135b5ed04a77202290ec93b813a2.png
Groking – 延迟性能提升(作者图片)
关于这个主题的另一个优秀读物可以在这里找到,其中研究人员通过引入神经网络内部学习机制的电路来解释 grokking。简单来说,电路是一组具有专门角色的神经元。作者分析了两种可以帮助神经网络在训练期间表现良好的电路家族:
优秀的泛化电路:这些电路学习模式和规则,可以应用于新的、未见过的数据。它们不仅记住训练数据,实际上还理解了底层概念。
优秀的记忆电路:这些电路在记住训练数据中的特定例子方面非常出色,但它们可能不擅长将所学应用到新的情境中。
这两种类型的电路都可以帮助神经网络在训练期间实现良好的性能。然而,当网络必须在两种类型的电路之间进行选择时,它更倾向于那些更“高效”的电路。这里的效率意味着电路可以在不需要太多参数或太多复杂性的情况下产生强大的输出。因此,理解能力(grokking)可以通过这些电路的相互作用来解释。此外,作者们还提出了一些更细致的术语,如半理解和非理解,其中电路以这种方式竞争,模型开始“忘记”或分别达到半最优精度。
我找到的大部分文献都探讨了理解能力(grokking)的原因和关系。对于那些感兴趣的人来说,我下面列出了一些这些论文。许多这些阅读材料观察到与其他已知现象(如弹射)的关系,或者探讨了不同正则化技术对理解能力的影响。为了这篇文章的目的,我将就此停止。作为一个对这个领域好奇的实践者,唯一引起我进一步关注的是,这个观察是否有实际的应用价值。
发现实际应用
虽然理解能力的发现和特征已经非常有趣,但它似乎没有非常直接的实际应用意义。首先,理解能力似乎局限于特定的场景,但更重要的是,在几乎完美的记忆之后,泛化需要大量的迭代。这意味着需要大量的计算资源来利用它。
这让我回到了我最初的那篇论文,该论文介绍了一种名为Grokfast的算法,旨在通过加速收敛到泛化来使这一现象在实践上变得可行。作者们所陈述的核心起点是:
[…] 将参数在训练迭代中的一系列梯度视为随时间变化的随机信号 […]
换句话说,通过将参数的梯度解释为离散的随机信号,作者们可以将这个信号分解成两个组成部分:一个快速变化的成分和一个缓慢变化的成分。前者负责过拟合,后者负责泛化。这与理解能力(grokking)的原因是两个电路的原理相似。现在,这个原理提供了一个相当巧妙的方法来加速收敛,只需简单地增强缓慢变化成分的影响力。因此,作者们声称,通过仅仅进行小的修改,理解能力可以以 50 倍的速度更快地实现。
对于感兴趣的实践者,该算法可以在github上找到。
最后的想法
这个发现让我感到一种难以用言语表达的兴奋。关于这些事物被发现的现实本身就很有吸引力,这让我想知道这个研究领域可能还隐藏着哪些不为人知的现象。不仅仅是被机器学习周围的文化热潮所吸引,我开始对事物的技术层面产生了欣赏。
我是不是理解错了,或者你认为我错过了这个要点?请通过mastodon或x.com与我联系。
进一步阅读与资源
通过电路效率解释 Grok
Grokking: 在小型算法数据集上超越过拟合的泛化
Grokfast: 通过放大慢梯度加速 Grok
弹弓机制:自适应优化器和 Grok 现象的经验研究
统一 Grok 和双重下降
Grok – 维基百科
GitHub – ironjr/grokfast: 论文 "Grokfast: 通过…的官方仓库