【论文精读】SimCLR2

news2025/3/13 8:12:24

摘要

       本文提出了一个半监督学习框架,包括三个步骤:无监督或自监督的预训练;有监督微调;使用未标记数据进行蒸馏。具体改进有:

  • 发现在半监督学习(无监督预训练+有监督微调)中,对于较大的模型只需采用少量有标签数据就可实现良好的结果
  • 证明了SimCLR中用于半监督学习的卷积层之后非线性变换(投影头)的重要性。更深的投影头能提高分类线性评估指标,也能提高从投影头的中间层进行微调时的半监督性能
  • 对于特定目标,过大的模型容量不必要。故通过针对特定任务使用无标签数据蒸馏将大型模型转移到更小的网络中,可以进一步提高模型的预测性能

框架

image
       提出的半监督学习框架归纳为三个主要步骤:预训练、微调和蒸馏(上图)。算法以任务无关或任务特定的方式利用无标记数据。

  • 第一步使用与任务无关的未标记的数据,通过无监督预训练学习一般特征表示
  • 第二步使用前一步的特征表示通过有监督学习微调来调整通用特征表示以适应特定任务
  • 第三步使用特定于任务的未标记的数据,采用模型蒸馏方法,进一步提高预测性能并获得更小的模型。本文用微调后的教师网络的估算标签,在未标记数据上训练学生网络

对SimCLR的改进

       无监督算法采用SimCLR方法,但做出如下改进:

  • 对于编码器网络 f ( ⋅ ) f(\cdot) f(),采用更大的一个152层ResNet模型及SKNet
  • 加深了非线性转换网络 g ( ⋅ ) g(\cdot) g()层,在微调阶段,不完全丢弃 g ( ⋅ ) g(\cdot) g(),而是从中间层进有监督训练
  • 纳入了MoCo的记忆机制,但由于batchsize设置的很大,这部分改进带来的提升相对较小

       该方法称为SimCLRv2。

Loss

       SimCLR中一张图像经过数据增强 τ τ τ、编码器网络 f ( ⋅ ) f(\cdot) f()、非线性转换网络 g ( ⋅ ) g(\cdot) g()后会产生对比损失 z 2 k − 1 z_{2k−1} z2k1 z 2 k z_{2k} z2k,一对正例 i i i j j j(从同一图像增强)之间的对比损失如下:
l i , j N T − X e n t = − log ⁡ exp ⁡ ( s i m ( z i , z j ) / τ ) ∑ k = 1 2 N 1 [ k ≠ i ] exp ⁡ ( s i m ( z i , z k ) / τ ) l^{NT-Xent}_{i,j}=-\log \frac {\exp(sim(z_i,z_j)/\tau)} {\sum^{2N}_{k=1}1_{[k \not = i]}\exp(sim(z_i,z_k)/\tau)} li,jNTXent=logk=12N1[k=i]exp(sim(zi,zk)/τ)exp(sim(zi,zj)/τ)

       其中 s i m ( ⋅ , ⋅ ) sim(·, ·) sim(⋅,⋅)是两个向量之间的余弦相似度, τ τ τ是temperature参数,通过教师学生网络得到对比学习来训练网络,在预训练,微调阶段时采用上述loss。

       在知识蒸馏阶段,将微调网络用作教师来估算标签以训练学生网络。具体来说,在没有使用真实标签的情况下,最小化以下蒸馏损失:
L d i s t i l l = − ∑ x i ∈ D [ ∑ y P T ( y ∣ x i ; τ ) log ⁡ P S ( y ∣ x i ; τ ) ] L^{distill}=-\sum_{x_i\in D}[\sum_yP^T(y|x_i;\tau)\log P^S(y|x_i;\tau)] Ldistill=xiD[yPT(yxi;τ)logPS(yxi;τ)]

       其中 P ( y ∣ x i ) = e x p ( f t a s k ( x i ) [ y ] / τ ) / ∑ y ′ e x p ( f t a s k ( x i ) [ y ′ ] / τ ) P(y|x_i)=exp(f^{task}(x_i)[y]/τ)/\sum_{y'}exp(f^{task}(x_i)[y']/τ) P(yxi)=exp(ftask(xi)[y]/τ)/yexp(ftask(xi)[y]/τ) τ τ τ是temperature参数。教师网络 P T ( y ∣ x i ) P^T(y|x_i) PT(yxi)在蒸馏过程中固定,用于训练学生网络 P S ( y ∣ x i ) P^S(y|x_i) PS(yxi)

       当标记样本的数量很大时,也可以使用加权组合将蒸馏损失与标记样本相结合训练,如下:
