SimCLR框架的理解和代码实现以及代码讲解

作者:MARCIN ZAB?OCKI
编译:ronghuaiyang
导读
如何使用SimCLR框架进行对比学习,看这个就明白了 。
在过去的几个月中,NLP和计算机视觉的迁移学习和预训练受到了广泛的关注 。研究表明,精心设计的无监督/自监督训练可以产生高质量的基础模型和嵌入,这大大减少了下游获得良好分类模型所需的数据量 。这种方法变得越来越重要,因为公司收集了大量的数据,但其中只有一部分可以被人类标记 —— 要么是由于标记过程的巨大成本,要么是由于一些时间限制 。
在这里,我将探讨谷歌在这篇arxiv论文中提出的SimCLR预训练框架 。我将逐步解释SimCLR和它的对比损失函数,从简单的实现开始,然后是更快的向量化的实现 。然后,我将展示如何使用SimCLR的预训练例程,首先使用EfficientNet网络架构构建图像嵌入,最后,我将展示如何在它的基础上构建一个分类器 。
理解SimCLR框架一般来说,SimCLR是一个简单的视觉表示的对比学习框架 。这不是什么新的深度学习框架,它是一套固定的步骤,为了训练高质量的图像嵌入 。我画了一个图来解释这个流程和整个表示学习过程 。
SimCLR框架的理解和代码实现以及代码讲解

文章插图
【SimCLR框架的理解和代码实现以及代码讲解】 
流程如下(从左到右):
  1. 取一个输入图像
  2. 准备2个随机的图像增强,包括:旋转,颜色/饱和度/亮度变化,缩放,裁剪等 。文中详细讨论了增强的范围,并分析了哪些增广效果最好 。
  3. 运行一个深度神经网络(最好是卷积神经网络,如ResNet50)来获得那些增强图像的图像表示(嵌入) 。
  4. 运行一个小的全连接线性神经网络,将嵌入投影到另一个向量空间 。
  5. 计算对比损失并通过两个网络进行反向传播 。当来自同一图像的投影相似时,对比损失减少 。投影之间的相似度可以是任意的,这里我使用余弦相似度,和论文中一样 。
对比损失函数对比损失函数背后的理论对比损失函数可以从两个角度来解释:
  1. 当来自相同输入图像的增强图像投影相似时,对比损失减小 。
  2. 对于两个增强的图像(i), (j)(来自相同的输入图像 — 我稍后将称它们为“正”样本对),(i)的对比损失试图在同一个batch中的其他图像(“负”样本)中识别出(j) 。
对正样本对(i)和(j)的损失的形式化定义为:
SimCLR框架的理解和代码实现以及代码讲解

文章插图
 
最终的损失是batch中所有正样本对损失的算术平均值:
SimCLR框架的理解和代码实现以及代码讲解

文章插图
 
请记住,在*l(2k- 1,2k) + l(2k, 2k-1)


    推荐阅读