self-supervised learning-introduction

This is my blog.

Self-Supervised Learning has become an exciting direction in AI community.

  • Jitendra Malik: “Supervision is the opium of the AI researcher”
  • Alyosha Efros: “The AI revolution will not be supervised”
  • Yann LeCun: “self-supervised learning is the cake, supervised learning is the icing on the cake, reinforcement learning is the cherry on the cake”

So, this blog is about the introduction about self-supervised learning (only for beginners, like me).


其实,里面全是中文ᶘ ᵒᴥᵒᶅ,只是为了封面好看一些,所以开始探索啦!٩(˃̶͈̀௰˂̶͈́)و冲冲冲!

概念

自主学习SSL,顾名思义就是数据监督自己来学习,几乎没有人的行为参与。self-supervised learning学到的feature不仅仅在recognition task上要比imagenet pre-trained model好,更关键的是它的generalization和transfer的能力也要优秀。

自主学习在不同的场景下,属于不同的学习;感觉它是一个单独的类别;或者说它是一种在无监督的数据集上做监督行为的学习(from 1 A form of unsupervised learning where the data provides the supervision),网上对自主学习属于哪个类别众说纷纭,可能我看的都是假网站,居然有关于这个讨论,个人认为从整体来看,作为无监督会更好。

  • 监督学习,对于pretext tasks(伪标记)和downstream tasks训练过程中还是使用标记数据的(从内部来看,可以当作监督);
  • 半监督学习,结合标记数据和无标记数据共同来训练(这个也可以从全局来看);
  • 无监督学习,用来查找未标记数据的特征,是一种表示学习,用于标记相同特征的未标记数据。(综述论文Longlong Jing and Yingli Tian, 2019认为是无监督,从全局来看可以分为无监督),只是少量标记数据作为验证目标是否完成。

通俗理解:

from 知乎

自监督学习的核心,在于如何自动为数据产生标签。例如输入一张图片,把图片随机旋转一个角度,然后把旋转后的图片作为输入,随机旋转的角度作为标签。再例如,把输入的图片均匀分割成3*3的格子,每个格子里面的内容作为一个patch,随机打乱patch的排列顺序,然后用打乱顺序的patch作为输入,正确的排列顺序作为label。类似这种自动产生的标注,完全无需人工参与。

以及它的:

从扩展性(scalability)的角度看,需要搞清楚自监督学习和以下三方面的关系:

  1. 扩展数据集。主要研究的问题是:训练自监督学习模型的数据集的大小,跟性能是否有某种关系?能否通过增大数据集来提升性能?
  2. 扩展模型复杂度。自监督学习,本质上是要训练出来一个feature提取器(一个CNN网络)。这个CNN网络的复杂度,跟性能是否有某种关系?能否通过增大网络复杂度来提升性能?(比如ResNet50比AlexNet复杂,用ResNet50,效果比AlexNet好吗?)
  3. 扩展辅助任务的难度。自监督学习的核心,是用一个辅助任务(pretext task)来自动为数据生成标签。这个辅助任务的难度,跟性能是否有某种关系?能否通过增大辅助任务的难度来提升性能?(比如拼图这个辅助任务,把图片分割成2x2个patch,还是4x4个patch?4x4个patch的难度更大)

理由

  1. 数据集的构建耗时耗力
  2. 一些领域难以进行标注,或者难以获取标注数据
  3. 大量未标记的数据
  4. 对于空白领域的学习困难

意义

  • 它可以减少手动标记数据的劳动力消耗,只利用少量标注数据,和大量没有标注数据(易获取)。深度学习中最大的障碍——注释数据将被(部分)消除;
  • 可以接近甚至超越ImageNet预训练的结果(但是在强语义任务上有些落后),也就是说在很多还没有标注的数据中学习的结果可以和用很多精准标注后预训练的结果相媲美,这样我们之后就可以不用花费大量的人力去标注数据了。现在的研究表明,可以提高一倍的数据效率(用一半的数据量达到相同的效果);
  • 算法自驱动,成本效益高

同时对标注信息过度依赖是有危险的

  • 数据的内部结构远比标注提供的信息要丰富,因此通常需要大量的训练样本,但得到的模型有时是较为脆弱的
  • 高维分类问题上,不能直接依赖监督信息
  • 标签信息通常适用于解决特定的任务,而不是可以做为知识一样可以重复利用

结构

  1. 先做无监督编码学习:稀疏编码器使用无标签数据进行无监督学习
  2. 分类:使用回归分类器softmax监督学习(如果是回归问题,则这里就是回归的做法)

稀疏编码器