L = − ( 1 − α ) ∑ ( x i , y i ) ∈ D L [ log ⁡ P S ( y i ∣ x i ) ] − α ∑ x i ∈ D [ ∑ y P T ( y ∣ x i ; τ ) log ⁡ P S ( y ∣ x i ; τ ) ] L=-(1-\alpha)\sum_{(x_i,y_i)\in D^L}[\log P^S(y_i|x_i)]-\alpha \sum_{x_i \in D}[\sum_yP^T(y|x_i;\tau)\log P^S(y|x_i;\tau)] L=(1α)(xi,yi)DL[logPS(yixi)]αxiD[yPT(yxi;τ)logPS(yxi;τ)]

实验

实验配置

       在ImageNet ILSVRC-2012数据集上评估了所提出的方法。数据集有128万张图像可用,但只随机抽样的1%或10%的图像与标签相关联,其余只采样图像。使用LARS优化器(动量为0.9)进行预训练、微调和蒸馏。

       对于预训练,batchsize大小为4096,采样全局批归一化,epoch为800。学习率在前5%的epoch线性增加,达到最大值6.4,然后以余弦衰减方法衰减,使用了1e−4的权重衰减。在ResNet编码器上使用一个3层的MLP投影。内存缓冲区设置为64K,指数移动平均(EMA)衰减设置为0.999。使用与SimCLR相同的简单增强集,即随机裁剪,颜色失真和高斯模糊。

       对于微调,默认情况下,从投影头的第一层对1%/10%的标记样本进行微调,用1%的标签数据进行60个epoch进行微调,用10%的标签进行30个epoch;但当存在100%的标签时,从投影头的输入进行微调。使用全局批量归一化,但删除了 权重衰减、学习率预热,学习率为标准ResNets的0.16,和更大的ResNets变体的0.064。批量大小设置为1024。

       对于蒸馏,使用无标签的数据。考虑两种类型的蒸馏:自蒸馏,学生与教师具有相同的模型结构(不包括投影头);以及从大到小的蒸馏,其中学生是一个小得多的网络。对于自蒸馏,将 τ τ τ设置为0.1,对于从大到小的蒸馏,将 τ τ τ设置为1.0。使用相同的学习率调度、权重衰减、批量大小作为预训练,模型被训练了400个epoch。在微调和蒸馏期间,只应用随机裁剪和水平翻转训练图像。

对比实验

image
       上图比较了不同模型大小和评估方法下的自监督学习和监督学习模型,包括微调和线性评估。 可以看到,增加编码器网络 f ( ⋅ ) f(\cdot) f()宽度和深度以及使用SK都可以提高性能。这些架构对标准监督学习的影响相对有限(最小模型和最大模型的差异为4%),但对于自监督模型,线性评估的精度差异可达8%,对1%的标记图像进行微调的精度差异可达17%。证明了自监督学习相对于监督学习的优势。
image
       上图显示了不同模型大小在不同标签样本占比时的性能。结果表明,更大的模型对于监督和半监督学习都具有更好的学习能力,但半监督学习性能提升幅度更大。
image
       上图显示了在不同标签样本占比下通过增加模型大小,监督学习和半监督学习(即SimCLRv2)都能从更大的模型中提升性能。
image
       上图显示了不同尺寸的微调SimCLRv2模型的top-1精度。结果表明模型越大越好;使用SK,在相同的参数数量下可以获得更好的性能。
image
       上图显示将最好的模型与之前最先进的半监督学习方法在ImageNet上进行比较。该方法大大改进了之前的结果,无论是小型的ResNet还是大型的ResNet变体。

消融实验

image
       使用具有不同投影头层数(从2到4个全连接层)的SimCLRv2对ResNet-50的预训练,并检查从投影头的不同层进行微调时的性能。从上图观察到,从投影头的最优层(投影头的第一层)进行微调时,在预训练期间使用更深的投影头更好(图5a);在投影头第一层微调效果最优(图5b)。
image
       上图显示2层和3层投影头的不同层微调的效果。结果证实,用少量标记样本在更深的投影头进行预训练和从中间层进行微调,可以提高半监督学习性能。模型尺寸越小,改进越大。
