表征学习就是为了学到一种data的变换使得更加容易地解决下游的任务。该领域有很长的研究历史,从经典的PCA和ICA开始,然而这些方法倾向于学到data中的low-level的variations,比如对于下游的object recognition任务就不太合适。

 简单回顾了一些contrastive learning的背景,特别是大牛LeCun于2006年就在Dimensionality Reduction by Learning an Invariant Mapping 提出了contrastive learning的想法。但对于几个关键性的工作的总结过于精炼,本着相互学习的态度,我尝试着对如下几篇文章做进一下个人小结。

N-pair loss(2016)

Improved Deep Metric Learning with Multi-class N-pair Loss Objective

需要从N个不同的类中构造N对样本,supervised

本文是基于Distance metric learning,目标也是要学到data的representation,但要求在embedding space里,要保持相似的data points之间的距离近,不相似的data points之间的距离远。其实在诸如人脸识别和图片检索的应用中,就已经使用了contrastive loss和triplet loss,但仍然存在一些问题,比如收敛慢,陷入局部最小值,相当部分原因就是因为loss function仅仅只使用了一个negative样本,在每次更新时,与其他的negative的类没有交互。早期,LeCun提出的contrastive loss只考虑输入成对的样本去train一个network去预测它们是否属于同一类,具体loss如下:

[公式]

若x_i和x_j属于同一类,y_i=y_j,则尽可能让f_i和f_j靠近;若y_i与y_j不相等,不属于同一类,则让f_i和f_j之间的距离大于或者等于margin m。

Triplet loss与contrastive loss的目的是一致的,具体做法是考虑到query样本和postive样本的比较以及query样本和negative样本之间的比较:

[公式]

该loss将促使query样本和positive样本之间的距离比query样本和negative样本之间的距离大于margin m。

上述的loss考虑的negative样本太少了,收敛慢,因此,本文提出了一个考虑多个negative样本的方法: (N+1)-tuplet loss,即从(N-1)个negative样本中区分一个positive样本,当N=2时,即是triplet loss。训练样本为 [公式] : [公式] 是一个positive样本, [公式] 是(N-1)个negative 样本。

图1. 图片来源于:Improved Deep Metric Learning with Multi-class N-pair Loss Objective

由图1 可见(蓝色代表positive样本,红色代表negative样本),Triplet loss在将positive样本拉近的同时一次只能推离一个negative样本;而(N+1)-tuplet loss基于样本之间的相似性,一次可以将(N-1)个negative样本推离。

那如何推导出(N+1)-tuplet loss的loss呢?先从N=2,即triplet loss入手,我们将上述式子中的Euclidean Distance替换为归一化之后的Cosine Distance,m=0:

[公式]

根据LogSumExp function对maximum进行的smooth近似,得出:

[公式]

将上式进一步扩展到(N-1)个negative样本,当N>2时:

[公式]

这不就是softmax + negative log likelihood嘛,如果把f当作feature vector, [公式] 和 [公式] 当作是weight vector的话,等式右边的分母是概率 [公式] 的partition function。这个(N+1)-tuplet 的partition function近似于(L+1)-tuplet,N的值越大,近似的越准确。

该loss就是大家最近讨论很多的contrastive loss,为了提高计算效率,不同的paper提出了不同的解决方案。

假如直接采用上述(N+1)-tuplet loss,Batch size 为N,则一次update就需要传递 [公式] 个样本,在很深的网络中scale the training会有问题。为了避免过大的计算量,本文提出了N-pair loss (图2)。

图2. 图片来源于:Improved Deep Metric Learning with Multi-class N-pair Loss Objective

N-pair loss其实就是重复利用了embedding vectors的计算来作为negative样本,避免了每一行都要计算新的negative样本的embedding vectors, 从而将 [公式] 的计算量降低为只需要计算图2(c)中的最左边2列,即2N。

上述这个loss真正work的关键点就是要sample很多negative samples,mini-batch不是很大该如何提升结果?由于该方法仍然用到了label信息,那能否可以unsupervised呢?

Instance discrimination(2018)

Unsupervised Feature Learning via Non-Parametric Instance Discrimination

Zhirong Wu等人的instance discrimination非常机智地引入了memory bank机制,并且真正地把这个loss用到了unsupervised learning。该论文主要论述如何通过非参数的instance discrimination进行无监督的特征学习。主要的思想是将每个单一实例都看作不同的“类”。

图3. 图片来源于:Unsupervised Feature Learning via Non-Parametric Instance Discrimination

通过CNN backbone,原始图片输入网络后输出一个经过L2标准化的128维向量,通过Non-Parametric Softmax Classifier计算每个单一样本被识别正确的概率,同时使用Memory Bank存储特征向量,通过NCE来近似估计softmax的数值减少计算复杂度,最后使用Proximal Regularization稳定训练过程的波动性。实例间的相似度直接从特征中以非参数方式计算,即:每个实例的特征存储在离散的bank中,而不是网络的权重。

