©作者 | 凤舞九天

前言 

由于工作原因搞了相当一段时间的无监督学习,包括 CV 单模态的无监督,以及多模态的无监督学习,这里将自己重点关注的论文介绍一下,并且会附上自己在实验过程中的一点心得体会。这篇文章主要介绍图像(CV)领域内的无监督学习。

无监督学习的概念其实很早就有了,从最初的 auto-encoder,到对图像进行不同的预处理然后进行预测的无监督学习(比如旋转后预测旋转角度、mask 一部分进行复原),以及到如今对比学习(simclr、moco)、特征重构(byol,simsiam)、像素重构 MAE、甚至 low-level 的无监督预训练(IPT),可以说图像的无监督学习获得了长足的发展,而且无监督的效果已经在逐步逼近有监督的效果。

当然,截止到目前我仍然不认为无监督学习的效果能打败有监督学习,但是在大量没有标注的数据上进行无监督训练,然后再在自己的特定任务上的少量标注数据上进行 finetune,那效果确实是会好很多的,但是如果是大量的无监督训练的数据也是有标注的情况,那么效果肯定不如直接有监督训练,而且经过自己的实验,即便是先无监督再有监督、有监督无监督一起训练也不会有太大收益,所以说目前为止还是数据为王。

但是目前无论是单模态(CV、NLP)还是多模态下,都会有超大规模的预训练数据甚至能到亿级别,在这种数据量下预训练出来的模型当然会很好,但是收集整理如此量数据以及在亿级别训练数据上进行训练都是极其消耗资源的,一般的研究员都是 load 开源的模型参数再进一步 pretrain 或者 finetune。

对比学习

最初做无监督的想法很简单,类似 auto-encoder,重构像素、或者对图像做一些变换(比如旋转)然后进行预测,但是如此做并没有得到特别好的效果。自己个人感觉对比学习(SimCLR 和 MoCo)的出现算是无监督学习的一次质的飞跃,而且这些经典论文的一些思路以及结论,对其他工作都有借鉴意义,自己有关的实验也会一一介绍。

先简单介绍下对比学习的概念。我们的输入图像 ,经过两种不同的预处理(变换)之后可以得到两张图像 和 ,那么经过特征提取器(encoder)之后两者的特征应该是比较相近的。但是如果直接最大化两张图像特征的距离,模型很容易陷入坍塌,即特征都映射成固定特征,那么 loss 为 0。因此对比学习引入负样本的概念,对于来自同一张图像的特征,其特征距离尽可能近,而来自不同图像的特征,其特征距离要尽可能远,用学术上的话说就是最小化正样本距离,最大化负样本距离,也就是对比学习的损失函数。

这里对损失函数简单解释下,对比学习的输入是对每一张图像进行两种不同的变换,经过特征提取之后会得到两种特征,对任意特征 来说,总会有一个特征 是其正样本(同一张原始图像的两种不同的数据增强得到的特征),而一个 batch 中的其他图像提取到的特征就是负样本。

从原理上来说(其实是各种论文的实验结果),提高对比学习的效果就是提供足够大的 batch size、研究更加有效的不同预处理方式(使得经过变换后的两张图像既能保留图像最本质的信息,又尽可能不一致)以及增加模型(encoder)表达能力。下面重点讲一下对比学习领域内 MoCo 和 SimCLR 两个最具代表性以及影响力的文章。

首先是 MoCo,MoCo 研究的重点是如何增加计算 loss 时的负样本数据,因为总显存是有限的。MoCo 设计了一种巧妙的方式,在训练的过程中维护一个队列,将历史 batch 中的特征(这里的特征由于没有梯度,所以占显存很小)存入到队列中,这样一个新的 batch 在计算的时候,可以在队列中找到足够多的负样本进行迭代优化。

但是这样有一个问题是,不同 batch 提取特征时的模型参数是在一直更新的,所以作者设计了一个 momentum-encoder,其结构与 encoder 完全相同,每次更新的时候以较小的步长从 encoder 中 copy 参数,这样 momentum-encoder 参数不是通过 loss 来进行学习的,所以提取的特征无需梯度,占用显存就比较小,同时 momentum-encoder 参数变化很缓慢,所以队列中维护负样本特征就保证了足量且相对一致(来自同一个模型参数),以保证对比学习的效果。

