softmax + NCE + infoNCE

softmax

下面是softmax的公式:
y ^ + = softmax ⁡ ( z + ) = exp ⁡ ( z + ) ∑ i = 0 k exp ⁡ ( z i ) (1) \hat{y}_{+}=\operatorname{softmax}(z+)=\frac{\exp (z+)}{\sum_{i=0}^k \exp \left(z_i\right)} \quad \tag{1} y^+=softmax(z+)=i=0kexp(zi)exp(z+)(1)

交叉熵损失函数如下:
L ( y ^ ) = − ∑ i ∈ K y i log ⁡ ( y ^ i ) (2) L(\hat{y})=-\sum_{i \in K} y_i \log \left(\hat{y}_i\right)\quad \tag{2} L(y^)=iKyilog(y^i)(2)

在有监督的学习中,标签是一个one-hot向量,将softmax出来的结果取 − log ⁡ -\log log,再和标签想成,即得到如下交叉熵损失:
− log ⁡ exp ⁡ ( z + ) ∑ i = 0 k exp ⁡ ( z i ) (3) -\log \frac{\exp (z+)}{\sum_{i=0}^k \exp \left(z_i\right)}\quad \tag{3} logi=0kexp(zi)exp(z+)(3)
上面的 k k k在有监督学习里指的是这个数据集一共有多少类别,比如cifar-10数据集,则k=9;ImageNet数据集有1000类,则k=999。

对于ImageNet数据集来说,此数据集有128万张图片,我们使用数据增强手段(比如,随机裁剪,随机颜色失真,随机高斯模糊)来产生对比学习正样本对,每张图片就是单独的一类,那$k$就是128万类,而不是1000类了, 有多少张图就有多少类。

对于对比学习来说,理论上也可以用上面的公式去计算loss,但实际上是行不通的。为什么?

因为每张图只和自己增强的图算正样本对。
在使用对比学习的方法时,尤其是当采用如ImageNet这类大规模数据集时,每张图片会与其经过数据增强后生成的图像形成正样本对。这意味着每张图片实际上会在特征空间中与其增强版本形成一个正样本对,而与其他所有图片生成的特征表示会成为负样本对。
具体分析

  1. 正样本对
  • 对于每张原始图片 x i x_i xi,我们通过各种数据增强手段(如随机裁剪、颜色失真、模糊等)生成多个增强图像。例如,如果我们对每张图片生成两张增强图像,那么每张图片 x i x_i xi 会形成三个图像之间的正样本对:原始图像和两个增强图像。
  1. 负样本对
  • 每张图片的增强图像会与数据集中其他图片的特征表示形成负样本对。这意味着,如果数据集中有 N N N 张图片,那么每张图片的增强版本会与其他 N − 1 N-1 N1 张图片的增强版本形成负样本对。
  1. 类别数
  • 在这种对比学习的框架下,每张图片及其增强版本被视为一个单独的类别。因此,对于ImageNet数据集中的128万张图片,类别数 k k k 实际上是128万,而不是数据集中原始的1000类。这是因为在对比学习的上下文中,每张图片及其增强版本被视为一个类别,这种方法利用了所有图像之间的对比信息。
    损失函数中的类别数
    在 InfoNCE 损失函数中:
    L InfoNCE = − 1 N ∑ i = 1 N log ⁡ exp ⁡ ( sim ( z i , z i + ) ) exp ⁡ ( sim ( z i , z i + ) ) + ∑ j = 1 K exp ⁡ ( sim ( z i , z j − ) ) (4) \mathcal{L}_{\text{InfoNCE}} = -\frac{1}{N} \sum_{i=1}^{N} \log \frac{\exp(\text{sim}(z_i, z_i^+))}{\exp(\text{sim}(z_i, z_i^+)) + \sum_{j=1}^{K} \exp(\text{sim}(z_i, z_j^-))}\quad \tag{4} LInfoNCE=N1i=1Nlogexp(sim(zi,zi+))+j=1Kexp(sim(zi,zj))exp(sim(zi,zi+))(4)
  • N N N 是正样本对的数量。
  • K K K 是负样本对的数量。在这种情况下, K = N − 1 K = N - 1 K=N1,因为每张图片会与其他所有 N − 1 N-1 N1 张图片形成负样本对。
    总结
    在对比学习的设置中,每张图片和它的多个增强版本形成正样本对。每张图片因此被视为一个单独的类别,所以在特征空间中,总的类别数等于图像的数量。在ImageNet数据集中,类别数就是128万,而不是原始的1000类。

