Catastrophic Forgetting
灾难性遗忘是指神经网络在新数据上训练时,突然丧失先前学会的技能。介绍其发生原因、示例和缓解方法。
灾难性遗忘(也称为灾难性干扰)是指神经网络在训练新数据时不再包含旧任务样本,导致先前学会的技能突然丧失。训练会更新存储旧知识的共享模型权重,而新的损失中没有任何项会奖励模型保留旧知识,因此模型在原任务上的准确率可能在几百次更新内骤降。McCloskey 和 Cohen 于 1989 年在依次学习算术事实的网络中描述了这一现象;时至今日,它仍是持续学习的核心障碍,也是微调中常见的风险。
灾难性遗忘为何发生#
神经网络中的知识是分布式的:每个权重都会影响多个输出,而每个输出也依赖多个权重。针对新任务训练时,权重会朝着损失下降最快的方向移动,而没有任何项衡量旧任务的表现,因此模型会逐渐偏离原任务有效的区域。分类会让输出层的这一现象更加明显。如果训练数据中只出现新类别,每一步都会压低缺失类别的分数,直到模型完全不再预测这些类别。先用手写数字 0–4、再用数字 5–9 训练一个小型网络,可以展示这一现象,也能说明重放少量旧数据如何减轻遗忘:
import torch
from sklearn.datasets import load_digits
torch.manual_seed(0)
X, y = load_digits(return_X_y=True)
X, y = torch.tensor(X / 16, dtype=torch.float32), torch.tensor(y)
train = torch.arange(len(y)) < 1400 # hold out the last 397 images for testing
task_a, task_b, test_a = train & (y < 5), train & (y >= 5), ~train & (y < 5)
replay = task_a & (torch.rand(len(y)) < 0.1) # keep 10% of task A for replay
for name, second_task in [("task B only", task_b), ("task B + 10% replay", task_b | replay)]:
model = torch.nn.Sequential(torch.nn.Linear(64, 64), torch.nn.ReLU(), torch.nn.Linear(64, 10))
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# Train on digits 0-4 (task A), then on digits 5-9 (task B)
for mask in (task_a, second_task):
for _ in range(200):
loss = torch.nn.functional.cross_entropy(model(X[mask]), y[mask])
optimizer.zero_grad()
loss.backward()
optimizer.step()
accuracy = (model(X[test_a]).argmax(1) == y[test_a]).float().mean()
print(f"{name}: held-out digits 0-4 accuracy {accuracy:.1%}")完成任务 A 后,网络能正确分类留出的 198 个数字 0–4 中的 92.4%。仅用数字 5–9 训练后,这一比例降至 0.0%,因为模型现在只预测新类别。第二阶段混入 66 张重放的任务 A 图像后,准确率保持在 74.7%。
实践中的灾难性遗忘#
- 目标检测:一个检测器先在行人和交通标志上训练,之后仅用新型施工标志图像进行微调,结果就不再检测行人。新图像中任何未标注的行人都会被当作背景积极学习,从而加速遗忘。
- 大型语言模型:在对参数量从 10 亿到 70 亿的 LLM进行持续指令微调时,领域知识、推理能力和阅读理解能力都出现退化,且在这个范围内,模型越大,遗忘越严重。对齐模型即使使用无害数据进行微调,也可能削弱其安全行为。
灾难性遗忘与相关术语的区别#
- 持续学习:研究如何在学习一系列任务时不遗忘先前任务的研究领域。灾难性遗忘正是它要解决的问题。
- 模型崩溃:模型使用早期模型生成的数据进行训练时,质量和多样性逐渐下降,即使任务相同也会如此。
- 过拟合:过度拟合当前训练数据中的噪声,导致模型在同一任务的新数据上表现下降。遗忘则是丧失先前任务的能力。
- 机器遗忘:有意从训练好的模型中移除特定数据或知识,是遗忘的主动对应形式。
- 稳定性—可塑性困境:保持旧知识稳定与保留足够可塑性以学习新任务之间的权衡,每种缓解方法对此都有不同的取舍。
如何减少灾难性遗忘#
缓解方法分为三类:重放、正则化和参数隔离;项目的具体限制通常决定适用哪一种:
- 重放:将先前任务的存储样本混入新一轮训练,是最可靠的解决方法,数字示例也说明了这一点。对于 YOLO26检测器,Ultralytics 数据 YAML 文件支持列出多个训练图像文件夹,因此重放就是在同一个合并类别列表下,把一部分原始图像目录和新图像目录一起列出。
- 正则化:弹性权重巩固(EWC)根据每个权重对先前任务的重要性来惩罚权重变化,该重要性通过 Fisher 信息估计。Learning without Forgetting则采用知识蒸馏,训练模型在新数据上继续匹配其旧输出。
- 参数隔离:冻结共享层、添加任务专属的头部,或训练 LoRA等适配器,都能让原始权重保持不变。在编程和数学任务中,LoRA 的学习效果不如完整微调,但遗忘也更少;而完整微调学到的权重变化,其秩比典型 LoRA 配置高出 10 到 100 倍。










