当前位置: 首页 > article >正文

别再让AI模型‘学新忘旧’了:手把手教你用PyTorch搞定Continual Learning的灾难性遗忘

别再让AI模型‘学新忘旧’了手把手教你用PyTorch搞定Continual Learning的灾难性遗忘当你的猫狗分类模型刚学会识别虹猫蓝兔中的虹猫却突然忘记了普通家猫的样子——这就是典型的灾难性遗忘现象。作为算法工程师我们需要的不是每次遇到新数据就重新训练的笨模型而是能像人类一样持续积累知识的智能系统。本文将用PyTorch带你实现三种应对策略从最基础的Replay Buffer到最新的梯度约束方法。1. 环境准备与数据模拟首先需要构建一个能模拟真实场景的非独立同分布(Non-IID)数据集。我们以CIFAR-10为例将其拆分为5个连续任务import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader, Subset # 定义数据转换 transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载完整数据集 full_dataset datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform) # 按类别划分任务每个任务2个类别 task_classes [[0,1], [2,3], [4,5], [6,7], [8,9]] task_datasets [] for classes in task_classes: idx [i for i, (_, label) in enumerate(full_dataset) if label in classes] task_datasets.append(Subset(full_dataset, idx))这种任务划分方式模拟了现实场景中数据按批次到达的特点。每个任务只包含部分类别且后续任务不会重复之前见过的类别数据。2. 基准模型与灾难性遗忘验证我们先实现一个简单的CNN基准模型观察其在连续学习中的表现import torch.nn as nn import torch.optim as optim class SimpleCNN(nn.Module): def __init__(self, num_classes10): super(SimpleCNN, self).__init__() self.features nn.Sequential( nn.Conv2d(3, 32, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2) ) self.classifier nn.Linear(64 * 8 * 8, num_classes) def forward(self, x): x self.features(x) x x.view(x.size(0), -1) return self.classifier(x)训练过程中我们会发现模型在新任务上的准确率迅速提升但在旧任务上的表现急剧下降任务顺序任务1准确率任务2准确率任务3准确率训练前随机猜测随机猜测随机猜测任务1后89.2%--任务2后32.1%85.7%-任务3后18.5%41.2%82.3%这种性能断崖式下跌正是灾难性遗忘的典型表现。接下来我们将实现三种解决方案。3. 解决方案一经验回放(Replay Buffer)经验回放是最直观的解决方案——保存部分旧数据与新数据一起训练。以下是PyTorch实现from collections import deque import random class ReplayBuffer: def __init__(self, buffer_size): self.buffer_size buffer_size self.buffer deque(maxlenbuffer_size) def add(self, data): for sample in data: self.buffer.append(sample) def sample(self, batch_size): return random.sample(self.buffer, min(len(self.buffer), batch_size)) # 在训练循环中使用 buffer ReplayBuffer(1000) # 存储1000个样本 for task_id, task_data in enumerate(task_datasets): # 添加新任务数据到缓冲区 buffer.add(task_data) # 训练时混合新旧数据 optimizer optim.Adam(model.parameters()) for epoch in range(10): # 获取当前任务数据 current_loader DataLoader(task_data, batch_size32, shuffleTrue) # 从缓冲区采样旧数据 old_data buffer.sample(256) # 采样256个旧样本 old_loader DataLoader(old_data, batch_size32) # 混合训练 for (new_x, new_y), (old_x, old_y) in zip(current_loader, old_loader): optimizer.zero_grad() loss criterion(model(new_x), new_y) criterion(model(old_x), old_y) loss.backward() optimizer.step()这种方法虽然简单但存在两个主要问题存储旧数据可能违反数据隐私要求当旧任务很多时缓冲区可能无法保存足够代表性的样本4. 解决方案二弹性权重固化(EWC)EWC通过约束重要参数的更新来保护旧知识。以下是实现关键步骤def compute_fisher_matrix(model, dataset, num_samples1000): fisher {} for name, param in model.named_parameters(): fisher[name] torch.zeros_like(param.data) loader DataLoader(dataset, batch_size1, shuffleTrue) model.eval() for i, (x, y) in enumerate(loader): if i num_samples: break model.zero_grad() output model(x) loss criterion(output, y) loss.backward() for name, param in model.named_parameters(): fisher[name] param.grad.data ** 2 / num_samples return fisher # 在训练新任务时添加EWC约束 def ewc_loss(model, fisher, prev_params, lambda_500): loss 0 for name, param in model.named_parameters(): loss (fisher[name] * (param - prev_params[name]) ** 2).sum() return lambda_ * loss # 训练循环 prev_params {n: p.clone().detach() for n, p in model.named_parameters()} fisher compute_fisher_matrix(model, old_task_data) for epoch in range(10): for x, y in current_task_loader: optimizer.zero_grad() output model(x) loss criterion(output, y) ewc_loss(model, fisher, prev_params) loss.backward() optimizer.step()EWC的关键在于计算Fisher信息矩阵识别重要参数在新任务训练时惩罚重要参数的剧烈变化超参数λ控制约束强度通常500-10005. 解决方案三梯度投影约束(GPM)GPM是较新的方法通过约束梯度方向来避免遗忘class GPMLayer(nn.Module): def __init__(self, input_dim, output_dim): super().__init__() self.weight nn.Parameter(torch.randn(output_dim, input_dim)) self.bias nn.Parameter(torch.zeros(output_dim)) self.memory None # 用于存储重要梯度方向 def project_grad(self): if self.memory is not None: for direction in self.memory: # 计算当前梯度在重要方向上的分量 grad self.weight.grad.view(-1) proj (grad direction) * direction # 移除可能干扰旧知识的梯度分量 self.weight.grad.data - proj.view_as(self.weight) def forward(self, x): return nn.functional.linear(x, self.weight, self.bias) # 在训练过程中记录重要梯度方向 def record_important_directions(model, dataloader): model.train() for x, y in dataloader: model.zero_grad() output model(x) loss criterion(output, y) loss.backward() for name, module in model.named_modules(): if isinstance(module, GPMLayer): grad module.weight.grad.view(-1) if module.memory is None: module.memory [grad / grad.norm()] else: # 只保留与现有方向正交的新方向 new_dir grad.clone() for d in module.memory: new_dir - (new_dir d) * d if new_dir.norm() 0.5: # 阈值过滤 module.memory.append(new_dir / new_dir.norm())GPM的优势在于不需要存储原始数据自动识别并保护对旧任务重要的参数空间方向计算开销小于EWC6. 综合对比与实战建议三种方法的性能对比如下方法准确率保持计算开销内存需求实现难度Replay Buffer★★★★☆★★☆☆☆★★★★★★★☆☆☆EWC★★★☆☆★★★★☆★★☆☆☆★★★★☆GPM★★★★☆★★★☆☆★★★☆☆★★★★★在实际项目中我的经验是当数据隐私要求不高且有足够存储时优先使用Replay Buffer对计算资源有限的项目EWC是较好的折中方案当任务数量很多且关系复杂时GPM表现更优一个实用的技巧是在模型中加入一个小型验证集定期测试所有旧任务的表现。当发现某个旧任务准确率下降超过阈值时可以触发针对性的复习训练。

