本文除了讨论了众所周知的深度/宽度/分辨率之外,还提出网络的"数目"应该是有效模型缩放的新维度。也因此提出了SplitNet;据作者称,这是首次提出此类讨论的工作,可引入现有CNN网络中(如EfficientNet、SE-ResNet等),涨点明显!
本文转载自:AI人工智能初学者
作者单位:港中文, AIRS, 浙江大学
论文: https:// arxiv.org/abs/2011.1466 0
项目源代码: https:// github.com/mzhaoshuai/S plitNet-Divide-and-Co-training
注:文末附CV学习交流群
1、简介
神经网络的宽度很重要,因为增加宽度必然会增加模型的容量。但是,网络的性能不会随着宽度的增加而线性提高,并且很快就会饱和。
为了解决这个问题,作者提出增加网络的数量,而不是单纯地扩大宽度。为了证明这一点,将一个大型网络划分为几个小型网络,每个小型网络都具有原始参数的一小部分。然后将这些小型网络一起训练,并使它们看到相同数据的各种视图,以学习不同的补充知识。在此共同训练过程中,网络也可以互相学习。
实验结果表明,与没有或没有额外参数或FLOP的大型网络相比,小型网络可以获得更好的整体性能。这表明,除了深度/宽度/分辨率之外,网络的数量是有效模型缩放的新维度。通过在不同设备上同时运行,小型网络也可以比大型网络实现更快的推理速度。
2、相关工作
神经网络结构设计
自从AlexNet的得到非常好的效果以后,深度学习方法便成为计算机视觉领域的主导,神经网络设计也成为一个核心话题。AlexNet之后出现了许多优秀的架构,如NIN、VGGNet、Inception、ResNet、Xception等。很多研究者设计了高效的模型,如1*1卷积核、用小核堆叠卷积层、不同卷积与池化操作的组合、残差连接、深度可分离卷积等。
近年来,神经网络结构搜索(NAS)越来越受欢迎。人们希望通过机器学习方法自动学习或搜索某些任务的最佳神经结构。在这里只列举几个,基于强化学习的NAS方法、渐进式神经架构搜索(PNASNet)、可微分架构搜索(DARTS),等等。
协同学习
协同学习最初是教育中的一个总称,指的是学生或教师共同努力学习的教育方法。它被正式引入深度学习中,用来描述同一网络中多个分类器同时训练的情况。
然而,按照其最初的定义,涉及两种或两种以上模型共同学习的作品,也可以称为协作学习,如深度相互学习(deep mutual learning, DML)、联合训练、互意教学、合作学习、知识蒸馏等。虽然有不同的名字,但核心思想是相似的,即通过一些同伴或老师的训练来提高一个或所有的模型的性能。
3、本文方法
这里先简单回顾了常用的深度图像分类框架。给定一个神经网络模型M和N个训练样本有C类,训练M模型最常用的损失函数是交叉熵损失函数:
其中y为ground truth label;p为估计概率,通常由M的最后softmax层给出。
分割模型
上图中根据网络的宽度将一个大网络M划分为S个小网络。当按宽度划分时,实际上指的是按参数量或FLOPs划分。
.1、如何计算参数量和FLOPs?
.2、如何切分网络?
通常,其中为常数。因此,如果想通过除以因子S来分割卷积层,只需要用除以:
1)切分ResNet
举例如下:如果我们想分割一个ResNet的Bottleneck Block:
通过除以2可以得到如下的4个小的Blocks:
这里每个Block只有原来Block的四分之一的参数量和FLOPs。
在实际应用中,网络中特征映射的输出通道数具有最大公约数(GCD)。大多数ResNet变体的GCD是第一卷积层的。对于其他网络,比如EfficienctNet,他们的GCD是8或者其倍数。一般来说,当想一个网络切分为S块时,只需要找到它的GCD,然后用就可以了。
# The below is the same as max(widen_factor / (split_factor ** ) + 0.4, 1.0)
if arch == 'wide_resnet50_2' and split_factor == 2:
self.inplanes = 64
width_per_group = 64
print('INFO:PyTorch: Dividing wide_resnet50_2, change base_width from {} '
'to {}.'.format(64 * 2, 64))
if arch == 'wide_resnet50_3' and split_factor == 2:
self.inplanes = 64
width_per_group = 64 * 2
print('INFO:PyTorch: Dividing wide_resnet50_3, change base_width from {} '
'to {}.'.format(64 * 3, 64 * 2))
2)切分ResNeXt
这意味着只需要通过channel数量除以S便可以得到d组小的Block。
self.dropout=Noneif'cifar'indataset:ifarchin['resnext29_16x64d','resnext29_8x64d','wide_resnet16_8','wide_resnet40_10']:ifdropout_pisnotNone:dropout_p=dropout_p/split_factor# You can also use the below code.# dropout_p = dropout_p / (split_factor ** )print('INFO:PyTorch: Using dropout with ratio {}'.format(dropout_p))self.dropout=nn.Dropout(dropout_p)elif'imagenet'indataset:ifdropout_pisnotNone:dropout_p=dropout_p/split_factor# You can also use the below code.# dropout_p = dropout_p / (split_factor ** )print('INFO:PyTorch: Using dropout with ratio {}'.format(dropout_p))self.dropout=nn.Dropout(dropout_p)
.3、权重衰减
.4、小型网络的并发运行
尽管小网络具有更好的集成性能,但在大多数情况下,小网络也可以通过在不同的设备上部署不同的小型模型,并且通过并发运行来实现比大网络更快的推理速度。如图所示。
典型的设备是NVIDIA的GPU。理论上,如果一个GPU有足够的处理单元,例如流处理器、CUDA核等,小型网络也可以在一个GPU内并发运行。然而,一个小的网络已经能够占用大部分的计算资源,不同的网络只能按顺序运行。因此,本文只讨论多设备的方式。
小网络并发推理的成功也表明了训练并发性的可能性。目前,小网络在训练过程中是按顺序运行的,导致训练时间比大网络长。
然而,设计一个灵活的、可伸缩的框架是相当困难的,它能够支持在多个设备上对多个模型进行异步训练,并且在前向推理和反向传播的过程中也需要进行通信。
联合训练
一个大网络M分割后变成S个小网络。现在的问题是如何让这些小网络从数据中学习不同的互补知识。在引入联合训练部分之前,强调划分和联合训练的设计只是为了说明增加网络数量是有效模型缩放的一个新维度的核心思想。
而联合训练部分是由deep mutual learning(DML)、co-training和mutual mean-teaching(MMT)所启发的。
不同的初始化方式和数据views
一个基本的理解是学习一些相同的网络是没有意义的。相比之下,小型网络则需要学习有关数据的互补的知识,以获得一个全面的数据理解。
为此,首先,对小网络进行不同权值的初始化。然后,在输入训练数据时,对不同网络的相同数据使用不同的数据转换器,如上图所示。这样,小模型便可以在不同的变换域下进行学习和训练。
在实际应用中,不同的数据域是由数据增广随机性产生的。除了常用的随机调整/剪切/翻转策略外,作者还进一步介绍了随机擦除和AutoAugment 策略。AutoAugment 有14个图像变换操作,如剪切,平移,旋转,自动对比度等。该算法针对不同的数据集搜索了几十种由两种转换操作组成的策略,并在数据扩充过程中随机选择一种策略。
源码如下:
train_transform = ([(32, padding=4),
(),
CIFAR10Policy(),
(),
((0.4914, 0.4822, 0.4465),
(0.2023, 0.1994, 0.2010)),
(p=erase_p,
scale=(0.125, 0.2),
ratio=(0.99, 1.0),
value=0, inplace=False),
])
联合训练损失函数
遵循半监督学习中共同训练的假设,小网络虽然对x的view不同,但对x的预测是一致的:
因此,在目标函数中加入预测概率分布之间的Jensen-Shannon(JS)散度,即联合训练损失函数:
其中是一个小网络的估计概率,是分布p的Shannon熵。联合训练损失也用于DML中,但具体形式不同,即DML使用的是两种预测之间的KullbacLeibler(KL)散度。通过这种联合训练的方式,一个网络还可以从它的同伴那里学到一些有价值的东西,因为预测的概率包含有关于物体的有意义的信息。
例如,一个将一个物体分类为Chihuahua的model可能也会对Japanese spaniel有很高的信心,因为它们都是狗。这是有价值的信息,定义了对象上丰富的相似结构。
总体目标函数为:
损失函数源码如下:
def _co_training_loss(self, outputs, loss_choose, epoch=0):
"""calculate the co-training loss between outputs of different small networks
"""
weight_now =
if self.is_cot_weight_warm_up and epoch < _warm_up_epochs:
weight_now = max( * epoch / _warm_up_epochs, 0.005)
if loss_choose == 'js_divergence':
# the Jensen-Shannon divergence between p(x1), p(x2), p(x3)...
# https://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence
outputs_all = torch.stack(outputs, dim=0)
p_all = (outputs_all, dim=-1)
p_mean = (p_all, dim=0)
H_mean = (- p_mean * (p_mean)).sum(-1).mean()
H_sep = (- p_all * (outputs_all, dim=-1)).sum(-1).mean()
cot_loss = weight_now * (H_mean - H_sep)
else:
raise NotImplementedError
return cot_loss
4、实验
、各个Backbone的增益
通过上图可以看出:增加网络的数量比单纯增加网络的宽度/深度更有效。
、性能对比
通过上图可以看出:整体性能与个体性能密切相关。
、CIFAR-100实验结果
通过上表可以看出:必要的网络宽度/深度很重要。
、序列和并发之间的推断延迟实验
参考:
[1].SplitNet: Divide and Co-training
[2].https://github.com/mzhaoshuai/SplitNet-Divide-and-Co-training
CVer-学术交流群
建了CVer微信交流群!想要进计算机视觉学习交流群的同学,可以直接加微信号:CVer5555。加的时候备注一下:研究方向+学校+昵称,即可。然后就可以拉你进群了。
强烈推荐大家关注CVer知乎账号和CVer微信公众号,可以快速了解到最新优质的CV论文。
推荐阅读
重磅!中山大学提出行人重识别新方法和史上最大数据集SYSU-30k,已开源!
AAAI 2021 | 上海交大等提出R3Det:旋转目标检测网络,代码已开源!
北京大学等提出SR新模块!通过Squeeze Reasoning实现高效的场景理解
冠军解决方案!用于脑肿瘤分割的nnU-Net改进
刷新WIDER Face纪录!TinaFace:人脸检测新网络,代码已开源!
这个AI能帮你女朋友自拍!从照片生成3D视频,总有个角度让她满意
STTR:基于Transformers的立体深度估计网络,代码已开源!
用GAN生成70岁的你!还可以重返17岁,代码已开源!ECCV 2020 Adobe等新研究
WACV2021 | 用于小目标检测的FPN中的高效融合因子
综述 | 对比自监督学习技术:全面调研
85.4 mIOU!NVIDIA:使用多尺度注意力进行语义分割
深入研究Label Smoothing(标签平滑)
使用PyTorch时,最常见的4个错误
NeurIPS 2020 | Auto-Panoptic:用于全景分割的协作式多组件体系结构搜索
NeurIPS 20 | RelationNet++: Transformer桥接视觉表示的目标检测
利用YOLOv4和Deep SORT实现多摄像头实时目标跟踪和计数(已开源)
NeurIPS 20 | 超越EfficientNet!TinyNet:玩转网络的分辨率,深度和宽度
涨点技巧!汇集13个Kaggle图像分类项目的性能提升指南
利用知识蒸馏改进目标检测:面向准确高效的检测器
使用深度学习从视频中估计车辆的速度(已开源)
ECCV 2020 | 旷视开源LabelEnc:提升目标检测的新型中间监督方法
这9个技巧让你的PyTorch模型训练得飞快!
牛津博士论文 | 学习重建和分割3D目标(143页PDF)
谷歌刚刚发布Objectron新数据集,可完美检测3D目标,超过4百万幅图像和15K视频剪辑!
综述 | MIT提出视频理解/行为识别:全面调研(2004-2020)
综述 | 基于无人机的目标跟踪的相关滤波器:全面调研
从三个维度加速你的CNN:全面的剪枝框架
Recall Loss:用于不平衡图像分类和语义分割的召回损失
即插即用!Rotate to Attend:卷积Triplet注意力模块
旷视提出MegDetV2:目标检测/实例分割系统
综述 | 基于深度学习的医学图像分割技术:全面调研
ResNet还是DenseNet?即插即用的DS涨点神器来了!
综述 | 基于深度学习的端到端人脸识别技术:全面调研
综述 | 行人检测技术(从手工特征到深度学习):全面调研
超越EfficientNets!无需注意力,也能让你的网络更快更强!
OpenCV 4.5来了!更强的SIFT,改进RANSAC算法,新增目标跟踪网络SiamRPN++
综述 | 基于深度学习的实时语义分割方法:全面调研
涨点神器!南航提出AFF:注意力特征融合
NeurIPS 2020 | 谷歌大脑提出:重新思考预训练和自训练
NeurIPS 2020 | 用于图像复原/恢复的神经稀疏表示
NeurIPS 2020 | aLRPLoss:统一目标检测中的分类和定位的平衡损失函数
CCE:具有互补交叉熵的不平衡图像分类
谷歌地标检索2020 Kaggle 第一名解决方案
ECCV 2020 | NAS-DIP:通过NAS实现DIP(去噪/去雾/超分辨率/修复等)
综述 | 小样本学习:全面调研(Few-shot)
使用深度神经网络从Noisy Labels中学习:全面调研
剪枝filter?还是剪枝layer?这是个问题
ECCV 2020 | WeightNet:重新探索Weight网络的设计空间
ECCV 2020 | 53.5 AP!PAA:用于目标检测的IoU预测的概率Anchor分配
ECCV 2020 | 南京理工提出FPT:特征金字塔Transformer
ECCV 2020 | BMask R-CNN:边界保持的Mask R-CNN
ECCV 2020 | 即插即用!PSConv:将特征金字塔压缩到紧凑