接下来介绍的就是 SimCLR 这篇文章。SimCLR 可以说有钱任性,直接暴力加足够的机器以保证 4096 的 batch size,这样一来损失函数就可以直接计算。SimCLR 主要研究了对图像的不同变换以及特征表达的影响,SimCLR 做了大量不同的尝试,最后发现在对比学习中,

402 Payment Required

预处理效果最好。

除此之外,SimCLR 还在 encoder 之外加了 MLP 结构,进一步提升了效果(其实不知道这个为什么会有效)。其模型结构为:

MoCo 在借鉴的 SimCLR 的数据增强方式以及 MLP 结构之后形成了 MoCo-v2,效果也有很大的提升,说明 SimCLR 本身的实验结论十分 solid。

最初在看到 MoCo 这篇文章的时候确实觉得这个思路很巧妙,而且很明显作者将其做 work 了,因为论文中的指标完全可复现。不过当我复现 SimCLR 的时候设计了另外一种在一定量显存的前提下模拟大 batch size 的实现方式,简单讲就是小 batch 先不带梯度推理保存结果,再带梯度推理计算 loss,但是需要重复推理,浪费了训练时间。我们看论文的目的除了直接用论文的方法之外,还可以借鉴论文中的部分思路。

比如说 SimCLR 中的数据增强以及 MLP 结构,可以说是类似文章的标配了,而 MoCo 论文利用 momentum-encoder 以及队列来实现在小 batch size 情况下得到足够量的负样本也很值得借鉴,在我训练 CLIP(多模态对比学习)的时候采用的就是 MoCo 的思路,比如 ALBEF 这篇文章也是用了类似的思路(当然人家还有别的优化点,所以能发表论文)。

同时自己在做目标检测的时候发现了一篇 DetCo,其实就是将 MoCo 适配到了目标检测领域,设计了多尺度的对比以及增加了局部 VS 全局的对比,自己实验下来,目标检测的任务下,DetCo 确实比 MoCo 好一些。在视频领域也有由 MoCo 改进而来的 VideoMoco,不过这篇文章没实验过。

最后写一些是自己应用中的一些思考。首先是在自己的业务数据上训练类似 MoCo 或者 SimCLR 的时候,由于对比损失函数的特点,如果数据中相似数据占比较高的话最好做一下去重;其次是在多机多卡训练的过程中,正样本都是在同一机器同一张卡上计算,但是负样本会来自不同的机器,所以当 encoder 选用 ResNet 等 CNN 结构时,BN 层会有一定的信息泄漏,MoCo 中采用的是 shuffle bn,而 SimCLR 采用的是 sync bn。

特征重构

刚刚有提到,如果直接最大化两张图像特征的距离,模型很容易陷入坍塌。但是也有一些文章进行直接进行特征重构但是却能收敛(其实从原理上并不是很清楚收敛原因)。这里主要是介绍 BYOL 和 SimSiam。

BYOL 可以说是我在尝试的论文中效果最好的一个,其最显著的特点是训练的时候不需要负样本,只需要正样本就好。

BYOL 在 Simclr 的 mlp(projection)之后额外加了新的 mlp 结构(predition),利用 predition 的结果和另一种增强方式得到的 projection 直接构建 l2 loss。BYOL 中 target emcoder 其实就是 Moco 中的 momentum-encoder,其参数更新来自于 online-encoder,而不是由 loss 计算。可以说 BYOL 在 Moco-v2 的基础上直接去掉了负样本的对比,而是在正样本projection之后再进行 predition 来预测图像特征。

SimSiam 就更简单了,SimSiam 相当于在 BYOL 的基础上进一步去掉了 momentum-encoder,仅用一个 encoder,而且作者研究发现保证模型不坍塌的原因是 target 数据的梯度不回传。

BYOL 和 Simsiam 我自己也有有过尝试,开源的代码也并不复杂,确实能复现论文的效果,但是目前仍然不是很理解为何 target 网络 stop gradient 就能使得无监督训练不坍塌,对我而言仍然是有一点点玄学。

其他思路

接下来的几篇文章,是我个人觉得思路比较值得借鉴的文章,这里一并介绍下。

