---
# System prepended metadata

title: 讨论 2021-11-04
tags: [Fudan, '2021', tutorials]

---

讨论 2021-11-04
=
###### tags: `tutorials` `Fudan` `2021`
# 对比学习

对比学习指的是通过让模型区分和不区分样本对来进行学习的。与平时常用的最大似然估计，交叉熵等误差函数不同，对比学习总归需要两个或以上的样本进行学习。其实其他方法也可以看做是对label进行对比学习，只不过对比学习更强调区分样本。

参考 https://davidmeyer.github.io/ml/nce.pdf

![](https://i.imgur.com/3V8PXHC.png)
![](https://i.imgur.com/gTsclCa.png)
![](https://i.imgur.com/kV522yi.png)
到这一步，其实对比学习的主要问题就描述清楚了，之后如何建模，其实有多样的选择。原始NCE采用了如下的方案，但其实对比学习有众多不同的策略。
![](https://i.imgur.com/VxXx4W9.png)
![](https://i.imgur.com/zUK409e.png)



### 三种形式
目前有三种常见的对比学习误差函数，他们思想类似，但具体性质其实是有一定区别的，我们下面简单讨论一下。

\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是最有指导价值的。
![](https://i.imgur.com/f8as44g.png)


