当前位置: 首页
AI教程
基于伪排练的NLP灾难性遗忘缓解策略

基于伪排练的NLP灾难性遗忘缓解策略

热心网友 时间:2026-06-07
转载

预训练模型微调会导致灾难性遗忘,伪排练通过用原始模型预测一批示例,将其标注混入微调数据共同训练,约束输出空间以保留原有能力。该方法在spaCy中可有效防止多任务共享权重时的性能退化。

2017年8月23日 · 8分钟阅读

在预训练模型微调过程中,灾难性遗忘始终是一个经典难题:你费尽心思在特定任务上把模型调整到位,结果回过头来,它却忘了之前学到的通用语言能力。听起来有些讽刺,对吧?但实际上,这个问题并非那么神秘。核心解决方案其实相当直接:利用原始模型先对一批样本进行预测,然后将这些“旧知识”与微调数据混合起来共同训练。这种方法被称为“伪排练”。

先来了解一下背景。当你依次优化两个学习任务,并且用第一个任务的权重初始化第二个任务时,灾难性遗忘就会出现。学术界一直在探索那些对初始化不敏感的优化算法——理想情况下,优化器应当足够强大,无论权重如何初始化,都能找到给定问题的最优解。然而现实远非如此。换句话说,如果你连续优化两个问题,遗忘实际上是一个必然会发生的现象。

多任务学习在spaCy v2.0.0a10中的实践

为了帮助用户避开这个陷阱,spaCy v2.0 alpha模型采用了一种“分合结合”的策略:多任务卷积神经网络(CNN)加上每个任务专用的局部CNN。这样一来,每个任务可以独立更新,而不会污染共享组件。

对于spaCy用户而言,灾难性遗忘近期变得尤为突出——因为v2版本的词性标注、命名实体识别、句法依存和句子分割模型全都共享同一个卷积神经网络生成的输入表示。好处是模型体积大幅降低(最新版本仅18MB,而之前的线性模型接近1GB),坏处是任何微调都可能破坏全局性能。

好在多任务输入表示可以通过doc.tensor属性开放给文本分类、语义相似度等下游任务。但共享权重也埋下了一个隐患:假设你有一批短命令需要解析,而默认的spaCy模型在这些输入上表现欠佳——例如,它总是把第一个单词“search”分析成名词,而实际上它应该是动词。你手头有大量示例表明句首是祈使动词,于是你决定用这些数据更新模型。

import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp(u"search for pictures of playful rodents")
spacy.displacy.serve(doc)

解析结果不正确。你可以仅用一个标签(比如把第一个单词标注为VBP)来修正模型。只需要向nlp.update()传递一个Doc对象和一个GoldParse对象即可:

from spacy.gold import GoldParse
new_tags = [None] * len(doc)
new_tags[0] = "VBP"
gold = GoldParse(doc, tags=new_tags)
nlp.update(doc, gold, update_shared=True)

None表示那些位置没有监督信号,梯度为零。没有提供依存或实体标签,对应的模型权重就不会更新。然而,所有模型共享同一个输入表示,因此一旦输入表示被更新,所有模型都可能受到影响。为解决这个问题,spaCy v2.0.0a10引入了update_shared标志,默认值为False

如果只在这个例子上反复更新几次,模型很快就能正确标注它。但仅凭一个例子,模型无法判断你想要的泛化程度——是把所有单词都标注成VBP?还是所有句子的第一个单词?抑或是所有出现“search”的地方?你需要向模型提供更多关于目标解空间的信息,否则学习问题过于自由,结果很可能不是你所期望的。

超越“遗忘”这个隐喻

我们通常说“模型忘记了之前学的东西”。这个比喻虽然直观,但仔细想想有些误导:整体多任务模型一开始“知道”如何为多种英文书面体裁标注实体和做依存解析。然后你专注做了一点修正,结果模型丢掉了更通用的能力。这听起来像AI很笨、很脆弱。但到这一步,隐喻已经帮不上忙了——我们需要更精确地理解背后发生了什么。

当调用nlp.update()时,模型根据当前权重产生分析结果,然后为每个子任务计算梯度,并通过反向传播更新权重。本质上,你是在调整权重,直到分析结果的误差梯度接近零。任何能使损失变为零的权重组合都是稳定的。但稳定并不意味着是你想要的那种稳定。

正则化对嵌入层依然有效

嵌入表定义了一个向量空间,参数值的变化与解的变化之间存在线性关系。在这种情况下,对参数值与初始值之间的偏差施加L2范数惩罚是合理的——它编码了对“不要改动太多”的偏好。但在深层神经网络中,模型权重与预测行为之间的关系往往是非线性的,甚至可能完全混乱。我们真正关心的是输出,而不是参数值。因此,理想的做法是直接对输出行为施加约束,而不是去猜测参数应该长什么样。

伪排练:简单而有效的解法

