【无监督】5、DINO | 使用自蒸馏和 transformer 来释放自监督学习的超能力(ICCV2021)

news2025/1/25 4:34:56

在这里插入图片描述

文章目录

    • 一、背景
    • 二、相关工作
    • 三、方法
    • 四、效果

论文:Emerging Properties in Self-Supervised Vision Transformers

代码:https://github.com/facebookresearch/dino

出处:ICCV2021 | FAIR

DINO: self-DIstillation with NO labels

本文的标题中总共有 6 个单词,有 2 个重点,一个是自监督,一个是 Vision Transformer,为什么这里作者在文章标题中强调了 transformer ,只因为之前的自监督学习基本上都是基于 CNN 的(也是因为之前 Transformer 没有在视觉中有很成功的应用),所以本文 DINO 的方法也算是首次将 Transformer 成功的用于自监督学习的方法,也证明了基于 Transformer 的自监督网络能够在视觉上获得很好的特征提取能力(甚至比 CNN 更好)。

这里我们首先要明白为什么要研究自监督任务,意义在哪里?

  • 自监督学习能干什么:强有力的特征提取器

  • 自监督学习的意义:不需要大量的人工标注数据,模型能学习图像内部的关系,从而可以利用大量无标注的数据,也能扩展模型的泛化能力

  • 自监督的一个很大的设定就是不需要标签,那么没有标签的图像能学习什么呢,能学习的就是有意义的前景特征,正是因为自监督学习不需要标签,所以不需要费时费力的人工标注。

  • 没有标签提示的情况下模型学习什么样的内容呢,就是基于图像内部的自相关性,具有相同语义信息的像素一定都是有相关性的,直观理解也就是说在一副图像中,前景和前景之间或前景目标内部的自相关性肯定比前景和背景的相关性更大一些,背景像素之间的相关性肯定比背景和前景的相关性大一些,所以自监督学习就是模型在图像内部不断提取由浅到深的特征,整合出有意义的特征

在这里插入图片描述

这个图一展示了,在没有任何监督信号(就是没有类别、框等 label 信息,只有一张图)的情况下,vision transformer 网络提取到的图像内部的自注意力特征图,图中像素颜色越亮就说明响应特征越强烈,这里展示的是 [CLS] token 的特征图,这几张图已经是强有力的证据证明自监督在图像特征提取上的效果,甚至帆船上的绳子都有很好的响应。作者在这里强调使用自监督得到的 ViT 的特征更关注场景信息尤其是目标边界信息。

DINO 的贡献:

  • 证明了使用 small ViT 获得的无监督特征在只搭配 KNN 且无任何 fine-tuning 的情况下就能在 ImageNet 上获得 78.3% top-1 acc
  • 证明了 momentum encoder、multi-crop training、small patch with ViT 的效果,并且基于此构建了一个自监督方法 DINO,证明了结合 DINO 和 ViT 可以达到 80.1% top-1 acc

一、背景

Transformer 的出现打破了视觉任务 CNN 一家独大的场面,Transformer 在 NLP 的成功证明了使用大量数据进行预训练,然后在对应任务上微调的方式是可行的。但 Transformer 一直被诟病于需要更大的计算量和训练数据,而且在视觉上也没有取得比 CNN 优异很多的成绩。

既然 Transformer 在 NLP 上取得的成功很大程度上源于无监督的训练方式,因为在 NLP 中 transformer 的输入都是源于一句相同的话。

如 BERT 中会 mask 掉的单词也是这个句子中的单词,GPT 的 language modeling 方式也是盖住后面的单词,使用前面的单词来预测后面的单词,所以不需要额外的标注,而这种句子自己监督自己的方式也就是自监督的方式。

BERT 中通过 mask 掉句子中的单词,然后让模型预测对应的单词,这样的操作能够让模型更关注全局特征,更关注整个句子内部单词之间的关系,在掌握了整个句子的全局语义后能更好的预测出被 mask 掉的单词,且效果也比对一个句子提供一个全局的监督监督信号更好。

所以 DINO 的出发点就是:自监督学习能否在视觉上展示出 ViT 不同于 CNN 的全新属性呢?

等同于 NLP 中的思路,作者认为给一个图片提供一个全局的监督信号(如 cat 或 dog)的方式会丢失图片中很多细节信息,也会丢失掉没有没 label 提及到的目标的信息。

