讨论 2021-11-04
=
###### tags: `tutorials` `Fudan` `2021`
# 对比学习
对比学习指的是通过让模型区分和不区分样本对来进行学习的。与平时常用的最大似然估计,交叉熵等误差函数不同,对比学习总归需要两个或以上的样本进行学习。其实其他方法也可以看做是对label进行对比学习,只不过对比学习更强调区分样本。
参考 https://davidmeyer.github.io/ml/nce.pdf



到这一步,其实对比学习的主要问题就描述清楚了,之后如何建模,其实有多样的选择。原始NCE采用了如下的方案,但其实对比学习有众多不同的策略。


### 三种形式
目前有三种常见的对比学习误差函数,他们思想类似,但具体性质其实是有一定区别的,我们下面简单讨论一下。
\begin{gather}
L = - \{ \ln [\sigma(\text{sim}(z_i,z_j)) ] + \sum_{k\neq j} \ln [1-\sigma(\text{sim}(z_i,z_k))] \} \\
L= - \{\ln \frac{\exp(\text{sim}(z_i,z_j))}{\sum_k \exp(\text{sum}(z_i,z_k))} \} \\
L = - \max(m+\frac{1}{K} \sum_{k\neq j} \text{sim}(z_i,z_k) - \text{sim}(z_i,z_j), 0)
\end{gather}
首先第一种最接近原始的对比学习,好处是这个函数本身不需要考虑概率的归一化问题(因为log把归一化引子分离了)。同时,他也是最直接体现对比的,对相似的直接提高其概率似然度,对反例,直接减小。
第二种方法目前最流行,严格来说,他不算对比,因为他少了对负样本对的惩罚项。但由于负样本成为了归一化项,所以会受到间接惩罚。与第一种的最大区别是负样本对和正样本对不再平等。
第三种更直接,但缺点是不考虑归一化,也不考虑空间的局部性质差异(不存在静态的,同时很好的m)。
https://arxiv.org/pdf/2002.05709.pdf
### 对比学习是一种度量学习
考虑下图,红色蓝色代表标签,圆形代表数据点,方形代表未采集到的样本。对比学习其实就是拉扯空间,让同类点离得更近,不同类点离得更远,并且图中两条线段是最需要拉远和最需要拉近的,他们产生的loss是最有指导价值的。
