对比学习的思想是去 拉近相似的样本,推开不相似的样本,而目标是要 从样本中学习到一个好的语义表示空间。

自监督对比学习

自监督对比学习是将样本“照镜子”,转为有监督任务。

以图像领域提取图片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)∣−1​p∈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)∣1​p∈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​+λLSCL​LCE​=−N1​i=1∑N​c=1∑C​yi,c​⋅logy^​i,c​LSCL​=i=1∑N​−Nyi​​−11​j=1∑N​1i​=j​1yi​=yj​​log∑k=1N​1i​=k​exp(Φ(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 λ是一个超参数用于调节下游任务。

论文中,新增的监督对比学习的损失可以达到如下效果:
在这里插入图片描述

参考

有监督对比学习:Supervised Contrastive Learning

超细节的对比学习和SimCSE知识点

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