鱼的深度学习

对比学习(一)损失函数

2022-12-19  本文已影响0人  升不上三段的大鱼

原文博客:https://lilianweng.github.io/posts/2021-05-31-contrastive/
感谢大佬的分享。

对比表示学习的目标是学习一个嵌入空间,其中相似的样本对彼此靠近,而不同的样本对相距很远。对比学习可以应用于有监督和无监督的情况。在处理无监督数据时,对比学习是自监督学习中最强大的方法之一。

一些符号:
f_\theta:要学习的参数为\theta的网络 f
x:输入样本,锚点(anchor)
x^{+}:锚点的正样本,与锚点同类别
x^{-}:锚点的负样本,与锚点类别不同
\tau:温度参数,用于调整特征在表示空间中的集中程度,超参数
\epsilon:是一个超参数,定义了不同类别样本之间的下界距离
I:互信息:

信息论中,信息(information)是消除事件不确定性的一个量,信息熵(entropy)表示信息量,变量的不确定越大,信息熵越大,因为要搞清楚一件不确定的事情,需要的信息量很大。
信息熵的计算公式:H(X)=\sum_{x \in X} P(x)logP(x)
对于两个变量X和Y,已知Y,X的不确定性会降低,降低的程度取决于XY的相关性,即互信息(mutual information):I(X;Y)=H(X)-H(X|Y)

对比学习目标函数对比

Loss Contrastive Loss Triplet Loss Lifted Structured Loss N-pair Loss NCE infoNCE Soft-Nearest Neighbors Loss
输入形式 x,x^+(x^-) x,x^+,x^- x,x^+,x^- x,x^+,X^- _{1...N-1} x,x^+,x^- x,x^+,X^- _{1...N-1} x^+_{1...N},x^-_{1...N}

Contrastive Loss

最早的以对比方式用于深度度量学习的训练目标。

给定输入样本列表 {x_i},每个样本在 L 个类中都有对应的标签 y_i∈\{1,…,L\}。我们想学习一个函数 f_θ(.):X→R^d,它将 x_i 编码为一个特征嵌入向量,使得来自同一类的示例具有相似的特征,而来自不同类的样本具有不同的特征。因此,对比损失的输入是一对(x_i,x_j) ,并在它们来自同一类时最小化距离,来自不同类时最大化距离。
\mathcal{L}_\text{cont}(\mathbf{x}_i, \mathbf{x}_j, \theta) = \mathbb{1}[y_i=y_j] \| f_\theta(\mathbf{x}_i) - f_\theta(\mathbf{x}_j) \|^2_2 + \mathbb{1}[y_i\neq y_j]\max(0, \epsilon - \|f_\theta(\mathbf{x}_i) - f_\theta(\mathbf{x}_j)\|_2)^2

Triplet loss

最初是在 FaceNet 论文中提出的,用于学习同一个人在不同姿势和角度下的人脸识别。

Triplet loss 学习最小化 anchor x 和正 x^+ 之间的距离,同时最大化 anchor x 和负 x^− 之间的距离,公式如下:
\mathcal{L}_\text{triplet}(\mathbf{x}, \mathbf{x}^+, \mathbf{x}^-) = \sum_{\mathbf{x} \in \mathcal{X}} \max\big( 0, \|f(\mathbf{x}) - f(\mathbf{x}^+)\|^2_2 - \|f(\mathbf{x}) - f(\mathbf{x}^-)\|^2_2 + \epsilon \big)

Lifted Structured Loss

利用一个训练 batch 中的所有成对连接来提高计算效率。也就是,在计算 loss 时,同时计算 anchor 与batch 内所有负样本的 loss。


