原文题目为:Contrastive Multiview Coding
代码链接:https://github.com/HobbitLong/CMC
引言
本文主要提出了Multiview 的contrastive learning。motivation是现实世界中看待同一个物体具有多个视角,每一个视角都是有噪声和不完整的,但是一些对于该物体很重要的元素,例如physics(物理), geometry(几何), and semantics(语义)通常是在多个视角间共享的,举个例子:(一只狗可以被看到(seen),听到(heard),摸到(felt)),所以作者认为一个powerful representation建模了多个视角下都不变的元素。
基于这个假设,作者提出了多视角下进行contrastive learning来获得multi-view representation,通过contrastive learning,实际上等同于最大化互信息在多个view之间,即让多个view之间最大化共享的信息。
如上图所示,对于第
i
i
i个样本,4个 不同视角的representation在朝着嵌入空间中靠近优化,而对于另一个
j
j
j样本,嵌入空间朝着远离的方向优化。最终的结果是每个样本簇不同分离开来,每个样本簇包含4个不同视角的嵌入representation。上图展示的是NYU RGBD数据的4个view,最终的表示可以是4个视角的representation concatenation。
方法
two-view contrastive learning
给定数据集 V 1 V_{1} V1和 V 2 V_{2} V2,包含样本集合 { v 1 i , v 2 j } i = 1 N \{v_{1}^{i},v_{2}^{j}\}_{i=1}^{N} {v1i,v2j}i=1N,我们考虑对比congruent(一致)和incongruent(不一致)样本对,即样本来自联合分布 x ∼ p ( v 1 , v 2 ) x\sim p(v_{1},v_{2}) x∼p(v1,v2),也就是 x = { v 1 i , v 2 i } x=\{v_{1}^{i},v_{2}^{i}\} x={v1i,v2i}认为是positives,相反的,样本来自边缘分布的乘积 y ∼ p ( v 1 ) p ( v 2 ) y\sim p(v_{1})p(v_{2}) y∼p(v1)p(v2),也就是 y = { v 1 i , v 2 j } y=\{v_{1}^{i},v_{2}^{j}\} y={v1i,v2j}认为是negatives。
我们定义一个判别函数(也称为critic)
h
θ
(
⋅
)
h_{\theta}(\cdot)
hθ(⋅),对positvie的样本对获得高值,对negative样本对获得低值。遵循先前的设置,选择一个正样本对
x
x
x,同时采样
k
k
k个负样本对
{
y
1
,
y
2
,
.
.
.
,
y
k
}
\{y_{1},y_{2},...,y_{k}\}
{y1,y2,...,yk}进行对比学习:
L
c
o
n
t
r
a
s
t
=
−
E
S
[
log
h
θ
(
x
)
h
θ
(
x
)
+
∑
i
=
1
k
h
θ
(
y
i
)
]
\mathcal{L}_{contrast}=-\mathbb{E}_{S}[\log{\frac{h_{\theta}(x)}{h_{\theta}(x)+\sum_{i=1}^{k}h_{\theta}(y_{i})}}]
Lcontrast=−ES[loghθ(x)+∑i=1khθ(yi)hθ(x)]
其中
S
=
{
x
,
y
1
,
y
2
,
.
.
.
,
y
k
}
S=\{x,y_{1},y_{2},...,y_{k}\}
S={x,y1,y2,...,yk},具体的,我们固定一个视角的样本
v
1
i
v_{1}^{i}
v1i,从另一个视角选择出正样本
v
2
i
v_{2}^{i}
v2i和采样的
k
k
k个负样本
v
2
j
,
j
v_{2}^{j},j
v2j,j
L
c
o
n
t
r
a
s
t
V
1
,
V
2
=
−
E
{
v
1
1
,
v
2
1
,
v
2
2
,
.
.
.
,
v
2
k
+
1
,
}
[
log
h
θ
(
{
v
1
1
,
v
2
1
}
)
∑
j
=
1
k
+
1
h
θ
(
{
v
1
1
,
v
2
j
}
)
]
\mathcal{L}_{contrast}^{V_{1},V_{2}}=-\mathbb{E}_{\{v_{1}^{1},v_{2}^{1},v_{2}^{2},...,v_{2}^{k+1},\}}[\log{\frac{h_{\theta}(\{v_{1}^{1},v_{2}^{1}\})}{\sum_{j=1}^{k+1}h_{\theta}(\{v_{1}^{1},v_{2}^{j}\})}}]
LcontrastV1,V2=−E{v11,v21,v22,...,v2k+1,}[log∑j=1k+1hθ({v11,v2j})hθ({v11,v21})]
理论上,针对一个样本
v
1
1
v_{1}^{1}
v11需要遍历
V
2
V_{2}
V2全部的负样本来进行contrast,即
k
k
k为数据集大小减1.但是当数据集很大时,例如imagenet,直接优化上述的loss是不合理的,因为softmax分类的类别过多,计算量太大。因此作者采用随机采样
k
k
k个负样本并进行
k
+
1
k+1
k+1-softmax分类的方法。
critic h θ ( ⋅ ) h_{\theta}(\cdot) hθ(⋅)
h
θ
(
⋅
)
h_{\theta}(\cdot)
hθ(⋅)是一个神经网络,采用编码器
f
θ
1
(
⋅
)
f_{\theta_{1}}(\cdot)
fθ1(⋅)和
f
θ
2
(
⋅
)
f_{\theta_{2}}(\cdot)
fθ2(⋅)来分别编码输入样本
v
1
v_{1}
v1和
v
2
v_{2}
v2,得到的表示来计算余弦相似度:
h
θ
(
{
v
1
,
v
2
}
)
=
exp
(
f
θ
1
(
v
1
)
⋅
f
θ
2
(
v
2
)
∣
∣
f
θ
1
(
v
1
)
∣
∣
⋅
∣
∣
f
θ
2
(
v
2
)
∣
∣
⋅
1
τ
)
h_{\theta}(\{v_{1},v_{2}\})=\exp{(\frac{f_{\theta_{1}}(v_{1})\cdot f_{\theta_{2}}(v_{2})}{||f_{\theta_{1}}(v_{1})||\cdot ||f_{\theta_{2}}(v_{2})||}\cdot \frac{1}{\tau})}
hθ({v1,v2})=exp(∣∣fθ1(v1)∣∣⋅∣∣fθ2(v2)∣∣fθ1(v1)⋅fθ2(v2)⋅τ1)
τ
\tau
τ是超参数来动态调节范围。
L
c
o
n
t
r
a
s
t
V
1
,
V
2
\mathcal{L}_{contrast}^{V_{1},V_{2}}
LcontrastV1,V2是将
V
1
V_{1}
V1视为anchor并枚举
V
2
V_{2}
V2,对称地,将
V
2
V_{2}
V2视为anchor并枚举
V
1
V_{1}
V1,将两者相加作为two views loss:
L
(
V
1
,
V
2
)
=
L
c
o
n
t
r
a
s
t
V
1
,
V
2
+
L
c
o
n
t
r
a
s
t
V
2
,
V
1
\mathcal{L}(V_{1},V_{2})=\mathcal{L}_{contrast}^{V_{1},V_{2}}+\mathcal{L}_{contrast}^{V_{2},V_{1}}
L(V1,V2)=LcontrastV1,V2+LcontrastV2,V1
与互信息(MI)的联系
通过证明,可以得到互信息的下界:
I
(
z
i
;
z
j
)
≥
log
(
k
)
−
L
c
o
n
t
r
a
s
t
I(z_{i};z_{j})\geq \log{(k)}-\mathcal{L}_{contrast}
I(zi;zj)≥log(k)−Lcontrast
可以看出增加
k
k
k能够导致更好的表示。
contrastive learning 扩展到>2个view
针对4个views,
V
1
,
V
2
,
V
3
,
V
4
V_{1},V_{2},V_{3},V_{4}
V1,V2,V3,V4,提供了(a)和(b)模式。
core view模式是针对某个view
V
1
V_{1}
V1,与其他view进行contrastive learning,此时一共有3个目标:
L
C
=
∑
j
=
2
4
L
(
V
1
,
V
j
)
\mathcal{L}_{C}=\sum_{j=2}^{4}\mathcal{L}(V_{1},V_{j})
LC=j=2∑4L(V1,Vj)
另一种是全图模式,full graph,即每一种view都与其他view进行contrastive learning,因此有6个目标:
L
F
=
∑
1
<
i
<
j
<
4
L
(
V
i
,
V
j
)
\mathcal{L}_{F}=\sum_{1< i< j< 4}\mathcal{L}(V_{i},V_{j})
LF=1<i<j<4∑L(Vi,Vj)
全图模式更能抓住不同view之间的共同信息。
Memory bank
Memory bank是一个存储中间latent representation缓冲区,当我们retrieve
k
k
k个负样本时,就从Memory bank获取而不用重新计算representation。Memory bank在训练过程中是动态更新的,每得到样本新的representation,即以滑动的形式更新:
r
e
p
=
(
1
−
m
o
m
e
n
t
u
m
)
∗
o
l
d
_
r
e
p
+
m
o
m
e
n
t
u
m
∗
n
e
w
_
r
e
p
rep=(1-momentum)*old\_rep+momentum*new\_rep
rep=(1−momentum)∗old_rep+momentum∗new_rep
momentum一般取0.5,Memory bank的好处是能够快速得到很多负样本的representation,缺点是representation可能略微陈旧。