由Facebook发布的非监督学习DINO引发的深入思考

本文介绍 聊一聊最近比较火的dino,facebook出品

由Facebook发布的非监督学习DINO引发的深入思考

本文为原创文章,未经授权不允许二次转载,如需要转载,请私信我获取授权.

很久没有更新文章了,工作太忙以至于没有时间思考.今天记录一篇对于facebook最新论文dino的思考.这其实还是transformer体系里面的一篇论文,只是这一篇看效果比较牛逼.一如既往的,我不对论文做文字翻译,只写我的思考和总结,甚至是一些不对的批判,抛砖引玉,欢迎一起礼貌交流探讨.

对应的代码链接:

github.com/facebookres…

之所以想写这篇论文,是因为题目是:Emerging Properties in Self-Supervised Vision Transformers,一般我看到标题包含transformer的论文不一定会感兴趣,但是看到Self-supervised (unsupervised) + Transformer, 我一定会感兴趣.个人认为,非监督学习将会是未来的一个趋势,尤其是self-supervised这种特定的方式,而途径只有可能是transformer (至少目前来看具有可行性),通过对这个方向的研究,未来才有可能建造出更加impressive的AI系统,甚至是GAI, 这就不是刷刷榜单这么简单了.所以今天就来好好聊聊.

近期一些非监督工作回顾

一如既往地,我的博客产出很少,为了体现质量,我会在每一篇里面穿插很多其他的内容,穿针引线,连点成线,聚线成面,让每一位读者都能有一个全局把握.说道非监督,近期不得不说的几篇工作诸如:

  • Momentum Contrast for Unsupervised Visual Representation Learning, 2019 (2020收录)
  • Improved Baselines with Momentum Contrastive Learning, 2020
  • An Empirical Study of Training Self-Supervised Vision Transformers, 2021

熟悉的朋友可能一看就知道,我要说的其实就是Moco系列.这三篇论文其实都是出自何凯明之手.我们先来看看这三篇论文的时间线,第一篇论文发表的背景是当时NLP领域transformer大热,应用于非监督表征学习的任务上产生了BERT, GPT这种非常横扫NLP各个任务的模型.第二篇是对标业内的新的SOTA的SimCLR,最后一篇当然就是今年大热的一个热点:将Transformer用于非监督任务上.关于Transformer一些综述性质的文章可以看我之前写的:

zhuanlan.zhihu.com/p/342512339

(为毛我回过头去看我写文章总感觉写的太浅显了... 贻笑大方之家,后面有机会我会做一些视频给大家详细讲解transformer!)

首先我们来解答这么几个问题:

  • moco系列解决什么问题?
  • 怎么解决的?
  • 效果怎么样?

相信这也是读者比较关心的问题.再陈述之前,先回到本文的议题:我们是要聊dino, 那么这个玩意和dino怎么联系起来呢?先别急,我们先来回答上面三个问题.

moco实际上就是使用自监督的方式去学习诸如分类这样的任务,然后这种学习到的backbone也可以进一步迁移到检测分割等任务上,实验效果显示它微调之后的效果比监督还好,完美的弥补了监督学习与非监督学习的鸿沟.

mocov1

我们不深入探讨一些实现细节,先贴一个论文里面的伪代码,给大家说一下具体是怎么去做的,细节暂且不做深入讨论:

image-20210508162345803

这个伪代码的做法维护了一个队列,在这个队列里面,存储的是模型输出的键,也就是key,然后我们会有另一组的query, 键和查询这两个变量通过对比loss, 更新队列里面的key, 同时会吐出最早的那个batch的key. 通过这么一些操作使得队列里面的key变得更加的唯一,同时新来了新的样本数据我再更新,直到我的队列里面包含了所有的特征,并且每个特征都不一样,从而实现我的非监督任务.

