自监督学习整理

1. 自监督学习定义

自监督学习主要是利用辅助任务(pretext)从大规模的无监督数据中挖掘自身的监督信息,通过这种构造的监督信息对网络进行训练,从而可以学习到对下游任务有价值的表征。
SSD: A UNIFIED FRAMEWORK FOR SELFSUPERVISED OUTLIER DETECTION
本文中对比式自监督学习的定义非常精准:训练一个一个特征提取器将样本与其他样本区分开,使用图像变换(数据增强)将每张图片生成两个视角(原图+增强图),将增强图看作正样本,优化模型使得每张图像的的原图与增强图距离更近,与其他样本的距离更远,其他样本看作为负样本。


image.png

2.自监督学习的核心

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

3.自监督学习如何评价性能?

自监督学习性能的高低,主要通过模型学出来的feature的质量来评价。feature质量的高低,主要是通过迁移学习的方式,把feature用到其它下游视觉任务中(分类、分割、物体检测...),然后通过视觉任务的结果的好坏来评价。目前没有统一的、标准的评价方式

4. 自监督学习的一个研究套路。

前面说到,自监督学习的核心是如何给输入数据自动生成标签。之前的很多工作都是围绕这个核心展开的。一般的套路是:首先提出一个新的自动打标签的辅助任务(pretext task,例如:旋转图片、打乱patch顺序),用辅助任务自动生成标签,然后做实验、测性能、发文章。每年都有新的辅助任务被提出来,自监督学习的性能也在不断提高,有的甚至已经接近监督学习的性能。总体上说,或者是提出一种完全新的辅助任务,或者是把多个旧的辅助任务组合到一起作为一个“新”的辅助任务。

5.自监督学习性能的可能提升角度

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

6 自动编码器与自监督学习

无监督学习中被广泛采用的方式是自动编码器(autoencoder)。编码器将输入的样本映射到隐层向量,解码器将这个隐层向量映射回样本空间。我们期待网络的输入和输出可以保持一致(理想情况,无损重构),同时隐层向量的维度大大小于输入样本的维度,以此达到了降维的目的,利用学习到的隐层向量再进行聚类等任务时将更加的简单高效。对于如何学习隐层向量的研究,可以称之为表征学习(Representation Learning)。
但这种简单的编码-解码结构仍然存在很多问题,基于像素的重构损失通常假设每个像素之间都是独立的,从而降低了它们对相关性或复杂结构进行建模的能力。尤其使用 L1 或 L2 损失来衡量输入和输出之间的差距其实是不存在语义信息的,而过分的关注像素级别的细节而忽略了更为重要的语义特征。对于自编码器,可能仅仅是做了维度的降低而已,我们希望学习的目的不仅仅是维度更低,还可以包含更多的语义特征,让模型懂的输入究竟是什么,从而帮助下游任务。而自监督学习最主要的目的就是学习到更丰富的语义表征。

7 自监督学习的挑战

对于大量的无标签数据,如何进行表征学习?
从数据的本身出发,如何设计有效的辅助任务 pretext?
对于自监督学习到的表征,如何来评测它的有效性?

8 监督学习与自监督学习的流程对比

image.png

image.png

9 自监督学习的代理任务(pretext task)

  • 9.1. 基于上下文(Context based)
    利用图像本身的上下文关系构建代理任务。
  • Jigsaw(拼图),预测图像块间相对位置/预测随机序列所属类别。


    image.png

  • 图像去遮挡,对添加遮挡的图像实现补全。
    只有模型真正读懂了这张图所代表的含义,才能有效的进行补全。


    image.png
  • 颜色转换,黑白图生成彩色图片。
    只有模型可以理解图片中的语义信息才能得知哪些部分应该上怎样的颜色,比如天空是蓝色的,草地是绿色的,只有模型从海量的数据中学习到了这些语义概念,才能得知物体的具体颜色信息。


    image.png
  • 数据增广———图像旋转
    给定一张输入的图片,我们对其进行不同角度的旋转,模型的目的是预测该图片的旋转角度。这种朴素的想法最后带来的增益竟然是非常巨大的,所以数据增强对于自监督学习也是非常有益处的,我个人的想法是数据增强不仅带来了更多的数据,还增加了预训练模型的鲁棒性。


    image.png
  • 9.2. 基于时序(Temporal Based)
    利用视频帧率间的时序关系设计代理任务。

  • 帧间相似性。
    频中的相邻帧特征是相似的,而相隔较远的视频帧是不相似的,通过构建这种相似(position)和不相似(negative)的样本来进行自监督约束。


    image.png
  • 视频的先后顺序
    可以从视频中采样出正确的视频序列和不正确的视频序列,构造成正负样本对然后进行训练。简而言之,就是设计一个模型,来判断当前的视频序列是否是正确的顺序。

  • 9.3. 基于对比(Contrastive Based)
    它通过学习对两个实例(instance)的相似或不相似进行编码来构建表征,这类方法的性能目前来说是自监督学习方法中最强的,很多大牛的精力都放在这个方向上面。
    其思想为通过构建正样本(positive)和负样本(negative),然后度量正负样本的距离来实现自监督学习。对比方法的目的是学习编码器f,核心思想样本和正样本之间的相似度远远大于样本和负样本之间的相似度:


    image.png

    这里x+是与x相似或相等的数据点,称为正样本。
    x−是与x不同的数据点,称为负样本。
    score函数是一个度量两个特征之间相似性的指标。
    x通常被称为“锚”数据点。
    损失函数定义如下,非常重要,后续工作都基于此损失函数。
    构造一个softmax分类器来正确地分类正样本和负样本。这个分类器鼓励score函数给正例样本赋于大值,给负样本赋于小值.分母项由一个正样本和N - 1个负样本组成。这里我们使用点积作为score函数:


    image.png

    image.png

    这是N-way softmax分类器常见的交叉熵损失,在对比学习文献中通常称为InfoNCE损失。InfoNCE也与互信息有关系。具体地说,最小化InfoNCE损失可使f(X)和f(X+)之间互信息的下界最大化。