定义 D_{ij} = |f(x_i)-f(x_j)|, structured loss function 定义为
\begin{aligned} \mathcal{L}_\text{struct} &= \frac{1}{2\vert \mathcal{P} \vert} \sum_{(i,j) \in \mathcal{P}} \max(0, \mathcal{L}_\text{struct}^{(ij)})^2 \\ \text{where } \mathcal{L}_\text{struct}^{(ij)} &= D_{ij} + \color{red}{\max \big( \max_{(i,k)\in \mathcal{N}} \epsilon - D_{ik}, \max_{(j,l)\in \mathcal{N}} \epsilon - D_{jl} \big)} \end{aligned}

其中, \mathcal{P} 是正样本对集合, \mathcal{N}是负样本对集合。\max_{(i,k)\in \mathcal{N}} \epsilon - D_{ik} 也就相当于\min_{(i,k)\in \mathcal{N}} D_{ik} - \epsilon ,也就是负样本对中距离最近的一对(i,k)

那么 {\max \big( \max_{(i,k)\in \mathcal{N}} \epsilon - D_{ik}, \max_{(j,l)\in \mathcal{N}} \epsilon - D_{jl} \big)} 意思是找出 i,j 与所有负样本对中距离最小的那个,loss 的组成就包括来自同一正样本集的 ij 间的距离,和ij与所有负样本对的最小距离(的负数)。Lifted Structure Loss对于每个正样本对i和j,会考虑mini-batch中所有的negative样本。

上面的公式容易导致模型陷入较差的局部最优,于是作者使用了平滑上界函数来代替:\mathcal{L}_\text{struct}^{(ij)} = D_{ij} + \log \Big( \sum_{(i,k)\in\mathcal{N}} \exp(\epsilon - D_{ik}) + \sum_{(j,l)\in\mathcal{N}} \exp(\epsilon - D_{jl}) \Big)

N-pair Loss

在 triplet loss 里加入多个负样本
\begin{aligned} \mathcal{L}_\text{N-pair}(\mathbf{x}, \mathbf{x}^+, \{\mathbf{x}^-_i\}^{N-1}_{i=1}) &= \log\big(1 + \sum_{i=1}^{N-1} \exp(f(\mathbf{x})^\top f(\mathbf{x}^-_i) - f(\mathbf{x})^\top f(\mathbf{x}^+))\big) \\ &= -\log\frac{\exp(f(\mathbf{x})^\top f(\mathbf{x}^+))}{\exp(f(\mathbf{x})^\top f(\mathbf{x}^+)) + \sum_{i=1}^{N-1} \exp(f(\mathbf{x})^\top f(\mathbf{x}^-_i))} \end{aligned}

如果只有一个负样本,就相当于 softmax loss。

NCE

Noise Contrastive Estimation,idea是利用逻辑回归来区分目标数据和噪声。

NCE提出的场景是:在一句话中,预测一个词的下一个词,当神将网络是个多分类的分类器时,这个类别的数量会变得和词的数量一样多,会导致计算量巨大,softmax也很难计算。

为了解决这个问题,NCE将多项分类问题转换为二分类问题,分类器不是预测下一个词,而是简单地预测一对词是好是坏。

假设样本 x的分布是P(X|C=1; \theta)=p_{\theta}(x),噪声样本的分布是 P(X|C=0)=q(\tilde{x})(其他不是目标类别的样本都可以看作是噪声)。目标时通过学习一个分类器(优化θ)来区分真实数据样本和人工生成的噪声样本。

在这种情况下,我们想从目标数据分布而不是噪声分布中计算样本 u 的 logit(未归一化的概率):
\ell_\theta(\mathbf{u}) = \log \frac{p_\theta(\mathbf{u})}{q(\mathbf{u})} = \log p_\theta(\mathbf{u}) - \log q(\mathbf{u})

再加上 sigmoid,应用交叉熵损失,可以得到:
\begin{aligned} \mathcal{L}_\text{NCE} &= - \frac{1}{N} \sum_{i=1}^N \big[ \log \sigma (\ell_\theta(\mathbf{x}_i)) + \log (1 - \sigma (\ell_\theta(\tilde{\mathbf{x}}_i))) \big] \\ \text{ where }\sigma(\ell) &= \frac{1}{1 + \exp(-\ell)} = \frac{p_\theta}{p_\theta + q} \end{aligned}

