自步对比学习(Self-paced Contrastive Learning with Hybrid Memory for Domain Adaptive Object Re-ID)
简介
目标重识别
上面的链接就有很好的介绍,主要怎么理解该问题。
个人理解:用简单的大白话来说,该任务的执行过程应该是对于某个目标先进行类似于确定的操作,再在譬如不同摄像机,场景下,再次将该目标识别出来。
领域自适应
个人理解:动机是机器学习深度学习再使用训练样本训练模型之后,测试样本或者真实场景的样本可能与训练数据的分布差异较大,容易出现过拟合的现象,针对这种问题提出迁移学习。领域自适应就是迁移学习的一个重要方法,主要是利用信息丰富的源域样本来提升目标域模型的性能。
方法
设计了一个框架,由一个基于CNN的encoder f θ f_\theta fθ和一个混合记忆模块,关键创新是该网络是被源域类别,目标域聚类类别,目标域离群实例三者联合监督训练的,并且还能动态更新混合记忆模块去提供更加可靠的学习目标。
为了避免初始化被噪声聚类影响,该方法初始化过程使用的是更加可靠的聚类结果,因此提出了一个新的聚类评价标准去衡量聚类的质量。
3.1通过对比学习构造和升级混合记忆模块
这里假定目标域的训练样本都是无监督的 X t X^t Xt,采用3.2节的聚类策略进行聚类分组。源域的样本为 X s X^s Xs,带有标签。
目标域的伪标签数据为 X c t X^t_c Xct,目标域的离群实例(也就是不属于任何聚类的样本)为 X o t X^t_o Xot( i . e . X t = X c t ∪ X o t i.e.X^t = X^t_c\cup X_o^t i.e.Xt=Xct∪Xot)。
3.1.1统一对比学习
给定一个一般特征向量
f
=
f
θ
(
x
)
,
x
∈
X
s
∪
X
c
t
∪
X
o
t
f=f_\theta(x),x\in X^s\cup X^t_c\cup X_o^t
f=fθ(x),x∈Xs∪Xct∪Xot,我们的统一对比loss为:
L
f
=
−
l
o
g
e
x
p
(
<
f
,
z
+
>
/
τ
)
∑
k
=
1
n
s
e
x
p
(
<
f
,
w
k
>
/
τ
)
+
∑
t
=
1
n
c
t
e
x
p
(
<
f
,
c
k
>
/
τ
)
+
∑
t
=
1
n
o
t
e
x
p
(
<
f
,
v
k
>
/
τ
)
\mathcal{L}_f=-log\frac{exp( \left< f,z^+ \right> /\tau)}{\sum_{k=1}^{n^s}exp(\left<f,w_k\right>/\tau)+\sum_{t=1}^{n^t_c}exp(\left<f,c_k\right>/\tau)+\sum_{t=1}^{n^t_o}exp(\left<f,v_k\right>/\tau)}
Lf=−log∑k=1nsexp(⟨f,wk⟩/τ)+∑t=1nctexp(⟨f,ck⟩/τ)+∑t=1notexp(⟨f,vk⟩/τ)exp(⟨f,z+⟩/τ)
z
+
z^+
z+表示与
f
f
f正相关的原型,
τ
\tau
τ经验数值为0.05,<>为内积用来衡量相似度。
n
s
n^s
ns表示源域类别数,
n
c
t
n_c^t
nct表示目标域聚类数,
n
o
t
n_o^t
not表示目标域离群实例的个数。根据
f
f
f所属类别,
z
+
z^+
z+的值与之对应
3.1.2混合记忆模块
他这里的策略是每个epoch重新聚类得到更加可靠的聚类信息,因此每次聚类类别,离群值都在变化,相应的统一对比loss就要发生改变,因此loss的类原型是非参数化动态构造的?
记忆模块初始化:通过前向计算 f θ f_\theta fθ得到提取的特征来初始化混合记忆模块,初始源域类中心可由每个类的平均特征向量得到,而初始的目标域实例特征 { v } \{v\} {v}是由 f f f被直接编码的。然后目标域的聚类中心被每个类的平均向量初始化。
注意,这样通过前向计算初始化仅有一次,后面更新混合记忆模块都在训练中进行。
更新记忆模块:每次迭代,每个小batch中的被编码特征向量会参与记忆模块更新。
对于源域中的类中心
{
w
}
\{w\}
{w},譬如第k个类中心就由minibatch中的属于k类的特征向量的均值向量更新:
w
k
←
m
s
w
k
+
(
1
−
m
s
)
⋅
1
∣
B
k
∣
∑
f
i
s
∈
B
k
f
i
s
w_k\leftarrow m^sw_k+(1-m^s) \cdot \frac{1}{|\mathcal{B}_k|}\sum_{f^s_i\in \mathcal{B}_k}f_i^s
wk←mswk+(1−ms)⋅∣Bk∣1fis∈Bk∑fis
B
k
\mathcal{B}_k
Bk表示属于在当前minibatch中源域第k类的特征集合,
m
s
∈
[
0
,
1
]
m^s\in[0,1]
ms∈[0,1]是动量参数,由经验设置为0.2
目标域的聚类中心不能被这样存储和更新,因为聚类的集合和离群值的集合是不断变化的。混合记忆模块缓存了所有目标域特征
{
v
}
\{v\}
{v},每个minibatch中的编码特征向量
f
i
t
f^t_i
fit被用来更新与之对应的实例条目
v
i
v_i
vi:
v
i
←
m
t
v
i
+
(
1
−
m
t
)
f
i
t
v_i\leftarrow m^tv_i+(1-m^t)f_i^t
vi←mtvi+(1−mt)fit
这里
m
t
m^t
mt按照经验设置0.2。然后再由新的
v
i
v_i
vi更新聚类中心。
3.2可靠聚类的自步学习
自步学习在每个epoch之前的重聚类步骤中,只有最可靠的聚类才会被保留,不可靠的类将会被打散重新归为离群值实例。
通过衡量聚类的独立性和紧性,提出一个可靠的评判标准。
**聚类的独立性:**一个可靠的类应该是与其他类和个例样本独立的。
用
I
(
f
i
t
)
\mathcal{I}(f_i^t)
I(fit)表示属于同一类的堂样本
f
i
t
f_i^t
fit,用IOU分数来衡量聚类的独立性得分:
R
i
n
d
e
p
(
f
i
t
)
=
∣
I
(
f
i
t
)
∩
I
l
o
s
s
e
(
f
i
t
)
∣
∣
I
(
f
i
t
)
∪
I
l
o
s
s
e
(
f
i
t
)
∣
\mathcal{R}_{indep}(f_i^t)=\frac{|\mathcal{I}(f_i^t)\cap\mathcal{I}_{losse}(f_i^t)|}{|\mathcal{I}(f_i^t)\cup\mathcal{I}_{losse}(f_i^t)|}
Rindep(fit)=∣I(fit)∪Ilosse(fit)∣∣I(fit)∩Ilosse(fit)∣
I
l
o
s
s
e
(
f
i
t
)
\mathcal{I}_{losse}(f_i^t)
Ilosse(fit)表示聚类标准松散的时候包含的类集合。
R
i
n
d
e
p
\mathcal{R}_{indep}
Rindep越大表示该类对于
f
i
t
f_i^t
fit越独立。在一个聚类中的样本应该有同样的独立分。
放宽聚类的标准也不会有样本被归到其他类里(对于一个聚类好的类来说)。
**聚类的紧性:**就是类内的样本之间有更短的距离。收紧聚类的标准也不会有样本被分到其他类里(对于一个聚类好的类来说)
R
c
o
m
p
(
f
i
t
)
=
∣
I
(
f
i
t
)
∩
I
t
i
g
h
t
(
f
i
t
)
∣
∣
I
(
f
i
t
)
∪
I
t
i
g
h
t
(
f
i
t
)
∣
\mathcal{R}_{comp}(f_i^t)=\frac{|\mathcal{I}(f_i^t)\cap\mathcal{I}_{tight}(f_i^t)|}{|\mathcal{I}(f_i^t)\cup\mathcal{I}_{tight}(f_i^t)|}
Rcomp(fit)=∣I(fit)∪Itight(fit)∣∣I(fit)∩Itight(fit)∣
I
l
o
s
s
e
(
f
i
t
)
\mathcal{I}_{losse}(f_i^t)
Ilosse(fit)表示聚类标准收紧的时候包含的类集合。该值越大表示类内的样本间距更小
设置了 α , β ∈ [ 0 , 1 ] \alpha,\beta\in[0,1] α,β∈[0,1]为独立性和紧性的阈值,来确定可靠的聚类。保留 R i n d e p > α , R c o m p > β \mathcal{R}_{indep}>\alpha,\mathcal{R}_{comp}>\beta Rindep>α,Rcomp>β的聚类结果,剩下的其他数据全部被当做不属于任何类的离群实例。
一些方法应用细节
每个epoch前重新聚类,聚类方法使用的是DBSCAN,基于密度聚类的方法。参考
伪码(也可以找西瓜书看看):来源
聚类中的距离使用的是Jaccard距离。直接参照百度百科
后续实验
具体细节就可以看论文表格了,一些对比实验与消融实验。论文的附录里有算法的伪码还有一些实施细节等,对于帮助论文理解有较大的帮助。