论文地址:https://arxiv.org/pdf/2002.05709.pdf
目前流行的无监督学范式。通过训练,使模型拥有比较的能力。即,模型能够区别两个数据(instance)是否是相同的。这在 深度聚类 领域受到广泛的关注。(在有监督中的 few-shot, 使用一些类让模型学会比较,再用一些新类去测试模型的比较能力)
我们分几个模块了解对比学习。
数据增强
对比学习主要是通过拉进 正例对 之间特征表示的相似度;以及拉远 负例对 之间特征表示的相似度。
从而使模型具有 对比的能力。因为是无监督学习,我们的数据没有标签。我们构建正例对的方法就是通过数据增强(基本不改变数据的语义信息)。
数据增强的方法有很多种:
图片数据增强
文本数据增强
语音数据增强
图数据增强
正负例对的构建
原数据:
(
x
1
,
x
2
,
x
3
)
(x_1, x_2, x_3)
(x1,x2,x3);
增强数据a:
(
x
1
a
,
x
2
a
,
x
3
a
)
(x_1^a, x_2^a, x_3^a)
(x1a,x2a,x3a);
增强数据b:
(
x
1
b
,
x
2
b
,
x
3
b
)
(x_1^b, x_2^b, x_3^b)
(x1b,x2b,x3b);
Aug_data{a & b} | x 1 b x_1^b x1b | x 2 b x_2^b x2b | x 3 b x_3^b x3b |
---|---|---|---|
x 1 a x_1^a x1a | ( x 1 a , x 1 b ) \color{red}(x_1^a, x_1^b) (x1a,x1b) | ( x 1 a , x 2 b ) (x_1^a, x_2^b) (x1a,x2b) | ( x 1 a , x 3 b ) (x_1^a, x_3^b) (x1a,x3b) |
x 2 a x_2^a x2a | ( x 2 a , x 1 b ) (x_2^a, x_1^b) (x2a,x1b) | ( x 2 a , x 2 b ) \color{red}(x_2^a, x_2^b) (x2a,x2b) | ( x 2 a , x 3 b ) (x_2^a, x_3^b) (x2a,x3b) |
x 3 a x_3^a x3a | ( x 3 a , x 1 b ) (x_3^a, x_1^b) (x3a,x1b) | ( x 3 a , x 2 b ) (x_3^a, x_2^b) (x3a,x2b) | ( x 3 a , x 3 b ) \color{red}(x_3^a, x_3^b) (x3a,x3b) |
构成的正例对:红色;
构成的负例对:黑色。
上面说的只是原始的 对比对的构造方式。 现在还有根据 语义信息 进行去除假负例对。
假负例对:
x
1
,
x
2
x_1, x_2
x1,x2 属于一个 簇类,
(
x
1
a
,
x
2
b
)
(x_1^a, x_2^b)
(x1a,x2b) 却属于负例对,实际上应该属于正例对,且他们的特征表示的相似度应该很大。
编码器 Φ ( ⋅ ) \Phi(\cdot) Φ(⋅)
将图片,文本,语音,图等进行编码。得到特征矩阵
H
H
H。
对于一个原数据:
X
=
{
x
i
}
i
=
0
M
X = \{ x_i \}_{i=0}^M
X={xi}i=0M, 我们得到其相应的增数据:
X
a
=
{
x
i
a
}
i
=
0
M
X^a = \{ x_i^a \}_{i=0}^M
Xa={xia}i=0M,
X
b
=
{
x
i
b
}
i
=
0
M
X^b = \{ x_i^b \}_{i=0}^M
Xb={xib}i=0M。
M
M
M是batch size的大小。
然后经过编码得到特征矩阵:
H
a
=
Φ
(
X
a
)
,
H
b
=
Φ
(
X
b
)
H^a = \Phi(X^a), H^b = \Phi(X^b)
Ha=Φ(Xa),Hb=Φ(Xb),其中,
H
a
,
H
b
∈
R
M
×
h
i
d
d
e
n
_
s
i
z
e
H^a, H^b \in \mathbb{R}^{M \times hidden\_size}
Ha,Hb∈RM×hidden_size。
Project head f ( ⋅ ) f(\cdot) f(⋅)
一般使用一个两层的线性MLP或者三层的非线性MLP。将得到的Feature Matrix映射到一个字空间(subspace)。一般都是将其映射为128维。
对于得到的特征矩阵:
H
a
,
H
b
H^a, H^b
Ha,Hb。我们经过
f
(
⋅
)
f(\cdot)
f(⋅) 得到映射的子空间:
Z
a
=
f
(
H
a
)
,
Z
b
=
f
(
H
b
)
Z^a = f(H^a), Z^b = f(H^b)
Za=f(Ha),Zb=f(Hb), 其中,
Z
a
,
Z
b
∈
R
M
×
128
Z^a, Z^b \in \mathbb{R}^{M \times 128}
Za,Zb∈RM×128。
最小化对比损失
得到子空间表示后,在使用对比损失函数,最小化损失函数。
l
i
a
=
−
log
exp
(
s
(
z
i
a
,
z
i
b
)
/
τ
)
∑
j
=
1
M
[
exp
(
s
(
z
i
a
,
z
j
a
)
/
τ
)
+
exp
(
s
(
z
i
a
,
z
j
b
)
/
τ
)
]
l
i
b
=
−
log
exp
(
s
(
z
i
b
,
z
i
a
)
/
τ
)
∑
j
=
1
M
[
exp
(
s
(
z
i
b
,
z
j
a
)
/
τ
)
+
exp
(
s
(
z
i
b
,
z
j
b
)
/
τ
)
]
L
=
1
2
M
∑
i
=
1
M
(
l
i
a
+
l
i
b
)
\mathcal{l}^a_i = -\log \frac{\exp(s(z_i^a, z_i^b)/\tau)}{\sum_{j=1}^{M} [\exp(s(z_i^a, z_j^a)/\tau) + \exp(s(z_i^a, z_j^b)/\tau) ]} \\ \mathcal{l}^b_i = -\log \frac{\exp(s(z_i^b, z_i^a)/\tau)}{\sum_{j=1}^{M} [\exp(s(z_i^b, z_j^a)/\tau) + \exp(s(z_i^b, z_j^b)/\tau) ]} \\ \mathcal{L} = \frac{1}{2M} \sum_{i=1}^{M} (\mathcal{l}^a_i + \mathcal{l}^b_i)
lia=−log∑j=1M[exp(s(zia,zja)/τ)+exp(s(zia,zjb)/τ)]exp(s(zia,zib)/τ)lib=−log∑j=1M[exp(s(zib,zja)/τ)+exp(s(zib,zjb)/τ)]exp(s(zib,zia)/τ)L=2M1i=1∑M(lia+lib)
其中,
τ
\tau
τ 是温度参数,
M
M
M 是batch size的大小,
s
(
⋅
)
s(\cdot)
s(⋅) 是相似性度量,具体表达为:
s
(
z
i
,
z
j
)
=
z
i
T
z
j
/
∣
∣
z
i
∣
∣
2
⋅
∣
∣
z
j
∣
∣
2
s(z_i, z_j) = z_i^Tz_j / ||z_i||_2 \cdot ||z_j||_2
s(zi,zj)=ziTzj/∣∣zi∣∣2⋅∣∣zj∣∣2。