综合来看,解决灾难性遗忘的思路其实很直接:当你微调模型时,你希望得到一个既在新数据上正确、又尽可能“像”原始模型输出的解。既然原始模型的输出可以无限生成,那么只需要把原始输出和新数据混合起来一起训练即可。这不是新点子,但非常管用。

下面是一个伪排练的Python示例:

revision_data = []

# 将初始模型应用于原始示例。需要试验找到合适的修订文本数量,
# 过滤掉一些数据也可能有帮助。
for doc in nlp.pipe(revision_texts):
    tags = [w.tag_ for w in doc]
    heads = [w.head.i for w in doc]
    deps = [w.dep_ for w in doc]
    entities = [(e.start_char, e.end_char, e.label_) for e in doc.ents]
    revision_data.append((doc, GoldParse(doc, tags=tags, heads=heads, deps=deps, entities=entities)))

# 现在将先前的行为打乱混入新的微调数据中,一起更新。
# 可以对微调示例做上采样(比如包含5个副本),这样在比例不变的情况下用更多样化的修订数据。
n_epoch = 5
batch_size = 32
for i in range(n_epoch):
    examples = revision_data + fine_tune_data
    losses = {}
    random.shuffle(examples)
    for batch in partition_all(batch_size, examples):
        docs, golds = zip(*batch)
        nlp.update(docs, golds, losses=losses)

关键细节在于:混入的“修订练习”不能由当前正在优化的权重生成。你必须让生成修订材料的模型保持静态,否则模型可能收敛到平凡解(比如直接复制当前输出)。如果数据是流式的,内存里需要保存两个模型副本。更省事的方法是:预先解析一批文本,用这些标注来稳定后续的微调过程。

目前,spaCy将教师模型提供的分析与金标准数据同等对待——例如,原始预测“80%置信度标签是NN”被强制转换为“100%置信度标签是NN”。这还不够理想。更好的做法是使用教师模型返回的分布做监督(比如对数损失),让模型学习“软”目标。

总结

在计算机视觉和自然语言处理中,预训练模型已经非常普遍。图像、视频、文本、音频这类输入都具有丰富的内部结构,可以从海量数据中学习跨任务泛化的能力。微调能够针对性地进行优化,但也会引发灾难性遗忘:你找到了在特定数据上表现出色的解,却丧失了泛化能力。有人建议用正则化惩罚来抑制参数变化,但这种方法只约束了参数空间,而我们真正需要的是输出空间上的约束。伪排练直接做到了这一点:用初始模型预测一批样本,把它们混入微调数据中一起训练,相当于告诉模型“除了新任务,你还得跟以前表现得一样好”。就这么简单。

来源:https://cloud.tencent.com.cn/developer/article/2683486

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
AI 编程工具教程:Windsurf GPU 加速安装配置教程,2026 最新版含多用户权限配置

AI 编程工具教程:Windsurf GPU 加速安装配置教程,2026 最新版含多用户权限配置

Windsurf的GPU配置重点在驱动、CUDA、Python环境、项目依赖和多用户目录权限。合理区分编辑器、终端与本地模型环境,可提升AI编程和深度学习项目开发效率。

时间:2026-07-13 14:32
个人版 Windsurf 安装教程:低配置电脑安装优化全流程,附 API 调用测试步骤

个人版 Windsurf 安装教程:低配置电脑安装优化全流程,附 API 调用测试步骤

面向低配置电脑的Windsurf安装与优化指南,涵盖下载准备、安装步骤、性能设置、API配置测试、常见问题处理和数据安全边界。

时间:2026-07-13 14:32
Windsurf 从零到可用安装全流程:稳定运行,附模型选择建议

Windsurf 从零到可用安装全流程:稳定运行,附模型选择建议

Windsurf是面向代码开发的AI编辑器,适合项目重构、补全、调试和文档生成。安装前需确认系统环境、账号权限与网络连通性,安装后建议按项目类型选择模型,并通过权限、索引和插件管理提升稳定性。

时间:2026-07-13 14:30
Windsurf 新手入门安装指南:离线安装包配置教程,免费方案,附配置参数和测试方法

Windsurf 新手入门安装指南:离线安装包配置教程,免费方案,附配置参数和测试方法

Windsurf可按在线与离线两种方式部署,新手应优先确认系统版本、安装包来源、登录方式和项目权限,再配置模型、上下文范围、终端策略与测试用例,确保AI编程环境稳定可用。

时间:2026-07-13 14:30
Devin AI 安装失败怎么办?源码编译安装教程和中文界面设置方法

Devin AI 安装失败怎么办?源码编译安装教程和中文界面设置方法

DevinAI安装失败多与环境版本、依赖缺失、权限、网络连通和非官方包有关。源码编译应先确认项目来源,按依赖、配置、构建、启动顺序排查,并通过语言文件或浏览器翻译实现中文界面。

时间:2026-07-13 14:27
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