因此,主要有以下三个问题需要考虑:

  • 能否仅通过特征表示表示来区分不同的instance实例。
  • 能否通过纯粹的判别学习(discriminative learning)反应样本间的相似性。
  • 将不同个例都看作不同的“类”,那这个数量将是巨大的,该如何进行处理。

Non-Parametric Softmax Classifier

采用softmax的instance-level的分类目标,假如有n个images [公式] ,即有n个类, [公式] ,它们的features [公式] 。传统的parametric的softmax可以表示为:

[公式]

其中 [公式] 是类别j的weight vector, [公式] 用来评价v与第j个instance的匹配程度。这种loss的问题是weight vector只是作为一种类的prototype,而无法对instances之间进行explicit的比较。所以本文通过替换[公式][公式],并且限制[公式],可以得到一种non-parametric的softmax函数,这样就不用训练权重参数weight vectors:

[公式][公式]是temperature参数,控制softmax的平滑程度。

非参数的softmax主要思路是每个样本特征除了可以作为特征之外,也可以起到分类器的作用。因为L2-norm之后的特征乘积本身就等于cos相似性,[公式]。学习的目标就是最大化joint probability:

[公式] ,即每一个 [公式] 越大越好,也等同于最小化negative log-likelihood:

[公式] , [公式]

使用Mermory Bank V 来存储上述的 {[公式]},在每个iteration对应修改其值[公式],在初始化时通过单位随机向量对V进行初始化。

NCE Loss

如果直接用上述的loss function去训练,会有什么问题?当类的数量n很大时,要求的计算量非常大,于是使用NCE来估算。其基本思想是将多分类问题转化为一组二分类问题,其中二分类任务是区分数据样本和噪声样本。关于对NCE loss的理解,参考 

 的回答和苏神的blog:

当我们设计一个模型来拟合数据时,经常会遇上指数族分布:

[公式]

其中分母部分是归一化常数,一个目的是用来让这个分布真的成为一个“分布”要求(分布积分=1)。很多时候,比如计算一个巨大(几十上百万词)的词表在每一个词上的概率得分的时候,计算这个分母会变得非常非常非常消耗资源。
比如一个language model最后softmax层中,在inference阶段其实只要找到argmax的那一项就够了,并不需要归一化,但在training stage,由于分母Z中是包含了模型参数的,所以也要一起参与优化,所以这个计算省不了。
而NCE做了一件很intuitive的事情:用负样本采样的方式,不计算完整的归一化项。让模型通过负样本,估算出真实样本的概率,从而在真实样本上能做得了极大似然。相当于把任务转换成了一个分类任务,然后再用类似交叉熵的方式来对模型进行优化(其实本质上是优化了两个部分:模型本身,和一个负例采样的分布和参数)。
另一方面,NCE其实证明了这种采样在负例足够多的情况下,对模型梯度优化方向和“完整计算归一化项进行优化”是一致的,这一点证明了NCE在用负采样方式解决归一化项的正确性。

Memory bank中特征表示 [公式] 对应于第 [公式] 个样例的概率为:

[公式]

[公式]

我们设定噪声分布为一个均匀分布: [公式] ,假设噪声样本的频率是数据样本的 [公式] 倍,那么样本 [公式] 及特征[公式]来自数据分布 [公式] 的后验概率为:

[公式]

训练目标为最小化 [公式]

其中, [公式] 指代真实数据分布,对[公式]而言[公式]是 [公式] 的特征; [公式] 是来自另一幅图片,从噪声分布 [公式] 中随机采样得到。注:[公式][公式]都是从Memory Bank中采样得到的。

[公式] 的计算量过大,我们把它当作常量,由Monte Carlo算法估计得到:

[公式]

{[公式]}是indices的随机子集,NCE将每个样例的计算复杂度从 [公式] 减少到 [公式] 。

最后一点是,这篇文章加入了近似正则化项[公式],来使训练过程更加平滑和稳定。

本文引入 memory bank把前一个step 学习到的instance feature存储起来,然后在下一个step把这些存储的memory去学习。效率有所提升。但是实际在优化的时候当前的instance feature 是跟outdated memory去对比的,所以学习效果还不是最优的。

MoCo (2020)

解决了一个非常重要的工程问题:如何节省内存节省时间搞到大量的negative samples?

