集成YYDS!让你的模型更快更准!
设为星标,干货直达!
集成学习是机器学习中重要的分支,比如常用的Bagging和Boosting方法,以及一些机器学习模型如Random Forest,AdaBoost也都属于集成学习的范畴。在深度学习领域,通过集成多个模型往往也能提升效果,但模型集成相比单个模型的效率并没有得到系统的研究。近期,Google的一篇论文Wisdom of Committees: An Overlooked Approach To Faster and More Accurate Models系统地研究了基于委员会的模型(committee-based models,即model ensembles or cascades)的效率问题,发现最简单的模型集成或级联方法就能达到甚至超过单个SOTA模型的精度,而且计算量和速度上更有优势,比如两个EfficientNet-B5模型集成可以达到EfficientNet-B7的精度,但是FLOPs降低了50%(20.5B vs 37B),而级联两个EfficientNet-B5模型同样能达到相同的精度,但FLOPs可以进一步降低到13.1B。论文虽然主要研究了模型集成和级联在图像分类问题上的效率,但也在其它任务上(视频分类和语义分割)做了进一步验证。本文将简单介绍这篇论文的主要研究内容以及结论。
模型集成
众所周知,集成多个模型往往能提升准确度,但引入了额外的计算量;如果固定计算量,那么模型集成是否能够超越单个模型呢?这里以三个不同的图像分类模型EfficientNet,ResNet和MobileNetV2在ImageNet数据集上的表现来研究这个问题,这个三个架构都包含一系列不同计算量和分类准确度的模型,比如EfficientNet从B0到B7,模型FLOPs增加的同时分类准确度也同步增加。对每个架构,可以训练很多的模型(对于同样的模型设定,可以采用不同的随机种子训练多个模型)来进行集成来和单个模型进行对比。
对于大计算量设置,达到同样的分类性能,模型集成要比单个模型在计算上更高效,比如对于EfficientNetB5/B6/B7和ResNet-152/200模型,集成后的模型的FLOPs要更小; 对于小计算量设置,达到同样的分类性能,单个模型比模型集成更高效,比如对于MobileNetV2模型,集成后的模型的FLOPs更大一些;
对于这种现象,可以用机器学习中的bias-variance tradeoff理论给出一个合理的解释。大模型拥有小的bias但大的variance,此时variance对测试误差影响较大,而模型集成能有效降低variance;但是小模型的bias大,此时bias往往主导测试误差,模型集成带来的variance收益无法抵消小模型bias的影响。
上面的实验可以看出对于大模型,通过模型集成可以在达到相同的性能时降低计算量,而且多个模型还可以并行计算从进一步加速。同时,模型集成的总训练时间也是优于单个模型的,比如两个EfficientNetB5模型的训练总时长为96,,比单个EfficientNetB7的训练时长160要小不少,但集成后与单个模型效果相当。
模型级联
模型集成虽然简单,但是存在计算冗余,因为大量的简单样本只需要单个模型就能给出正确的分类结果。一种有效降低计算量的方法是采用模型级联(model cascades),模型集成是并行计算多个模型,而级联是串行计算多个模型,它允许中间提前终止计算,从而减少计算量,具体如下:
模型级联涉及组合不同的模型,而且也需要确定阈值超参数,在特定的条件下,这就变成了一个寻优问题。假定为模型候选集(可用于级联的模型集合),并限制FLOPs不能超过,模型级联共选择个模型,阈值设定为,此时就需要求解一个约束优化问题:
模型级联计算的是平均FLOPs,对于少量的样本会用到所有的模型,此时FLOPs就是所有模型的FLOPs之和,这是最差的情况。某些实际的应用场景往往需要保证最大的计算延迟,此时在寻优过程中就需要加上这个限制:。基于这个新增约束,新的实验结果如下所示,可以看到模型级联在得到相似的分类性能下,不仅能够加速,而且也能保证最差的FLOPs小于单个模型。
自级联
模型级联需要训练多个模型,如果只有一个模型,其实也可以进行级联,只不过是改变输入图像的分辨率。大部分情况下,提升输入图像分辨率会提升模型效果(存在上限),据此,在单模型级联可以逐渐提升图像分辨率。论文实验2-model级联,如下表所示,可以看到单模型多尺度级联相比单个模型也能提升计算效率,比如B6模型在528和600尺度上级联,性能可以达到B7效果,而且加速1.6x。
模型级联缩放
单个模型可以进行缩放来得到不同FLOPs的模型,比如EfficientNet设计了一个统一缩放因子来缩放模型的depth,width和resolution:,这里。当时,就是EfficientNetB0模型,而对应EfficientNetB7模型。那么模型级联是否也能够缩放呢,比如已经建立了一个base模型级联,是否能对级联的模型进行缩放,从而得到不同FLOPs下的级联模型。这里建立一个3-model级联的模型C0来对应EfficientNetB0,建立C0的候选模型包括13个模型,它们的缩放因子分别为:-4.0, -3.0, -2.0, -1.0, 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.50, 1.75, 2.0 ,部分比EfficientNetB0小,部分比EfficientNetB0大,最终寻优得到的C0其级联模型为-2.0,0.0,0.75。有了C0,就可以对C0的3个模型分别进行缩放(增加),从而得到不同FLOPs的级联模型。具体的结果如下所示,构建的C0~C7可以和EfficientNetB0~B7得到相似的效果。
视频分类
与图像分类类似,视频分类模型最后的分类层也是预测logits,所以也可以用相同的方法对模型进行级联。这里以X3D架构和Kinetics-600数据集为例,X3D架构包括3个不同FLOPs的模型X3D-M,X3D-L和X3D-XL。对比结果如下表所示,可以看到无论是限定FLOPs还是分类准确度,级联后的模型均优于单个模型。
语义分割
对于语义分割,情况更复杂一些,因为语义分割预测图像中每个像素的分类logits,所以需要调整置信度函数。具体地,先计算每个像素点的最大预测概率值:,然后需要聚合所有像素的结果来得到整个图像的置信度,这里计算的是图像中所有像素点置信度的平均值:,这种方式比较简答粗暴,但是语义分割的一个现实难点是不同区域的分割难度可能不一样,如果只采用一个置信度来代表整个图像可能会不够准确,一个简单的解决方案是将图像分成不同的网格,对每个格子单独做级联。这里以DeepLabV3架构和Cityscapes数据集为例,建立一个2-model级联( DeepLabv3-ResNet-50和DeepLabv3-ResNet-101 ),具体的结果如下所示,这里的 指的是网格的大小,图像的输入为1024x2048大小,表示将图像分成8个网格。可以看到,如果不分成网格,虽然级联后模型的mIoU提升了但是FLOPs却增加了,如果分成网格能有加速效果。
小结
对于模型集成或者级联,直观上会觉得增加了计算成本,但如果合理设计后反而是提升计算效率,这在工业部署实践中还是有比较大的应用意义。不过对于比较复杂的任务如分割和检测,模型集成就需要比较特殊的设计。
参考
Wisdom of Committees: An Overlooked Approach To Faster and More Accurate Models
推荐阅读
PyTorch1.10发布:ZeroRedundancyOptimizer和Join
谷歌AI用30亿数据训练了一个20亿参数Vision Transformer模型,在ImageNet上达到新的SOTA!
"未来"的经典之作ViT:transformer is all you need!
PVT:可用于密集任务backbone的金字塔视觉transformer!
涨点神器FixRes:两次超越ImageNet数据集上的SOTA
不妨试试MoCo,来替换ImageNet上pretrain模型!
机器学习算法工程师
一个用心的公众号