相关文章:

别再让AI模型‘学新忘旧’了:手把手教你用PyTorch搞定Continual Learning的灾难性遗忘

别再让AI模型‘学新忘旧’了:手把手教你用PyTorch搞定Continual Learning的灾难性遗忘 当你的猫狗分类模型刚学会识别"虹猫蓝兔"中的虹猫,却突然忘记了普通家猫的样子——这就是典型的灾难性遗忘现象。作为算法工程师,我们需要的不…...

GVINS实战解析:如何用自录的ROS Bag数据替换官方数据集进行真机测试?

GVINS实战进阶:用自采集ROS Bag替换官方数据集的完整指南 当你第一次在官方数据集上成功运行GVINS时,那种兴奋感可能还记忆犹新。但很快,一个更实际的问题浮出水面:如何让这套强大的GNSS-视觉-惯性紧耦合系统处理我自己的传感器数…...

MATLAB R2023a新功能实测:用SHAP值给你的机器学习模型做个‘CT扫描’,到底哪个特征说了算?

MATLAB R2023a中的SHAP值分析:揭开机器学习模型的黑箱之谜 当你的随机森林模型坚定地拒绝了某位贷款申请人,或是回归模型预测出某款车型的油耗异常高时,你是否曾好奇——究竟是哪些特征在背后主导了这些决策?MATLAB R2023a带来的S…...

5分钟高效配置FFXIV动画跳过插件:告别副本等待的智能解决方案

5分钟高效配置FFXIV动画跳过插件:告别副本等待的智能解决方案 【免费下载链接】FFXIV_ACT_CutsceneSkip 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_ACT_CutsceneSkip FFXIV动画跳过插件是一款专为《最终幻想14》国服玩家设计的智能辅助工具&#…...

G-Helper华硕笔记本控制工具:3分钟掌握极致性能调校

G-Helper华硕笔记本控制工具:3分钟掌握极致性能调校 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar…...