至于文章的motivation,之前contrastive learning存在两种问题。在用online的dictionary时,也就是文章中比较的end-to-end情形,constrastive learning的性能会受制于batch size,或者说显存大小。在用offline的dictionary时,也就是文章中说的memory bank(InstDisc)情形,dictionary是由过时的模型生成的,某种程度上可以理解为supervision不干净,影响训练效果。那么很自然的,我们想要一个trade-off,兼顾dictionary的大小和质量。文章给出的解法是对模型的参数空间做moving average,相当于做一个非常平滑的update。

作者:小朱
链接:zhihu.com/question/3557
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
图4. 图片来源于:Momentum Contrast for Unsupervised Visual Representation Learning

MoCo完全专注在 Contrastive Loss 上,将这个问题想象成有一个很大的 Dictionary ,Network 的目的就是一个 Encoder 要将图片 Encode 成唯一的一把 Key ,此时要如何做到让Key Space Large and Consistent 是最重要的。

首先借鉴了instance discrimination的文章的Memory Bank ,建一个 Bank 来存下所有的 Key (或称为 Feature) 。 此方法相对把所有图塞进 Batch少用很多内存,但对于很大的 Dataset 依旧难以 Scale Up。

因此,MoCo改进了 Bank,用一个 Dynamic Queue 来取代,但是单纯这样做的话是行不通的,因为每次个 Key 会受到 Network 改变太多,Contrastive Loss 无法收敛。 因此 MoCo将种子 feature extractor 拆成两个独立的 Network: Encoder 和 Momentum Encoder。

图 5. 图片来源于:簡介 Self-Supervised Learning 的近期發展 (2018–2020)

[公式] :Encoder, [公式] :Momentum Encoder, 初始化时,它们的参数值一致。Queue里maintain着最新的K个key。

为了结合图5对文章中的Algorithm进行分析,我们假设Batch size N=1,同样的x经过不同的augmentation,encode为q和 [公式] ,它们俩为positive pair。将q与Queue中的K个key (Negative Sample )进行比较,计算 Similarity 。由此,即可按照上述的N-pair contrastive loss计算loss,并对 [公式] Encoder 更新parameters。等Encoder Update 完后,在用 Momentum Update [公式] Momentum Encoder。 并将这次的 Batch 放入到 Queue 中。

[公式]

可以看到key对应的[公式] Momentum Encoder是由query对应的[公式] Encoder 来更新的,同时受到key对应的Encoder上一次的状态(更新后的Encoder)影响。因此其更新速率,与query对应的encoder相比要慢, 能提供很稳定的 Key ,也就是 Momentum Encoder 把这个Key Space 先摆好。具体要有多慢呢?慢到Queue中最旧key依然能够反映出最新的Momentum encoder信息。所以文章给出m=0.999,要远好于m=0.9。直观的的感受就是,key对应的Momentum encoder基本不动,非常缓慢的更新,Queue中所有的key可以近似的看成由目前的Momentum encoder编码得到。

如果 [公式] 与Queue中原本的 Key比较远,如图5所示,再回想一下,MoCo本质上还是在做instance discrimination。 所以,这时的Loss较小,且主要去 Update [公式] Encoder,使得q更接近[公式] ,而Momentum Encoder更新又很缓慢,它更新后, [公式] 依然会与Queue中原本的 Key相距较远。如果 [公式] 与Queue中原本的 Key容易混淆,这时候的 Loss 较大, [公式] Encoder的更新使得q远离Queue中原本的Key,同时尽可能地距离[公式]较近,随后Momentum Encoder缓慢更新,倾向于使得[公式] 远离Queue中原本的 Key,相当于找一个比较空的区域放 [公式] , 而不影响原本的Queue中原本的 Key。但此处只是直观上的分析,缺乏严谨的理论证明。

近期,何凯明团队推出了MoCo_V2,效果相对于V1有了较大提升,但没有改变MoCo_V1的框架。

contrastive loss总结

本文主要回顾了三篇有代表性的paper,其他的像CPC, CPC V2, AMDIM也是用的类似的N-pair contrastive loss,并得出数学上面的insight, 即是maximize mutual information。 大佬

 对于contrastive loss进行了相当直观的总结:

以上这些contrastive loss的工作, 包括凯明的工作,都可以理解成你有两个variable, [公式] 和 [公式] ,并且你有一堆从相应的联合分布采集的sample [公式] ,给定一个 [公式] , 现在从y这边去选择,对应的 [公式] 就是正样本,不对应的 [公式] 就是负样本.然后对每一个这样本,我们都配对N个负样本去学习一个softmax loss.
有了这么个框架,那么instance discrimination可以把 [公式] 理解成当前的第i张图片的随机crop, [公式] 理解成过去epochs对第i张图片的smooth aggregation(或者第i张图片的另一个crop). CPC, CPCv2就可以把一个image patch理解成 [公式] , 把他的context理解成 [公式] .我们的CMC可以把一个modality,比如rgb, 理解成 [公式] ,另外一个modality,比如光流,理解成 [公式] .这个框架也启发我做了一个Knowledge Distillation的side project ("contrastive representation distillation"), 可以把teacher理解成 [公式] , 把student理解成 [公式] .同样的MoCo里面的两个encoder,也可以其中一个理解成 [公式] ,另外一个是 [公式] 。 所以有了这样的背景,就可以大概看出其中的key, query只是取的名字而已,本质只是x和y.并且大家之前已经explore很多了.我认为MoCo这篇最创新的地方,就是解决了一个非常重要但以前又没有思路的工程问题,就是怎么节省内存节省时间搞到大量的negative sample。之前的memory bank虽然机智,但是必须存下来整个数据集,空间开销O(N),所以处理不了Instagram级别的数据,这个问题困扰我很久而且我没找到有效策略,我试过跟MoCo一样用一个queue,也是存过去m个batch的sample,这个其实很容易想到,但我发现效果不好,问题就是我只有一个encoder,我没有像他一样在不断update这个encoder的同时保存一个它的历史smooth的版本。 (又跟同学学习了一下, 这个相似trick在Q-learning里面就很多被用到, 大家update Q-function的时候就是用类似的momentum去做的,看来是我学得太少)。
作者:慕容腹黑
链接:zhihu.com/question/3557
来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
图6. 图片来源于:Contrastive Multiview Coding

匿名大佬提出了自己不同的看法,我根据自己的粗略理解,归纳整理如下:

  • Mutual information是contrastive loss的一个好解,但不一定是最优解, 因为最优的判决必须要在给定约束下才有意义,但单纯从判别 positive/negative的角度,好像并不能给出最优的判据,必须附加约束,比如对判决函数构造的网络的参数的约束,以及相应约束的物理或者信息处理上的含义。
  • 与predictive learning的比较,contrastive learning考察样本的relative relationship,而不仅仅是只保证一对一的数据保持能力,毕竟学习的本质是要学到整个数据流形的特征,所以relative relationship是重要的一部分,甚至是更重要的部分。而predictive learning的核心是考察监督信息到底能重构数据空间的何种结构。
  • CMC(Contrastive Multiview Coding)本质就是在进行不同modality图像空间的registration,其配准过程是把不同modality的流形映射到各自的某个类似切空间的空间上然后在切空间之间进行配准,而这个配准不一定就是基于互信息的准则为最佳。
  • 一个很值得考察的问题:互信息可能会丢失不同modality个性化的信息,虽然可以抓住不同modality所编码的共性的信息,但是这些不同的modality specific信息对于下游的问题可能是有用的,比如在医学图像处理中,如果CT/MRI只是把共有的信息保留了,那么对于诊断任务而言,肯定会有信息丢失,从这个角度看,反而是predictive learning可能保留这些信息(不过怀疑这些信息是在嵌入空间中,还是在decoder中)。
  • 相比于强调保持个体自身信息的自编码器,MoCo更多强调不同个体之间的关系,直观上理解应该就是在嵌入空间每个个体都把其他个体尽量往外推,从而使得样本间距离在嵌入空间达到一个平衡的分布。有一些 relational theory的味道。至于具体的技术细节,比如采用 momentum更新,其实还是对系统加了阻尼,要求推起来要费点劲,增加了系统的稳定性。
  • 关键问题:是否仅仅通过要求每个个体与他人的距离尽量远这一条就可以保证得到好的嵌入呢?毕竟还是有相似的图像,按照这个方法得到的嵌入能否忠实的表达图像之间相似程度的差异?会不会因为要求距离尽量远的准则过于简单粗暴导致嵌入空间对图像间距离的扭曲? 此外,由于方法仅仅直接要求距离的分布,没有对嵌入空间对数据信息表达的完整性的要求,会不会导致丢失一些必要信息?
  • 什么表示学习,什么 self-supervise,有必要弄个新名词么?其实就是充分统计量加上复杂度约束而已,其实只要不是外界提供监督信息,其他的所有监督信息都是挖掘数据本身的某种相容性特征来构造的,没有本质的差异。
  • MoCo可以从GAN 的角度去解读,两个网络竞争, 以及嵌入到线性空间求点积,query和 key的变换网络本别是G和D,D其实是把数据映射到嵌入空间并将嵌入空间看作欧氏空间构造了对每一个样本的判决函数,G则是要尽量生成和目标样本相似的数据,然后二者博弈,并且为了GAN的收敛,二者还是要紧密关联,这里是靠所谓 momentum更新来实现的。
  • 另外,也可以从attention的角度,就是要保证要把给定的query的注意力注意到对应的key上去而尽量忽略无关的key,比如Queue中原本的key。

内容中包含的图片若涉及版权问题,请及时与我们联系删除