其他分享
首页 > 其他分享> > Unsupervised Learning | 对比学习——MoCo

Unsupervised Learning | 对比学习——MoCo

作者:互联网

文章目录


在这里插入图片描述
paper:Momentum Contrast for Unsupervised Visual Representation Learning
Code:https://github.com/facebookresearch/moco


Abstrcat

MoCo从对比学习的角度出发,构建了一个包含队列和移动平均编码器的动态字典。这使得能够即时构建一个大型的、一致的字典,从而促进对比无监督学习。贡献如下:

亮点:在分类、检测和语义分割等cv任务证明无监督学习也不比有监督学习差,其中的分类还是做的是Linear protocol测试,就是冻结主干网络的参数,然后只微调最后的分类的全连接层,相当于把backbone当作是一个特征提取器,可以证明backbone学习图片特征的好坏。

1. Introduction


paper将一系列的对比学习方法归纳为一个字典查询的问题building dynamic dictionaries。将负样本图片通过编码器后所得的输出看成是一个特征key,将正样本图片通过另外一个编码器所得到的输出看成是一个query。对比学习本质上,就是希望在字典中找到与query最匹配的那个key,而这个key是正样本通过一些列的数据增强变化获得,所以语义信息应该相同,在特征空间上也应该类似,而与其他的负样本的特征key应该尽可能的远离。整个学习的过程变成了一个对比学习的框架,从而只需要最小化一个对比学习的目标函数就可以。
在这里插入图片描述
从动态字典的角度看对比学习,字典应该满足大且保持一致性两个特征。

现有的对比学习方法某有上面两个问题的限制,所以MoCo提出了动量编码器Momentum Encoder来解决这个问题。

MoCo中代理任务的选择是instance discrimination,因为其比较简单而且效果也比较好。但是MoCo建立模型比较灵活,可以和很多个代理任务一起使用。

无监督学习本来的目的就是在一个很大的无标注的数据集上进行训练,使得模型学习到的特征可以很好的迁移到下游任务上,MoCo做到了。MoCo用 instance discrimination在ImageNet对下游任务进行无监督预训练可以与用其进行有监督预训练打个平手,或者有更好的表现。其在七个计算机视觉任务中表现得不错,部分甚至超越了ImageNet有监督训练的结果。而且,MoCo在更大数量级上进行训练,在性能上还有提升。这满足了无监督学习的期待,更多的数据,更大的模型来实现更强的性能。

MoCo的效果也说明,之前使用ImageNet来做有监督预训练的模型可以考虑用其的无监督预训练模型来替换掉。所用的应用,都可以用MoCo无监督的训练方式训练好的模型,说不定效果更好。

2. Related Work


无监督或者是自监督的学习方法一般包括两个方面:代理任务pretext task、损失函数loss function。其中,pretext task一般指大家不太感兴趣的有实际应用场景的任务(分类,分割,检测),代理任务的提出主要是为了学习一个比较好的特征。损失函数通常可以独立于代理任务进行研究,MoCo侧重于损失函数方面。

2.1 Loss functions

2.2 Pretext tasks

代理任务发展得多种多样:

2.3 Contrastive learning & pretext task

不同的代理任务是可以和某种形式的对比学习的目标函数配对使用的。

2.4 Unsupervised or Supervised

与有监督学习工作的对比,有监督学习的整个流程是,现在有一个输入x,然后通过一个模型得到一个y,也就是输出,然后将输出与ground truth进行比较,然后需要一个目标函数去衡量这个比较的结果,这个就是有监督学习的流程。

而对于无监督或者是自监督来说,缺少的就是这个标签ground truth,代理任务的用去就是去生成一个自监督的信号,从而去充当这个ground truth这个标签的信息。那么现在有输出也有一个伪标签信息,就需要一个目标函数衡量差异。

所以,整个流程下来,有监督与无监督的区别,就是使用了特别的代理任务已经去衡量输出与伪标签差异的损失函数。

3. MoCo Method


3.1 Contrastive Learning as Dictionary Look-up