首先是 SwAV 这篇文章。这篇文章比较有意思的点是虽然loss采用的仍然是类似对比学习,但是其无需负样本计算 loss。具体实现方式为其中一个增强结果所提的特征会进行聚类,得到一个 one-hot 编码,我个人理解为就是为这张图像打了一个 label,然后对另一个增强结果进行分类(特征与聚类中心点乘)。

还有一个值得借鉴的点是其数据增强引入了低分辨率(小 size),一张图像经过数据增强之后可以得到 8 个不同的 view,其中两个是高分辨率,其余六个是低分辨率,view1(利用 distributed_sinkhorn 计算 q)与其余 7 个 view 计算 loss,view2(利用 distributed_sinkhorn 计算 q)与其余 7 个 view 计算 loss。其 loss 表达式和模型结构为:

其次是 MAE 这篇文章,是凯明大神继 Moco 系列之后的又一力作,其实自从 BERT、GPT 在 NLP 领域内被成功应用之后,在图像领域也有相当一部分研究集中在对图像进行一定 mask 然后重建的工作上,IGPT,BEiT 是其中的代表作。其实自己也跑过类似 IGPT 的代码,结果当然是有点惨不忍睹。凯明大神一贯作风是思路简单,效果拔群,然而能将简单的思路实现,并最终 work,才真是硬实力。MAE 选用的模型是 VIT 结构,首先对原图进行 patch 划分,mask 的粒度也是在patch上完成。AutoEncoder 的结构其实比较简单,一个 encoder,一个decoder,配合上 VIT 以及 patch 划分,整体模型结构便呼之欲出。

MAE 之所以能成功,个人认为有两个比较重要的关键点。

1. 75% mask 比例,与文本不同的是,一张图像信息是非常冗余的,如果类似于BERT 采用随机 15% 的 mask 比例的话,重建任务非常简单,模型很容易就从 mask 部分的邻域学到信息完成重建任务。

2. 非对称的 encoder、decoder 结构。在论文中指出,因为训练的目的是拿到比较好的 encoder 模型,所以 encoder 模型相对重一些(参数多),而轻量级(参数少)decoder 已经能很好的完成重建任务,与此同时,Mask token 不参与 encoder 计算,仅参与 decoder 计算,这样一来,参数多的 encoder 只输入 25% 的图像数据,而输入 100% 图像数据的 decoder 参数又比较少,能够加速计算。

最后是 IPT 这篇文章。IPT 与之前文章最大的不同点在于 IPT 模型更加关注细粒度信息,当然其负责的任务也主要是降噪、去雨、超分等 low level 的任务,其模型以及任务的设计也比较巧妙,为每个任务设计独立的 head 和 tail 模块,中间层则是共享参数的 transformer 结构,预训练任务就是人为对原始数据加噪声、缩小等各种操作进行复原,这篇文章感觉在 low level 的任务上有很好的启发意义。

总结

以上提到的大多数文章自己都有相关的实验,但是做无监督有一点点心塞的是随着自己业务上的标注数据越来越多,无监督预训练带来的收益会越来越少,所以无监督预训练在业务上应用一般是启动的时候第一版本,手中只有少量的数据,这个时候加上无监督预训练,而后随着数据回流与标注,有监督训练的效果会越来越好。同时这里介绍的这么多篇文章,自己实验下来在业务数据上效果其实并没有差很多,同时无监督预训练也需要大量的数据,而且 epoch 也要更长(其实也比较消耗资源),最好是先 load 各家在 imagenet 上预训练好的开源模型。

不过在多模态领域内,多模态无监督预训练确实能带来更大的收益,后面会再写一篇无监督预训练的相关文章。

最后贴一下自己详细介绍的几篇关于图像无监督预训练的文章,也欢迎大家关注:

https://zhuanlan.zhihu.com/p/438635291

https://zhuanlan.zhihu.com/p/395585634

https://zhuanlan.zhihu.com/p/359526033

更多阅读

#投 稿 通 道#

 让你的文字被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。

