推荐!小议如何跳出魔改网络结构的火坑(完整版)
点击我爱计算机视觉标星,更快获取CVML新技术
本文原载于知乎,已获作者授权转载,请勿二次转载,
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 当时的总结,异彩纷呈~这里总结一些常用的先验知识学习方法:
颜色信息(Image Colorization)
高分辨率信息(Image Superresolution)
相对位置(内容)信息(Image Inpainting / Context Prediction / Image Jigsaw Puzzle)
形变信息(Geometric Transformation Recognition)
关联信息(Image Clustering)
1. 颜色信息(Image Colorization)
要想学习物体的颜色作为下游任务的先验知识,我们只需要在原图的基础上剔除颜色信息,将原图灰度化生成灰度图,再训练模型根据灰度图重构原图。这种策略在 Image Colorization 任务中很常见。
现有工作一般先对图像进行灰度化。
之后使用 Auto-Encoder 模型,将灰度图作为输入重构彩色图。在训练时,将重构的彩色图与原图的 MSE(L2 距离)作为损失函数,优化 Auto-Encoder 。
在训练过程中,Auto-Encoder 能够掌握图像中物体的颜色信息,例如,天会被涂上蓝色,山会被涂成绿色,雪会被涂成白色。Encoder 和 Decoder 都可以用在下游任务中取得较好的效果。
[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 任务中很常见。
现有工作一般使用双线性差值对图像进行缩放,得到原图和其对应的小图(缩略图)。
之后使用 GAN 模型,将小图作为输入重构高分辨率图像。在训练时,将重构的高分辨率图像与原图的 MSE(L2 距离)、内容损失(Content Loss)和对抗损失作为生成器的损失函数,将二分类损失作为判别器的损失函数,将生成器和判别器进行对抗训练。
在训练过程中,生成器能够掌握图像中物体的细节信息,生成逐渐清晰的图像;判别器能够掌握一张图片的细节信息是否准确,判别生成图像和原图的差异。生成器和判别器都可以用在下游任务中取得较好的效果。
[4] Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
3. 相对位置(内容)信息(Image Inpainting / Context Prediction / Image Jigsaw Puzzle)
图像中物体的上下文信息、或是不同物体的相对位置信息、亦或是远距离物体的相关性在计算机视觉中扮演着重要的角色。在魔改网络结构时,为了学习这些信息,我们往往会设计各种 Attention 模块。
在自监督学习中,我们可以显式地让模型学习这些信息。目前,比较常见(我认为)有效的策略有三类。
第一种,要想学习物体的内容信息作为下游模型的先验知识,我们只需要在原图的基础上剔除某块物体或区域,只保该留物体或区域的上下文,并训练模型根据上下文重构原图。这种策略在 Image Inpainting 任务中很常见。
现有工作一般先从图像中随机选择(或者通过物体检测选择)一块区域抠出。
之后使用 GAN 模型,将图像中抠出一块区域所得的残留图(区域出现的上下文)作为输入,训练模型修复出完整图像。在训练时,使用对抗损失作为生成器的损失函数,使用二分类损失作为判别器的损失函数,对生成器和判别器进行对抗训练。
[5] Context encoders: Feature learning by inpainting
第二种方法认为物体中不同局部的相对位置比纹理更能表达内容信息。例如,我们在观察狗的时候,会发现狗的头总在狗的身体上方。假如一种生物的身体在头的上方,那么这种生物肯定不是狗。
要想学习这种物体隐含的相对位置信息,我们只需要在原图的基础上提取一个局部内连续的 9 块区域(一个中心区域及其 8 个方向的相邻区域),保区域内的纹理信息,并训练模型根据纹理预测区域在中心区域的哪个方向。这种策略在 Context Prediction 任务中很常见。
现有工作一般是将图像中物体所在区域切分成 9 个 Patch,记录 8 个 Patch 与中心 Patch 的相对位置关系(如下图,1 对应左上)。
之后使用 CNN-based 的分类器,将中心区域和某一块相邻区域作为输入,用共享权重的特征提取器分别提取特征,合并两区域的特征并通过 MLP 输出相邻区域相对中心区域的方向(例如 6 是下)。在训练时,使用多分类损失作为损失训练分类器学习相对位置信息。
[6] Unsupervised Visual Representation Learning by Context Prediction
第三种,同样是学习物体内含的相对位置信息,我们还可以将原图切分成 9 块区域进行随机打乱,并训练模型预测这 9 块区域被打乱的方式属于哪种情况。这种策略在 Image Jigsaw Puzzle 任务中很常见。
现有工作一般先将图像分成 9 块 Patch,定义对 9 块 Patch 的 64 种打乱方式,每次从 64 种打乱方式里随机选一种进行打乱。
之后使用 CNN-based 的分类器(CFN),将 9 块 Patch 作为输入,用共享权重的特征提取器分别提取特征,合并 9 个 Patch 的特征并通过 MLP 输出打乱的方式属于 64 种中的哪一种。在训练时,使用多分类损失作为损失训练分类器学习相对位置信息。
[7] Unsupervised learning of visual representions by solving jigsaw puzzles
6. 形变信息(Geometric Transformation Recognition)
CNN 有限的旋转不变性一直饱受研究者的诟病,在一些工作中,学习到物体的旋转角度显得十分重要。在魔改网络结构时,为了学习这些信息,我们往往嫁接 STN 模块。
在自监督学习中,我们可以显式地让模型学习这些信息。一些工作提出根据原图生成不同方向新图像(当然也可以理解为剔除不同旋转角度图像中的旋转角度得到原图像),并训练模型根据新图像预测旋转角度。这种策略在 Geometric Transformation Recognition 任务中很常见。
现有工作一般对图像进行 0、90、180、270 度的旋转,生成新图像并记录对应的旋转角度。
之后使用 CNN-based 的分类器,将旋转后的图像作为输入,预测旋转角度。在训练时,使用多分类损失作为损失训练分类器学习旋转角度信息。
[8] Unsupervised Representation Learning by Predicting Image Rotations
7. 关联信息(Image Clustering)
在训练 CNN 时,样本间的关联关系往往会被忽视,但是在图像检索等领域这些关联关系却对提高任务精度为重要。在魔改损失函数时,我们可能会用到 metric learning;
在魔改网络结构时,我们会使用 GCN 计算节点之间的相似度进行图卷积。而在自监督学习中,我们可以显式地让模型学习这些信息。
现有工作一般使用聚类算法先对图像进行聚类,记录聚类结果并将样本标注上对应簇的标签;(当然也可以理解为剔除相关样本带来的簇信息)并训练模型根据图像预测样本所属的簇。
相比于任务相关的类别标签,簇所指向的标签更符合数据本来的特征(例如真假人脸分类可能会聚簇为男女),粒度可能也更细(例如猫狗分类可能会聚簇成不同颜色的猫狗等)。
之后使用 CNN-based 的分类器(CFN),图像作为输入,预测图像所属的簇。在训练时,使用多分类损失作为损失训练分类器学习样本间的模式差异。
[9] Deep clustering for unsupervised learning of visual features
半监督学习
前面我们提到,在数据集中,标签的数量和标签蕴含的信息往往是有限的。而自监督希望充分利用数据自身,通过数据自身的结构或者特性,人为构造标签进行训练(这个过程被称为 pretext 训练)。
另外一些工作提出,在一部分数据集标签未知的情况下,我们是否能够根据已知样本的标签,人为构造任务相关的标签进行训练呢?这就是半监督学习的初衷。
有些同学会说,我们的数据集都是 banchmark,都是有监督的数据集,我们是否还需要半监督方法呢?答案是肯定的。
在科研过程中,如果模型在某个数据集上表现尴尬,而创意却很难割舍,我们(的朋友)往往会选择扩充数据集构造一个新数据集进行验证。但是扩充的数据集往往缺少标签(钱),这时半监督的方法对比不失为一种选择。
即使是在比赛中,外部数据集也经常会被掺杂在任务数据集中提高模型的泛化能力(甚至是在频谱分类数据集中掺杂 Flickr)。
这时的外部数据集八成是没有任务相关的标签了,我们就需要半监督学习来救场,生成任务相关的标签。
根据生成标签所代表的“指导方向”的不同,这里总结一些半监督学习的方法:
指向临近的类别(Pseudo Labels / Entropy Minimization / Sharpen)
指向扰动后的自洽(Π-model / Temporal ensembling/ Mean Teacher / UDA)
指向对抗中的自洽(Virtual Adversarial Training)
1. 指向临近的类别(Pseudo Labels / Entropy Minimization / Sharpen)
如何为没有标签的样本创建一个代理标签,最简单的想法是使用模型在有标签的数据上训练,进而用该模型预测无标签样本所属的类别,作为该样本的代理标签(Pseudo Labels)。
例如,模型对某样本的预测是 20% 的可能是猫,30% 的可能是狗,50% 的可能是苹果。我们就将该样本标记为苹果。在后续的训练过程中,用苹果作为标签指导模型在这张图片上的分类结果。其本质是将模型预测拉向当前最邻近的类别(无论是否正确)。
直观来看,Pseudo Labels 并未改变模型实际的预测类别,只是提高了模型在无监督数据上的自信度(例如,有 50% 可能性是苹果的图片被标注为苹果加入训练集,模型经过优化后,判断其为苹果的可能性进一步提高)。
但是,这带来了两方面的好处:一方面,模型不仅能够正确解释有监督的数据,也能正确解释部分无监督数据了。
另一方面,随着模型预测自信度的增强,模型会更少地给出模棱两可的预测,增强模型的鲁棒性(49% 是猫 51% 是狗的图像,图像稍加变化可能就会改变模型的分类结果;反之则更为稳定)。
也有些工作解释说,强自信度的模型更加关注与个类有关的特征而不是与一些类有关的混合特征(强自信度的模型的分类边界不会穿过边际分布的高密度区域)。
后续的工作中,又有些人提出,可以通过熵衡量模型预测结果的自信程度,从而通过最小化熵将模型预测拉向当前最邻近的类别。
熵可以理解为系统的混乱程度(来自我的天文学老师),熵越高系统越混乱,事件的随机性越强(如果 49% 的可能出现猫 51% 的可能出现狗,那么系统中出现猫还是狗基本就不可控了);反之事件的随机性越弱。
因此,这些工作一般在有监督的数据上使用交叉熵作为损失(正常的分类损失),在无监督的数据上使用熵作为正则项,迫使模型在无监督的数据上作出低熵预测。这个正则项非常好实现:
import torch.nn as nn
import torch.nn.functional as F
class EntropyMinimizationLoss(nn.Module):
def __init__(self, reduction='mean'):
super(HLoss, self).__init__()
self.reduction = reduction
def forward(self, x):
entropy = -1.0 * F.softmax(x, dim=1) * F.log_softmax(x, dim=1)
if self.reduction == 'mean':
return entropy.mean()
if self.reduction == 'sum':
return entropy.sum()
return entropy
另一方面,也有些工作通过显式的后处理,人为地降低预测结果的熵。这种后处理方式在 MixMatch 中被称为 Sharpen(锐化)。锐化的过程可以用下式表达:
其中, 为模型预测样本属于某一类的概率, 为温度参数,一般为 2。锐化的实现也很简单,却能有效地获得低熵预测,增强模型对预测结果的自信度:
def sharpen(probabilities, T):
if probabilities.ndim == 1:
tempered = torch.pow(probabilities, 1 / T)
tempered = (
tempered
/ (torch.pow((1 - probabilities), 1 / T) + tempered)
)
else:
tempered = torch.pow(probabilities, 1 / T)
tempered = tempered / tempered.sum(dim=-1, keepdim=True)
return tempered
注:这里我特别把这两部分代码写出来,是因为在最近的 Kaggle 竞赛中,(在蛙神的讨论中)这些低熵方法(尤其是在 Ensemble 的过程中)取得了不俗的效果(尽管有时候容易被 shake down)。添加到现有模型也比较容易,各位同学取需。
[10] Entropy Minimization vs. Diversity Maximization for Domain Adaptation
[11] MixMatch: A Holistic Approach to Semi-Supervised Learning
2. 指向扰动后的自洽(Π-model / Temporal ensembling/ Mean Teacher / UDA)
也有的工作提出,尽管我们无法得知准确的无监督数据的标签,但是,针对同一个样本做不同的轻微扰动,模型得出的预测结果应当是相同的。
即增广后图像的预测应当与增广前(或其他增广方式产生的图像)的预测结果自洽。这种思路显著提高了模型在某个方面(取决于扰动的策略)的泛化能力。
现有工作一般使用无标签数据,经过两次不同增广(augment)之后,再使用两个模型(一般是同一模型结构,使用不同 dropout)分别对对应的变换后的样本进行预测。
因为训练样本本质上都是同一样本的轻微扰动,因此两个模型输出的概率分布应该尽可能相同。一般使用 MSE 计算两个概率分布之间的相似度作为损失,提升模型在不同扰动下的一致性。
在 Π-model 的基础上,研究者们进一步提出了 Temporal ensembling。在 Π-model 中,我们需要在一迭代时间内产生的图像的两种增广图像,但实际上并没有必要,因为这样一次迭代就需要推理两次模型,而且由于 batch 有限,生成增广的概率分布偶然性较大。
他们提出,使用时序组合模型,让来自历史迭代周期产生的预测结果与当前迭代周期产生的预测结果计算 MSE 进行比较。文中使用上一次迭代周期中的预测结果和当前周期的预测结果的加权和作为历史迭代周期产生的预测,有效地保留历史了信息,消除了扰动并稳定了当前值。
在此基础上一些研究者又提出了 Mean Teacher 和 UDA 等模型,尽管图像增广的方式、分布差异的度量、模型的 Ensemble 有所差异;但是其核心都是针对扰动的自洽损失。
[12] Temporal Ensembling for Semi-Supervised Learning
[13] Mean teachers are better role models: Weight-averaged consistency targets improve semi-supervised deep learning results
[14] Unsupervised Data Augmentation for Consistency Training
3. 指向对抗中的自洽(Virtual Adversarial Training)
随着自洽损失被人们广泛使用,一些工作认识到半监督学习的精髓在于保证不同扰动下模型预测的一致性,而要学习这种一致性就要找到更好添加扰动的策略。人为的数据增广无法模拟各种复杂情况的输入,那么能否让模型学习自适应地添加扰动呢?
虚拟对抗训练(Virtual Adversarial Training)使用反向传播和梯度上升来生成噪声样本作为扰动后的数据(即,寻找一个与原始样本十分接近的样本,使得分类器对其给出与原是样本一个非常不同的预测)。
在得到噪声样本后,我们使用原数据上的模型预测结果作为噪声样本的学习目标,训练模型在对抗生成的样本上仍能保持分类效果;与此同时训练有标签的训练样本进行正常的分类。这种思路常常被用于对抗样本生成任务中。
这些工作一般使用分类损失的正梯度方向作为扰动方向(在负梯度方向上模型的损失下降最快,导致正梯度方向上神经网络的盲区较大),通过在原图基础上添加扰动,生成噪声样本 。
我们希望通过在小范围内优化噪声样本使得加入扰动后的预测与原预测的差异(KL 散度) 尽可能大。
在获得噪声样本后,再将噪声样本加入训练集,训练模型将噪声样本的类别预测为原样本所对应的类别。最终的目标函数可以表示为:
[15] Virtual Adversarial Training: A Regularization Method for Supervised and Semi-Supervised Learning
后记
本文提到的自监督和半监督方法都是较为经典的算法,提供了最基础的思路和研究方向。近年来的研究不断在此基础上交叉(多个基础思想相结合)、变异(为了解决某个任务痛点进行魔改),新的方法已经屡次刷新 sota,但仍万变不离其宗。
根据我个人的研究进展,在 self-supervise 和 semi-supervise 坑里灌水仍有不小空间,但是由于系统化的理论比较少,我们在选择灌水方向时往往需要遵循“拆解-组合”(没错,多一步拆解)的步骤。
即,先将一篇文章中使用的 trick 拆解成不同小 trick,之后通过消融试验等选择有效的部分,和其他文章中的拆解出来的 trick 组合。至于有哪些前沿方法可以拆解,直接看 awesome list 和综述就可以了~
[16] Awesome self-supervised learning
[17] A survey on Semi-, Self- and Unsupervised Techniques in Image Classification
学习交流群
关注最新最前沿的自监督/半监督学习技术,扫码添加CV君拉你入群,(如已为CV君其他账号好友请直接私信)
(请务必注明:自监督/半监督 之一)
喜欢在QQ交流的童鞋,可以加52CV官方QQ群:805388940。
(不会时时在线,如果没能及时通过验证还请见谅)
长按关注我爱计算机视觉
上一篇: 有关tab选项的文章推荐10篇
下一篇: PHP与SQL注入攻击[二]_PHP教程