对比学习目标函数的关键是当在字典中找到与query唯一匹配的key时(称为 k + k_{+} k+​),loss值应该比较小;而query与其他的key不相似时,loss的值应该比较大。当总的损失值比较小时,可以认为模型已经训练完成了。而如果query与正样本 k + k_{+} k+​不相似,或者说query和本来应该是负样本的那些key相似,那么这个loss值就应该比较大来惩罚这个模型。

L q = − log ⁡ exp ⁡ ( q ⋅ k + / τ ) ∑ i = 0 K exp ⁡ ( q ⋅ k i / τ ) L_{q} = -\log \frac{\exp(q·k_{+}/τ)}{\sum^{K}_{i=0}\exp(q·k_{i}/τ)} Lq​=−log∑i=0K​exp(q⋅ki​/τ)exp(q⋅k+​/τ)​
其中, K K K指的是字典中所有的key,也就是一个正样本和k个负样本, q ⋅ k + q·k_{+} q⋅k+​与 q ⋅ k i q·k_{i} q⋅ki​可以看成是logit,而 τ τ τ是温度系数,一般用来控制部分的形状,值越大分布越平滑,值越小分布越尖锐。值太大会可能导致模型学习没有轻重,但是值设定得太小,又会让模型只关注到那些特别困难的负样本,但是这些负样本很有可能是潜在的正样,这样会导致模型很难收敛或者很难去泛化。

另外, q = f q ( x q ) q = f_{q}(x^{q}) q=fq​(xq), k = f k ( x k ) k = f_{k}(x^{k}) k=fk​(xk),这里的输入是什么模型是什么,他们具体的实现与代理任务有关。当代理任务不一样时, x q , x k x^{q},x^{k} xq,xk既可以是图片也可以是图片块,或者是含有上下文的一系列的图片块。对于模型,这个query的编码器和key的编码器的模型架构既可以相等,参数也可以完全共享,或者参数部分构想,又或者是彻底不一样的两个网络。

3.2 Momentum Contrast

对比学习是一种在图像等高维连续输入上构建离散字典的方法。字典是动态的,因为key是随机采样的,而且键编码器 f k f_{k} fk​在训练过程中也会变化。

paper里面提出将字典构建成一个队列,队列里面的元素就是一系列的特征key。在模型训练的过程中,每一个mini-batch就会有新的一批key进入队列中,同时也会有一批老的key移出队列。如此可以将字典的大小与mini-batch大小剥离开,就可以在模型训练过程中使用一个比较标准的mini-batch size(128/256),但是字典的大小既可以变得比较灵活。字典总是表示所有数据的一个采样子集,而维护这个字典的额外计算是可管理的。此外,删除最老的mini-batch size可能是有益的,因为这些key是最过时的,因此与最新的key最不一致。

但是,通过队列的方式没有办法通过反向传播的方式去更新其参数,因为梯度需要传播到队列中的所有样本,但是这些样本又不是同时处理的。一个简单的方式是一次训练结束时,将编码器 f q f_{q} fq​的参数值赋予编码器 f k f_{k} fk​,但是这样做的效果不好,可能是降低了这个队列里所有key的特征一致性,因为这些key是由不同时刻的编码器所提取的特征,也就是相当于使用了不同的编码器了,所以不一致。

所以提出了动量更新编码器 f k f_{k} fk​,公式为:
θ k ← m θ k + ( 1 − m ) θ q \theta_{k} \leftarrow m\theta_{k} +(1-m)\theta_{q} θk​←mθk​+(1−m)θq​
其中, m m m就是动量参数, θ q \theta_{q} θq​就是query编码器,是通过梯度方向传播来更新结构参数的。 θ k \theta_{k} θk​除了刚开始是 θ q \theta_{q} θq​初始化外,后面的更新主要是靠自己。通过这样的一个方式,使得虽然特征key还是由不同时刻的编码器输出而得,但是这些不同时刻的编码器的区别比较小,所以其一致性还是比较强的。