一文详解图像中的无监督学习相关推荐

  1. 一文详解图像中通道相关知识

    有少数颜色空间可以表示图像,如RGB,BGR,HSV,CMYK等,但它们都有一些共同点.它们是这些色彩空间用来共同形成图像的通道.让我们看看频道的一些定义.维基百科上说, 彩色数字图像由像素组成,像素 ...

  2. 一文详解编程中的随机数

    一文详解编程中的随机数 随机数的类型 真随机数生成器 TRNG - True Random Number Generator 伪随机数生成器 PRNG - Pseudo Random Number G ...

  3. 机器学习中的无监督学习_无监督机器学习中聚类背后的直觉

    机器学习中的无监督学习 When it comes to analyzing & making sense of the data from the past and understandin ...

  4. 深度盘点:一文详解数据分析中100个常用指标和术语

    大家好,有个朋友是金融行业产品经理,最近在对已有的站内用户做分层与标签分类,需要对用户进行聚类分析.一般从事数据分析行业的朋友对这类词并不陌生,但是像市场运营人员就会把这类些名词概念搞混,导致结果不准 ...

  5. 无监督学习与有监督学习的本质区别是什么_人工智能中的无监督学习

    这些误解中的许多原因都归因于这些形式的统计AI的名称 例如,有些人认为仅将机器学习用作反馈循环就是强化学习.其他人则认为,无人监督的全自动机器学习应用程序就是无监督学习的例子,但是这些类别的真正区别在 ...

  6. 机器学习中的无监督学习是什么?

    什么是无监督学习? 顾名思义,"无监督"学习发生在没有监督者或老师并且学习者自己学习的情况下. 例如,考虑一个第一次看到并品尝到苹果的孩子.她记录了水果的颜色.质地.味道和气味.下 ...

  7. 机器学习中的无监督学习应用在哪些领域呢?自动驾驶?医疗影像?卷积神经网络?

    监督学习|机器学习|集成学习|进化计算| 非监督学习| 半监督学习|自监督学习| 无监督学习| 随着人工智能.元宇宙.数据安全.可信隐私用计算.大数据等领域的快速发展,自监督学习脱颖而出,致力于解决数 ...

  8. 一文详解科研中的Paper阅读方法!!!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 前言 论文阅读一直是科研过程中至关重要的一环,如何收集论文,快速选取和课题匹配的论 ...

  9. 一文详解LeGO-LOAM中的点云分割

    作者丨王方浩@知乎 来源丨https://zhuanlan.zhihu.com/p/382460472 编辑丨3D视觉工坊 LeGO-LOAM是一种激光雷达SLAM算法,对应的论文为<LeGO- ...

最新文章

  1. 04flex弹性布局子项常见属性总结
  2. mysql栈空间大小_jvm 堆内存 栈内存 大小设置
  3. 周记 2014.11.29
  4. 两台centos之间免密传输 scp
  5. 【ACL 2019】腾讯AI Lab解读三大前沿方向及20篇入选论文
  6. 安全跑路指南2013之乌云版
  7. 黄金分割点(java)
  8. 关于New Date()获取的不是当前电脑时间问题
  9. Linux系统上安装python详细步骤
  10. PD-L1免疫组化检测难点与要点
  11. linux系统下复制粘贴不了怎么办,电脑复制粘贴不了怎么解决?三种解决办法 了解一下...
  12. jQuery插件库超级好用库
  13. 不均衡分类问题 之 class weight sample weight
  14. 用重合图片去计算网络的峰值分类准确率
  15. Final Cut Pro 7非线性编辑高级教程
  16. 中学学生成绩管理系统
  17. python:ImportError: cannot import name ‘xx‘ from ‘xxxx‘
  18. 悟空出行携手融创文化梦之城、哈弗品牌,融合战略发布会圆满落幕
  19. 实现制作萝莉语音包前的准备——百度AI的使用介绍
  20. C语言 | 快速了解C的发展史

热门文章

  1. caffe 环境搭建
  2. python标记_Python实现一个简单的图片物体标注工具
  3. ul中清除所有的li标签
  4. The fully qualified name of the bean‘s class, except if it serves only as a parent definition for ch
  5. STM32变频器技术方案,源码+图纸,供参考设计与学习
  6. 竞品分析怎么做?4要素+6大核心方法论教你迅速掌握竞品分析精髓
  7. 数值计算之 Levenberg-Marquardt算法
  8. 疯狂的DFS,也带不动EOS大丰收
  9. PHP 正则匹配手机号格式
  10. calendar前推n天_java日期前推一个月