大概理解就是有稀疏(很少的)神经元的自编码器。对于一个输入X,喂入稀疏自编码器中,得到隐藏单元激活量a;接下来就可以用隐藏单元激活量a来代替原始数据(替代表示,节省成本),也可以用向量(X, a)来代替原始数据(级联表示,表现更好)进行训练。但这种简单的编码-解码结构仍然存在很多问题,基于像素的重构损失通常假设每个像素之间都是独立的,从而降低了它们对相关性或复杂结构进行建模的能力。尤其使用 L1 或 L2 损失来衡量输入和输出之间的差距其实是不存在语义信息的,而过分的关注像素级别的细节而忽略了更为重要的语义特征。对于自编码器,可能仅仅是做了维度的降低而已,我们希望学习的目的不仅仅是维度更低,还可以包含更多的语义特征,让模型懂的输入究竟是什么,从而帮助下游任务。而自监督学习最主要的目的就是学习到更丰富的语义表征。

区别

场景:分离大象🐘和犀牛🦏

  • 监督学习:有大量大象和犀牛的标记样本;训练分类器就ok;
  • 非监督学习:有大量大象和犀牛的样本(没有其他样本),少量已标记,大部分没有标记,然后划分群;
  • 迁移学习:有大量羊和马的标记样本,少量大象和犀牛的样本;从羊和马的样本中学习,然后迁移(有监督)到大象和犀牛的学习样本中;
  • 自主学习:有少量大象和犀牛的标记样本,但是还有大量的自然图像(即包含其他物种的图片,包括大象和犀牛),通过数据来自我学习。希望通过数据来得到pretext tasks的伪标记pseudo label,通过卷积网络来自动为surrogate替代/auxiliary辅助/proxy代理任务生成visual feature,学习到和高层语义信息相关联的特征,然后再将pretext tasks训练完后的网络作为downstream task的预训练网络,之后就是传统的监督学习方法了;
  • 弱注释:具有不同(或者粗糙)标签或标题的图像
  • 传统自动编码器:传统自动编码器,仅仅以重构输入为目的,而且它有两个问题:
    • 设计了pixel级别的loss,没有结构上的loss(GAN可能可以消除这个问题)
    • 重构后很难表示语义信息
  • 主动学习active learning,有大量大象和犀牛的样本(没有其他样本),少量已标记,大部分没有标记;先用标记数据训练一个学习器,然后对未标记的数据进行预测,对于预测中不确定性高或置信度低的样本咨询专家并进行打标,最后用扩充后的训练集重新训练;其是用少量的/有价值的咨询来获得更好的性能

可见自主学习更加符合实际的应用,因为我们的自然图像是很充足的、易获取的,但标记的图像却需要我们耗费一定的人力来获得。

监督学习的方法可以总结为三个步骤:

  1. 构建关于任务的大型标记数据集
  2. 设计具体的网络结构以及训练损失函数
  3. 训练网络,然后部署

下述会从Image、Video、Control展开,讲述各自的pretext tasks的方法。实际上这个分类标准并不太准确,建议以综述为准。

Image

常见的工作流程是在一个或多个带有未标记图像的辅助任务上训练模型,然后用该模型的一个中间特征层进入多项Logistic回归分类器,最终的分类准确性量化了学习的表示的质量。

最近研究(2019)有提出说用标记的数据进行监督学习,用未标记的数据进行自主学习,这两者共享网络的参数。

Distortion

图片本身改变:通过轻微的扰动,让图片在没有改变语义特征和几何形式情况下,生成新的数据,同时新的数据的标注应该和原图片一样。

  • Exemplar-CNN Dosovitskiy et al., 2015:对于一张图片首先用合理的梯度(包含目标的边缘)来切成小的patches,然后对这些patches随机扰动,产生多个同种类的新数据(可以产生任意多个新数据),最后用这些新(替代)数据来完成代理任务。
  • Rotation Gidaris et al. 2018: 通过旋转让网络更加关注于全局的信息,而不是仅仅因为一个局部的信息而得出预测结果【检测任务和监督学习相差2.4%】

Patches

图片分块:对于数据的生成可以通过随机旋转等变换或者可以丢失一些patches,让网络来预测。

Doersch et al. (2015) 对于一张图片随机选择两个patches,第一个随机采取,然后从其周围8个位置寻找第二个patches,然后预测它们的相对位置。为了避免因为线条等边界相邻的关系,可以采样patches时隔一定的距离;也会增加一些小的扰动,使周围8个采集的不是完全平行线上;随机降采样;更改色差;只使用单一通道等等操作。【在PASCAL VOC+R-CNN上评估:ImageNet预训练后56.8%;相对位置自主学习后51.1%;无预训练45.6%】

Noroozi & Favaro (2016)则用了9个patches,设计了jigsaw puzzle game,提出了shuffle patches来控制复杂度。