那为什么要这样设置呢?为什么要设置“每张图片和它的多个增强版本形成正样本对”而不是同一类的都算正样本对呢?

  1. 无监督学习的效果
    在无监督学习中,尤其是对比学习的场景中,我们通常没有类标签来明确区分样本之间的相似性。通过对每张图片及其增强版本形成正样本对,模型可以学习到同一图像在不同变换下的表示是一致的。这种方式不依赖于人工标签,只需利用数据增强来生成正样本对,这样可以在没有标签的情况下训练出有效的特征表示。
  2. 对比学习的核心思想
    对比学习的核心思想是通过对比来学习特征表示。正样本对的设计是为了让模型在特征空间中将相似的图像(即同一个图像的不同增强版本)拉近距离,而将不相似的图像(即负样本对)推远距离。这种设计使得模型能够学到一个有用的嵌入空间,使得同一物体的不同视角或变换后的图像更接近,而不同物体的图像则距离更远。

总的来说就是,对比学习,它本来发明这个方法的初衷就是为了解决无监督学习,也就是在没有标签的情况下怎么学习特征空间,所以,“设置 每张图片和它的多个增强版本形成正样本对而不是同一类的都算正样本对

那为啥不利用标签信息,将同一类的都算正样本对呢?而不是单纯设置“每张图片和它的多个增强版本形成正样本对”
这是一个很好的问题。使用标签信息将同一类的图片作为正样本对,而不是仅依靠图像的多个增强版本来形成正样本对,确实是一个值得考虑的策略。下面是一些可能的原因和考虑:

  1. 标签噪声和不一致性
    在实际应用中,标签可能存在噪声或不一致的情况。如果依赖标签信息将同一类的图片视为正样本对,可能会因为标签错误或标注不一致而引入噪声,从而影响模型的训练效果。相比之下,通过图像增强生成的正样本对可以减少这些问题,因为增强变换是在同一图像上进行的,不受标签噪声的影响。
  2. 增强变换的鲁棒性
    数据增强技术(如旋转、缩放、裁剪等)能够生成具有相似语义但视觉上不同的图像,这有助于模型学习到在不同条件下保持稳定的特征。如果只依赖标签信息,可能会忽略这些在实际应用中重要的变换。通过将图像的增强版本作为正样本对,模型可以学习到图像在不同变换下的稳定特征,从而提高对实际变换的鲁棒性。
  3. 大规模数据集的处理
    在处理大规模数据集(如ImageNet)时,将每张图像及其增强版本作为正样本对可以大大简化数据处理过程。这种方法不需要额外的标签处理或对齐,可以直接利用增强技术生成正样本对,这使得训练过程更加高效和可扩展。
  4. 减少计算和存储开销
    利用标签信息将同一类的图片视为正样本对需要维护和处理更多的标签信息,同时计算每一对样本的相似性也会增加开销。相反,使用增强版本生成正样本对可以减少计算和存储开销,因为每个图像的增强版本自动形成正样本对,不需要额外的标签处理。
  5. 简单且有效的训练策略
    将每张图片及其多个增强版本作为正样本对是一种简单而有效的策略。这种方法充分利用了对比学习的优势,同时避免了复杂的标签处理和可能的标签噪声问题。在实际应用中,这种方法往往能取得很好的效果,并且易于实现。
  6. 总结
    虽然利用标签信息将同一类的图片作为正样本对是一个合理的策略,但依赖图像的多个增强版本来生成正样本对可以减少标签噪声和处理复杂性,增强模型的鲁棒性,并简化训练过程。这种方法在实际应用中被广泛使用,并且效果证明了它的有效性。

但是softmax操作在如此多类别上进行计算是非常耗时的,再加上有指数运算的操作,当向量的维度是几百万的时候,计算复杂度是相当高的。所以对比学习用上述公式(3)计算loss的话是行不通的。

那咋办呢?NCE loss可以解决此问题。

NCE(noise contrastive estimation)