这么做的一个优势就是队列的长度其实是可控的,这也就意味着,我可以通过增大字典的大小,来提高分类的精准度,进而提升性能.这就好像是用反向传播的方式去做KNN, 你可以通过控制K的大小来控制你的聚类效果.

至于如何使用对比的loss, 如果知道修改momentum一定可以使得这一套可以work,以及对应的公式推导,大家可以仔细的阅读一下原来的那篇论文,论文链接都在引用里面.

mocov2

第二篇其实没啥可以讲的,增加一些trick使得效果更好,那我们就看看增加了什么trick. 简单来说借用了SimCLR里面的一些设计,应用到了Moco的体系内,然后超越了SimCLR,有点借力使力的味道.

image-20210508163824411

借用的SimCLR的trcik包括:

  • 更大batch;
  • 最后的FC变成了一个MLP (这也行??)
  • 更牛逼的数据增强

好吧,这篇感觉比较水

mocov3

这最近的这篇其实就是将非监督应用于transformer, 或者说把transformer拿过来,堆到了非监督的任务上.那么除此之外有哪些改变没?还是说还是moco那一套?我不看论文我都认为不可能是之前那一套,为什么呢?因为transformer就是天然的队列啊!而token就是你的key! 所以这篇文章出来,其实是很顺理成章的.

论文中花了一些笔墨描述他们使用ViT作为非监督学习的骨干网络的时候遇到的一个问题,随着训练的进行,会变得不稳定.根木原因,他们也不知道,于是就通过控制变量的方法去尝试找寻这个原因,实验发现一些有趣的结论.

从实验中可以看出随着batch的增大或者lr的增大,kNN accuracy都逐渐出现了dip的情况,并且dip的程度逐渐增加,呈现周期性出现。当使用LAMB optimizer时,随着lr的增加,虽然kNN accuracy还是平滑的曲线,但是中间部分还是会出现衰退.

文中也提到了如何让训练变得更加稳定的一些trick.

we explore freezing the patch projection layer during training. In other words, we use a fixed random patch projection layer to embed the patches, which is not learned. This can be easily done by applying a stop-gradient operation right after this layer.

通过free投影层的patch,换句话说,用固定的随机patch去投影,这部分参数不参与学习,这个实现起来也比较简单,可以参看moco的代码看看里面到底是如何实现的.

image-20210508165904114

图中可以看到,使用随机投影的方式貌似确实解决了问题.

最后mocov3的效果也是超越了之前所有的非监督架构:

这是moco到目前为止的故事,但这和我要将的DINO其实还是不一东西.因为dino将会解决的问题是:

除了分类,非监督学习+transformer能解决分割问题吗?换句话说,它在没有任何监督信息的基础上知道物体之间的相互关系吗?

DINO可能实现了更加阶层的视觉理解

说句实在的,我自从理解了ViT里面的具体实现,突然对transformer有一种很亲切的感觉,就好像我看到一位少年,乍一看,骨骼清奇,料定它未来一定会生大器,那么现在要做,就是好好投资一下它.事实上,transformer给我的,就是这么一种感觉,而深入理解DINO之后,我仿佛进一步的发现transformer的潜能,所以就多写点东西与大家分享.

这些年来,不管是CNN的大力发展也好,还是transformer的大力发展,大家其实都是在已有的监督任务上,告诉模型去建模他们看到的数据.这其实非常依赖于你对于数据的定义,这一点和NLP就很不一样,比如我们词嵌入,我不告诉模型任务信息,它就可以知道"刘德华"是一个人名,甚至可以告诉你其他跟这个名词有关系的名词.这是很早以前的效果,现在OpenAI可以告诉你,他们做的模型不仅可以理解词,还可以告诉你每个词之间的相互关系,甚至可以把你的自然语言的数据库检索问题写成SQL语句.这难道不牛逼吗?更有甚者,把GPT3的模型对接到图像领域,实现了DALL-E. 告诉它 绿色的钟表, 它就可以生成绿色的钟表.显然它学习到了更高阶的特征.

