网站分几个阶段建设,wordpress自定义seo,长沙服装网站建设,佛山市骏域网站建设提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、方法介绍2.Rainbow Memory(RM)2.1多样性感知内存更新2.2通过数据增强增强样本多样性(DA) 二、使用步骤1.实验概况2.RM核心代码 总结 摘要
本博客概… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、方法介绍2.Rainbow Memory(RM)2.1多样性感知内存更新2.2通过数据增强增强样本多样性(DA) 二、使用步骤1.实验概况2.RM核心代码 总结 摘要
本博客概述了文章《Rainbow Memory: Continual Learning with a Memory of Diverse Samples》聚焦于任务边界模糊的持续学习场景提出基于样本分类不确定性和数据增强的Rainbow Memory (RM)记忆管理策略。多数研究在任务不共享类别的较人为的设置下评估相关方法但在现实世界应用场景中任务之间的类分布是不断变化的更现实和实用的是任务共享类别的模糊CIL设置。在这种设置下之前存储少量旧数据的方法虽在缓解灾难性遗忘方面有成果但也引出了如何管理记忆memory的最优策略问题。基于该问题研究者在新定义的模糊CIL设置下更好地持续学习的两个因素记忆的采样和记忆中的数据增强进而提出Rainbow Memory(RM方法。通过在MNIST、CIFAR10、CIFAR100和ImageNet数据集上的实证验证RM在模糊持续学习设置中显著提高了准确性大幅超越现有技术。
文章链接
Abstract
This blog summarizes the article “Rainbow Memory: Continual Learning with a Memory of Diverse Samples”, which focuses on the continuous learning scenario with fuzzy task boundaries, and proposes a Rainbow Memory (RM) memory management strategy based on sample classification uncertainty and data augmentation. Most studies evaluate the relevant methods in a more artificial setting where tasks do not share categories, but in real-world application scenarios, the class distribution between tasks is constantly changing, and it is more realistic and practical to see the fuzzy CIL settings of task sharing categories. In this setting, the previous method of storing a small amount of old data has been successful in mitigating catastrophic forgetting, but it also raises the question of the optimal strategy for managing memory. Based on this problem, the researchers proposed a rainbow memory (RM) method for better continuous learning under the newly defined fuzzy CIL setting: memory sampling and data enhancement in memory. Through empirical verification on MNIST, CIFAR10, CIFAR100, and ImageNet datasets, RM significantly improves accuracy in fuzzy continuous learning settings, significantly outperforming existing technologies.
一、方法介绍
模糊类增量学习的设置要求如下:1每个任务作为流顺序地给出2大多数分配的任务类别彼此不同以及3模型只能利用先前任务的非常小的一部分数据。 如下图所示在模糊CIL中任务共享类与传统的不相交CIL相反。建议的记忆管理策略更新的情景记忆与当前任务的样本以保持不同的样本在内存中。数据扩充DA进一步增强了内存中样本的多样性。
2.Rainbow Memory(RM)
在模糊类增量学习的场景中现有方法因样本多样性不足导致模型易过拟合或遗忘严重。为了解决该问题研究者提出了Rainbow Memory(RM)RM提出通过多样性记忆管理和数据增强解决 Blurry-CIL 问题。
2.1多样性感知内存更新
研究者认为被选择存储在内存中的样本应该不仅是代表其相应的类还要识别其他类。为了选择这样的样本研究者认为在分类边界附近的样本是最具鉴别力的靠近分布中心的样本是最具代表性的。为了满足这两个特点研究者建议抽样的样本是不同的特征空间。
由于计算样本与样本之间的距离O(N2)较为复杂和昂贵研究者通过分类模型估计的样本的不确定性来估计相对位置即假设模型的更确定的样本将位于更靠近类分布的中心通过测量扰动样本的模型输出方差来计算样本的不确定性扰动样本通过各种数据增强转换方法进行包括颜色抖动、剪切和剪切如下图所示:
通过蒙特-卡罗MC法近似计算分布py c的不确定度|x当给定扰动样本x的先验时即px| x的情况下,推导过程可以写成
其中x、x^~、y和A分别表示样本、扰动样本、样本的标签和扰动方法的数量。分布D * 表示由扰动样本λ x定义的数据分布。特别地扰动样本λ x由随机函数fr·绘制如下
其中θr是表示第r次扰动的随机因子的超参数。 测量样品相对于扰动的不确定性为
其中ux表示样本x的不确定性Sc是类别c是预测的前1类别的次数。1c表示二进制类索引向量。较低的ux值对应于扰动上更一致的top-1类表明x位于模型强置信的区域.
2.2通过数据增强增强样本多样性(DA)
为了进一步增强记忆中的示例的多样性研究者采用了数据增强DA。 DA的通过图像级或特征扰动使给定的样本多样化这对应于通过确保多样性来更新内存的理念。 随着任务迭代的进行新任务中的样本可能会遵循与情节内存中的样本即从以前的任务中遵循不同的分布。 研究者在新任务的类别和内存中旧类的示例中采用混合标记的DA来“混合”图像。 这种混合标签DA减轻了由类分布在任务上的变化引起的副作用并改善了表现。 混合标记的DA方法之一CutMix 生成了混合样品和平滑标签鉴于一组监督样品X1Y1和X2Y2其公式如下: 二、使用步骤
1.实验概况
研究者通过将RM与各种实验设置中的艺术状态进行比较从经验上验证了RM的功效。 基准测试的CIL任务设置情节内存的内存大小和性能指标。在MNIST、CIFAR10、CIFAR100和ImageNet数据集上进行实验。采用多种CIL任务设置、不同的记忆大小和性能指标评估RM方法。将RM与EWC、Rwalk、iCaRL等标准CIL方法对比 比较不同方法在各种设置下的Last AccuracyA5、Last ForgettingF5和IntransigenceI5等指标。分析RM在不同模糊水平如Blurry0、Blurry10、Blurry30下的性能还探究了不确定性测量方法、记忆更新算法、数据增强方法等对性能的影响。
2.RM核心代码
RM部分的完整核心代码如下:
import logging
import randomimport numpy as np
import pandas as pd
import torch
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterfrom methods.finetune import Finetune
from utils.data_loader import cutmix_data, ImageDatasetlogger logging.getLogger()
writer SummaryWriter(tensorboard)def cycle(iterable):# iterate with shufflingwhile True:for i in iterable:yield iclass RM(Finetune):def __init__(self, criterion, device, train_transform, test_transform, n_classes, **kwargs):super().__init__(criterion, device, train_transform, test_transform, n_classes, **kwargs)self.batch_size kwargs[batchsize]self.n_worker kwargs[n_worker]self.exp_env kwargs[stream_env]if kwargs[mem_manage] default:self.mem_manage uncertaintydef train(self, cur_iter, n_epoch, batch_size, n_worker, n_passes0):if len(self.memory_list) 0:mem_dataset ImageDataset(pd.DataFrame(self.memory_list),datasetself.dataset,transformself.train_transform,)memory_loader DataLoader(mem_dataset,shuffleTrue,batch_size(batch_size // 2),num_workersn_worker,)stream_batch_size batch_size - batch_size // 2else:memory_loader Nonestream_batch_size batch_size# train_list streamed_list in RMtrain_list self.streamed_listtest_list self.test_listrandom.shuffle(train_list)# Configuring a batch with streamed and memory data equally.train_loader, test_loader self.get_dataloader(stream_batch_size, n_worker, train_list, test_list)logger.info(fStreamed samples: {len(self.streamed_list)})logger.info(fIn-memory samples: {len(self.memory_list)})logger.info(fTrain samples: {len(train_list)len(self.memory_list)})logger.info(fTest samples: {len(test_list)})# TRAINbest_acc 0.0eval_dict dict()self.model self.model.to(self.device)for epoch in range(n_epoch):# initialize for each taskif epoch 0: # Warm start of 1 epochfor param_group in self.optimizer.param_groups:param_group[lr] self.lr * 0.1elif epoch 1: # Then set to maxlrfor param_group in self.optimizer.param_groups:param_group[lr] self.lrelse: # Aand go!self.scheduler.step()train_loss, train_acc self._train(train_loadertrain_loader, memory_loadermemory_loader,optimizerself.optimizer, criterionself.criterion)eval_dict self.evaluation(test_loadertest_loader, criterionself.criterion)writer.add_scalar(ftask{cur_iter}/train/loss, train_loss, epoch)writer.add_scalar(ftask{cur_iter}/train/acc, train_acc, epoch)writer.add_scalar(ftask{cur_iter}/test/loss, eval_dict[avg_loss], epoch)writer.add_scalar(ftask{cur_iter}/test/acc, eval_dict[avg_acc], epoch)writer.add_scalar(ftask{cur_iter}/train/lr, self.optimizer.param_groups[0][lr], epoch)logger.info(fTask {cur_iter} | Epoch {epoch1}/{n_epoch} | train_loss {train_loss:.4f} | train_acc {train_acc:.4f} | ftest_loss {eval_dict[avg_loss]:.4f} | test_acc {eval_dict[avg_acc]:.4f} | flr {self.optimizer.param_groups[0][lr]:.4f})best_acc max(best_acc, eval_dict[avg_acc])return best_acc, eval_dictdef update_model(self, x, y, criterion, optimizer):optimizer.zero_grad()do_cutmix self.cutmix and np.random.rand(1) 0.5if do_cutmix:x, labels_a, labels_b, lam cutmix_data(xx, yy, alpha1.0)logit self.model(x)loss lam * criterion(logit, labels_a) (1 - lam) * criterion(logit, labels_b)else:logit self.model(x)loss criterion(logit, y)_, preds logit.topk(self.topk, 1, True, True)loss.backward()optimizer.step()return loss.item(), torch.sum(preds y.unsqueeze(1)).item(), y.size(0)def _train(self, train_loader, memory_loader, optimizer, criterion):total_loss, correct, num_data 0.0, 0.0, 0.0self.model.train()if memory_loader is not None and train_loader is not None:data_iterator zip(train_loader, cycle(memory_loader))elif memory_loader is not None:data_iterator memory_loaderelif train_loader is not None:data_iterator train_loaderelse:raise NotImplementedError(None of dataloder is valid)for data in data_iterator:if len(data) 2:stream_data, mem_data datax torch.cat([stream_data[image], mem_data[image]])y torch.cat([stream_data[label], mem_data[label]])else:x data[image]y data[label]x x.to(self.device)y y.to(self.device)l, c, d self.update_model(x, y, criterion, optimizer)total_loss lcorrect cnum_data dif train_loader is not None:n_batches len(train_loader)else:n_batches len(memory_loader)return total_loss / n_batches, correct / num_datadef allocate_batch_size(self, n_old_class, n_new_class):new_batch_size int(self.batch_size * n_new_class / (n_old_class n_new_class))old_batch_size self.batch_size - new_batch_sizereturn new_batch_size, old_batch_size
1.内存管理与数据混合对应论文 Section 4.1 将内存中的旧任务样本memory_loader与当前任务的流数据train_loader按比例混合默认各占50%。
使用cycle(memory_loader)循环读取内存数据避免内存样本因容量限制被忽略。 实现多样性记忆回放通过混合新旧任务样本缓解灾难性遗忘确保模型同时学习新任务和巩固旧任务知识。
def train(self, cur_iter, n_epoch, batch_size, n_worker, n_passes0):# 加载内存数据旧任务样本和流数据新任务样本if len(self.memory_list) 0:mem_dataset ImageDataset(self.memory_list, transformself.train_transform)memory_loader DataLoader(mem_dataset, batch_size(batch_size // 2), ...)stream_batch_size batch_size - batch_size // 2else:memory_loader Nonestream_batch_size batch_size# 混合流数据和内存数据data_iterator zip(train_loader, cycle(memory_loader)) # 循环迭代内存数据x torch.cat([stream_data[image], mem_data[image]])y torch.cat([stream_data[label], mem_data[label]])
数据增强CutMix 以50%概率应用CutMix将两张图像局部区域混合并生成对应的混合标签labels_a和labels_b。 计算混合损失lam * loss_a (1-lam) * loss_b鼓励模型学习更鲁棒的特征实现标签混合增强Section 4.2通过生成边界复杂的样本提升记忆库多样性增强模型泛化能力。
def update_model(self, x, y, criterion, optimizer):# CutMix增强混合图像和标签do_cutmix self.cutmix and np.random.rand(1) 0.5if do_cutmix:x, labels_a, labels_b, lam cutmix_data(xx, yy, alpha1.0)logit self.model(x)loss lam * criterion(logit, labels_a) (1 - lam) * criterion(logit, labels_b)else:logit self.model(x)loss criterion(logit, y)
动态学习率与批量调整
# Warm start学习率调整
if epoch 0:for param_group in self.optimizer.param_groups:param_group[lr] self.lr * 0.1 # 初始低学习率
elif epoch 1:param_group[lr] self.lr # 恢复基准学习率
else:self.scheduler.step() # 后续按计划调整# 动态调整新旧任务批量大小
def allocate_batch_size(self, n_old_class, n_new_class):new_batch_size int(self.batch_size * n_new_class / (n_old_class n_new_class))old_batch_size self.batch_size - new_batch_sizereturn new_batch_size, old_batch_size
初始阶段使用低学习率10%基准值进行预热Warm-up避免训练初期不稳定。
根据新旧类别比例动态分配批量大小平衡新旧任务的学习强度防止新任务数据主导学习过程。 4. 训练流程与评估
# 训练与评估循环
for epoch in range(n_epoch):train_loss, train_acc self._train(...) # 训练eval_dict self.evaluation(...) # 评估logger.info(fTask {cur_iter} | Epoch {epoch1} | train_acc {train_acc:.4f} | test_acc {eval_dict[avg_acc]:.4f})
3.实验结果 研究者将提出的RM与各种数据集的“ Blurry10-Online”设置中的其他方法进行了比较并总结了如下表的结果如表所示RM始终优于所有其他方法并且当类| C |增加时增益会更大。但是在MNIST上没有DA的RM表现最好。 研究者认为DA会干扰模型培训因为示例足以避免忘记。
下表列出了三个情节记忆大小K的CIFAR10-Blurry10Online的比较 200、500和1,000。结果表明这些方法在最终任务中保留了有效的示例足以恢复以前任务中发生的遗忘。 ICARLGDUMB和BIC对于不固定i5的有效性较小并且与EWC和RWALK相比它们在忘记方面的表现较大作为权衡。
研究者进一步比较了任务流的准确性轨迹 由随机分配的函数ψc生成的三个流具有不同的随机种子用于Imagenet和单个流用Imagenet并总结了下图中的结果
RM在整个任务流中始终优于其他基线。
总结
研究结论研究者提出一种名为彩虹记忆RM的方法用于处理任务共享类别模糊 - CIL的现实持续学习场景。通过基于样本分类不确定性的新的多样性增强采样方法和多种数据增强技术在CIFAR10、CIFAR100和ImageNet的模糊 - CIL场景中RM大幅优于现有方法在不连续和离线CIL设置中也有可比性能。 研究的创新性一是提出基于样本扰动不确定性的多样性增强采样方法管理有限容量记忆二是采用多种数据增强技术提高样本多样性增强记忆中样本的代表性和判别性。 研究展望可研究基于不确定性的记忆更新和数据增强在训练时的关系及其对不同CIL任务的影响。还可探索RM在更多类型数据集或其他领域持续学习场景中的应用效果。