1. Why self-supervised learning: 主要的问题在于获取数据及其标注部分.
  2. Definition:
    • Self-supervised learning is a method that poses the following question to formulate an unsupervised learning problem as a supervised one: “Can we design the task in such a way that we can generate virtually unlimited labels from our existing images and use that to learn the representations?”
    • Replace the human annotation block by creatively exploiting some property of data to set up a pseudo-supervised task.
    • 学到这些特征后, 利用迁移学习将特征在下游的监督任务上进行微调, 从而利用更少的数据进行训练.

Self-Supervised Learning from Image

Pattern 1: Reconstruction

  1. Image Colorization: 生成彩色和黑白的图片对, 黑白图片经过encoder-decoder生成预测的图片, 和真是图片计算L2 loss. 如此可以学到图片中的物体及其关联部分以正确上色.
  2. Image Superresolution: 基于GAN的SRGAN, 低分辨率的图片经过卷积网络生成高分辨率图片, 计算和原图的MSE. 同时将生成的图片和真实图片送入二分类器, 判断哪个是真实图片, 以此使生成器学到如何生成具有细节的高分辨率图片.
  3. Image Impainting: 将图片扣掉一块, 由生成器生成完整的图片, 后续步骤同上.
  4. Cross-Channel Prediction: 一张图分成灰度图和颜色信道, 用灰度图预测颜色信道, 用颜色信道预测灰度图, 将预测的两个channel复合成预测的图片, 和原图对比计算loss以改进模型.

Pattern 2: Common Sense Tasks

  1. Image Jigsaw Puzzle: 图像分成9个patch, 按照汉明距离最大的64种打乱方式打乱, 输入是9个patch, 需要预测是按照哪一种方式 (1-64) 打乱的. 这一任务要求模型学习物体里的各部分是如何组合的, 以及物体的形状.
  2. Context Prediction: 图中取9个相邻的patch选取中心的patch和周围随意一个patch, 输入和前一条类似的网络, 预测两者位置关系.
  3. Geometric Transformation Recognition: 将旋转后的图片输入, 预测旋转了多少度 (0, 90, 180, 270). 这个任务要求模型学习物体的地点, 类型和造型.

Pattern 3: Automatic Label Generation

  1. Image Clustering: 在无标注数据集上对图片进行聚类. Deep Clustering, 图片首先被聚类, 然后这些类才被作为classes.
  2. Synthetic Imagery: 用game engine生成人造图片, 和真实的图片送入convnet, 并判断生成的特征是属于人造的or真实存在的场景图片.

Self-Supervised Learning from Video

  1. Frame Order Verification: (不)打乱帧的顺序, 送入convnet, 预测输入顺序是否是正确的.

SimCLR

  1. Contrastive Learning: It attempts to teach machines to distinguish between similar and dissimilar images.
  2. 需要构造相似的图片对和不相似的图片对. 一张图片被经过随机变换后和原图构成相似图片对 $(x_i,x_j)$, 两张图片分别送入encoder以获取表示 $(h_i,h_j)$, 在经过非线性全连接层以获得新的表示 $(z_i,z_j)$, 最后判断 $(z_i,z_j)$ 的相似性.

步骤

  1. Self-supervised Formulation
    • Batch Size = N
    • Transformation function T = random(crop + flip + color jitter + grayscale).
  2. Getting Representation
    • 针对一个batch里的所有图片做随机变换, 共获得2N张图片. 增强后的图片对经过共享参数的encoder生成表示$(h_i, h_j)$.
    • 作者使用ResNet-50, 输出的特征为2048维向量.
  3. Projection Head
    • Projection Head g(·) = Dense + Relu + Dense
    • $(h_i, h_j)$经过 g 生成新的表示$(z_i, z_j)$, 在他们之间计算相似度.
  4. Tuning Model, 针对N张图片生成的增强后的2N个表示, 进行如下操作
    • 计算cosine相似度, 同一张图增强后相似性高, 其余很低
    • 将2N张图片组成很多对, 用softmax计算两张图片相似的概率, 除了同一张图生成的两个表示很相似, 其余的图片对全部是负例. 且这个方法不需要memory bank, queue等特别的结构.
    • 计算损失: $l(i,j) = -\log\dfrac{\exp(s_{i,j})}{\sum_{k=1}^{2N}l_{[k!=i]}\exp(s_{i,k})}$
    • 一个batch的损失: $L = \dfrac{1}{2N}\sum_{k=1}^M[l(2k-1, 2k) + l(2k, 2k-1)]$
    • 优化这个损失函数可以提升图片表示能力, 是模型学会区分图片是否相似 (如果两张图片属于同一类是否需要更高的相似度? 但是没有标注, 无法判断两张照片是否属于同一类.)

