这篇文章非常有意思,在代表自监督领域的对比学习方法中提出了有监督的对比学习框架。
Introduction
交叉熵损失函数有缺乏对嘈杂标签鲁班性,差边距等缺点,但是很多替代方案始终不能泛用地替代它。此工作中提出了一种监督学习的损失,通过利用标签信息建立对比自监督信息。在将不同实例拉开的同时还使来自同一类的更紧密地结合在一起。看图一目了然:
左边是传统的自监督,可以看到在嵌入空间内同类样本也被拉开了,理论上我们希望同类的特征应该紧靠一起,这就是作者要这么做的原因把。
有监督对比学习的正负实例的选择策略也不同:正样本是从与锚点相同类别的样本中提取的而不是像自监督学习中所做的是锚点的数据增强。每个锚点使用多个正实例和多个负实例,无需进行负例的选择探究。作者还分析了所设置的两种自监督损失函数的效果。
Method
给定一批输入数据,首先应用两次数据增强以获得该批的两个副本。两个副本都通过编码器网络前向传播,以获得 2048 维的归一化嵌入。在训练期间,该表示通过投影网络进一步传播,该投影网络在推理时被丢弃。在投影网络的输出上计算监督对比损失。与监督学习的不同之处在于,在分类头之前,划分了一个阶段用于优化对比损失。而与自监督学习不同的是,选取的正负例是根据是否同类来区分的。如下图:
Data Augmentation :
对于每个输入样本 x,生成两个随机增强, x = A u g ( x ) x = Aug(x) x=Aug(x) ,每个都代表数据的不同视图。
Encoder Network:
这个模块主要用于将x编码为一个表示向量,两个增强样本分别输入到同一个编码器,产生一对表示向量。 r = E n c ( x ) r = Enc(x) r=Enc(x)
Projection Network:
将表示向量r映射到一个投影空间: z = P r o j ( r ) z = Proj(r) z=Proj(r)。
Loss function
对于一个批次内的样本、标签对
{
x
k
,
y
k
}
k
=
1
…
N
\left\{{x}_{k}, {y}_{k}\right\}_{k=1 \ldots N}
{xk,yk}k=1…N , 在训练时将其扩充为
2
N
2N
2N对
{
x
^
2
k
,
y
^
2
k
}
k
=
1
…
N
\left\{\hat{x}_{2k}, \hat{y}_{2k}\right\}_{k=1 \ldots N}
{x^2k,y^2k}k=1…N
{
x
^
2
k
−
1
,
y
^
2
k
−
1
}
k
=
1
…
N
\left\{\hat{x}_{2k-1}, \hat{y}_{2k-1}\right\}_{k=1 \ldots N}
{x^2k−1,y^2k−1}k=1…N 。我们将这些增强样本对称为多视图批次。
而在一个多视图批次内,设
i
∈
I
≡
{
1
…
2
N
}
i \in I \equiv\{1 \ldots 2 N\}
i∈I≡{1…2N} 为该批次内任一个增强样本。
L
out
sup
=
∑
i
∈
I
L
out
,
i
sup
=
∑
i
∈
I
−
1
∣
P
(
i
)
∣
∑
p
∈
P
(
i
)
log
exp
(
z
i
⋅
z
p
/
τ
)
∑
a
∈
A
(
i
)
exp
(
z
i
⋅
z
a
/
τ
)
L
in
sup
=
∑
i
∈
I
L
in
,
i
sup
=
∑
i
∈
I
−
log
{
1
∣
P
(
i
)
∣
∑
p
∈
P
(
i
)
exp
(
z
i
⋅
z
p
/
τ
)
∑
a
∈
A
(
i
)
exp
(
z
i
⋅
z
a
/
τ
)
}
\begin{gathered} \mathcal{L}_{\text {out }}^{\text {sup }}=\sum_{i \in I} \mathcal{L}_{\text {out }, i}^{\text {sup }}=\sum_{i \in I} \frac{-1}{|P(i)|} \sum_{p \in P(i)} \log \frac{\exp \left(\boldsymbol{z}_{i} \cdot \boldsymbol{z}_{p} / \tau\right)}{\sum_{a \in A(i)} \exp \left(\boldsymbol{z}_{i} \cdot \boldsymbol{z}_{a} / \tau\right)} \\ \mathcal{L}_{\text {in }}^{\text {sup }}=\sum_{i \in I} \mathcal{L}_{\text {in }, i}^{\text {sup }}=\sum_{i \in I}-\log \left\{\frac{1}{|P(i)|} \sum_{p \in P(i)} \frac{\exp \left(\boldsymbol{z}_{i} \cdot \boldsymbol{z}_{p} / \tau\right)}{\sum_{a \in A(i)} \exp \left(\boldsymbol{z}_{i} \cdot \boldsymbol{z}_{a} / \tau\right)}\right\} \end{gathered}
Lout sup =i∈I∑Lout ,isup =i∈I∑∣P(i)∣−1p∈P(i)∑log∑a∈A(i)exp(zi⋅za/τ)exp(zi⋅zp/τ)Lin sup =i∈I∑Lin ,isup =i∈I∑−log⎩⎨⎧∣P(i)∣1p∈P(i)∑∑a∈A(i)exp(zi⋅za/τ)exp(zi⋅zp/τ)⎭⎬⎫
以上二式就是作者提出的两个损失,其中
P
(
i
)
≡
p
∈
A
(
i
)
P(i) \equiv{p \in A(i) }
P(i)≡p∈A(i) 为多视图批次的正样本对,
a
∈
A
(
i
)
{a\in A(i)}
a∈A(i) 为除
i
i
i 外的样本对。
τ
\tau
τ 为温度超参数。两个公式的含义都很直观,即在投影空间里,拉近正例的距离,拉远与负例的距离。不同的是,
l
o
g
log
log 所处的位置不同,因此作者还比较了两种损失的差异:
L
o
u
t
s
u
p
\mathcal{L}^{sup}_{out}
Loutsup 显然优于
L
i
n
s
u
p
\mathcal{L}^{sup}_{in}
Linsup 。作者认为,这是正例归一化项
1
/
P
(
i
)
1/P(i)
1/P(i) 带来的偏差。因为在
L
i
n
s
u
p
\mathcal{L}^{sup}_{in}
Linsup 中,正例归一化项位于
l
o
g
log
log内部,导致对整个损失函数的影响仅仅为常数级别。而前者在
l
o
g
log
log外部,能有效地影响梯度变化。在没有任何归一化效果的情况下,
L
i
n
s
u
p
\mathcal{L}^{sup}_{in}
Linsup 的梯度更容易受到正例偏差的影响,从而导致次优训练。
Experiments
由于使用了label,主要还是和交叉熵比较(imageNet上不同网络,不同数据增强的消融)
对数据损伤的鲁棒性:
第一次看觉得噱头大于实际,类标签都预先知道了,套个对比学习的框架,这和交叉熵有什么区别。。。后面简单实现了下,还是能涨点的,确实是有点玄学,硬要解释的话,个人觉得在对比学习的空间里知识表示能力较于交叉熵更强吧。