基于此,作者证明使用自监督的 ViT 得到的图像特征包含了非常丰富的语义分割信息,这在有监督的 ViT 或 CNN 中都是没有的

作者发现了哪些有意思的事情:

  • 第一:很多无监督的方法都展现了对 segmentation mask 的很好的提取特性
  • 第二:只有在结合 momentum encoder 和 multi-crop augmentation 的情况下,DINO 和 KNN 的简单结合才能或者很好的效果
  • 第三:在 ViT 中使用更小的 patch 能提高特征的质量(但这也会带来计算量的提升啊!)

二、相关工作

self-supervised learning:

很多自监督学习方法的做法是在一张图片上使用数据增强获得两个不同的图像,将得到的这两张图片当做一对正样本,也就是这两个图片是一个类别(有多少个图片样本就会有多少个类别),然后自监督学习的目的是让模型能学习到哪两个图像属于一类(就是源于同一张图片)

这种方法就相当于一个分类任务,也就是要学习一个分类器来区分不同的类别(同一图片经过不同数据增强方式获得的两张图片就相当于同一个类别),但是当数据样本增多的时候,这种方法表现的就不是很好的

[73] 提出了使用 noise contrastive estimator(NCE)的方法来对比不同的实例,而不是分类,但这个需要大量的对比数据,也就是需要大的 batch 或 memory bank 才能学习到不同类别数据的内在差别。

基于此,BYOL 方法就提出了不需要学习不同图像之间的差别特征的方法,BYOL 训练的目标是使用 momentum encoder 来将同一类的图片匹配上。

本文的方法也是手 BYOL 启发,但是和 BYOL 的 similarity matching loss 不同

Self-training and knowledge distillation:

Self-training 是最简单的半监督方法之一,其主要思想是找到一种方法,用未标记的数据集来扩充已标记的数据集。算法流程如下:

  • 利用已标记的数据来训练一个好的模型,然后使用这个模型对未标记的数据进行伪标签的生成
  • 模型对未标记数据的所有预测都不可能都是好的,因此对于经典的 Self-training,通常是使用分数阈值(confidence score)过滤部分预测,以选择出未标记数据的预测标签的一个子集。
  • 将生成的伪标签与原始的标记数据相结合,并在合并后数据上进行联合训练。
  • 整个过程可以重复 n 次,直到达到收敛。
  • Self-training 最大的问题在就在于伪标签非常的 noisy,会使得模型朝着错误的方向发展。以下文章大多数都是为了解决这个问题。

Distillation 一般是使用一个大的训练好的模型的输出来指导小模型的训练,将大模型的知识迁移到小模型上,一般 teacher 模型比较大,学习能力比较强,student 模型比较小

Self-training 和 Distillation 如何结合起来呢,之前有的方法使用大模型生成 soft label(pseudo-label),然后小模型学习这些 soft label,以 self-training 的模式来训练模型

本文的方法也是建立在自训练和知识蒸馏上,特殊的地方在于:

  • self-training 过程是完全没有标签的,所以不存在上面说的使用小部分带标签数据训练然后生成伪标签的过程
  • teacher 模型的参数是随机初始化的,使用 EMA 的方式从 student 模型上来更新参数,不存在预训练好的 teacher model
  • teacher 模型和 student 模型结构完全一样,student 模型使用梯度回传来更新,teacher 模型使用 EMA 方式来更新

三、方法

模型在总体框架如图 2 所示,该蒸馏网络学习的目标是让 student 的输出分布和 teacher 的输出分布尽可能的相同,衡量两个分布的差距的方式使用的是交叉熵,让交叉熵最小化。

给定一张图 x,会使用不同的 crop 方式来得到多种不同的子图:

  • 两个 global views,分辨率为 224x224,包含的内容大于原图的 50%
  • 多个 local views,分辨率为 96x96,包含的内容小于原图的 50%

得到不同的子图后怎么经过不同的模型:

  • teacher 模型:每次只会接收一个 global 子图
  • student 模型:每次接收一个随机子图,global 和 local 的都可以

训练的目标是最小化如下 loss:

在这里插入图片描述