image
       上图显示了在使用蒸馏损失进行训练时使用未标记样本的重要性。当标签样本占比很小时,单独使用蒸馏损失几乎与平衡蒸馏损失效果一样好。
image
       蒸馏未标记的样本以两种方式改进微调模型。

  • 一般蒸馏:当学生模型的结构小于教师模型时,它通过将特定任务的知识迁移到学生模型中来提高模型效率
  • 自蒸馏:学生模型与教师模型具有相同的结构(不包括ResNet编码器后的投影头),可以提高半监督学习性能。为了使较小的ResNets获得最佳性能,在将大模型蒸馏为较小的模型之前,对其进行自我蒸馏。

       上图显示了不同蒸馏方法组合的线性评估指标,分别为微调模型、自蒸馏模型、基于自蒸馏教师网络的蒸馏模型、监督模型。可以看到蒸馏模型效果最佳。
image
       上图显示了组合蒸馏损失中蒸馏权重 α α α τ τ τ的影响。可以看到没有实际标签的蒸馏(即 α α α为1.0)与有实际标签的蒸馏效果相同。此外, τ τ τ为0.1和1.0的效果相似,但2.0的效果明显较差。对于本文的蒸馏实验,当教师模型是微调模型时,默认 τ τ τ为0.1,否则 τ τ τ为1.0。
image
       进一步研究了使用不同投影头进行微调的教师网络的蒸馏性能。更具体地说,预训练两个ResNet-50 (2 × +SK)模型,分别具有两层或三层投影头,并从中间层进行微调。这给出5个不同的教师网络,对应不同的投影头设置。上图所示,蒸馏性能与微调teacher的top-1精度密切相关。这表明,更好的微调模型(以其top-1精度衡量),无论其投影头设置如何,都是更好的老师使用未标记数据将特定知识传递给学生。
image
       上图研究了微调和线性评估的相关性,显示了两种不同微调策略下的相关性:

  • 来自投影头输入的微调(行1)
  • 来自投影头中间层的微调(行2)

       观察到总体上存在线性相关性。当从投影头的中间层进行微调时,观察到更强的线性相关性。此外,注意到随着用于微调的标记图像数量的增加,相关性的斜率变得更小。
image
       上图显示了有或没有memory(MoCo)训练的SimCLRv2模型的top-1比较。memory在线性评估在微调方面提供了适度的优势,性能提升约1%。大致认为,memory只能提供边际改进的原因是使用了很大的batchsize(即4096)。

reference

Chen, T. , Kornblith, S. , Swersky, K. , Norouzi, M. , & Hinton, G. . (2020). Big Self-Supervised Models are Strong Semi-Supervised Learners. Neural Information Processing Systems.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式day24