NCE核心思想是将多分类问题转化为二分类问题,一个类是数据类别data sample, 另一个类是噪声类别noise sample, 通过学习数据样本和噪声样本之间的区别,将数据样本去和噪声样本做对比,也就是噪声对比(noise contrastive),从而发现数据中的一些特性。但是,如果把整个数据集剩下的数据都当做负样本(即噪声样本),虽然解决了类别多的问题,计算复杂度还是没有解决下来,解决办法就是做负样本采样来计算loss,这个就是estimation的含义,也就是说它只是估计和近似。一般来说,负样本选取的越多,就越接近整个数据集,效果自然会更好。

NCE loss常用在NLP模型,公式如下:
L N C E k M C = ∑ w , c ∈ D ( log ⁡ p ( D = 1 ∣ c , w ) + k × ∑ i = 1 , w ˉ ∼ q k 1 k × log ⁡ p ( D = 0 ∣ c , w ˉ ) ) = ∑ ( w , c ) ∈ D ( log ⁡ p ( D = 1 ∣ c , w ) + ∑ i = 1 , w ˉ ∼ q k log ⁡ p ( D = 0 ∣ c , w ˉ ) ) \begin{align*} \mathcal{L}_{NCE_{k}}^{MC}&=\sum_{w,c\in\mathcal{D}}\left( \log p(D=1|c, w)+ k \times \sum_{i=1,\bar{w}\sim q}^{k}\frac{1}{k}\times \log p(D=0|c, \bar{w})\right)\\ &=\sum_{(w,c)\in\mathcal{D}}\left( \log p(D=1|c,w) + \sum_{i=1, \bar{w}\sim q}^{k}\log p(D=0|c, \bar{w})\right)\quad\tag{5} \end{align*} LNCEkMC=w,cD(logp(D=1∣c,w)+k×i=1,wˉqkk1×logp(D=0∣c,wˉ))=(w,c)D(logp(D=1∣c,w)+i=1,wˉqklogp(D=0∣c,wˉ))(5)
上述公式详解见此论文NCE loss

有了NCE loss,为什么还要用info NCE loss呢?

InfoNCE

InfoNCE loss是NCE的一个简单变体,它认为如果你只把问题看做是一个二分类,只有数据样本和噪声样本的话,可能对模型学习不友好,因为很多噪声样本可能本就不是一个类,因此还是把它看成一个多酚类问题比较合理(但这里的多分类 k k k 指代的是负采样之后负样本的数量,下面会解释)。于是就有了infoNCE loss,公式如下:

L q = − log ⁡ exp ⁡ ( q ⋅ k + / τ ) ∑ i = 0 k exp ⁡ ( q ⋅ k i / τ ) ) (6) L_q=-\log \frac{\exp \left(q \cdot k_{+} / \tau\right)}{\left.\sum_{i=0}^k \exp \left(q \cdot k_i / \tau\right)\right)}\tag{6} Lq=logi=0kexp(qki/τ))exp(qk+/τ)(6)
公式6中, q , k q, k q,k是模型出来的logits, 相当于公式1中softmax里面的 z z z, τ \tau τ是一个温度超参数, 是一个标量,假设我们忽略 τ \tau τ, 那infoNCE loss其实就是Cross Entropy Loss.唯一的区别就是,在cross entropy loss里, k k k 指代的是数据集里类别的数量,而在对比学习infoNCE loss里,这里 k k k 指的是负样本的数量。
公式6中sum是在1个正样本和 k k k个负样本上做的,从0到k,所以一共 k + 1 k+1 k+1个样本,也就是字典里所有的key。何凯明在MoCo里提到,InfoNCE loss其实就是一个cross entropy loss, 做的是一个 k + 1 k+1 k+1 类的分类任务,目的就是把 q q q这个图片分到 k + k_{+} k+这个类里面去。

看下图中MoCo的伪代码,MoCo 这个loss的实现就是基于cross entropy loss。

在这里插入图片描述

温度系数 τ \tau τ的作用

温度系数 τ \tau τ虽然只是一个超参数,但它的设置是非常讲究的,直接影响了模型的效果。公式6里面的 q , k q, k q,k相当于是logits, 温度系数可以用来控制 logits 的分布形状。对于既定的logits分布的形状,当 τ \tau τ变大,则 1 τ \frac{1}{\tau} τ1就变小, q . k / τ q . k/\tau q.k/τ则会使原来logit分布里的数值都变小,且经过指数运算之后,就变得更小了,导致原来的logits分布变得更平滑。相反,如果 τ \tau τ取值小,则 1 τ \frac{1}{\tau} τ1就变大,原来的logits分布里的数值就相应的变大,经过指数运算之后,就变得更大,使得这个分布变得更集中,更peak。