别再只会用if-else了!用STM32 HAL库的PWM调出丝滑转弯的循迹小车(附完整代码)

从机械转向到丝滑过弯:STM32 HAL库PWM调校实战指南 循迹小车从实验室走向竞赛场的关键转折点,往往在于那毫秒级的电机响应差异。当传统if-else控制让小车像醉汉般踉跄前行时,PWM调速却能赋予它芭蕾舞者般的优雅姿态。本文将揭示如何用STM32的…...

从一块烧坏的板子说起:聊聊PCB安全间距如何影响电源模块的长期可靠性

从一块烧坏的板子说起:PCB安全间距如何决定电源模块的生死 那块烧焦的AC-DC电源模块静静躺在我的工作台上,初级侧到次级侧的碳化痕迹像一道闪电劈开了整个PCB。客户反馈说设备在潮湿环境下运行两年后突然冒烟,拆解后发现正是这个24V输出的电源…...

2026年04月27日最热门的开源项目(Github)

本期榜单展示了多个热门开源项目,主要集中在提高编码效率、AI助手以及与 Claude 相关的工具等主题。以下是对榜单的分析: 项目分布 语言多样性: 该榜单中的项目使用了多种编程语言,包括 Shell (3个项目)、Python (5个项目)、Type…...

移动端安全编码规范

移动互联网时代,智能手机已成为人们日常生活的重要组成部分。随着移动应用的普及,安全问题也日益凸显。恶意攻击、数据泄露、隐私侵犯等安全事件频发,给用户和企业带来了巨大损失。移动端安全编码规范的制定和遵循显得尤为重要。它不仅关乎用…...

终极Total War模组编辑器:RPFM一站式解决方案完整指南

终极Total War模组编辑器:RPFM一站式解决方案完整指南 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://git…...

3步掌握MediaCreationTool.bat:Windows安装介质制作终极方案

3步掌握MediaCreationTool.bat:Windows安装介质制作终极方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...

3个突破性方案:如何解决工业视觉的形状识别难题?

3个突破性方案:如何解决工业视觉的形状识别难题? 【免费下载链接】shape_based_matching try to implement halcon shape based matching, refer to machine vision algorithms and applications, page 317 3.11.5, written by halcon engineers 项目地…...

咖啡烘焙数据可视化平台Artisan:构建专业级烘焙过程控制的革命性方案

咖啡烘焙数据可视化平台Artisan:构建专业级烘焙过程控制的革命性方案 【免费下载链接】artisan artisan: the worlds most trusted roasting software 项目地址: https://gitcode.com/gh_mirrors/ar/artisan Artisan作为全球最受信赖的开源咖啡烘焙软件&…...

别只看理论!用Wireshark抓包实战解析5G信令流程(附大唐杯真题分析)

别只看理论!用Wireshark抓包实战解析5G信令流程(附大唐杯真题分析) 在5G技术快速发展的今天,理解其底层信令交互机制已成为通信工程师和学生的必备技能。然而,传统的理论学习往往让人陷入"知其然而不知其所以然&q…...

2026公考培训行业深度观察:粉笔教育凭借透明师资体系与AI技术优势蝉联第一

一、行业背景与市场趋势 2026年,公考培训行业进入“精准滴灌”时代。随着公务员招录政策的区域化特征日益凸显(例如各省自主命题、面试考官评分标准差异等),传统的“一刀切”式培训模式面临挑战。与此同时,考生对培训…...

cursor-生成的git文案为英文,转换为中文

根目录添加.cursorrules文件 写入 # GIT COMMIT MESSAGE RULES # IMPORTANT: These rules apply to the "Generate with AI" (Sparkle icon) in the Git panel.You MUST always generate git commit messages in Simplified Chinese (简体中文). DO NOT use English …...

圆满收官!桥田智能磁力换模硬核闪耀2026国际橡塑展

2026年04月24日,中国,上海为期四天的2026 Chinaplas 国际橡塑展于04月24日圆满结束!作为橡塑行业饱受关注的盛会,本届国际橡塑展上,桥田智能携旗下核心产品与一站式解决方案重磅亮相,与众多行业专家、新老客…...

别只盯着部署!Datahub安装后的第一件事:快速集成MySQL元数据与任务调度配置

DataHub实战:从安装到元数据采集的完整落地指南 当你终于看到DataHub管理界面成功加载的那一刻,意味着已经跨过了最艰难的技术部署门槛。但空转的工具不会产生价值——接下来这30分钟的操作,将决定这个元数据平台能否真正融入你的数据架构。本…...