在这里插入图片描述
整个框架是自蒸馏的框(自己学习自己):输入的是一张不带标签的图片,使用代理学习(数据增强)来获得两个不同视角的图片,teacher 模型和 student 模型的结构完全一致

  • 左边是 student 网络:使用梯度更新参数

    • student 网络学习的目标是 teacher 网络的输出,输入的是 crop 大于 50% 的大子图,或小于 50% 的小子图
    • 权重的更新方式是使用梯度回传的方式更新,经过 student 模型会输出特征
    • 经过 softmax 后得到 p1 和 teacher 的输出特征 p2 求交叉熵损失
  • 右边是 teacher 网络:使用 EMA 更新参数,且 teacher 的参数也是随机初始化的,没有使用预训练好的模型

    • teacher 网络的输出用于指导 student 网络的学习
    • 输入的是 crop 大于原图 50% 内容的大子图
    • 权重不使用梯度回传的方式更新,而是使用 EMA 的方式即动量的方式来更新权重
    • 在经过 teacher 网络得到的输出上,会进行 centering 的操作,这个操作就是把整个 batch 的样本算一个均值,减掉均值就是 centering(BYOL 中对 batch norm 的讨论),防止模型坍塌
    • θ t ← λ θ t + ( 1 − λ ) θ s \theta_t \gets \lambda \theta_t + (1-\lambda)\theta_s θtλθt+(1λ)θs,且 λ \lambda λ 在训练的时候设置为 0.996~1 之间,也就是每次 teacher 网络的更新特别小
  • 在之前的对比学习方法中(如 MOCO)使用了 queue 中存储的样本作为负样本来进行对比学习,但 DINO 是没有对比学习 loss 的,更像是自监督学习中的 mean teacher。

图 6 展示了使用不同方式更新 teacher 模型参数所带来的效果:

  • student copy:每次 student 更新后直接把参数复制到 teacher
  • previous iter:就是直接使用上一个 iter 的参数来更新 teacher
  • previous epoch:就是直接使用上一个 epoch 的参数来更新 teacher,能够取得和 MOCOv2 或 BYOL 类似 效果
  • Momentum:能够得到最好的效果

Centering 的效果:防止模型坍塌

在这里插入图片描述

伪代码:和 MOCOv3 非常像

在这里插入图片描述

在这里插入图片描述

四、效果

在这里插入图片描述
图 3 展示了不同 attention head 能够注意到不同的语义区域,哪怕当两个不同语义的目标叠加、遮挡非常严重的时候,也能区分开开

在这里插入图片描述

图 4 展示了有监督的训练和 DINO 的效果,有监督的模型在图片上的注意力不集中而且很散乱

在这里插入图片描述
图 8 和图 10 展示了更多自注意力的可视化效果,图片源自 COCO val

图 8 上的点对应的特征图框表示和该点的相关性

在这里插入图片描述

在这里插入图片描述

图 11 展示了 DINO 提取到的 ImageNet val 特征的 t-SNE 可视化,每个类别是使用所有图片的 embedding 的平均后得到的,可以看出类间相关性更高的类会被聚合到一起。

在这里插入图片描述

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

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

相关文章

Ubuntu服务器service版本初始化

下载 下载路径 官网:https://cn.ubuntu.com/ 下载路径:https://cn.ubuntu.com/download 服务器:https://cn.ubuntu.com/download/server/step1 点击下载(22.04.3):https://cn.ubuntu.com/download/server…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)一(112)

需求&#xff1a;&#xff1a; 有一个List<Map<String.Object>>,存储了某年某月的数据&#xff0c; 数据是根据用户查询条件进行显示的&#xff1b;所以查询的数据是动态的&#xff1b;需按月份统计每个年月数据出现的次数&#xff0c;并且按照月份排序&#xff1…

Oracle19c-补丁升级报错合集(一)

前言: 本文主要介绍Oracle19c补丁升级遇到的问题&#xff0c;涉及安装补丁prepatch步骤&#xff0c;apply应用报错以及datapatch -verbose数据字典更新报错 问题一: 在执行补丁rootcrs.sh -prepatch操作时&#xff0c;发生执行检查命令cluutil -chkshare报错 CLSRSC-180: An …

春秋云镜 CVE-2019-9042

春秋云镜 CVE-2019-9042 Sitemagic CMS v4.4 任意文件上传漏洞 靶标介绍 Sitemagic CMS v4.4 index.php?SMExtSMFiles 存在任意文件上传漏洞&#xff0c;攻击者可上传恶意代码执行系统命令。 启动场景 漏洞利用 login进入登陆界面admin/admin 访问http://eci-2zebi1tekpr…

什么是BEM命名规范?为什么要使用BEM命名规范?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范⭐ 为什么使用BEM命名规范&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为…

ROS_LINUX学习笔记=2=

