视频链接:MoCo 论文逐段精读【论文精读】_哔哩哔哩_bilibili
MoCo: CVPR 2020 最佳论文,视觉 + 对比学习的里程碑式的工作
对比学习:
简单、好用;
19年以来,视觉领域乃至整个 ML 领域最火的方向之一;
盘活了从17年很卷的CV领域,MoCo是其中的优秀工作之一
分类:逼近了有监督的 baseline
检测、分割、人体关键点检测:大幅超越有监督预训练的模型 (ImageNet 上预训练的模型)
CV 领域的定心丸,无监督学习真的可以,有可能真的不需要大规模、有标号的数据集做预训练。
侧面正面了 Yann LeCun 的 NeurIPS 2016 的演讲图
蛋糕:ML
樱桃:RL
蛋糕的糖霜 icing:有监督学习
蛋糕本质:无监督学习
现在无监督的进展:
NLP 大模型都是自监督的预训练方式
CV 的大模型用自监督预训练,也快了
Note: 多听大佬的 talk 报告有好处,找下一个研究方向
01:39
MoCo 动量对比学习:假设读者已经了解对比学习
对比学习:通过对比去学习模型,只需要知道图 1 和 图 2 相似,图 1、图 2 和 图 3 不相似;而不需要真的知道 图 1 和 图 2 代表的是人,图 3 代表的是狗。
3 张图进入一个网络 M 得到特征 f1、f2、f3,在一个学习好的特征空间 embedding space 中,f1、f2 的特征尽量近,和 f3 的特征尽量远离。
对比学习学到的很好的特征:类似物体在这个特征空间 相邻,不类似的物体在特征空间 远离
类似 meta-learning 的基于度量的学习?
Q: 图 1 和 图 2 相似,和图 3 都不相似,难道不是有监督学习吗?Why 对比学习在 CV 领域被认为是无监督训练呢?
CV 领域 设计巧妙的代理任务 pre-text task,人为设立一些规则 —— 定义哪些图片相似、哪些图片不相似,为自监督学习提供监督信号,从而自监督训练
04:30
一个无标注的数据集,n 张图片,x1, x2, ..., xn
随机选取一张图片,做 transformation
以 x1 图片为例,x1 随机裁剪 + 数据增广 得到 xi1, xi2 (看起来和 x 1 有区别的 2 张照片,x1 的正样本),数据集中的其它图片 x_j, j ≠ i 是 x1 的负样本
i.e., ImageNet-1K 此时不是 1000 个类别,而是 100w 个类别。每个图片都是它自己的正样本,其余都是负样本。
基于 图片和图片本身的变换是正样本,和其它图片是负样本 的代理任务, + 模型 得到特征,+ 对比学习的目标函数 i.e., NCE loss (正文有提)
对比学习的框架:灵活性--定义正负样本的规则
同一个视频里的任意两帧 是 正样本,和其它视频的所有帧是负样本
NLP, simCSE 把同样的句子扔给模型,但是做 2 次 forward,通过不同的 dropout 得到一个句子的 2 个特征;和其它所有句子的特征都是负样本。
CMC 论文:一个物体的不同视角 view(正面、背面;RGB 图像、深度图像)作为不同形式的正样本。
多模态领域:Open AI 的 CLIP 模型
07:33
动量对比学习的方法做无监督视觉特征学习
Momentum Contrast: 动量对比学习
动量:(指数)加权移动平均值 y_t = m * y_(t - 1) + (1 - m) * x_t
m: 动量的超参数
y_(t - 1): 上一个时刻的输出
x_t: 当前时刻的输入
m 趋近于 1,y_t 改变缓慢,当前时刻的输入 x_t 没什么影响
m 趋近于 0, y_t 更多依赖于当前时刻的输入。
MoCo 利用动量的特性,缓慢的更新一个编码器,从而让中间学习到的字典中的特征尽可能保持一致。
作者来自 FAIR, 大佬 * 5
09:12
本文提出 MoCo (动量对比) 做无监督的表征学习。
MoCo 从什么角度做对比学习呢?
dictionary look-up, 字典查询任务, a dynamic dictionary with a queue and a moving-averaged encoder 动态字典
一个队列:队列中的样本无需梯度回传,可以放很多负样本,让字典变得很大
一个移动平均的编码器:让字典的特征尽可能的保持一致
一个大的、一致的字典,有利于 无监督的对比学习 训练。
本文的亮点是什么?
结果 nice, MoCo (第一个)在 (分类、检测、分割)主流的 CV 任务证明 无监督学习 也不比 有监督学习 差
ImageNet 分类:linear protocol 做测试,MoCo 和 之前最好的无监督学习方式差不多
linear protocol (类似 MAE 的 linear probing)测试:freeze backbone 主干网络的参数不调整,只微调最后的分类全连接层(分类头)。把 backbone 当成特征提取器,可以证明 backbone 学习图片特征的好坏。
容易迁移到下游任务。满足了大家对 大规模、无监督训练 的想象:
7 个 下游任务表现好 counterpart: 模型使用的一样的 i.e., Res50,只是训练方式不一样,i.e., 有监督的带标签数据训练,无监督的不带标签的数据训练。(控制-训练方式-变量法)
在大规模的数据集上进行无监督训练,模型学到一个很好的特征,而且学到的特征可以迁移,在小、少标注数据的下游任务取得好的结果。
MoCo 有什么意义呢?
填补了 CV 领域的无监督学习和有监督学习的 gap
12:04
第一段:无监督学习为什么在 CV 不成功?原始信号不一样
NLP 的离散单词更具语义性,CV的连续、高维信号不好构建字典
引入无监督学习的成功:
无监督学习在 NLP 很成功, i.e., GPT, BERT
无监督学习在 CV 大幅落后于 主流的 有监督学习
无监督在 CV 不成功的原因是什么?
原始信号空间的不同
NLP 原始信号是离散的,词、词根、词缀,容易构建 tokenized dictionaries 做无监督学习
tokenized: 把一个词对应成某一个特征
Why tokenized dictionaries 有助于无监督学习?
把字典的 key 认为是一个类别,有类似标签的信息帮助学习
NLP 无监督学习很容易建模,建好的模型也好优化
CV 原始信号是连续的、高维的,不像单词具有浓缩好的、简洁的语义信息,不适合构建一个字典
如果没有字典,无监督学习很难建模
第二段:别人怎么用对比学习的方法在 CV 的无监督学习里?dynamic dictionaries
近期结合 对比学习和 CV 的无监督学习效果不错,出发点motivation 不一样,但可以被归纳为 “动态字典法”
x_1^1: anchor
x_1^2: positive
x2, x3, ......, xn: negative
编码器 E_11 和 E_12 可以一样,可以不一样
Q:负样本使用哪个编码器?
E_12:因为 positive 和 negative 都是相对 anchor f_11 来说的。正负样本使用同样的编码器
Q: 对比学习怎么做?
f11 和 f12 相近,f11 和 f2, f3, ......, fn 远离
Q: Why 对比学习可以归纳成 在做一个动态的字典 呢?
15:25
f11 当成 query 在 f12, f2, f3, ......, fn 组成的字典的 key 特征条目 k1, k2, ...... 里面查找,dictionary look-up 靠近 f12, 远离 f2, f3, ......
be similar to its matching key and dissimilar to others
learning is formulated as minimizing a contrastive loss 最小化对比学习的目标函数
第三段:从动态字典的角度看对比学习,什么样的字典才适合呢? 大 + 一致性
17:09
large
从连续高维空间做更多的采样。字典 key 越多,表示的视觉信息越丰富,匹配时更容易找到具有区分性的本质特征。
如果 字典小、key 少,模型可能学到 shortcut 捷径,不能泛化
consistent
字典里的 key (k0, k1, k2, ......, kN) 应该由相同的 or 相似的编码器生成
如果字典的 key 是由不同的编码器得到的,query q 做字典查询时,很有可能 找到和 query 使用同一个 or 相似编码器生成的 key,而不是语义相似的 key。另一种形式的 shortcut solution
已有的 CV 对比学习 动态字典方法在 large or consistent 上有不足。
引言结构:介绍研究动机、相关研究工作的不足、想要达到的目标 ---> 本文的工作
第四段:本文的 MoCo
19:07
为什么要提出 MoCo? 给CV 无监督对比学习 构建一个 大 (by queue)+ 一致 (momentum encoder) 的字典
图1 MoCo 框架图 queue, momentum encoder
queue 数据结构: 剥离 字典的大小 和 显卡内存的限制,让字典的大小 和 模型每次做前向传播的 batch size 的大小 分开
字典很大(成千上万),意味着要输入很多很多的图片,显卡内存吃不消
current mini-batch enqueued and the oldest mini-batch dequeued 当前 mini-batch 入队,最早进入队列的 mini-batch 出队
队列的大小 == 字典的大小,但是每次做 iteration 更新,并不需要更新字典中所有 key 元素的值。普通 GPU 训练
momentum encoder:
Q:使用 queue,只有当前 mini-batch 的特征是由当前的编码器得到的;之前的 key 是由不同时刻的编码器抽取的特征,如何保持 consistent 呢?
momentum encoder 由 当前时刻的 encoder 初始化而来
theta_k = m * theta_(k-1) + (1-m) * theta_q
动量参数 m 较大时,theta_k 的更新缓慢,不过多的依赖于 theta_q 当前时刻的编码器,即不随着当前时刻的编码器快速改变,尽可能保证 字典里的 key 都是由相似的编码器生成的特征,保证特征的 consistent
基于 large + consistent dynamic dictionary,MoCo 可以很好的无监督学习视觉特征。
第五段:MoCo 的代理任务 pretext task? instance discrimination
22:04
MoCo 建立模型的一种方式,很灵活,可以和很多代理任务使用
instance discrimination: query 和 key 匹配 如果它们来自于同一张图片的不同视角, i.e., 不同的裁剪
MoCo 用 instance discrimination 无监督训练 在 ImageNet 上可以和之前最好的结果打个平手 or 更好的表现 competitive results
第六段:MoCo 的效果怎么样? 卖结果
23:05
无监督学习的目的:在一个很大的无标注的数据集上训练,模型学到的特征可以很好的迁移到下游任务。
MoCo 做到了。7个检测 or 分割的任务表现很不错。超越 ImageNet 有监督训练的结果,甚至有时大幅度超越 in some cases by nontrivial margins.
无监督学习的期待:更多数据、更大的模型,性能会提升,不饱和。
MoCo 在 10亿 Instagram 数据集(更糙 relatively curated 真实*******、一张图片有多个物体; ImageNet 数据集的图片大多只有一个图片、在图片中间) 上性能还有提升
中型 ImageNet or 大型 Instagram 数据集,MoCo 把 无监督学习和有监督学习的 坑 填平。
应用展望:之前 ImageNet 预训练好的模型,可以尝试替换为 MoCo 预训练好的模型。
25:33
结论:MoCo在一系列的任务和数据集上效果很好 positive results
1000 倍数据集数量的增加, MoCo 性能的提升不高
大规模数据集可能没有完全被利用
尝试开发其它的代理任务 pretext task
除了 instance discrimination 代理任务,类似 NLP 的代理任务 masked auto-encoding
MAE, 大佬 2 年前就有了想法,做了实验;做研究急不来
像 NLP 的 BERT 使用 masked language model 完形填空做自监督预训练
点题总结:MoCo 和 其它对比学习的 代理任务的解和
MoCo 设计的初衷:去构造一个大的字典,从而让正负样本能够更有效地去对比,提供一个稳定的自监督信号,最后去训练这个模型
27:30
unsupervised / self-supervised learning:
自监督学习是无监督学习的一种。
前人研究不怎么区分,MoCo使用 无监督学习 unsupervised learning (定义更广泛一些)
两个可以做的点:pretext tasks and loss functions
代理任务:不是大家实际感兴趣的任务 (检测、分类、分割实际应用任务),而是为了 学习一个好的数据特征表示
损失函数:和代理任务可以分开研究。 MoCo 的创新点在损失函数,又大又一致的字典 影响 info NCE 目标函数的计算
28:30
损失目标函数:衡量 模型的预测输出 和 固定的目标之间的 difference。
L1 or L2 losses
i.e., Auto-encoder(生成式网络的做法), 输入一张原图 or 一张被干扰的图,经过编码器、解码器 重构输入的图,衡量是原图 和 重构图 之间的差异。
判别式网络:eight positions 2015
一张图片 打成 有序号的 9 宫格,给 中间的 第 5 格 和 剩下随机挑一格,预测随机挑的这一格是中间 第5 格 的方位(8个方位可选)。
pretext tasks:分类任务,因为每一个方格都自带序号,输出分到 8 个方位的哪一类。
损失函数:判别式、生成式、对比学习、对抗学习
对比学习的损失:目标不固定,训练过程中不断改变。目标有编码器抽出来的特征(MoCo 的字典)而决定
判别式:预测 8 个位置中的哪一个方位
生成式:重建整张图
对比学习的目标:测量 样本对 在特征空间的相似性。
相似样本离得近,不相似样本离得远
最近无监督表现好的文章都用了 contrastive learning (Sec. 3.1 讨论)
对抗学习的损失:衡量两个概率分布之间的差异,i.e., GAN
unsupervised data generation 做无监督的数据生成
对抗性的方法做特征学习
如果可以生成很好、很真实的图片,模型应该学到数据的底层分布
GAN 和 NCE 的关系 noise-contrastive estimation Ref. [24]
代理任务的生成:
denoising auto-encoders 重建整张图
context auto-encoders 重建某个 patch
cross-channel auto-encoders (colorization) 给图片上色当自监督信号
pseudo-labels 图片生成伪标签
exemplar image 给同一张图片做不同的数据增广,它们都属于同一个类。
patch ordering 九宫格方法:打乱了以后预测 patch 的顺序, or 随机选一个 patch 预测方位 eight positions
利用视频的顺序做 tracking
做聚类的方法 clustering features
对比学习和代理任务的关系:
不同的代理任务 可以和 某种形式的对比学习的目标函数 配对使用
MoCo 论文里 instance discrimination 个体判别方法 ++++ examplar based 代理任务很相关
CPC contrastive predictive coding 用上下文信息预测未来 ++++ context auto-encoding 上下文自编码
CMC contrastive multiview coding 利用一个物体的不同视角做对比 ++++ colorization 图片上色(同一个图片的 2 个视角:黑白 和 彩色)
32:38
简洁明了
从 代理任务 和 目标函数 (2 个和有监督学习不同的点)写相关工作
有监督学习的过程
无监督学习 or 自监督学习 缺少 ground truth,没有标签怎么办?
代理任务来帮忙,自己造标签。
代理任务生成自监督的信号,充当 ground truth 的标签信息
有输出 y 和 标签信息 ground truth,还需要什么呢?
目标函数 L,衡量 输出 Y 和 标签 ground truth 的差异,让模型学到更好
MoCo 从 目标函数 L 和 代理任务 pretext tasks 生成 ground truth 写相关工作
33:44
3.1 Contrastive learning as dictionary look-up
对比学习和最近的发展,都可以看成是一个训练一个 encoder 来做 字典查询 的任务
01:06:11
01:23:20
感谢 MoCo 论文和高效实现,普通 GPU 跑对比学习的实验,做激动人心的研究。
MoCo 激励学者研究 “MoCo 学出来的特征 和 有监督学习学出来的特征有什么区别?还能从什么方向提高对比学习?”
期待对比学习的论文串烧
第一阶段:Contrastive Predictive Coding (CPC), CMC Contrastive Multiview Coding,
第二阶段:MoCo v1, simCLR v1, MoCo v2, simCLR v2
第三阶段:不需要负样本的 BYOL, bootstrap your own latent, SimSiam
第四阶段: 用了 vision transformer 的 MoCo v3, 作者:BeBraveBeCurious https://www.bilibili.com/read/cv14463867?from=note 出处:bilibili