论文解读:Label Hallucination for Few-Shot Classification

news/2024/5/19 21:53:50

文章汇总

动机

本文的一个思想就是:尽管新类的标签并不能“恰如其分”地表示基数据集中的样本,但是很多基数据集的样本会包含与新类中相似的对象,例如,基数据集中的老虎和新类中的猫有相似的特征,那么就有60%的概率将老虎打上猫的标签;或者基数据集中的图片与新类中的图片有背景相似,比如“car”和“pedestrians”即车和行人的背景可能都是街道,那么打完伪标签后,两幅图的标签很有可能相同。

而我们通过伪标签数据集来微调整个模型,训练网络识别基数据集上的这些相似特性或背景线索,从而将representation转向对新类识别有用的特征

此外,由于基数据集中样本数据相比新类来说丰富,起到大量非参数化数据增强的作用,能够产生general representation,避免过拟合问题,同时也克服了小样本学习中固有的数据稀缺问题。

流程解读

Pretraining

很正常的预训练步骤,用庞大的基类数据集base训练出backbone和分类器:\Theta^{base},\phi^{base}

Episode training:step1

拿novel数据集来训练出一个预测的标签空间为novel的标签空间的分类器\phi_{i}

值得注意的是,这里\Theta^{base}是不变的,而\phi_{i}的初始参数为\phi^{base}进行softmax之前的参数

Episode training:step2

\Theta^{base},\phi_{i}作为backbone,分类器,两者参数都不变,而是直接拿base的数据来生成软伪标签\hat y^{base}

\hat y^{base}_{i,t}=g_{\phi_i}(f_{\Theta^{base}}(x_t)),t=1,...,N^{base}

Episode training:step3

拿novel数据集训练backbone和分类器:\Theta',\phi_{i}'

L_{KL},L_{CE}分别为x与伪标签的损失,x与实际标签的损失。

本人对这篇文章的疑问

少样本图像分类的目标不是要去一个识别出一份训练中没有出过的新类数据集novel domain吗?可是这篇文章把novel domain的数据拿来训练了,这是否违背了少样本图像分类的本意?

摘要

少样本分类需要适应从大型带注释的基础数据集中学习到的知识,以识别新的未见过的类,每个类由几个标记的示例表示。在这种情况下,在大数据集上预训练一个具有高容量的网络,然后在少数例子上对其进行微调,会导致严重的过拟合。同时,在从大型标记数据集中学习的“冻结”特征之上训练简单的线性分类器无法使模型适应新类别的属性,从而有效地导致欠拟合。

在本文中,我们提出了这两种流行策略的替代方法。首先,我们的方法使用在新类上训练的线性分类器对整个大型数据集进行伪标签。这有效地“幻觉”了大型数据集中的新类,尽管新类别不存在于基本数据库中(新类和基本类是不相交的)。然后,除了新数据集上的标准交叉熵损失外,它还使用伪标记基础样本上的蒸馏损失对整个模型进行微调。这一步有效地训练网络识别上下文和外观线索,这些线索对小说类别识别有用,但使用整个大规模基础数据集,从而克服了少样本学习固有的数据稀缺性问题。尽管方法很简单,但我们表明,我们的方法在四个建立良好的少量分类基准上优于最先进的方法。

介绍

深度学习已经成为大数据场景的主要学习范式,并在广泛的应用领域取得了令人印象深刻的成果,包括计算机视觉[23]、自然语言处理[10]和生物信息学[41]。然而,要使深度学习模型适应标记样本较少的环境仍然很困难,因为大容量模型本质上容易过度拟合。

