小议如何跳出魔改网络结构的火坑

2020-03-04 17:18:00 浏览数 (1)

本文原载于知乎,已获作者授权转载,请勿二次转载,

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

引言

0202 年,CV 领域已经相当内卷。

知乎上,如何设计一个网络拟合 xx 函数的讨论层出不穷(e.g. 判断一个数是奇数还是偶数、能否被 n 整除);

学术上,为了补充训练集中缺少的先验信息网络结构被修改的摇摇欲坠:为了学习位置信息(距离较远的内容信息)各种 Attention 层出不穷;为了应对旋转(形变)信息, STN 被嫁接在混乱的拓扑图中;

对于 low-level 的任务,手动计算一个先验的滤波器都不足为怪;对于 high-level 的任务,GCN 开始被广泛用于捕捉样本间(流形)上的关联关系;

就在前几天的 AAAI 上,老爷子还老当力壮,想要通过 capsule 网络改善 CNN 的种种弊病......

在这种内卷情况下,和 CV 领域头部的大佬直接拼刺刀着实有些困难。毕竟,(虚假的)idea 好想但是不好 work。那么如何跳出魔改网络结构的火坑呢?正如一个人有两条腿走路,CV 领域也有模型和数据两条腿。魔改模型不行,我们可以魔改数据集(跳入魔改数据集的火坑)!

回到 10 年前,特征工程总比魔改 SVM 更直观和有效,魔改数据集、在数据集中添加任务需要的先验知识,比魔改模型结构更容易出成果(至少在竞赛和我的部分科研实践中如此)。

结合目前 semi-supervise 和 self-supervise 的发展,这里总结一些魔改数据集的 baseline idea,祝大家论文年年有,今年尤其多~

自监督学习

在数据集中,标签的数量和标签蕴含的信息往往是有限的。例如,在 ImageNet 上进行图像分类任务时,标签能够为模型提供图片的类别信息,即,这张图片是猫还是狗。

但是,标签并没有显式地指明,这张图片表现的是一只白色的猫还是一只黄色的猫,是一只正面拍摄的猫还是一只侧面拍摄的猫,猫的眼睛在猫的鼻子上面还是猫的鼻子下面等等。

对此,自监督希望充分利用数据的自身信息,根据图像的结构或者特性,人为构造标签进行训练(这个过程被称为 pretext 训练)。pretext 训练完后,再让模型在有监督的数据集上 fine-tune,完成相关任务。

其实质是,尽可能人为地利用图像,学习图像中隐含的本质特征。再用这种本质特征作为先验知识,指导学习相关任务。

目前,现有工作一般是基于“剔除-重构”策略构造标签的。模型学习需要图像中某方面特征时,就将该部分特征从原图中剔除掉作为标签,再将被剔除掉部分特征的图像作为模型的输入,训练模型重构被剔除的部分(标签),从而学习到该方面的先验知识。

LeCun 在 Energy-Based Self-Supervised Learning 中提到的“剔除-重构”策略

目前自监督学习的发展已经远超 LeCun 当时的总结,异彩纷呈~这里总结一些常用的先验知识学习方法:

  • 颜色信息(Image Colorization)
  • 高分辨率信息(Image Superresolution)
  • 相对位置(内容)信息(Image Inpainting / Context Prediction / Image Jigsaw Puzzle)
  • 形变信息(Geometric Transformation Recognition)
  • 关联信息(Image Clustering)

1. 颜色信息(Image Colorization)

要想学习物体的颜色作为下游任务的先验知识,我们只需要在原图的基础上剔除颜色信息,将原图灰度化生成灰度图,再训练模型根据灰度图重构原图。这种策略在 Image Colorization 任务中很常见。

现有工作一般先对图像进行灰度化。

学习颜色信息 step 1:在原图的基础上剔除颜色信息

之后使用 Auto-Encoder 模型,将灰度图作为输入重构彩色图。在训练时,将重构的彩色图与原图的 MSE(L2 距离)作为损失函数,优化 Auto-Encoder 。

在训练过程中,Auto-Encoder 能够掌握图像中物体的颜色信息,例如,天会被涂上蓝色,山会被涂成绿色,雪会被涂成白色。Encoder 和 Decoder 都可以用在下游任务中取得较好的效果。

学习颜色信息 step 2:训练 Auto-Encoder 根据灰度图重构原图