如果温度系数设的越大,logits分布变得越平滑,那么对比损失就会对所有的负样本一视同仁,导致模型学习没有轻重。如果温度系数设的过小,则模型会越关注特别困难的负样本,但其实那些负样本很可能是潜在的正样本,这样会导致模型很难收敛活着泛化能力差。

总之,温度系数的作用就是它控制了模型对负样本的区分度。

InfoNCE和NCE的联系

InfoNCE 和 NCE 是两个在机器学习中相关但有所区别的损失函数。它们都属于对比学习(Contrastive Learning)的一部分,用于在无监督或自监督学习任务中学习表征。它们的主要区别在于应用场景和理论基础。

1. NCE(Noise Contrastive Estimation)

NCE(噪声对比估计)最早由 Gutmann 和 Hyvärinen 在 2010 年提出,最初的目的是用于将概率密度估计问题转换为分类问题,简化了无监督学习中的难度。NCE 的核心思想是将真实的数据与噪声数据进行区分,模型的目标是通过对比真实样本和噪声样本,学习到数据的分布。

具体来说,NCE 通过引入噪声分布,将概率密度估计问题转化为一个二分类问题:给定一个样本,它来自于真实数据分布的概率多大,或者它来自于噪声分布的概率多大。通过训练模型进行这个区分,NCE 能够有效估计出目标数据分布。

NCE 在很多任务中被应用,比如词向量训练中的 Word2Vec Skip-gram 模型,就是通过 NCE 训练的。

2. InfoNCE

InfoNCE 是 NCE 的一种改进或变体,主要用于对比学习(Contrastive Learning)中。它的名字中的 “Info” 指的是信息理论中的“互信息”(Mutual Information),也就是在学习过程中最大化互信息。InfoNCE 通常用于自监督学习任务,特别是在表征学习(Representation Learning)中,用来学习不同样本或数据片段之间的相似性。

InfoNCE 的目标是在给定一个正样本和一组负样本的情况下,最大化正样本和查询样本之间的相似性,同时最小化查询样本与负样本的相似性。具体来说,InfoNCE 会将正样本视为从相同分布中提取的样本,而负样本则被视为噪声数据。通过最大化正样本的得分与负样本得分的对比差异,模型能够学习到更好的数据表征。

一个经典的应用是 SimCLRMoCo 等自监督学习模型,它们都基于 InfoNCE 损失函数,用于在无监督或自监督的情况下训练视觉表征。

InfoNCE 与 NCE 的区别

  • 应用场景:NCE 通常用于概率密度估计问题,将它转化为二分类问题;而 InfoNCE 更多用于对比学习,用于学习不同样本之间的相似性表征。
  • 损失函数设计:InfoNCE 是基于信息理论的概念,特别是最大化互信息,而 NCE 主要是通过引入噪声对比分布来估计概率。
  • 目标不同:NCE 的目标是估计一个数据分布,而 InfoNCE 的目标是学习表示,通过最大化相似样本的得分与非相似样本的对比。

3. 总结

InfoNCE 是从 NCE 派生出来的一种特殊形式,主要用于对比学习中的表征学习任务,而 NCE 本质上是一个用于概率密度估计的技术。InfoNCE 的 “Info” 代表互信息的最大化,这也是它与传统 NCE 的核心区别之一。

InfoNCE的info的含义

“InfoNCE 是 NCE 的一种改进或变体,主要用于对比学习(Contrastive Learning)中。它的名字中的 "Info" 指的是信息理论中的“互信息”(Mutual Information),也就是在学习过程中最大化互信息。”写出来infoNCE的公式来具体说明,为啥和互信息有关系?

InfoNCE 损失与互信息(Mutual Information, MI)的关系可以通过其公式来解释。在对比学习的背景下,InfoNCE 是为了通过最大化正样本与查询样本之间的相似性,来隐式地最大化互信息。我们先介绍 InfoNCE 的公式,并再解释其如何关联到互信息。

1. InfoNCE 损失函数公式

给定一个查询样本 q q q 和一组样本对,包含一个正样本 + ^+ + N N N 个负样本 x 1 − , x 2 − , … , x N − x_1^-, x_2^-, \dots, x_N^- x1,x2,,xN,InfoNCE 损失可以写成如下形式:

