自监督对比学习
本篇承接前一篇自监督对比学习的介绍自监督对比学习系列论文(一):无引导对比学习–MOCO,SimCLR,这次主要关注于包含先验指导的对比学习,这一指导更进一步的可以区分为聚类指导以及标签指导两种类型。前者给出数据集的基本结构–即数据可以大致划分为 K K K个类别,但如何划分,依据什么样的特征或者目标进行划分并没有给出,需要通过聚类的方式自行学习。而基于标签指导的对比学习则显式的给出了instance的标签,迫使同类样本在特征空间上的距离得以保留。
聚类对比学习
聚类对比学习的思路相交于instance-wise contrastive learning而言,笔者认为是更为合理更为深入的。聚类对比学习的基础同样是认为每个instance可以认为是单独的一类,但在此基础之上,我们并不能否认某些类应当是更为亲密、而某些类则应当较为疏远,典型的例子如下:
instace-wise对比学习倾向于学到的是左边的的特征空间,但对于同类“狗”样本而言,即使是负样本,也应该和正样本更为亲密,由此诞生出了聚类对比学习。由于没有先验标签指导,只能通过聚类的形式来判断样本在语义上的一致性,进行有偏好的特征空间构造。而另一方面,针对于反例构造中性能与开销的抉择问题,聚类对比学习可以通过计算group层面的相似性来减少instance层面的开销,便于模型训练。
SCCL
SCCL其实并不算是完全的聚类对比学习,而是对比监督学习,也就是利用对比学习的范式来完成聚类问题,其思路也非常的简单粗暴。既然instance-wise 对比学习可以实现将每个样本推开,同时又隐式的将相似样本的距离拉近(这一点存疑),那么完全可以借助这一特性来将那些较为重叠(集群)的样本们分散开来,从而形成簇。实现方式也非常的直接,就是在simCLR的框架上额外增加了一个聚类头,如下图所示:
同样是在
N
N
N张图片组成的batch内,针对每个样本都产生1个正例和
2
N
−
1
2N-1
2N−1个反例,利用infoNCELoss来训练模型。不同之处就在于Clustering Head的设计,实际上这个聚类头也是比较典型的设计,常见于深度聚类算法之中,意图用用可训练的方式来寻找数据数据的潜在分布。具体而言是先假定数据可以被划分为
K
K
K类,并且初始化
K
K
K个聚类中心,然后利用假定每个簇内的数据分布都符合
t
t
t分布,由此计算样本
e
j
e_j
ej从属于第
k
k
k类的概率如下:
q
j
k
=
(
1
+
∣
∣
e
j
−
μ
k
∣
∣
2
2
/
α
)
−
α
+
1
2
∑
k
′
=
1
K
(
1
+
∣
∣
e
j
−
μ
k
′
∣
∣
2
2
/
α
)
−
α
+
1
2
q_{jk}=\frac{(1+||e_j-\mu_k||^2_2/\alpha)^{-\frac{\alpha+1}{2}}}{\sum_{k'=1}^{K}(1+||e_j-\mu_k'||^2_2/\alpha)^{-\frac{\alpha+1}{2}}}
qjk=∑k′=1K(1+∣∣ej−μk′∣∣22/α)−2α+1(1+∣∣ej−μk∣∣22/α)−2α+1
由此就得到了条件概率(软分类)
P
(
K
∣
q
j
)
P(\bold{K}|q_j)
P(K∣qj)。传统的聚类方法如k-Means想要优化的是簇内聚类和簇间聚类,而在深度聚类里我们则希望实现分布的近似,想要加强簇的纯净程度,这一目标分布如下:
p
j
k
=
q
j
k
2
/
f
k
∑
k
′
q
j
k
2
/
f
k
′
p_{jk}=\frac{q^2_{jk}/f_k}{\sum_{k'}q^2_{jk}/f_{k'}}
pjk=∑k′qjk2/fk′qjk2/fk
其中
f
k
−
∑
j
=
1
N
q
j
k
f_k-\sum_{j=1}^{N}q_{jk}
fk−∑j=1Nqjk,聚类头只对原始的输入进行计算,不对变换后的图片进行计算。这一目标分布具有三个特点:
- strengthen predictions
- 更加强调高置信度的数据点
- 使得每个聚类中心对于模型训练都有贡献
首先通过抬升概率的阶数使得分布更加的尖锐,然后通过簇置信度的归一化来消除大簇对于小簇的影响(实际上这一函数的具体数学原理真没看懂)。而后通过优化
q
j
k
,
p
j
k
q_{jk},p_{jk}
qjk,pjk的KL散度,使得前者逼近后者我们就可以使得模型学到一个更高置信度的分配方案,也就是:
l
j
C
=
K
L
[
p
j
∣
∣
q
j
]
=
∑
k
=
1
K
p
j
k
l
o
g
p
j
k
q
j
k
l^C_j=KL[p_j||q_j]=\sum_{k=1}^Kp_{jk}log \frac{p_{jk}}{q_{jk}}
ljC=KL[pj∣∣qj]=k=1∑Kpjklogqjkpjk
将聚类损失和对抗损失结合一起来优化网络训练即可得到一个不错的聚类模型。文章后面也讨论了是否要将聚类和对抗结合在一起joint 训练还是先用对抗损失训练再用聚类损失训练,实验证明前者效果更好
实际上这块聚类头的意思感觉上有点像semi-supervised learning里的pseduo-labeling策略,反倒和聚类没有那么的类似,具体可以去看看UDA以及SSL领域的的文章Unsupervised Domain Adaption (UDA)及domain shift介绍。虽然这个聚类头在很多深度聚类文章里都有应用,但总感觉不是很像聚类。
SwAV
SwAV的motivation来自于聚类对比学习的第二个优点,即利用group层面的prototype来减小过多负例计算带来的开销。更精确来说,SwAV里其实完全去除了负例的概念,仅仅使用来正例来进行模型的训练,但正例训练的目标不再是简单的拉近正例对在特征空间中的距离,而是拉近二者在标签上的分布,用文章的表述来说,“从图像的一个增强版本中计算一个代码,再利用图像的其他增强版本来预测这个代码”,这里“代码”的物理含义就是图像从属于不同簇的软标签。
online clustering
具体而言,首先从给定的一张图片得到
N
N
N张变换后的图片,然后对于某张图片,经特征提取后我们从特征相似性的角度可以计算其某一变换图
x
t
x_t
xt从属于不同簇的概率分布情况:
p
t
k
=
e
x
p
(
1
τ
z
t
T
c
k
)
∑
k
′
=
1
K
e
x
p
(
1
τ
z
t
T
c
k
′
)
p^{k}_t=\frac{exp(\frac{1}{\tau}z_t^Tc_k)}{\sum_{k'=1}^{K}exp(\frac{1}{\tau}z_t^Tc_k')}
ptk=∑k′=1Kexp(τ1ztTck′)exp(τ1ztTck)
同时先前图像一个增强版本的代码则通过设计一个最优化分配方案得到,这一最优化分配方案要求同一个BATCH内的样本能够被较为均匀的的分配到不同的簇中,避免出现平凡解。假定输入BATCH的图像特征可以通过一个mapping
Q
Q
Q转换到簇空间,这样我们的目的就变成了优化
Q
Q
Q来最大化特征和簇之间的距离:
m
a
x
Q
∈
Q
T
r
(
Q
T
C
T
Z
)
+
ϵ
H
(
Q
)
\underset{Q\in\mathbb{Q}}{max}\ Tr(Q^TC^TZ)+\epsilon H(Q)
Q∈Qmax Tr(QTCTZ)+ϵH(Q)
其中
H
(
Q
)
=
−
∑
i
j
Q
i
j
l
o
g
Q
i
j
H(Q)=-\sum_{ij}Q_{ij}logQ_{ij}
H(Q)=−∑ijQijlogQij是熵正则项,而对于
Q
Q
Q的选取有一额外约束,要求BATCH中每个样本要被利用一次,每个簇也要被选中一次1,即:
Q
=
Q
∈
R
+
K
×
B
∣
Q
l
B
=
1
K
l
K
,
Q
l
K
=
1
B
l
B
\mathbb{Q}={Q\in R_+^{K\times B}|Q\mathbf{l}_B=\frac{1}{K}\mathbf{l}_K,Q\mathbf{l}_K=\frac{1}{B}\mathbf{l}_B}
Q=Q∈R+K×B∣QlB=K1lK,QlK=B1lB
这一问题其实是最优化运输里常见的问题,可以通过sinkhron算法来解决2,解得Q的最优可行解为一迭代形式,即对如下式进行不断迭代直到收敛:
Q
∗
=
D
i
a
g
(
u
)
e
x
p
(
C
T
Z
ϵ
)
D
i
a
g
(
v
)
Q^*=Diag(u)exp(\frac{C^TZ}{\epsilon})Diag(v)
Q∗=Diag(u)exp(ϵCTZ)Diag(v)
其中
D
i
a
g
(
u
)
,
D
i
a
g
(
v
)
Diag(u),Diag(v)
Diag(u),Diag(v)实际上就是在对矩阵进行行、列归一化。
总体而言,SwAV的计算可以规范为如下几个步骤:
- 选取一张图片的两张变换后图片并进行特征提取得到 z t , z s z_t,z_s zt,zs
- 在BATCH层面内依据前述优化约束问题的解求得图像 x s x_s xs的code, q s q_s qs
- 计算簇和图像特征的相似性来计算 x t x_t xt的code, p t p_t pt
- 优化 q t q_t qt和 q s q_s qs间的距离(以 q s q_s qs为标签计算交叉熵): l ( z t , q s ) = − ∑ k q s k l o g ( p t k ) l(z_t,q_s)=-\sum_{k}q_s^klog(p_t^k) l(zt,qs)=−∑kqsklog(ptk)
- 交换
x
t
,
x
s
x_t,x_s
xt,xs的code计算方式,重复2~4
实际上笔者也没太明白为什么要用两种不同的方式来计算code,而且从计算方式来看,明显是决定通过优化方案计算得到的code更为靠谱,更适合作为一个pseduo label来指导聚类的进行。
Multi Crop
除了online clustering之外,SwAV还提出了一种图像增强的方式,mutli crop,也就是从原图中截取一系列低分辨率的局部图像作为一种补充view。在此基础之上,SwAV隐性的将不同增强图进行了划分,2张全分辨率的corp信息更多,用于计算优化得到code;V张低分辨率crop信息少,只计算聚类crop,因此总的损失函数变为:
L
(
z
t
1
,
z
t
2
,
.
.
.
,
z
t
v
+
2
)
=
∑
i
∈
1
,
2
∑
v
=
1
V
+
2
l
v
≠
i
l
(
z
t
v
,
q
s
)
L(z_{t1},z_{t2},...,z_{t_{v+2}})=\sum_{i\in{1,2}}\sum_{v=1}^{V+2}\mathbf{l}_{v\neq i}l(z_{tv},q_s)
L(zt1,zt2,...,ztv+2)=i∈1,2∑v=1∑V+2lv=il(ztv,qs)
小结
总得来看,SwAV的思路是很优秀的,巧妙的解决了传统聚类需要利用全部样本进行的不足,用一种类似于pseduo labeling的方式实现了每个BATCH内的聚类。但这里通过解决最优分配问题求得code存在一个很强的先验–同一个BATCH内的样本应当被均匀分配到clusetr中,即簇的大小应当是接近的,但在实际存在长尾分布问题的数据集中,这一assumption显然是不成立的,求得code能否再指导聚类也存疑。
PCL
PCL的设计思路就是聚类对比学习的另一条方向,希望能够利用语义信息来帮助模型更好的进行特征提取。其目的就是利用聚类作为某种程度的正则项来保证样本在语义空间上的结构不被破坏,相似类的样本仍然相近。其基本框架仍然是MOCO,只是附加了聚类约束:
首先从EM算法入手,最大似然角度出发,优化的目的是最大化已观测样本的出现概率,再假定样本背后存在着隐变量(原型)的情况下,可以写成:
由jensen不等式可得其下界满足:
忽略掉常数项,我们最终的优化目标是:
E-step
E-step中我们要对momentum encoder得到的图像特征向量进行k-means聚类,得到 k k k个聚类中心,并且记录下每个样本的“硬类别”也就是 p ( x i ; c i , θ ) p(x_i;c_i,\theta) p(xi;ci,θ)
M-step
M-step中我们在E-step求得的条件分布基础之上优化最大似然函数:
给出两个强先验:
-
簇选取的先验分布是均匀的
-
已知簇后,样本的条件分布是各项同性高斯分布;
同时假定提取出的图像特征和聚类中心都已经经过了归一化,我们的最优解可以写做:
感性上理解仍然是类似于softmax函数,对于给定的图像
x
i
x_i
xi以及由聚类得到的类别
s
s
s,我们希望最小化其交叉熵,
j
j
j为其余类别。
实践中为了得到不同层次的聚类效果,我们进行
M
M
M次不同簇数目的聚类,得到M个聚类正则项以保证图像语义空间的临近结构;将这一目标和infoCEloss结合以保证特征空间的局部平滑并促进聚类进程,我们可以得到如下损失函数ProtoNCE:
其中的 r r r为从memory bank里抽取的负样本数目, c j m c^m_j cjm为对应负样本在当前聚类策略下的聚类中心。
concentration estimation
ProtoNCE中有一个温度项
ϕ
\phi
ϕ,用于衡量簇的紧密程度,值越小表面对应的簇越紧密,通过该簇中包含样本特征到聚类中心距离得到:
这一参数的加入使得簇的大小更加的平均,实验也证明了这一点。
小结
其实感觉上这篇论文写的不是很连贯,聚类和最大似然的联系在哪解释的不是很清楚(可能是EM算法的原理), M-step里 p ( x i ; c i ) p(x_i;c_i) p(xi;ci)怎么得到的也没太懂,后续为什么随机采集 r r r个负样本对应的聚类中心也可以计算这个式子也不懂。只能大概理解算是给infoNCE加了个聚类的正则项来保留语义空间的结构。
有监督对比学习
有监督对比学习在聚类对比学习的基础上再往前走了一步,由于我们可以显式的获取标签,那么直接使用标签来约束特征空间的结构,使得同类样本更为接近即可。一个较为简单的方式就是将同类样本也视作为正例,而不再和instance wise一般将除样本本身之外的instance都认为是负样本,这样就可以得到supervised contrastive loss:
其中
P
(
i
)
=
{
p
∈
A
(
i
)
;
y
^
p
=
y
^
i
}
P(i)={p\in A(i);\hat{y}_p=\hat{y}_i}
P(i)={p∈A(i);y^p=y^i},也就是Batch内的同类样本,这两种形式的有监督对比损失区别在于log运算的顺序,考虑到log本身是个凹函数,这两个损失并不等价,由jensen不等式可知
L
i
n
s
u
p
≤
l
s
u
p
o
u
t
L_{in}^{sup}\leq l_{sup}^{out}
Linsup≤lsupout,实验也证明了后者会是个更好的损失函数。
这一篇论文其实改进不大,但在ImageNet上也算有用,涨了个点。
论文
Supporting Clustering with Contrastive Learning
Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
Prototypical Contrastive Learning of Unsupervised Representations
Supervised Contrastive Learning
参考
【研一小白论文精读】SwAV ↩︎
Notes on Optimal Transport ↩︎