少样本学习通常在情景学习范式下进行研究,该范式通过从大型基础数据集的一小部分类别中重复采样少量示例来模拟训练过程中的少样本设置。在这些训练集上进行优化的元学习算法[15,36,22,49,44]推动了少样本分类领域的发展。然而,最近的研究[7,11,48]表明,纯粹的迁移学习策略往往更具竞争力。例如,Tian等人[48]提出首先在基本数据集上预训练一个大容量分类模型,然后使用少数新示例在这个预训练的表示上简单地学习一个线性分类器。通过多次蒸馏迭代[17],或者同时结合熵最大化、旋转自我监督、知识蒸馏等几种损失,可以进一步提高转移模型的少样本性能[35]。

在本文中,我们采用迁移学习方法。然而,我们并没有将表征冻结为从基类中学习到的特征[48,35,39],而是对整个模型进行了微调。由于仅使用少数示例来调整网络会导致严重的过拟合(正如我们的缩减所证明的那样),我们建议通过重用整个基本数据集来优化模型,但只有在将原始标签与对应于新类的伪标签交换之后。这是通过在基本数据集上运行一个简单的线性分类器来实现的,这个分类器是在少数新类别的示例上训练的。分类器有效地“幻觉”了基础图像中新类的存在。尽管我们在基本数据集的类别与新类别完全脱节的情况下对我们的方法进行了经验评估,但我们证明了这种大规模伪标记数据能够有效地调整整个模型以识别新类别。优化是使用伪标记基础数据集上的蒸馏和少数样本上的交叉熵最小化的组合来进行的。图1概述了我们提出的方法。

直觉是,尽管新奇类在基本图像中没有“适当地”表示,但许多基本示例可能包含与新奇类相似的对象,这些对象由定义属于新奇类的概率的软伪标签编码。例如,假设老虎的基本图像与“家猫”的外观相似,伪标签可能会给它们分配0.6的概率,使其属于新类别“家猫”。或者,它可能会为基础图像分配大的新类伪标签概率,因为它的真实基础类别与小说类共享相似的上下文背景,例如“汽车”和“行人”,它们都可能出现在街景中。使用蒸馏目标(结合少数新图像示例的交叉熵损失)对这些软伪标签上的整个模型进行微调,训练网络识别在基础数据集上的相似或相同线索。因此,将表示转向对识别新类别有用的特征。此外,由于基础数据集是大规模的,这些示例服务于大量非参数数据增强的作用,产生相当一般且不会过拟合的表示,从而克服了少拍学习固有的数据稀缺性问题。我们邀请读者回顾我们的技术附录(TechApp)的标签幻觉可视化部分中的可视化和解释,以进一步了解我们系统的行为。这些可视化证实了我们方法背后的直觉,即得分最高的基本图像往往包含与小说类对象共同出现的上下文元素。例子包括前景对象有相似的外观few-shot图像(例如,图1中的雪橇犬形象TechApp),或基地的例子包括与新类的形状类似于类对象(例如,图2中的绿曼巴TechApp,类似于线虫的形状),甚至实例匹配的空间布局(例如,烟草商店和立式钢琴的图片也有类似的空间布局的书店在图3类TechApp)。

图1:我们提出的方法在一个说明性设置中的概述,涉及5个新类别的1-shot分类。预训练从标记的基础数据集中学习主干模型\Theta和分类头\phi_0。骨干用于计算后续阶段的嵌入,而分类头被丢弃。在episode训练中,步骤1)使用支持集和固定嵌入Θ在新域学习一个线性分类器\phi_1。步骤2)使用固定嵌入\Theta和分类器\phi_1对基数据集相对于新域的标签空间进行伪标签。步骤3)结合蒸馏和交叉熵最大化,使用支持集和伪标记的基础数据集重新学习嵌入和分类器。注意,基本数据集和支持集不共享任何类。

我们注意到,伪标记在半监督学习中已经被广泛使用,其中未标记的样本与标记的样本属于同一类[45,6,34]。伪标记也适用于少数镜头设置[24,50],但仍然适用于经验设置,即未标记数据集中包含新类。我们工作的新颖之处在于表明伪标记的优势甚至扩展到极端的设置,其中基类集和新类集完全不相交。我们还注意到,我们的工作不同于换向的few-shot学习[50,11],后者需要在训练过程中使用未标记示例的测试集。相反,我们的方法在一个纯粹的归纳设置中运行,在每个集中,只有一小部分新的标记示例和基本数据集用于微调。

