Self-Supervised Learning of Pretext-Invariant Representations
Introduction
在对比学习方法中,决定其性能的关键因素是正负样本选取的合理性,如果样本选取不合理,会导致网络的训练出现震荡,甚至学不到任何的信息。因此,对比学习的方法很多都致力于研究如何获取高质量的正负样本。该文章提出了Pretext-Invariant Representation Learning (PIRL)的方法。 该方法假设图像经过变换后语义特征是不变的,这和对比学习的思路一致。作者在文中使用之前介绍的jigsaw方法产生増广样本,也就是一次把图像分成九份,然后送到孪生网络中提取特征,通过聚合和映射得到増广样本的表征。増广样本的表征需要和原始图像的表征相似,和负样本的相异。另外,作者还提出了memory bank的方法,保存原图像的表征,并通过滑动平均的方法进行更新,为预训练提供负样本。
本文收录在CVPR 2020,作者Ishan Misra发表过若干篇有影响力的自监督表示学习的文章。文章地址。
PIRL: Pretext-Invariant Representation Learning
本部分给出PIRL方法的介绍,包括损失函数的设计,memory bank的设计和网络结构的细节等。
Overview of PIRL
总体说来,该方法还是对比学习的思路,目的是让原图及其变换后的图像特征相似,让不同图像之间的特征相异,但是在具体操作的过程中有一些改进,使预训练的效果得到了很大的提升。
首先我们定义
D
D
D为图像的集合,
D
=
{
I
1
,
I
2
,
.
.
.
,
I
∣
D
∣
}
D=\{I_1,I_2,...,I_{|D|}\}
D={I1,I2,...,I∣D∣},
I
∈
R
H
×
W
×
3
I \in R^{H \times W \times 3}
I∈RH×W×3表示单张图片,
T
T
T表示数据变换的集合,
I
t
I^t
It指对数据
I
I
I做数据变换
t
t
t。
v
I
=
θ
(
I
)
v_I=\theta(I)
vI=θ(I)表示图像
I
I
I经过网络提取之后得到的特征。对于
v
I
v_I
vI和
v
I
t
v_{I^t}
vIt,损失函数为:
h
(
v
I
,
v
I
t
)
=
exp
(
s
(
v
I
,
v
I
t
)
/
τ
)
exp
(
s
(
v
I
,
v
I
t
)
/
τ
)
+
∑
I
′
∈
D
N
exp
(
s
(
v
I
t
,
v
I
′
)
)
/
τ
h(v_I,v_{I^t})=\frac{\exp(s(v_I,v_{I^t})/\tau)}{\exp(s(v_I,v_{I^t})/\tau)+\sum_{I^{'}\in D_N}\exp(s(v_{I^t},v_{I^{'}}))/\tau}
h(vI,vIt)=exp(s(vI,vIt)/τ)+∑I′∈DNexp(s(vIt,vI′))/τexp(s(vI,vIt)/τ)
其中,
I
′
I^{'}
I′为负样本。
s
s
s表示特征之间的相似度,一般使用余弦相似度。
在本文中,作者不是直接使用CNN提取得到的特征,而是将其又过了一个映射层(MLP之类的),原图像的映射函数表示为
f
f
f,变换图像的表示为
g
g
g,使用NCE loss作为损失函数:
L
N
C
E
(
I
,
I
t
)
=
−
log
(
h
(
f
(
v
I
)
,
g
(
v
I
t
)
)
)
−
∑
I
′
∈
D
N
log
(
1
−
h
(
f
(
v
I
t
)
,
g
(
v
I
′
)
)
)
L_{NCE}(I,I^t)=-\log(h(f(v_I),g(v_{I^t})))-\sum_{I^{'}\in D_N}\log (1-h(f(v_{I^t}),g(v_{I^{'}})))
LNCE(I,It)=−log(h(f(vI),g(vIt)))−I′∈DN∑log(1−h(f(vIt),g(vI′)))
使用以上损失函数可以保证正样本之间互相接近,负样本之间相互原理。不过这个也不是最终的损失函数,最终的损失函数在下面介绍。
Memory Bank
本文提出了使用memory bank来保存图像的特征,并在训练中起到提供负样本。memory bank可以理解为一个字典,其中原始图像
I
I
I和特征
m
I
m_I
mI有一个映射的关系,每一个循环之后,
m
I
m_I
mI会议滑动平均的方式更新。在训练过程中,
m
I
m_I
mI有两个作用,一个是提供足量的负样本,避免batchsize过大的问题,另一个是为原始图像
I
I
I和变化图像
I
t
I^t
It之间提供一个中间的基准,帮助训练。经过memory bank之后的损失函数如下:
L
(
I
,
I
t
)
=
λ
L
N
C
E
(
m
I
,
g
(
v
I
t
)
)
+
(
1
−
λ
)
L
N
C
E
(
f
(
v
I
)
)
L(I,I^t)=\lambda L_{NCE}(m_I,g(v_{I^t}))+(1- \lambda)L_{NCE}(f(v_I))
L(I,It)=λLNCE(mI,g(vIt))+(1−λ)LNCE(f(vI))
也就是说经过上述的损失函数的约束,网络在学习过程中,会使
I
I
I和
I
t
I^t
It的特征趋向于
m
I
m_I
mI。同时还会从memory bank中随机去除任意多的
m
I
′
m_{I^{'}}
mI′。
总的流程如图所示:
Networks Architecture
作者使用ResNet50作为backbone, v I v_I vI为globalpool之后的输出,对于原始图像,映射函数 f f f为一个 2048 × 128 2048\times 128 2048×128的线性运算层。对于变换图像 g g g,首先将图像切分为九块,每一个patch记为 I p 0 . . . . I p 8 I_{p0}....I_{p8} Ip0....Ip8,然后打乱之后依次送入backbone,得到特征 v I p 1 . . . . . v_{I_{p1}}..... vIp1.....。之后将这九个特征concate到一起,通过 g g g得到最后的特征。
Experimental results
实验部分,主要看该方法在目标检测和线性分类任务上的性能
Object Detection
对于目标检测任务,作者主要评估其在VOC07+12上的检测效果。同种实验条件下,本文的方法可以取得最好的成绩,同时作者也列出了一些其他的方法,这些方法加了一些其他的trick,会超过本方法。
Image Classification with Linear Models
固定特征提取层,只训练线性分类层,得到的结果如下:
在ImageNet,VOC07,Places205和iNat数据集上的效果表明,该方法可以取得最好的效果,不过仍然比ImageNet的方法有差距。
Conclusion
本文介绍的方法可以有效解决batchsize过大的问题,很有启发效果。但是该方法需要一个memory bank保存所有图像的特征,这非常耗费内存,而且更新也非常缓慢。后面我们会介绍MoCo方法,他提出了一种非常有效的方案,在很多的任务上取得了SOTA的效果。