开课复工啦~ 冲冲冲! 文件IO: read函数和write函数: 📚 write 接口有三个参数: fd:文件描述符buf:要写入的缓冲区的起始地址(如果是字符串,那么就是字符串的起始地址&…

语义分割-基础知识

1.cls_iou计算: cls0_iou预测正确的像素个数/(预测为该类别的像素个数真实标签为该类别的像素个数-预测正确的像素个数) mean_iou各个类别的像素预测准确值相加/像素总个数2.转置卷积(Transposed Convolution) 转置卷积不是卷积的逆运算 转置卷积也是卷…

黑猫带你学NandFlash第2篇:NandFlash部分相关名词释义

1 前言 1.1 声明 本文依据ONFI5.1、网络资料及个人工作经验整理而成,如有错误请留言。 文章为付费内容,已加入原创侵权保护,禁止私自转载及抄袭。 文章所在专栏:《黑猫带你学:NandFlash详解》 1.2 本文背景 本文关…

springboot198基于springboot的智能家居系统

基于Springboot的智能家居系统 **[摘要]**社会和科技的不断进步带来更便利的生活,计算机技术也越来越平民化。二十一世纪是数据时代,各种信息经过统计分析都可以得到想要的结果,所以也可以更好的为人们工作、生活服务。智能家居是家庭的重要…

【java苍穹外卖项目实战三】nginx反向代理和负载均衡

文章目录 1、nginx反向代理2、nginx 反向代理的好处3、nginx 反向代理的配置方式5、nginx 负载均衡的配置方式6、nginx 负载均衡策略 我们思考一个问题: 前端发送的请求,是如何请求到后端服务的? 前端请求地址:http://localhost/…

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(深入)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:世界上的另一个我 1:02━━━━━━️💟──────── 3:58 🔄 ◀️ ⏸ ▶️ ☰ &am…

手把手教你Linux系统下的Java环境配置,简单到不行!

推荐阅读 给软件行业带来了春天——揭秘Spring究竟是何方神圣(一) 给软件行业带来了春天——揭秘Spring究竟是何方神圣(二) 文章目录 推荐阅读下载JDK安装包方式一方式二 添加环境变量验证安装情况 下载JDK安装包 方式一 1.进入…

如何引导llm为自己写prompt生成剧本

如何使用写prompt让你自己生一个狗血修仙穿越短剧,且短剧有趣生动让人流连忘返 好的,我会尝试编写一个狗血修仙穿越短剧的prompt,以激发你的想象力,让你创作出一个既有趣又生动的短剧。以下是我的prompt: 标题&#x…

神经网络代码实现

目录 神经网络整体框架 核心计算步骤 参数初始化 矩阵拉伸与还原 前向传播 损失函数定义 反向传播 全部迭代更新完成 数字识别实战 神经网络整体框架 核心计算步骤 参数初始化 # 定义初始化函数 normalize_data是否需要标准化def __init__(self,data,labels,layers,…

遨博I20协作臂关节逆解组Matlab可视化

AUBO I20协作臂关节逆解组Matlab可视化 前言1、RTB使用注意点2、代码与效果2.1、完整代码2.2、运行效果 总结 前言 注意:请预先配置好Matlab和RTB机器人工具箱环境,本文使用matlab2022b和RTB10.04版本 工作需要,使用matlab实现对六轴机械臂…

【Kubernetes in Action笔记】1.快速开始

在Kubernetes上运行一个程序 基础运行环境 当前的运行环境为使用虚拟机构建的单master集群。 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 109d v1.27.1 k8s-node1 Ready …

Jetpack Compose 第 2 课:布局

点击查看:Jetpack Compose 教程 点击查看:Composetutorial 代码 简介 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发。 在本教程中&a…

Centos7挂载磁盘

1 查看未挂载的磁盘 命令: fdisk -l红框圈中的即是本次要挂载的磁盘,/dev/vdb 与 /dev/vda 相比,其没有下方的 /dev/vda1 等信息,代表 /dev/vdb 磁盘并没有进行过分区操作,是一个新加的硬盘。 2 对新建的磁盘进行分…

2024.2.18

使用fgets统计给定文件的行数 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./test.txt","w"))NULL){perror("open err");return -1;}fputc(h,fp);fputc(\n,fp);fput…

【Webpack】处理字体图标和音视频资源

处理字体图标资源 1. 下载字体图标文件 打开阿里巴巴矢量图标库open in new window选择想要的图标添加到购物车&#xff0c;统一下载到本地 2. 添加字体图标资源 src/fonts/iconfont.ttf src/fonts/iconfont.woff src/fonts/iconfont.woff2 src/css/iconfont.css 注意字体…

【MySQL进阶之路】MySQL中的聚簇索引和非聚簇索引、以及回表查询

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

uniapp返回上一级页面,传参,上一级通过参数重新请求数据

小程序navigateback传值_微信小程序 wx.navigateBack() 返回页面如何传递参数 - 文章...-CSDN博客 当前页面 上一级页面

【Kuiperinfer】笔记01 项目预览与环境配置

学习目标 实现一个深度学习推理框架设计、编写一个计算图实现常见的算子&#xff0c;例如卷积、池化、全连接学会如何进行算子的优化加速使用自己的推理框架推理常见模型&#xff0c;检查结果是否能够和torch对齐 什么是推理框架&#xff1f; 推理框架用于对已经训练完成的模…

php数组运算符 比较 isset、is_null、empty的用法和区别

php数组运算符 1. 数组运算符2. 判断两个数组是否相等3. isset、is_null、empty的用法和区别 1. 数组运算符 注意&#xff1a;只会保留第一个数组中的键值对&#xff0c;而忽略后面数组中相同键名的元素&#xff0c;如果想要合并两个数组并覆盖相同键名的元素&#xff0c;可以…

微信小程序之开发会议OA项目

目录 前言 本篇目标 首页 会议 投票 个人中心 会议OA项目-首页 配置 tabbar mock工具 page swiper 会议信息 会议OA项目-会议 自定义tabs组件 会议管理 会议OA项目-投票 会议OA项目-个人中心 前言 文章含源码资源&#xff0c;投票及个人中心详细自行查看…