7

自监督黑马 SimCLRv2 来了!提出蒸馏新思路,可迁移至小模型,性能精度媲美有监督

 3 years ago
source link: https://bbs.cvmart.net/articles/2776
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

导语:SimCLR将自监督学习推向了高潮,引起了学术界的大轰动。现在SimCLRv2来了,那么它有带来了哪些新的思想呢?又有哪些值得期待的点呢?我们先来对SimCLRv2进行一番简单的解读分析。文末附论文下载方式。

Abstract

一种从少量带标签数据+大量无标签数据中进行学习的方案是:现在无标签数据集上采用无监督学习方案进行与训练,然后采用监督学习方式在少量带标签数据上进行微调。尽管盖方案中的无标签数据上的无监督学习是一种任务不可知方式(不同于其他CV中半监督学习),但是令人惊讶的是这种半监督学习的放哪在ImageNet上极为有效。

该方案的一个重要组成是是与训练和微调阶段采用了“大模型”。作者发现:越少的标签数据,该方法越能从更大的模型中受益。经过微调后,大模型可以进一步得以改善并蒸馏更多信息到小模型中(注:蒸馏阶段会对无标签数据进行二次利用,此时该数据将以任务已知方式进行应用)。

总而言之,所提半监督方法可以总结为三步;(1)采用SimCLRv2方法在无标签数据上对一个Big ResNet模型进行与训练;(2)在有标签数据上通过有监督方式进行微调;(3)在无标签数据上采用蒸馏方式进行进行知识迁移。

所提方法在仅仅采用1%有标签数据时,ResNet50取得了73.9%的top-1精度;当采用10%有标签数据时,ResNet50的精度达到了77.5%的top-1精度。这个精度超越了采用全部有标签数据时有监督训练的精度。

Introduction

少量有标签数据+大量无标签数据的学习问题是机器学习中存在已有的问题。其中一种知名的方法是半监督学习,它包含无监督或自监督训练,后接有监督微调。在预训练阶段该方法以任务未知方式利用无标签数据,而有标签数据仅应用于微调阶段。尽管这类方法在CV领域受到的关注较少,但它已成为NLP领域的主流方案(比如首先在无标签文本数据上训练一个大的语言模型,然后在有标签数据上微调该模型)。在CV领域,常用的一种方案是:直接在以监督方式利用无标签数据(起正则作用)。这时的无标签数据是以任务已知方式进行利用,即:要求多个不同模型在无标签数据上的预测类标签具有一致性;或者在不同数据增广方式下输出的类别标签相一致。

受启发于视觉表达领域自监督学习的进展,该文首次对ImageNet上“无监督与训练、有监督微调”的半监督学习进行了系统研究。在自监督预训练阶段,图像以任务不可知方式进行应用,也就是说通过这种方式学习到的表达方式不会存在对特定分类任务的倾向性。作者发现:对于无监督数据的这种任务不可知的应用而言,模型的大小至关重要。在自监督预训练阶段采用更大的模型,那么微调后的性能也会更高。除此之外,作者还描绘了对比学习中几个重要的设计选项。

一旦卷积网络完成预训练和微调,作者发现:模型的任务已知预测属性可以进一步改善并蒸馏到一个更小的网络中。为此,作者对无标签数据进行了二次利用以促使学生网络尽可能的模拟老师网络的标签预测性能。所提方法的蒸馏阶段采用伪标签方式且不会造成额外的更多复杂度。

总而言之,所提半监督方法可以总结为三步;(1)采用SimCLRv2方法在无标签数据上对一个Big ResNet模型进行与训练;(2)在有标签数据上通过有监督方式进行微调;(3)在无标签数据上采用蒸馏方式进行进行知识迁移。整个流程见下图。

针对ResNet的无监督预训练,作者在SimCLR基础上进行了改进并称之为SimCLRv2.在仅仅采用1%和10%有标签数据时评估了所提方案的有效性,该方案主要包含下面三个贡献:

  • 实验结果表明:对于半监督学习而言,有标签数据越少,更多的模型微调后性能受益越多,见下图1.
  • 尽管大模型对于广义特征表达非常重要,但是额外的模型容量对于特征任务而言可能并非必须的。因此无标签数据的任务已知应用方式会进一步提升模型的预测性能并迁移到更小模型中;
  • 作者进一步证实了SimCLR中卷积后的非线性变换(即projection head)的重要性。更深的projection head不仅可以提升特征表达质量,同时可以提升半监督学习的性能。

组合上述发现得到了ImageNet上的半监督学习的SOTA性能,见上图2.SimCLRv2取得了79.8%的top-1精度,以4.3%绝对优势超过了此前SOTA方法。当仅仅采用1%和10%有标签数据进行微调并蒸馏到相同模型后,模型的指标分别为76.6%和80.9%,分别以21.6%和8.7%的绝对优势超越了已有SOTA方法。通过蒸馏,上述性能改进可以迁移到更小的ResNet50网络并取得了73.9%和77.5%的top1精度。相比较而言,ImageNet上有监督训练得到的ResNet50的精度为76.6%top精度。

Method

受启发于无标检数据的成功学习,所提半监督学习方案以任务未知和任务已知两种方式利用无标签数据。首先,采用任务未知方式利用无标签数据进行无监督预训练以学习广义视觉特征表达;然后;所学习的广义特征表达通过有监督微调进行方式;最后;采用任务已知方式利用无标签数据进行模型蒸馏。为达到该目的,作者提出在无标签数据集上训练一个学生模型,而标签则来自微调后的老师模型。盖房可以总结为:pretrain, fine-tune, distill.见下图。