L InfoNCE = − log ⁡ exp ⁡ ( sim ( q , x + ) ) ∑ i = 0 N exp ⁡ ( sim ( q , x i ) ) \mathcal{L}_{\text{InfoNCE}} = - \log \frac{\exp(\text{sim}(q, x^+))}{\sum_{i=0}^N \exp(\text{sim}(q, x_i))} LInfoNCE=logi=0Nexp(sim(q,xi))exp(sim(q,x+))

其中:

  • sim ( q , x ) \text{sim}(q, x) sim(q,x) 表示查询样本 q q q 和样本 x x x 之间的相似度(通常为内积或余弦相似度)。
  • x + x^+ x+ 是查询样本 q q q 的正样本(通常是来自相同分布或同一数据的不同视角)。
  • x 1 − , x 2 − , … , x N − x_1^-, x_2^-, \dots, x_N^- x1,x2,,xN 是负样本集,即从其他数据中抽取的样本。

目标是最小化该损失,也就是最大化查询样本 q q q 与正样本 x + x^+ x+ 之间的相似度,同时减少与负样本的相似度。

2. InfoNCE 与互信息的关系

互信息 I ( X ; Y ) I(X; Y) I(X;Y) 是用来度量两个随机变量 X X X Y Y Y 之间共享的信息量。InfoNCE 通过对比正样本和负样本,隐式地在最大化样本之间的互信息。接下来用互信息的定义来解释这一点。

(1) 互信息的公式

信息熵+互信息(信息增益)的介绍
互信息 I ( X ; Y ) I(X; Y) I(X;Y) 可以定义为联合分布和边缘分布之间的差异:

I ( X ; Y ) = E p ( x , y ) [ log ⁡ p ( x , y ) p ( x ) p ( y ) ] I(X; Y) = \mathbb{E}_{p(x, y)} \left[ \log \frac{p(x, y)}{p(x)p(y)} \right] I(X;Y)=Ep(x,y)[logp(x)p(y)p(x,y)]

这意味着我们希望找到一种表征,使得正样本对(在相同分布中采样的 q q q x + x^+ x+)的联合概率尽可能大,而负样本对的联合概率尽可能小。

(2) 连接 InfoNCE 和互信息

InfoNCE 的损失公式通过对比正样本和负样本,可以看作是在最大化如下的目标:

log ⁡ p ( x + , q ) p ( x + ) p ( q ) \log \frac{p(x^+, q)}{p(x^+) p(q)} logp(x+)p(q)p(x+,q)

即,我们希望查询样本 q q q 和正样本 x + x^+ x+ 之间的联合概率比它们各自的边缘概率更大。这个目标与互信息的定义是一致的——最大化正样本对之间的互信息(共享的信息量)。

具体来说:

  • 正样本 x + x^+ x+ 和查询样本 q q q 是从相同的分布中提取的,因此它们应该具有高的相似度,最大化它们之间的互信息有助于模型学习到数据的内在结构。
  • 负样本则被视为噪声,因此模型通过对比学习来降低负样本的相似性,这在一定程度上相当于降低负样本对之间的“互信息”。
(3) 数学推导

实际上,InfoNCE 损失可以视为互信息的一个下界。根据Mutual Information Neural Estimation (MINE) 的工作,InfoNCE 通过最大化一个近似的对比下界来学习互信息。我们将 InfoNCE 损失进行变形:

L InfoNCE = − E [ log ⁡ p ( x + , q ) p ( x + ) p ( q ) ] + constant terms \mathcal{L}_{\text{InfoNCE}} = - \mathbb{E} \left[ \log \frac{p(x^+, q)}{p(x^+) p(q)} \right] + \text{constant terms} LInfoNCE=E[logp(x+)p(q)p(x+,q)]+constant terms

这和互信息的公式非常接近,原因看这篇文章,只是 InfoNCE 通过对比学习的方式,对正样本对最大化联合概率 p ( x + , q ) p(x^+, q) p(x+,q),而负样本对最小化联合概率。

3. 总结

InfoNCE 通过对比正样本和负样本,隐式地最大化了正样本对之间的互信息。它的损失形式在最大化相似样本的联合概率时,类似于在最大化样本间的互信息。虽然 InfoNCE 的原始形式没有直接提及互信息,但它的作用可以被解释为在对比学习中通过最大化互信息来学习有效的表征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值