[1] Colorful Image Colorization

[2] Real-Time User-Guided Image Colorization with Learned Deep Priors

[3] Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic Image Colorization with Simultaneous Classification

2. 高分辨率信息(Image Superresolution)

要想学习物体的高分辨率信息(细节信息)作为下游模型的先验知识,我们只需要在原图的基础上剔除细节信息,将原图缩放成小图,并训练模型根据小图重构原图。这种策略在 Image Superresolution 任务中很常见。

现有工作一般使用双线性差值对图像进行缩放,得到原图和其对应的小图(缩略图)。

学习高分辨率信息 step 1:在原图的基础上剔除细节信息

之后使用 GAN 模型,将小图作为输入重构高分辨率图像。在训练时,将重构的高分辨率图像与原图的 MSE(L2 距离)、内容损失(Content Loss)和对抗损失作为生成器的损失函数,将二分类损失作为判别器的损失函数,将生成器和判别器进行对抗训练。

在训练过程中,生成器能够掌握图像中物体的细节信息,生成逐渐清晰的图像;判别器能够掌握一张图片的细节信息是否准确,判别生成图像和原图的差异。生成器和判别器都可以用在下游任务中取得较好的效果。

学习高分辨率信息 step 2:训练 SRGAN 根据灰度图重构原图

[4] Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network

3. 相对位置(内容)信息(Image Inpainting / Context Prediction / Image Jigsaw Puzzle)

图像中物体的上下文信息、或是不同物体的相对位置信息、亦或是远距离物体的相关性在计算机视觉中扮演着重要的角色。在魔改网络结构时,为了学习这些信息,我们往往会设计各种 Attention 模块。

在自监督学习中,我们可以显式地让模型学习这些信息。目前,比较常见(我认为)有效的策略有三类。

第一种,要想学习物体的内容信息作为下游模型的先验知识,我们只需要在原图的基础上剔除某块物体或区域,只保该留物体或区域的上下文,并训练模型根据上下文重构原图。这种策略在 Image Inpainting 任务中很常见。

现有工作一般先从图像中随机选择(或者通过物体检测选择)一块区域抠出。

学习物体的内容信息 step 1:在原图的基础上剔除物体或区域

之后使用 GAN 模型,将图像中抠出一块区域所得的残留图(区域出现的上下文)作为输入,训练模型修复出完整图像。在训练时,使用对抗损失作为生成器的损失函数,使用二分类损失作为判别器的损失函数,对生成器和判别器进行对抗训练。

学习物体的内容信息 step 2:训练 GAN 根据上下文重构原图(被剔除的物体或区域)

[5] Context encoders: Feature learning by inpainting

第二种方法认为物体中不同局部的相对位置比纹理更能表达内容信息。例如,我们在观察狗的时候,会发现狗的头总在狗的身体上方。假如一种生物的身体在头的上方,那么这种生物肯定不是狗。

要想学习这种物体隐含的相对位置信息,我们只需要在原图的基础上提取一个局部内连续的 9 块区域(一个中心区域及其 8 个方向的相邻区域),保区域内的纹理信息,并训练模型根据纹理预测区域在中心区域的哪个方向。这种策略在 Context Prediction 任务中很常见。

现有工作一般是将图像中物体所在区域切分成 9 个 Patch,记录 8 个 Patch 与中心 Patch 的相对位置关系(如下图,1 对应左上)。

学习物体内含的相对位置信息 step 1:原图的基础上剔除物体或区域中包含的相对位置信息

之后使用 CNN-based 的分类器,将中心区域和某一块相邻区域作为输入,用共享权重的特征提取器分别提取特征,合并两区域的特征并通过 MLP 输出相邻区域相对中心区域的方向(例如 6 是下)。在训练时,使用多分类损失作为损失训练分类器学习相对位置信息。

学习物体内含的相对位置信息 step 2:训练 CNN 根据纹理重构相对位置信息

[6] Unsupervised Visual Representation Learning by Context Prediction

第三种,同样是学习物体内含的相对位置信息,我们还可以将原图切分成 9 块区域进行随机打乱,并训练模型预测这 9 块区域被打乱的方式属于哪种情况。这种策略在 Image Jigsaw Puzzle 任务中很常见。