B站ros入门教程 rqt_robot_steering 控制小乌龟 在index ros .rog中查找相关的包&#xff1a;rosindex 下图是rqt_robot_steering的简介 其中可以查看github源码地址 website可以查看效果图 下载相关的包 sudo apt install ros-kinetic-rqt-robot-steering roscore打开ros核…

C++入门知识点——解决C语言不足

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

D. Anton and School - 2

范德蒙德恒等式 考虑统计每一个右括号位置的贡献&#xff0c;也就是每个右括号作为右边起点的贡献 其中i0的时候&#xff0c;r-1<r-0,故i0时贡献为0&#xff0c;直接套用恒等式不会有影响 #include <bits/stdc.h> using namespace std; typedef long long int ll; # d…

JAVA入坑之高级文件处理

一、图片文件简介及解析 1.1图形图像基础概念 1.2JAVA图形图像关键类 1.3图形的基本操作 package org.example;import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; imp…

foobar2000使用笔记

foobar2000使用笔记 现在大多数在线音乐不开通VIP会员&#xff0c;很多歌曲只能听很短几句就听不了了。即使是歌曲免费&#xff0c;想听的歌在不同的APP平台&#xff0c;也较为不便。没办法&#xff0c;听歌又回归到了很多年前下载到本地播放的方式。电脑上的离线音乐一直用网上…

C语言——通讯录详解(文件版)

文件版通讯录 前言&#xff1a;一、保存通讯录二、读取通讯录2.1 通讯录初始化2.2 将文件的信息加载到通讯录 三、代码展示3.1通讯录的声明和定义(contct.h)3.2通讯录函数的实现&#xff08;contact.c&#xff09;3.2 通讯录的测试(test.c) 前言&#xff1a; 我们已经掌握了通…

2023国赛数学建模D题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

【工具】python代码编辑器--PyCharm下载安装和介绍

PyCharm是一种Python IDE(集成开发环境),由JetBrains打造。它带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。此外,PyCharm还提供了一些高级功能,以用于支持Django框…

Python学习笔记_实战篇(二)_django多条件筛选搜索

多条件搜索在很多网站上都有用到&#xff0c;比如京东&#xff0c;淘宝&#xff0c;51cto&#xff0c;等等好多购物教育网站上都有&#xff0c;当然网上也有很多开源的比楼主写的好的多了去了&#xff0c;仅供参考&#xff0c;哈哈 先来一张效果图吧&#xff0c;不然幻想不出来…

Python学习笔记_实战篇(一)_模拟登陆之下载

中间涉及到的技术点有&#xff1a; 模拟登陆模拟下载解析exal文件数据流读取exal文件&#xff0c;拿出订单号还有最后一点请求接口 下面就给大家挨个说一下,刚拿到需求其实还是很模糊的&#xff0c;因为一个都没做过&#xff0c;等静下心来去理解的时候&#xff0c;发现并没有…

Linux中shell脚本——for、while循环及脚本练习

目录 一.for循环 1.1.基本格式 1.2.类C语言格式 二.while循环 2.1.基本格式 2.2.死循环语句 三.跳出循环 3.1.continue跳出循环 3.2.break跳出循环 四.常用循环 4.1.循环打印九九乘法表 4.2.循环ping测试某个网段网络连通性 4.3.while死循环实现猜数字游戏 4.4.数…

springboot之多数据源配置

文章目录 一、多数据源的典型使用场景1 业务复杂&#xff08;数据量大&#xff09;2 读写分离 二、如何实现多数据源通过AbstractRoutingDataSource动态指定数据源多数据源切换方式AOPMyBatis插件 三、spring集成多个Mybatis框架 实现多数据源控制四、dynamic-datasource 多数据…

YOLO目标检测算法训练过程学习记录

先前已经完成过YOLO系列目标检测算法的调试过程&#xff0c;今天主要是将所有的调试加以总结 这里的conda环境就不再赘述了&#xff0c;直接使用requirement.txt文件的即可&#xff0c;也可以参考YOLOX的配置过程5 数据集处理 YOLOv5有自己的数据集格式&#xff0c;博主的数据…

70 # 协商缓存的配置:通过修改时间

对比&#xff08;协商&#xff09;缓存 比较一下再去决定是用缓存还是重新获取数据&#xff0c;这样会减少网络请求&#xff0c;提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候&#xff0c;服务器会把数据进行缓存&#xff0c;同时会生成一个缓存标识符&#…