Noroozi, et al, 2017其只考虑了两个变换,一个是扩大2倍后,视觉元素的数量应该保持不变,另一个是分成若干部分后得到的特征求和,应当等于整个图片直接的特征求和。实际上文中有增加别的约束,比如某个部分的特征应该和其他图片(不同类别)的特征的距离应该很远等等,否则结果肯定也是非常差的。

Colorization

填色问题Zhang et al., 2016:在self-supervised learning中这个问题是常常被提及的。这里用的颜色用的是Lab,一种基于人的视觉的表示(L是亮度,0是黑色,100是白色;a和b表示颜色,其中a负表示绿色,a正表示洋红色,b负表示蓝色,b正表示黄色)。

这个问题其实我还没怎么看懂,我觉得是一个挺难的问题,就像小时候买的玩具一样(很多闪亮的粉倒入有粘性的纸上那个),就是一种创作,后续需要再看看。

Generative Modeling

泛化模型Dosovitskiy et al., 2014:就是需要让这个模型可以适合多个相关问题。主要就是在学习内在表示的时候,对于输入进行重构。刚开始会觉得扰动和分块都可以认为是改变输入,其实是不一样的。扰动是一种增加生成数据的方式;分块更不同了,每一块都是作为输入,并且块之间是有关系的;而这里对输入的改变可以说是一种永久性的,就是单纯将输入丢失一些特性,使得得到的模型更加泛化。

Vincent, et al, 2008最简单的就是在自动编码器中增加随机噪声。

Pathak, et al., 2016随机丢失一些pixels。

Zhang et al., 2017将通道分开作不同成分,通过一些通道来预测剩余的一些通道。

Radford et al., 2016Donahue, et al, 2017则是直接使用GAN来生成新的数据。

Multi-task self-supervised visual learning

就是将多种方法融合起来。

C Doersch, A Zisserman, ICCV 2017文中有多种实验对比,场景是分类任务和目标检测任务。

实验结果中发现:

  1. backbone深一些更好
  2. 填色和相对位置的效果比泛化模型更好
  3. 自主学习可以和监督学习比拟【分类任务和监督学习相差16.15%;检测任务和监督学习相差4.69%】

Video

Video包含一系列语义相关的帧。可以直接从过去预测未来,然后下一秒可能就是未来,就可以直接做验证,这样就有源源不断地的数据来训练(Video可以提供充足的信息)。当然,也可以倒着,通过当前的行为预测之前的行为。对于video中的帧,使用active learning去选择,以此来减少不必要的运算。

方法无外乎寻找帧之间的相关性,如:pixel-level - Optical Flow,object-level - Tracking,patch-level - Mid-level Correspondence

对于video因为帧之间很相近,因此对于如何选择有信息的数据也是需要考虑研究的。

Tracking

记得一次周会上有提到这个,但是那时候好像说的是强化学习吧(有点失忆( ・᷄ὢ・᷅ ))。

Wang & Gupta, 2015由于帧是连续的,因此相近的帧之间目标有着相近的内在特征,可以利用这个特征来追踪目标。为了避免这种特征导致错误地认为所有帧特征都一致,需要随机选择一个帧,然后就是很平常的认为这个随机选择的帧应该和这两个帧之间的距离与这两个帧之间的距离不是一个等级的。

Cues

Donglai Wei, Joseph Lim, Bill Freeman, Andrew Zisserman CVPR 2018

考虑的线索:

  1. 重力
  2. 摩擦
  3. 因果关系
  4. 照相机的行为

与监督学习相比,在数据集UCF-101可以超过。

Frame Sequence

因为帧之间是有时间顺序的,因此我们认为好的表示应该从正确顺序的帧中学习得到。这个侧重的是帧顺序决定的特征,前面侧重的是相邻两帧之间的特征关系。

Misra, et al 2016辅助任务来确定是否是正确的顺序。这里对于五个帧作为一组,然后将数据分为Positive Tuples和Negative Tuples,然后再用这个元组来训练。对于每一个帧通过网络,然后将这几个帧通过concatenation连接网络得到预测顺序,通过分类网络判断,这里用交叉熵损失。【这里还蕴含了另一个角度,Geometric View,即对于棒球的运动轨迹,给出起点和终点,是否可以作为中间点】

评估:

  • 在动作识别任务上,与监督学习相差16.9%;
  • 在人动作识别上
    • 与监督学习在FLIC数据集上mean PCK -0.9%, AUC PCK -0.7% - Sapp & Taskar, 2013
    • 在MPII数据上甚至超越了监督学习的结果 - Andriluka et al., 2014

Colorization

Video中的填色Vondrick, Shrivastava, Fathi, Guadarrama, Murphy. ECCV 2018.:感觉就是在image填色上,增加了相同目标之间的关联约束而已,这里有提到寻找对应点。

Video with sound

增加了声音的约束,即声音与图像之间的相关性和同步性。这里的任务不仅仅包括代理任务,比较复杂。