10 对比式自监督学习主流算法

  • Deep InfoMax
    DIM的对比任务是区分全局特征和局部特征是否来自同一幅图像。在这里,全局特征是卷积编码器的最终输出(一个平面向量,Y),局部特征是编码器中间层(一个M x M特征图)的一个输出。每个局部特征图都有一个有限的感受野。所以,直观上,这意味着要做好对比任务全局特征向量必须从所有不同的局部区域中获取信息。

DIM的损失函数看起来与我们上面描述的对比损失函数完全一样。给定一个锚图像x,

f(x)为全局特征。
f(x+)为同一图像(正样本)的局部特征。
f(x−)是指来自另一幅图像(负样本)的局部特征。
DIM的应用还延伸到了其他领域,如graph和RL。对DIM的后续研究,即增强多尺度DIM (Bachman et al., 2019),使用线性分类协议评估时,使用无监督训练在ImageNet上实现了68.4%的Top-1准确率。


image.png
  • 使用对比学习学习不变性(AMDIM/CMC)
    对比学习可用于衡量在表示空间中的不变性。假设我们想要一个表示对一个变换T不变(例如剪裁、灰度缩放),我们可以简单地构造一个对比目标,给定一个锚点x,

T(x)是正样本
T(x′)其中x′是随机的图像或数据,是负样本
增强多尺度DIM (AMDIM,Bachman et al., 2019)使用标准的数据增强技术作为转换集,表示应该对不同的增强方法具有不变性。
对比多视图编码(CMC, Tian et al., 2019)使用同一幅图像的不同视图(深度、亮度、亮度、色度、表面法线和语义标签)作为变换集,其表示也应该是不变的。


image.png

左:AMDIM学习数据增强(如随机裁剪)之间的不变的表示。右:CMC学习图像的不同视图(通道)之间不变的表示

  • SimCLR及MOCO等重点工作也属于这个范畴。
    SimCLR主要是对于一个输入的样本,进行不同的数据增广方式,对于同一个样本的不同增广是正样本,对于不同样本的增广是负样本。拉近正样本相似性,拉远负样本相似性,使得模型能够对单个样本的表征完成较好的学习。整个过程比之前kaiming提出的动量对比(MoCo)更加的简单,同时省去了数据存储队列。

  • SimCLR提出了Projection Head,也就是在representation与contrastive loss间使用可学习的non-linear projection,效果是非常好。这样使用可学习的网路的优势在于避免计算 similarity 的 loss function在训练时丢掉一些重要的feature。论文中使用非常简单的单层MLP,配上ReLU activation function作为non-linear projection。

在表征层和最后的损失层增加了一个非线性映射可以增加性能 (这个地方我比较好奇,希望能有大佬给出更直观的解释)。
数据增广对于自监督学习是有益的,不同数据增广方式的结合比单一增广更好。
自监督学习需要更大的 batch 和更长的训练时间,batch size很大,这样保证了batch中的都当negatives样本的丰富性。

image.png
  • Moco通过Momentum Contrast来实现样本对比这一想法,具有2个方面的作用:

大容量:使用memory bank保留了已看到的所有批次的历史记录,增加了负样本的数量,并且当前mini-batch被压入bank,bank中较早的mini-batch则被移除。
一致性:Moco维护了encoder和moment encoder,每次梯度传播只更新 encoder的参数,而momentum encoder其实是用encoder来做一个moving average。这样键值表示特征的连续性相对memory bank就会好很多;


image.png
  • MoCo-V2使用了SimCLR 的两点有效改进:在encoder 编码特征计算loss 前加入了 MLP 的projection head 以及多种数据增强手段,并且将这两点改进应用到MoCo 框架又可以解决SimCLR 本身需要大 batch size的问题。


    image.png
  • BYOL直接丢掉了负样本,可以说是大道至简,在我看来其触及到一些被忽视的问题了:对比自监督学习是否一定要构建正对并使其距离相近,同时也要构建负对并拉开距离?*

image.png
  • momentum update:BYOL也是使用两个encoder,和Moco一样。
  • MLP:比SimCLR多了一个MLP来从 z 预测 p,Loss function 采用了L2,相当于只有正样本,所以没有负样本。
  • memory bank:BYOL没有采用memory bank也依旧取得了非常好的效果。

个人理解对比损失函数中负对的一个目的是防止mode collapse,而BN会根据学习到的平均值和标准差重新分配,这样就避免了mode collapse。所以BYOL能够work的关键是MLP中的BN

所有这些方法(BYOL除外)都已融合使用相似性度量和NCE损失。 NCE损失分为两个部分:分子和分母。 分子鼓励相似的向量靠在一起,而分母将所有其他向量推开。

BYOL中没有负样本,直接使用L2损失。

10 一些思考

  • 找到合适的辅助任务(pretext)对于自监督学习是最需要解决的问题。与数据特点相比,代理任务难一些有助于性能提升
  • 数据和资源越多,自监督预训练的效果会更好(Bert, MoCo, SimCLR)。
  • 自监督直接和具体任务的结合(Task Related Self-Supervised Learning)是个可探索的方向,已经在很多任务中初露头角,也比较符合审稿人的口味。

你可能感兴趣的:(自监督学习整理)