方法

问题陈述

我们现在正式定义了本工作中考虑的少样本分类问题。我们采用了通用的设置,假设存在一个大规模的标记基础数据集,用于判别学习对随后的新类识别有用的表示。设D^{base}=\{x^{base}_t,y^{base}_t\}^{N^{base}}_{t=1}是基数据集,标签是y^{base}_t \in C^{base}。为了实现良好的表示学习,我们假设类的数量(|C^{base}|)和示例的数量(N^{base})都很大。我们用
D^{novel}=\{x^{novel}_t,y^{novel}_t\}^{N^{novel}}_{t=1},y^{novel}_t \in C^{novel}表示新颖数据集。基类和新颖类是不相交的,即C^{base}\cap C^{novel}=\emptyset。我们假设对少样本分类模型的训练和测试是按episode组成的。在每episode的i中,给予少样本学习者一个支持集D^{support}_i=\{x^{support}_{i,t},y^{support}_{i,t}\}^{NK}_{t=1},涉及K个新颖类和从D^{novel}中采样的每个类的N个样例(N非常小,通常在1到10之间)。然后对查询集
D^{query}_i=\{x^{query}_{i,t},y^{query}_{i,t}\}^{N'K}_{t=1},其中包含与D中支持i的相同K类的示例。因此,查询/支持集分别充当少量训练/测试集。在每集episode的i中,在给定D^{support}_i中的少数训练样例的情况下,few-shot学习器适应从大规模数据库D^{base}中学习到的表示/模型来识别新的类。

学习在基础数据集上的嵌入表示

首先,我们的目标是从base数据集中学习一个嵌入模型,该模型将很好地转移和推广到下游的少样本问题。我们遵循Tian等人[48]的方法(表示为RFS),有区别地地训练一个由主干f_\Theta和最终分类层g_\phi组成的卷积神经网络。参数\{\Theta,\phi\}共同优化|C^{base}|-way基分类问题,使用数据集D^{base}:

其中L_{CE}为交叉熵损失。先前的工作表明,通过知识蒸馏[48]、旋转自我监督[35]或通过对图像变换集强制表示等价和不变性[39],可以进一步提高参数\Theta^{base}编码的嵌入表示的质量。在本文提出的实验中,我们遵循SKD[35](使用自监督蒸馏)和IER[39](利用不变和等变表示)的嵌入学习策略。然而,请注意,我们的方法独立于用于嵌入学习的具体方法。

幻想在基本数据集中出现新的类

为了根据新类对基本数据集进行伪标记,我们首先在支持集上训练一个分类器。对于元学习阶段的每一episode 中i,我们使用少样本支持集D^{support}_i=\{x^{support}_{i,t},y^{support}_{i,t}\}^{NK}_{t=1}在固定特征嵌入模型\Theta^{base}上学习一个线性分类器\phi_i

需要注意的是,在之前的文献[48,35,39]中,\phi_i是直接对查询集D^{query}_i求值,从而得到最终的少样本分类结果。相反,这里我们使用生成的模型g_{\phi_i}(f_{\Theta^{base}}(x))根据第个episode中新类的本体重新标记基本数据集。我们用\hat y^{base}_{i,t}的向量(softmax之前的输出)表示通过将学习到的分类器应用于x^{base}_t的示例生成的logits向量,即\hat y^{base}_{i,t}=g_{\phi_i}(f_{\Theta^{base}}(x_t)),t=1,...,N^{base}。这些软伪标签用于通过知识蒸馏重新训练整个模型,如下所述。

微调整个模型以识别新的类

最后,我们使用包含相同比例的支持和基类样例的mini-batch对整个模型(即主干和分类器)进行微调。基础示例的损失函数是知识蒸馏[20],而支持示例的目标最小化是交叉熵(CE)。换句话说,我们在两种损失的混合上优化模型的参数

其中\hat y表示幻觉伪标签,L_{KL}为模型预测与温度T缩放的伪标签之间的KL散度,\{\lambda_{KL},\lambda_{CE}\}是超参数,权衡了这两个损失的重要性。由于支持集非常小(在某些设置中,每episode包括五个新颖类,每个新颖类只有一个示例),我们使用数据增强来生成每个支持图像的多个视图,以便获得足够的示例来填充mini-batch的一半。具体来说,我们采用了之前作品[48,35,39]的标准设置,并使用随机裁剪,颜色抖动和随机翻转来生成多个视图。

最后,在查询集D^{query}_i=\{x^{novel}_{i,t},y^{novel}_{i,t}\}^{N'K}_{t=1}上计算得到的模型g_{\phi_i'}(f_{\Theta^{'}_i}(x))。最后的结果是通过对所有episode的平均准确率来报告的。我们注意到,虽然伪标签和调优的操作是分开且按顺序呈现的,但在实践中,对于某些数据集,我们发现为迷你批处理中加载的基本示例动态生成目标伪标签更有效,而不必将它们存储在磁盘上。

实验

结论

我们提出了一种简单的标签幻觉策略,以便从新类的少样本样本中有效地微调大容量模型。在四个已建立的少量分类基准上的结果表明,即使在基本数据集的标签和新示例的标签完全不相交的极端情况下,我们的过程也达到了最先进的精度,并且通过微调或在预训练表征之上执行线性分类的方法,始终优于流行的迁移学习策略。

参考资料

论文下载(2022 AAAI)

https://arxiv.org/abs/2112.03340

代码地址

GitHub - yiren-jian/LabelHalluc: [AAAI 2022] Label Hallucination for Few-Shot Classification

参考文章


http://www.mrgr.cn/p/58444546

相关文章

【CSS】使用 scroll snap 实现页面的垂直大屏滚动

CSS 属性 scroll-snap-type 设置了在有滚动容器的情形下吸附至吸附点的严格程度。 scroll-snap-type 使用 scroll snap 也可以用于垂直滚动&#xff0c;全屏展示就是一个很好的例子: <main><section class"section section-1"></section><sect…

4.26文件上传学习

文件上传,绕过,验证,检测一、文件上传 概念:(不赘述转web安全文件上传)[[9.6-9.7基础和过滤方式]] 前置知识:(除解析漏洞)后门代码需要以特定格式后缀解析,不能以图片后缀解析; 知识点 1、文件上传-前端验证 直接修改前端js代码,文件上传格式; 2、黑白名单 3、use…

MySQL—MySQL的存储引擎之InnoDB

MySQL—MySQL的存储引擎之InnoDB 存储引擎及种类 存储引擎说明MyISAM高速引擎&#xff0c;拥有较高的插入&#xff0c;查询速度&#xff0c;但不支持事务InnoDB5.5版本后MySQL的默认数据库存储引擎&#xff0c;支持事务和行级锁&#xff0c;比MyISAM处理速度稍慢ISAMMyISAM的…

Python-Flask-migrate安装和使用

在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。 环境…

MySQL-07.InnoDB数据存储结构

C-07.InnoDB数据存储结构 1.数据库的存储结构:页索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作。不同存储引擎中存…

C++感受6-Hello World 交互版

变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课&#xff0c;我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多&#xff0c;每一次问…

以链表为基础实现链式队列——————遍历、入队、出队

以链表为基础实现链式队列 ​ 如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。​ 需要注意的点:遍历队列需要备份地址 出队需要考虑空…

Windows设置开机自启动项

一、常见软件的开机自启设置大部分安装的软件,在设置中都带有“设置开机自启”的选项,直接在软件本身的设置中勾选相应开关项即可。 二、本身无开机自启的软件或一些绿色便携式的软件 (一)实现原理Windows自带了一个启动文件夹,在此文件夹中的软件都会在开机后进行启动操作…

个人音乐播放网站项目(SpringBoot+Linux部署上线)

在做完第一个博客系统项目以后&#xff0c;接着做下一个项目&#xff1a;音乐播放网站项目&#xff0c;此项目应用的技术栈和第一个项目是差不多的&#xff0c;即算是学完SSM等知识以后的两个入门级Java开发项目吧。 此项目包含的核心功能有&#xff1a; 一、登录、注册、退出…

李彦宏:程序员将不复存在! 周鸿祎回怼!网友:先把百度程序员都开除了!

近日&#xff0c;百度创始人、董事长兼首席执行官李彦宏在央视《对话》•开年说的访谈中指出&#xff1a;“基本上说以后其实不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力”。 “未来的编程语言只会剩下两种&#xff0c;一种…

Unsortbin attack原理及分析

Unsortbin attack原理 ✔️条件:首先要实现Unsortbin attack前提是可以控制Unsortbin attack chunk的bk指针 ✔️目的:我们可以实现修改任意地址为一个比较大的值 ✔️原理:1.Unsortbin的来源 1.当一个较大的 chunk 被分割成两半后,如果剩下的部分大于MINSIZE,就会被放到 …

flutter release 报错 Error: SocketException: Failed host lookup:

flutter 的 debug 模式没有任何问题 &#xff0c;打了release 包后一直报下面的错&#xff0c;查了一下是 因为没有网络权限 Error: SocketException: Failed host lookup: yomi-test-aws-sg.yomigame.games (OS Error: No address associated with hostname, errno 7) 按照下…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图&#xff0c;直接下载即可 transforms.Compose 是PyTorch中的一个实用工具&#xff0c;用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理&#xff0c;例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制&#xff0c;可以将数据拷贝存储在不同的节点上。这样&#xff0c;如果一…

运行django

确保app被注册 urls.py中编写url 视图对应关系 命令行启动 python manage.py runserver

iOS - 多线程-GCD-队列组

文章目录 iOS - 多线程-GCD-队列组1. 队列组1.1 基本使用步骤 iOS - 多线程-GCD-队列组 开发过程中&#xff0c;有时候想实现这样的效果 多个任务并发执行所有任务执行完成后&#xff0c;进行下一步处理&#xff08;比如回到主线程刷新UI&#xff09; 1. 队列组 可以使用GC…

npm run dev, serve和build的区别

真实命令分别为npm run vite,npm run vite build,npm run vite preview ctrl+c结束运行的npm项目

算法06链表

算法06链表 一、链表概述1.1概述1.2链表的组成部分&#xff1a;1.3链表的优缺点&#xff1a; 二、链表典例力扣707.设计链表难点分析&#xff1a;&#xff08;1&#xff09;MyLinkedList成员变量的确定&#xff1a;&#xff08;2&#xff09;初始化自定义链表&#xff1a;&…

OpenHarmony语言基础类库【@ohos.util.LinkedList (线性容器LinkedList)】

LinkedList底层通过双向链表实现&#xff0c;双向链表的每个节点都包含对前一个元素和后一个元素的引用。当需要查询元素时&#xff0c;可以从头遍历&#xff0c;也可以从尾部遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。LinkedList允许元素为null。 LinkedList…

谷歌 hackbar 不能使用的问题

谷歌 hackbar 不能使用的问题 下载 hackbar 插件:https://github.com/Mr-xn/hackbar2.1.3 解压文件,将其拖入 chrome 扩展程序中点击详情,点击下面来源的链接 会跳转到插件的安装位置,进入theme/js文件,打开hackbar-panel.js文件,将以下三处disable_hackbar()函数替换成i…