Self-supervised pretraining with SimCLRv2

为更好的从无标签数据上学习广义视觉特征表达,作者对SimCLR进行了改进。SimCLR通过最大化不同增广数据之前的一致性进行学习。给定输入图像$xi,它将被增广两次,构建关于同一数据两次增广x{2k-1},x{2k},这两个图像通过编码网络f(\cdot)进行编码得到更易特征表达h{2k-1}, h{2k}。这些特征表达然后经过非线性变换网络g(\cdot)进行变换得到z{2k-1},z{2k}并用于对比学习。对比损失定义如下:$
\mathcal{l}
{i,j}^{NT-X_{ent}} = -log \frac{exp(sim(z_i, zj)/\tau)}{\sum{k=1}^{2N} \mathcal{1}_{[k\ne i]} exp(sim(z_i,z_k)/\tau)}
$$
其中sim(⋅,⋅)表示余弦相似性,τ表示温标参数。

在这里,作者基于SimCLR提出了三个主要改进得到了SimCLRv2,总结如下:

  • 为更好的利用广义与训练能力,作者探索了更大的ResNet模型。而SimCLR预其他方法中采用的最大模型为ResNet50(4x),在这里作者采用的最大模型是带SK的ResNet152,且通道数x3。在1%有标签数据上进行微调时,ResNet50到ResNet152的改变得到29%的性能提升。
  • 作者同时还提升了非线性网络g(⋅)(即projection head)的容量,将其变得更深。不同于SimCLR微调阶段中直接剔除掉g(⋅),SimCLRv2对其中间层进行微调。相比SimCLR仅采用两层project head,SimCLRv2采用了三层冰在第一层后进行微调,它得到了14%的性能提升(1%的有标签数据)。
  • 与此同时,作者还集成了MoCo中的记忆机制。这种方式取得了另外的1%的性能提升。

Fine-tuning

微调是将任务未知与训练模型迁移到任务已知中常用技巧。在SimCLR的微调阶段,非线性网络g(˙)会被直接完整丢弃而仅仅保留编码器部分f(⋅)进行微调。而在SimCLRv2中则是集成非线性网络的一部分(第一层)进行微调。

作者精心构建了一个三层projection head g(hi)=W(3)(σ(W(2)σ(W(1)hi))),其中σ表示ReLU激活函数,为简单起见这里忽略了偏置项。在微调阶段,SimCLR采用ftask(xi)=Wtaskf(xi)进行微调;而SimCLRv2则是采用ftask=Wtaskσ(W(1)f(xi))进行微调。这一点点的改进是不是看上去非常简单?能想到并去做才是难的!

Self-training/knowledge distillation via unlabeled examples

为进一步改善网络在特定任务上的性能,作者提出直接采用无标签数据进行特定任务学习。那么标签从何而来呢?伪标签咯。将签署微调模型作为老师模型并给出无标签数据对应的伪标签用于蒸馏学生模型。蒸馏阶段采用KL散度就可以了,有没有觉得很简单,方法都是现成的。

这个方法感觉跟Google之前提出的Noisy Student有异曲同工之妙,感兴趣的小伙伴可以去看一下谷歌的Noisy Student(https://arxiv.org/pdf/1911.04252v1.pdf)一文

Experiments

沿着无监督学习的设置方式,作者在ImageNet数据集上进行了实验分析。注:作者采用的优化器是LARS。

在预训练阶段,batch=4096,硬件平台128CloudTPU,同时采用了全局BatchNorm,训练了800epoch。学习率在前5%epoch线性提升到6.4然后按照余弦方式衰减,权值衰减因子为0.0001。非线性网路g(⋅)为三层感知器。记忆buffer设置为64K,同时采用了EMA技术。增广技术类似于SimCLR,即随机裁剪、颜色都懂以及高斯模糊。

在微调阶段,作者对非线性网络的第一层进行了微调。采用了全局BatchNorm,但移除了权值衰减、学习率warmup,而是采用了更小的学习率0.16和0.064用于标准ResNet和更大ResNet。batch=1024,在1%数据上微调60epoch,在10%数据上微调30epoch。

在蒸馏阶段,作者提出仅仅采用无标签数据进行蒸馏。作者采用了两种类型的蒸馏:自蒸馏与Big-to-small蒸馏。采用了与预训练相同的学习率机制、权值衰减以及batch。合计训练400epoch,此时仅仅采用随机裁剪、随机镜像数据增广。

下表给出了自监督、有监督在不同模型大小下的性能评估。可以看到:提升模型宽度、深度以及添加SK可以取得更好的性能。

下图给出了不同模型大小不同标签数据时的性能对比。

下图给出了非线性网络部分改善前后的性能对比。

最后,下图给出了蒸馏阶段的性能对比。更多实验对比分析建议查看原文。

Conclusion

这篇比较详细的描述了如何在SimCLR基础上改进得到SimCLRv2的过程,整个思路的转换非常清晰自然。通篇看下来,最大的感觉就是它和Noisy Student相同之处真的非常多,流程与思想都非常的相似。

论文与代码链接

paper:https://arxiv.org/abs/2006.10029

code:https://github.com/google-research/simclr

微信公众号: 极市平台(ID: extrememart )
每天推送最新CV干货


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK