对比学习的思想是去 拉近相似的样本,推开不相似的样本,而目标是要 从样本中学习到一个好的语义表示空间。
自监督对比学习
自监督对比学习是将样本“照镜子”,转为有监督任务。
以图像领域提取图片feature为例,在不使用图片类别等信息的情况下,对无标签的图片做augmentation(旋转、裁剪、添加noise等),将一个batch的样本转为监督任务,具体如下:
- 一个batch包含N张图,通过augmentation获得 N N N张图,将2N张图输入Network得到 2 N 2N 2N个feature: [ z 1 , z 2 , ⋯ , z N − 1 , z N ] [z_1,z_2,\cdots,z_{N-1},z_N] [z1,z2,⋯,zN−1,zN]。
- 对于每个特征 z i z_i zi,都存在一个特征 z j z_j zj与之同源(来自同一张图),所以 z i z_i zi和 z j z_j zj的距离越接近越好;反之,对于其余 2 N − 2 2N-2 2N−2个图片特征,与 z i z_i zi的距离越远越好。
自监督的损失函数如下:
L
s
e
l
f
=
∑
i
∈
I
L
i
s
e
l
f
=
−
∑
i
∈
I
log
exp
(
z
i
⋅
z
j
(
i
)
/
τ
)
∑
a
∈
A
(
i
)
exp
(
z
i
⋅
z
a
/
τ
)
\mathcal{L}^{self}=\sum_{i\in I}\mathcal{L}_i^{self}=-\sum_{i\in I}\log\cfrac{\exp{\left(z_i\cdot z_{j(i)}/\tau\right)}}{\sum_{a\in A(i)}\exp(z_i\cdot z_a/\tau)}
Lself=i∈I∑Liself=−i∈I∑log∑a∈A(i)exp(zi⋅za/τ)exp(zi⋅zj(i)/τ)
其中,
j
(
i
)
j(i)
j(i)是与
i
i
i来自同一张图片的索引,
⋅
\cdot
⋅ 代表内积符号,
z
l
z_l
zl是l2标准化后的向量,
τ
∈
R
+
\tau\in\mathcal{R}^{+}
τ∈R+是一个温度系数,
A
(
i
)
≡
I
\
{
i
}
A(i)\equiv I\backslash \{i\}
A(i)≡I\{i}。index
i
i
i称为anchor,index
j
(
i
)
j(i)
j(i)称为positive,另外
2
(
N
−
1
)
2(N-1)
2(N−1)个样本(
k
∈
A
(
i
)
\
{
j
(
i
)
}
k\in A(i)\backslash\{j(i)\}
k∈A(i)\{j(i)})称为negatives。
自监督思路的不足在于没有考虑同一类图片的特征相关性,例如下图中同属于狗的两张图片距离学习到的特征距离也会越大。
监督对比学习
Supervised Contrastive Learning
为了让同类图片的特征距离接近,需要引入类别信息,将“自监督”转为“监督”。则对比学习的依据由“是否来自同一张图片”变为"是否属于同一类"。loss公式如下:
L
s
e
l
f
=
∑
i
∈
I
L
i
s
e
l
f
=
∑
i
∈
I
−
1
∣
P
(
i
)
∣
∑
p
∈
P
(
i
)
log
exp
(
z
i
⋅
z
p
/
τ
)
∑
a
∈
A
(
i
)
exp
(
z
i
⋅
z
a
/
τ
)
\mathcal{L}^{self}=\sum_{i\in I}\mathcal{L}_i^{self}=\sum_{i\in I}\frac{-1}{\lvert P(i)\rvert}\sum_{p\in P(i)}\log\cfrac{\exp{\left(z_i\cdot z_p/\tau\right)}}{\sum_{a\in A(i)}\exp(z_i\cdot z_a/\tau)}
Lself=i∈I∑Liself=i∈I∑∣P(i)∣−1p∈P(i)∑log∑a∈A(i)exp(zi⋅za/τ)exp(zi⋅zp/τ)
其中
P
(
i
)
≡
{
p
∈
A
(
i
)
:
y
~
p
=
y
~
i
}
P(i)\equiv \{p\in A(i):\tilde{y}_p=\tilde{y}_i\}
P(i)≡{p∈A(i):y~p=y~i}是与样本
i
i
i所属同一类的样本,
∣
P
(
i
)
∣
\lvert P(i)\rvert
∣P(i)∣是样本个数。
另一种先求和再取
log
\log
log的公式:
L
i
n
s
e
l
f
=
∑
i
∈
I
L
i
n
,
i
s
e
l
f
=
∑
i
∈
I
−
log
{
1
∣
P
(
i
)
∣
∑
p
∈
P
(
i
)
exp
(
z
i
⋅
z
p
/
τ
)
∑
a
∈
A
(
i
)
exp
(
z
i
⋅
z
a
/
τ
)
}
\mathcal{L}^{self}_{in}=\sum_{i\in I}\mathcal{L}_{in,i}^{self}=\sum_{i\in I}-\log{\left\{\frac{1}{\lvert P(i)\rvert}\sum_{p\in P(i)}\cfrac{\exp{\left(z_i\cdot z_p/\tau\right)}}{\sum_{a\in A(i)}\exp(z_i\cdot z_a/\tau)}\right\}}
Linself=i∈I∑Lin,iself=i∈I∑−log⎩⎨⎧∣P(i)∣1p∈P(i)∑∑a∈A(i)exp(zi⋅za/τ)exp(zi⋅zp/τ)⎭⎬⎫
则对于上述损失函数,与
i
i
i同类的图片的特征与
i
i
i的距离越近,余弦距离越大越好;反之,与
i
i
i异类的图片的特征与
i
i
i的距离越远,余弦距离越小越好。
相比于自监督学习,监督对比学习的效果如下图:
监督学习做预训练模型fine-tuning
论文Supervised Contrastive Learning for Pre-trained Language Model Fine-tuning与上述监督学习类似,不过这里应用到预训练模型的fine-tuning上,在分类损失交叉熵的基础上,添加一个对比loss来使得“同类相近,异类远离”。公式如下:
L
=
(
1
−
λ
)
L
C
E
+
λ
L
S
C
L
L
C
E
=
−
1
N
∑
i
=
1
N
∑
c
=
1
C
y
i
,
c
⋅
log
y
^
i
,
c
L
S
C
L
=
∑
i
=
1
N
−
1
N
y
i
−
1
∑
j
=
1
N
1
i
≠
j
1
y
i
=
y
j
log
exp
(
Φ
(
x
i
)
⋅
Φ
(
x
j
)
/
τ
)
∑
k
=
1
N
1
i
≠
k
exp
(
Φ
(
x
i
)
⋅
Φ
(
x
k
)
/
τ
)
\mathcal{L}=(1-\lambda)\mathcal{L}_{CE}+\lambda\mathcal{L}_{SCL}\\ \mathcal{L}_{CE}=-\frac{1}{N}\sum_{i=1}^N\sum_{c=1}^Cy_{i,c}\cdot\log{\hat{y}_{i,c}}\\ \mathcal{L}_{SCL}=\sum_{i=1}^N-\frac{1}{N_{y_i}-1}\sum_{j=1}^N 1_{i\neq j}1_{y_i=y_j}\log\frac{\exp\left(\Phi(x_i)\cdot\Phi(x_j)/\tau\right)}{\sum_{k=1}^N1_{i\neq k}\exp(\Phi(x_i)\cdot\Phi(x_k)/\tau)}
L=(1−λ)LCE+λLSCLLCE=−N1i=1∑Nc=1∑Cyi,c⋅logy^i,cLSCL=i=1∑N−Nyi−11j=1∑N1i=j1yi=yjlog∑k=1N1i=kexp(Φ(xi)⋅Φ(xk)/τ)exp(Φ(xi)⋅Φ(xj)/τ)
对于一个多分类(类别数为 C C C)问题,计算对象为一个batch的样本 { x i , y i } i = 1 , … , N \{x_i,y_i\}_{i=1,\dots,N} {xi,yi}i=1,…,N, Φ ( ⋅ ) ∈ R d \Phi(\cdot)\in \mathcal{R}^d Φ(⋅)∈Rd表示编码器生成l2标准化后的向量, N y i N_{y_i} Nyi是与 y i y_i yi类别相同的样本数, τ > 0 \tau>0 τ>0是一个温度系数, y i , c y_{i,c} yi,c表示label, y ^ i , c \hat{y}_{i,c} y^i,c表示样本 i i i预测类别 c c c的值, λ \lambda λ是一个超参数用于调节下游任务。
论文中,新增的监督对比学习的损失可以达到如下效果:
参考