综述所述,一个缓慢更新的编码器是至关重要的,以为其可以保证这个队列里面的所以key都是相对一致的。此外,paper还总结了MoCo与现有其他两种对比学习机制进行比较,如下图所示:
在这里插入图片描述

所以,之前的方法都受限于字典大小与特征一致性这两个方面中的至少一个。所以,MoCo采用了队列的形式去实现了一个字典,从而使得他不像end-to-end方式一样受限于batch size的大小;同时为了提高字典中特征的一致性,MoCo使用了动量编码器。

伪代码如下所示:

# Algorithm 1 Pseudocode of MoCo in a PyTorch-like style
# f_q, f_k: encoder networks for query and key
# queue: dictionary as a queue of K keys (CxK)
# m: momentum
# t: temperature
f_k.params = f_q.params # initialize
	for x in loader: 	# load a minibatch x with N samples
	x_q = aug(x)		# a randomly augmented version
	x_k = aug(x)		# another randomly augmented version
	
	q = f_q.forward(x_q) 	# queries: NxC (256x128)
	k = f_k.forward(x_k) 	# keys: NxC (256x128)
	k = k.detach() 			# no gradient to keys
	
	# positive logits: Nx1 (256x1)
	l_pos = bmm(q.view(N,1,C), k.view(N,C,1))	# q·k+
	
	# negative logits: NxK (256x65536)
	l_neg = mm(q.view(N,C), queue.view(C,K))	# sum q·ki
	
	# logits: Nx(1+K) (256x65537)
	logits = cat([l_pos, l_neg], dim=1)
	
	# contrastive loss, Eqn.(1)
	labels = zeros(N) # positives are the 0-th
	loss = CrossEntropyLoss(logits/t, labels)
	
	# SGD update: query network
	loss.backward()
	update(f_q.params)
	
	# momentum update: key network
	f_k.params = m * f_k.params+(1-m) * f_q.params
	
	# update dictionary
	enqueue(queue, k) 	# enqueue the current minibatch
	dequeue(queue) 		# dequeue the earliest minibatch
# bmm: batch matrix multiplication; mm: matrix multiplication; cat: concatenation.

3.3 Shuffling BN

用了BN之后,很有可能会造成batch里的这些样本中间信息会泄漏,因为BN要算这些样本的running meanrunning variance,也就是说他能通过这些泄漏的信息很容易的去找到那个正样本,而不需要去学一个真正好的模型。

而BN这个操作大部分是在当前的这个GPU上面计算的,所以在做多卡训练之前先把样本的顺序打乱,再送到所以的GPU上去,算完了特征再把顺序回复去算最后的loss,这样的操作loss是不会改变的,但是每隔GPU上的bn计算就变了,就不会再存在这种信息泄露的问题。

4. Experiments


paper在测试分类效果的时候,是将backbone冻结住的,只训练一个分类头,也就是相当于是一个特征提取器。其中,使用grid search搜索出最好的learning rate是30,这个比较诡异,这说明无监督学习学到的特征分布与有监督学习学到的特征分步是非常不一样的。

总结:

MoCo在一系列的任务和数据集上效果很好,但是还是存在一点瑕疵。比如使用了1000倍数据规模的提升, 但MoCo 性能的提升不高,可能大规模数据集可能没有完全被利用,可以尝试开发其它的代理任务 pretext task。而且除了 instance discrimination 代理任务,类似 NLP 的代理任务 masked auto-encoding可以在cv领域进行(有了后来的MAE)。

MoCo 设计的初衷:去构造一个大的字典,从而让正负样本能够更有效地去对比,提供一个稳定的自监督信号,最后去训练这个模型。

ps:MoCo系列工作的泛化会比其他的对比学习模型好

参考资料:
1)视频讲解:https://www.bilibili.com/video/BV1C3411s7t9?spm_id_from=333.999.0.0
2)视频笔记:https://www.bilibili.com/read/cv14463867?from=note

标签:编码器,Learning,Unsupervised,batch,学习,key,MoCo,字典
来源: https://blog.csdn.net/weixin_44751294/article/details/122720525