Downstream Tasks

PIRL: Pretext-Invariant Representation Learning

  1. 存在的问题: 随机变换有可能导致不同的图生成相似的新图.
  2. 解决方法: 使同一张图变换后的新图尽可能相似, 不同图变换后的新图尽可能不相似.

PIRL Framework

  1. 原图经过一个转换后生成新图, 两张图经过共享参数的convnet $\theta$ 后得到两个表示$V_I, V_{I^T}$, $V_I$经过projection head $f$后得到新的表示 $f(V_I)$, $V_{I^T}$经过projection head $g$后得到新的表示 $g(V_{I^T})$. 优化损失函数使得两个表示尽量相似, 而$f(V_I)$和memory bank里其他图生成的表示尽量不相似.
  2. 用memory bank存储别的图像生成的表示, 以避免更大的batch size
  3. 损失函数: $h(f(V_I), g(V_{I^T})) = \dfrac{\exp(\frac{s(f(V_I), g(V_{I^T}))}{\tau})}{\exp(\frac{s(f(V_I), g(V_{I^T})}{\tau}) + \sum_{I'\in D_N}\exp(\frac{g(V_{I^T}), s(f(V_{I'})}{\tau})}$ $L_{NCE}(I, I^t) = -\log[h(m_I, g(V_{I^t}))] - \sum_{I'\in D_N}\log[1-h(g(V_{I^t}), m_{I'})]$

Self-Labelling

Combining clustering and representation learning together to learn both features and labels simultaneously.

  • 生成标签然后用标签训练一个模型
  • 由训练好的模型生成新的标签
  • 重复以上操作 以上形成鸡蛋问题, 最初用随机初始化的Alexnet, 在Imageet上评估.

Self-Labelling Pipeline

  1. 利用一个随机初始化的模型为增强后的无标签数据生成标签
  2. 使用Sinkhorn-Knopp算法将无标签图片聚类, 得到新的标签
  3. 利用新生成的标签训练模型上, 利用交叉熵损失优化
  4. 重复以上步骤

Sinkhron-Knopp Algorithm: 源于最优运输问题 (仓库, 商店, 运输距离) - 原问题: 将N个样本分到K个类中 - 限制条件: N个样本被均分到K个类中 - 代价矩阵: 将 使用这种分类方式训练出的模型的模型表现 作为这种划分方式的代价. 如果代价很高, 说明需要调整划分方式以接近理想效果.

FixMatch for Semi-Supervised Learning

  1. Intuition: 数据集中只有少部分标注数据和大部分未标注数据, 先用标注数据有监督训练一个模型. 对于未标注数据, 将所有图片做两种变换, 分别送入之前训练的模型, 由于是同一张图片生成的输入, 因此模型的输出应该相同.
  2. 模型结构:
    • 将已标记数据用于训练, 交叉熵损失作为监督学习的损失函数: $l_s = \dfrac{1}{B}\sum_{b=1}^BH(p_b, p_m(y|\alpha(x_b)))$
    • 伪标记: 对于一张未标记图片, 先对它进行weak augmentation, 输入模型得到伪标签, 再和strongly augmented image的输出对比.
    • 针对未标记数据, 半监督部分损失函数: $l_u = \dfrac{1}{\mu B}\sum_{b=1}^{\mu B}1(max(q_b\geq \tau)H(\hat{q}_b, p_m(y|A(u_b))))$, $loss = l_s + \mu l_u$, 其中$\tau$代表伪标记生成的阈值, 当weakly augmented image的softmax超过阈值则生成伪标记, 并和strongly augmented image的结果计算较差熵.
    • 在最终loss的计算中, 随着训练的进度$\mu$逐渐增大, 具体可以解释为前期对用少量样本训练出的模型不信任, 后期会逐渐加入对未标记数据的考量.

DeepCluster

  1. 主要思想: 图片经过augmentation之后送入convnetm 取分类之前的特征, 经过pca降维, 用kmeans聚类得到各个类别. 将kmeans的结果作为伪标记, 和convnet输出的表示经过分类层得到的结果计算交叉熵.