那么Computer Vision有没有可能做到这一点呢?

今天要讲的这个dino, 其实就做到了.请理解两个事情,实现分割和非监督的实现分割是两个概念. 当然也有一些其他的方法实现了非监督的语义分割,这其实也不难,但结合transformer来做的,应该DINO是第一个.

image-20210508172317750

这是DINO的效果.

需要注意的是,这个是AttentionMap, dino并没有任何语义的ground truth, 也没有任何类别告诉它这是一只猴子,但是它可以把所有注意力学到在这上面.

我这么说,你可能会觉得:就这?兄弟,你可别太天真了,这是game changer!! 这等于是丢给你一张图片,没有任何GT, 它就可以自动帮你把这些attention学出来!再仔细想一下,这是不是和NLP里面的embedding 很像?再想一下,我们现在最不缺的是什么?最不缺的是原始数据,每天互联网产生这么多图片,视频,如果这个transformer这么牛逼,全部丢进去,你觉得会产出一个什么样的AI? 一个超大版本的resnet101???

NO, no, no. 远没有这么简单.这就是为什么我看好这个方向的原因,也是我写这篇paper解析的原因.当然我们目前还不能完全做unsupervisor, 但是self-supervisor已经够用了!

就准备着Google AI或者FAIR放出更大的招吧,这将可能会使得游戏规则发生改变.

这个还能做些什么?使用Self-supervisor的方法,DINO学出来的模型,可以直接做分类,简单来说,你丢给他你要分类的图片,它可以自动挖掘出每幅图片不同的特征,并自动给你归类,想要几类有几类,这才是未来的AI.

要放到以前,我可能会觉得这种论断有点哗众取宠,但是DINO所展现出来的,不仅仅是分类的效果,还有网络学出来的非常清晰的热力图,注意力图,这些都足以证明,DINO所能做的,不仅仅是分类,包括分割,检测,未来的CV众多的task都未来可期,采用非监督的方式.

下面是DINO系统的一个简单原理.

img

DINO的原理其实也很简单,由于它是非监督的学习,因此它在学习的时候是不需要label的,为了达到这个非监督的目的,就需要

image-20210512154917643

基础来说,一个学习网络,和一个教学网络.输入实际上是同一张图片,但是经过不同的transformation, 二者的网络结构一致,不一样的只是参数.teacher网络的梯度会传给学生网络.teacher网络的参数会随着学生网络的参数更新而更新.

我们来看一下DINO网络的流程图: image-20210512155910311

这个流程图可以说简单易懂,老少皆宜了.就和我上面说的步骤和那张流程图差不多.

我们来看一下DINO的效果到底咋样:

image-20210512160127178

单看Linear这一列,是所有的方法的对比,在固定类别输出下.可以看到DINO的方法,精度是最高的,在使用DeiT的架构基础之下,精度是远远地超过了RN50, 也就是传统的CNN.

再去看k-NN这个非监督的这一行,虽然比不上固定类别,但是相差也不大,尤其是使用transformer架构的时候,误差更小.

总结

DINO实际上是一个摸着石头过河的文章,里面做了很多详尽的ablation study, 我就不一一阐述,感兴趣的同学可以仔细看看论文.毫无疑问,DINO引领大家来到了一个新的领域,这一领域将开创Unsupervise和Transformer新的结合.如同我之前的判断,transformer训练所需要的海量数据,仅从监督上去学习是不够的,而非监督的学习如果能够让transformer工作的很快,那么未来毫无疑问,这将是CV的一个新的篇章.

Reference

  1. Momentum Contrast for Unsupervised Visual Representation Learning
  2. Improved Baselines with Momentum Contrastive Learning
  3. An Empirical Study of Training Self-Supervised Vision Transformers
  4. 陀飞轮-Moco三部曲
  5. Emerging Properties in Self-Supervised Vision Transformers

猜你喜欢

转载自juejin.im/post/6961313932346654751