InfoNCE 损失
这里:
这个损失到底在做什么
可以把 InfoNCE 想成一道“单选题”。
给定一个
它要求模型给“正确答案”最高分。 分数高了以后,softmax 算出来的“正确答案概率”就会更大;这个概率越大,损失就越小。
所以它本质上就是一个“在一堆候选里把正确项分出来”的多分类交叉熵。原始 CPC 论文也明确把它解释成 categorical cross-entropy:模型要正确识别哪一个样本是正样本。
公式
先定义:
那么 softmax 概率就是:
其中,正样本对应的概率是:
于是损失就变成:
这三步可以这样理解:
分子只看“正确答案”的分数。 分母看“所有候选”的总分。 两者一除,就得到“模型认为正确答案有多大概率是对的”。
所以:
- 如果模型真的把正样本和 query 配得很近,那么
会接近 1,损失会很小。 - 如果模型把负样本错当成更像的候选,那么
会变小,损失就会变大。
一个很小的数字例子
假设某个 query 有 3 个候选,分数分别是:
- 正样本:3
- 负样本 1:1
- 负样本 2:0
并且先取
那么:
于是损失是:
这个值很小,说明模型分得不错。
如果反过来,正样本分数只有 1,某个负样本分数是 3,那就会变成:
于是:
这个值就很大,说明模型分错得比较明显。
所以你会发现,InfoNCE 并不关心“分数绝对有多大”,它真正关心的是:
正样本的分数,是否比其他候选更大。
温度
当
CLIP 论文里也专门把这个温度作为一个会影响 logits 范围的量,并且不是手工固定,而是直接学习一个可训练的缩放参数。
“拉近正样本、推远负样本”
令
那么有:
对负样本
这组式子的意思其实很直白:
对正样本来说,梯度会把它的分数往上推; 对负样本来说,梯度会把它们的分数往下压。
而且,哪个负样本当前更“像正样本”,也就是哪个
如果相似度是点积
即:
query 会被拉向正样本,同时被推离那些高相似度的负样本。
在 CLIP 里怎么用
CLIP 不是只做“图像去找文本”,而是同时做两个方向:
- image
text - text
image
具体来说,给定一个 batch 的
常见写法可以记成:
其中
然后分别做两个方向的损失:
最后取平均:
所以对 CLIP 来说,一个 batch 内所有图像都要找到正确文本,所有文本也都要找到正确图像。
在 DPR 里怎么用
给定一个问题
- 一个正文档
- 若干负文档
DPR 论文直接把损失写成:
而且 DPR 里常用的相似度就是 inner product。论文还明确讨论了 in-batch negatives:也就是一个 batch 里别的问题对应的正 passage,可以拿来当当前问题的负样本。
所以 DPR 可以一句话记成:
给问题一个向量,给文档一个向量,让正确文档的分数在 softmax 里尽量最大。
更深一层:为什么它叫 “InfoNCE”
从论文历史上说,InfoNCE 这个名字来自 CPC。CPC 不只是把它当成一个排序损失,还给了它一个信息论视角:在一定条件下,最优打分函数对应一个密度比,而且这个损失可以给 mutual information 提供下界。原论文写成:
这说明:当 InfoNCE 变小的时候,模型保留下来的“有用共享信息”会变多。
一句话记忆
InfoNCE 就是“把正确配对当成正确类别”的 softmax 交叉熵。
再直白一点:
让 query 更像正样本,不像负样本。