现有工作一般先将图像分成 9 块 Patch,定义对 9 块 Patch 的 64 种打乱方式,每次从 64 种打乱方式里随机选一种进行打乱。

学习物体内含的相对位置信息 step 1:原图的基础上剔除物体或区域中包含的相对位置信息

之后使用 CNN-based 的分类器(CFN),将 9 块 Patch 作为输入,用共享权重的特征提取器分别提取特征,合并 9 个 Patch 的特征并通过 MLP 输出打乱的方式属于 64 种中的哪一种。在训练时,使用多分类损失作为损失训练分类器学习相对位置信息。

学习物体内含的相对位置信息 step 2:训练 CFN 根据纹理重构相对位置信息

[7] Unsupervised learning of visual representions by solving jigsaw puzzles

6. 形变信息(Geometric Transformation Recognition)

CNN 有限的旋转不变性一直饱受研究者的诟病,在一些工作中,学习到物体的旋转角度显得十分重要。在魔改网络结构时,为了学习这些信息,我们往往嫁接 STN 模块。

在自监督学习中,我们可以显式地让模型学习这些信息。一些工作提出根据原图生成不同方向新图像(当然也可以理解为剔除不同旋转角度图像中的旋转角度得到原图像),并训练模型根据新图像预测旋转角度。这种策略在 Geometric Transformation Recognition 任务中很常见。

现有工作一般对图像进行 0、90、180、270 度的旋转,生成新图像并记录对应的旋转角度。

学习旋转信息 step 1:原图的基础上生成不同方向新图像

之后使用 CNN-based 的分类器,将旋转后的图像作为输入,预测旋转角度。在训练时,使用多分类损失作为损失训练分类器学习旋转角度信息。

学习旋转信息 step 2:训练 CNN 根据新图像预测旋转角度

[8] Unsupervised Representation Learning by Predicting Image Rotations

7. 关联信息(Image Clustering)

在训练 CNN 时,样本间的关联关系往往会被忽视,但是在图像检索等领域这些关联关系却对提高任务精度为重要。在魔改损失函数时,我们可能会用到 metric learning;

在魔改网络结构时,我们会使用 GCN 计算节点之间的相似度进行图卷积。而在自监督学习中,我们可以显式地让模型学习这些信息。

现有工作一般使用聚类算法先对图像进行聚类,记录聚类结果并将样本标注上对应簇的标签;(当然也可以理解为剔除相关样本带来的簇信息)并训练模型根据图像预测样本所属的簇。

相比于任务相关的类别标签,簇所指向的标签更符合数据本来的特征(例如真假人脸分类可能会聚簇为男女),粒度可能也更细(例如猫狗分类可能会聚簇成不同颜色的猫狗等)。

学习样本间的信息 step 1:对图像进行聚类并记录聚类结果作为标签

之后使用 CNN-based 的分类器(CFN),图像作为输入,预测图像所属的簇。在训练时,使用多分类损失作为损失训练分类器学习样本间的模式差异。

学习样本间的信息 step 2:训练 CNN 根据图像预测簇标签

[9] Deep clustering for unsupervised learning of visual features

半监督学习

前面我们提到,在数据集中,标签的数量和标签蕴含的信息往往是有限的。而自监督希望充分利用数据自身,通过数据自身的结构或者特性,人为构造标签进行训练(这个过程被称为 pretext 训练)。

另外一些工作提出,在一部分数据集标签未知的情况下,我们是否能够根据已知样本的标签,人为构造任务相关的标签进行训练呢?这就是半监督学习的初衷。

有些同学会说,我们的数据集都是 banchmark,都是有监督的数据集,我们是否还需要半监督方法呢?答案是肯定的。

在科研过程中,如果模型在某个数据集上表现尴尬,而创意却很难割舍,我们(的朋友)往往会选择扩充数据集构造一个新数据集进行验证。

但是扩充的数据集往往缺少标签(钱),这时半监督的方法对比不失为一种选择。即使是在比赛中,外部数据集也经常会被掺杂在任务数据集中提高模型的泛化能力(甚至是在频谱分类数据集中掺杂 Flickr)。

这时的外部数据集八成是没有任务相关的标签了,我们就需要半监督学习来救场,生成任务相关的标签。

根据生成标签所代表的“指导方向”的不同,这里总结一些半监督学习的方法:

  • TODO

0 人点赞