其他参考:
https://www.zhihu.com/question/50043438

InfoNCE

受 NCE 的启发,使用分类交叉熵损失来识别一组不相关的噪声样本中的正样本。

给定上下文向量 c,正样本从条件分布 p(x|c) 中抽取,而N-1 个负样本从则从独立于语境c的提议分布p(x)中抽取。为了简洁起见,将所有样本标记为X=\{x_i\}_{i=1}^N 其中只有一个x_pos是正样本。

我们正确检测到正样本的概率是
p(C=\texttt{pos} \vert X, \mathbf{c}) = \frac{p(x_\texttt{pos} \vert \mathbf{c}) \prod_{i=1,\dots,N; i \neq \texttt{pos}} p(\mathbf{x}_i)}{\sum_{j=1}^N \big[ p(\mathbf{x}_j \vert \mathbf{c}) \prod_{i=1,\dots,N; i \neq j} p(\mathbf{x}_i) \big]} = \frac{ \frac{p(\mathbf{x}_\texttt{pos}\vert c)}{p(\mathbf{x}_\texttt{pos})} }{ \sum_{j=1}^N \frac{p(\mathbf{x}_j\vert \mathbf{c})}{p(\mathbf{x}_j)} } = \frac{f(\mathbf{x}_\texttt{pos}, \mathbf{c})}{ \sum_{j=1}^N f(\mathbf{x}_j, \mathbf{c}) }

InfoNCE损失优化了对正样本进行正确分类的负对数概率:
\mathcal{L}_\text{InfoNCE} = - \mathbb{E} \Big[\log \frac{f(\mathbf{x}, \mathbf{c})}{\sum_{\mathbf{x}' \in X} f(\mathbf{x}', \mathbf{c})} \Big]

f(x,c)估计的是密度比\frac{p(x|c)}{p(x)},与互信息优化有关系。为了使输入x和上下文向量c之间的相互信息最大化,我们有:
I(\mathbf{x}; \mathbf{c}) = \sum_{\mathbf{x}, \mathbf{c}} p(\mathbf{x}, \mathbf{c}) \log\frac{p(\mathbf{x}, \mathbf{c})}{p(\mathbf{x})p(\mathbf{c})} = \sum_{\mathbf{x}, \mathbf{c}} p(\mathbf{x}, \mathbf{c})\log\color{blue}{\frac{p(\mathbf{x}|\mathbf{c})}{p(\mathbf{x})}}

,其中蓝色的对数项由f估计。

Soft-Nearest Neighbors Loss

拓展到了多个正样本。

函数f(.,.) 用于测量两个输入之间的相似性:
\mathcal{L}_\text{snn} = -\frac{1}{B}\sum_{i=1}^B \log \frac{\sum_{i\neq j, y_i = y_j, j=1,\dots,B} \exp(- f(\mathbf{x}_i, \mathbf{x}_j) / \tau)}{\sum_{i\neq k, k=1,\dots,B} \exp(- f(\mathbf{x}_i, \mathbf{x}_k) /\tau)}

温度τ用于调整特征在表示空间中的集中程度。例如,当温度较低时,损失由小距离主导,相隔甚远的表征不能做出很大贡献,变得无关紧要。

Supervised Contrastive Learning

让同一类别的归一化嵌入比不同类别的嵌入更接近。

\mathcal{L}_\text{supcon} = - \sum_{i=1}^{2n} \frac{1}{2 \vert N_i \vert - 1} \sum_{j \in N(y_i), j \neq i} \log \frac{\exp(\mathbf{z}_i \cdot \mathbf{z}_j / \tau)}{\sum_{k \in I, k \neq i}\exp({\mathbf{z}_i \cdot \mathbf{z}_k / \tau})}

根据实验,Supervised Contrastive Learning:

论文笔记:论文笔记-Supervised Contrastive Learning

上一篇下一篇

猜你喜欢

热点阅读