从Darknet53到CSP Darknet53:手把手教你用PyTorch复现YOLOv4的骨干网络(附Mish激活函数实现)

从Darknet53到CSP Darknet53:PyTorch实战与架构深度解析 去年在Kaggle竞赛中尝试复现YOLOv4时,我花了整整三天时间才搞明白CSP结构的设计精髓。当时最大的困惑是:为什么简单的特征图拆分再合并能显著提升检测精度?本文将用代码解剖…...

别再为HADOOP_CLASSPATH报错头疼了!手把手教你搞定Flink 1.14.0 on Yarn的完整环境配置

从零到一:Flink 1.14.0 on Yarn环境配置全攻略与深度排错指南 1. 环境配置的底层逻辑与常见陷阱 每次看到"HADOOP_CLASSPATH not set"这类报错时,很多开发者第一反应是机械地复制粘贴解决方案。但真正理解背后的机制,才能从根本上避…...

深入TI毫米波SDK:从IWR6843AOP的Demo工程看数据流与LVDS高速传输配置

深入解析TI毫米波雷达SDK:IWR6843AOP的LVDS高速数据传输实战 毫米波雷达技术正在工业自动化、智能交通和消费电子领域掀起一场感知革命。德州仪器(TI)的IWR6843AOP作为集成DSP和雷达前端的单芯片解决方案,其开箱即用的Demo工程为开…...

10分钟学会在Windows上搭建专业级RTMP流媒体服务器

10分钟学会在Windows上搭建专业级RTMP流媒体服务器 【免费下载链接】nginx-rtmp-win32 Nginx-rtmp-module Windows builds. 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-rtmp-win32 你是否想过在Windows电脑上搭建自己的直播服务器?今天我们要介绍的…...

ESP32无线桥接踩坑实录:esp-idf中CONFIG_LWIP_IPV4_NAPT不生效?问题排查与修复指南

ESP32无线桥接深度排障:从CONFIG_LWIP_IPV4_NAPT失效到完整解决方案 当你在ESP32上实现APSTA无线桥接时,是否遇到过这样的场景:手机能连接到ESP32创建的AP热点,却死活上不了网?控制台明明显示STA已成功连接路由器&…...

一个Bug引发血案:AI服务恢复后为何还在报错?——双重缓存污染的排查与治理

写在前面某个周四下午,运维同学告诉我Python AI服务因为网络波动短暂不可用,几分钟后恢复了。但诡异的事情发生了——用户继续提问,系统却依然返回“AI服务暂时不可用”,而且是毫秒级返回。我第一反应是服务没恢复,检查…...

别再盲目重装!Dev Containers环境崩溃的8大高频故障(附可复用的自动化健康检查脚本)

更多请点击: https://intelliparadigm.com 第一章:Dev Containers环境崩溃的典型现象与认知误区 Dev Containers(开发容器)在 VS Code 中提供了一致、可复现的开发环境,但其崩溃现象常被误判为“Docker 服务异常”或“…...

5分钟搭建跨平台直播自动录制系统:告别错过的每一场精彩直播

5分钟搭建跨平台直播自动录制系统:告别错过的每一场精彩直播 【免费下载链接】LiveAutoRecord 基于 Electron 的多平台直播自动录制软件 项目地址: https://gitcode.com/GitHub_Trending/li/LiveAutoRecord 你是否曾经因为工作繁忙、时差问题或临时有事而错过…...

终极指南:如何快速将网页转换为可编辑的Figma设计稿

终极指南:如何快速将网页转换为可编辑的Figma设计稿 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 你是否曾经想要将任何网站的设计快速转换为Figma中的可编辑图层&a…...

ColabFold蛋白质结构预测:从算法思维到生产实践的全栈指南

ColabFold蛋白质结构预测:从算法思维到生产实践的全栈指南 【免费下载链接】ColabFold Making Protein folding accessible to all! 项目地址: https://gitcode.com/gh_mirrors/co/ColabFold ColabFold作为现代蛋白质结构预测的民主化工具,将Alph…...

PyAEDT实战指南:从手动仿真到自动化工作流的工程转型

PyAEDT实战指南:从手动仿真到自动化工作流的工程转型 【免费下载链接】pyaedt AEDT Python Client Package 项目地址: https://gitcode.com/gh_mirrors/py/pyaedt PyAEDT作为Ansys Electronics Desktop的Python客户端,为电磁仿真工程师提供了从手…...

NoFences:彻底终结Windows桌面混乱的免费开源分区神器

NoFences:彻底终结Windows桌面混乱的免费开源分区神器 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是不是也有这样的烦恼?每天打开电脑&#xff…...