Control/Robotics

是针对于机器人控制的,通过多个摄像机的角度来一同做状态表示。

Multi-View Metric Learning

这部分感觉就是用多个摄像机(多个角度)寻找同一个目标,这样一个目标有多个角度来学习。

Autonomous Goal Generation

自动生成目标,使得可以实现多种目标。

算法

当前的自监督方法大致可以分为两类:预测和对比;或者三类:基于上下文Context based(拼图顺序、抠图补全、上色、数据增强);基于时序Temporal Based(相邻帧的相似性、多视角同帧的相似性、同一物体的相似性、帧顺序学习);基于对比Contrastive Based。

Generative / Predictive

传统方法专注于像素空间的特征,存在不足:

  • 使用像素级loss可能导致此类方法过于关注基于像素的细节,而不是抽象的语义信息;
  • 在于像素分析的方法难以有效的建立空间关联及对象的复杂结构。

Contrastive

对比方法通过正面和负面的例子来学习表征。即,对于数据,对比主法目标是学习一个

其中,是与相似的数据(正样本),是与不相似的数据(负样本)。score函数是一个度量函数,评价两个特征间的相似性

知名方法:

  1. 2019年Henaff提出的CPC方法,在未标记的ImageNet数据上训练并使用线性分类器的无监督对比方法已经超过了监督的AlexNet
  2. 2019年何恺明提出的MoCo方法,ImageNet上的对比式预训练成功地转移到了其它任务,并且胜过了监督的预训练任务

评估方法

通过模型所学到的(generalized/visual)feature质量来评价自监督学习性能的高低。并且对于模型的评估,我们通常不关心其对于invented/pretext task的情况,甚至在结果不理想也不care(因为这个任务只是为了得到预训练模型,和实际任务并无直接关系);而是更关注于它是否在语义和结构上有好的表示,在各种downstream tasks上有效(即自监督学习性能的高低,主要通过模型学出来的feature的质量来评价。feature质量的高低,主要是通过迁移学习的方式,把feature用到其它视觉任务中(分类、分割、物体检测…),然后通过视觉任务的结果的好坏来评价。目前没有统一的、标准的评价方式)。

评测自监督学习的能力,主要是通过 Pretrain-Fintune 的模式

  • 监督学习中的 Pretrain - Finetune 流程:我们首先从大量的有标签数据上进行训练,得到预训练的模型,然后对于新的下游任务(Downstream task),我们将学习到的参数进行迁移,在新的有标签任务上进行「微调」,从而得到一个能适应新任务的网络。
  • 自监督的 Pretrain - Finetune 流程:首先从大量的无标签数据中通过 pretext 来训练网络,得到预训练的模型,然后对于新的下游任务,和监督学习一样,迁移学习到的参数后微调即可。所以自监督学习的能力主要由下游任务的性能来体现。

后记

之前介绍的模型都是在专注如何寻找自监督信息,而自监督学习一定要脱离下游的具体任务吗?答案是否定的,越来越多的工作开始思考自监督学习和具体任务紧密结合的方法(Task Related Self-Supervised Learning)。Lee, Hankook et al (Rethinking Data Augmentation: Self-Supervision and Self-Distillation)探索了在多任务学习中增加自监督学习的可能,他们将普通的分类任务中嵌入了旋转预测任务。而自监督和半监督学习也可以进行结合L: Self-Supervised Semi-Supervised Learning),对于无标记的数据进行自监督学习(旋转预测),和对于有标记数据,在进行自监督学习的同时利用联合训练的想法进行有监督学习。

对于自主学习,其实就是一种学习的方法而已,主要是因为对于深度学习来说,预训练模型是很有必要的(尤其在数据较少的情况下),但是标注是很耗时耗力的。因此提出说,能不能让数据根据自己的数据来从数据中自主学习呢!具体的方法呢,主要就是两个步骤,第一部分就是需要建立代理任务,从数据的属性中获得代理任务的伪标记,用稀疏编码器完成无监督学习;之后就可以用代理任务训练的网络作为预训练模型来做监督学习,进行常规的分类回归问题了。

那么再细节的问题,或者说更加具体的算法在这一篇post中暂时不叙述,只留下一个大概的认识与感觉!

其实后面两者video和control都是可以转换为图像,只是他们的图像之间存在着某一种关联而已。

虽然我感觉我后面的几种方法都没有仔细看清楚(看多了,总容易一目十行( ・᷄ὢ・᷅ ),所以暂时先这样,休息一会,再更新STA部分。下一个post见٩(˃̶͈̀௰˂̶͈́)و

1. self-Supervised Learning by Andrew Zisserman https://project.inria.fr/paiss/files/2018/07/zisserman-self-supervised.pdf

转载请注明出处,谢谢。

愿 我是你的小太阳


买糖果去喽