作者:Dominic Masters翻译:王可汗校对:欧阳锦本文约3300字,建议阅读5分钟本文为大家介绍了提升EffcientNet效率和性能的三个策略。

在实践中有更好性能的EfficientNet

在我们的新论文“Making EfficientNet More Efficient: Exploring Batch-Independent Normalization, Group Convolutions and Reduced Resolution Training”中,

我们采用了最先进的模型EfficientNet[1],该模型在理论上优化成为高效模型并研究了三种方法,使其在IPU上的实践中更高效。例如,添加分组卷积,已经被证明在IPU上表现良好,在理论计算成本最小的情况下,实际训练吞吐量实现了3倍提升。

结合调研的所有三种方法,我们在训练吞吐量上达到了7倍的提高,在IPU上的推理达到了3.6倍的提高,以达到相当的验证准确性。

模型训练的理论成本(通常以FLOPs来衡量)很容易计算,而且与所使用的硬件和软件堆栈无关。这些特征使它成为一种吸引人的复杂性度量,成为寻找更有效的深度学习模型的关键驱动因素。

然而,在现实中,这种训练成本的理论衡量和实践成本之间存在着显著的差异。这是因为一个简单的FLOP计数没有考虑许多其他重要的因素,比如计算结构和数据移动。

分组卷积的引入

我们研究的第一种方法是如何提高与深度卷积相关的性能(换句话说,组大小为1的组卷积)。EfficientNet将深度卷积用于所有空间卷积操作。它们以其FLOP和参数量中的效率而闻名,因此已经成功地应用于许多最先进的卷积神经网络(CNNs)。然而,在实践中,EfficientNet在加速方面遇到了若干挑战。

例如,由于每个空间核都需要独立考虑,因此,通常由向量乘积型硬件加速的点积操作的长度是有限的。这意味着硬件不能总是被充分利用,导致“浪费”了周期。

深度卷积(Depthwise convolutions)也有非常低的计算效率,因为它们需要大量的数据传输,相对于执行的FLOPs的数量,这意味着内存访问速度是一个重要的因素。虽然这可能会限制替代硬件上的吞吐量,但IPU的处理器中内存架构提供了高带宽的内存访问,这可以显著提高像这样的低计算效率操作的性能。

最后,深度卷积被发现是最有效的,当它们被夹在两个逐点(pointwise)的“投影”(projection)卷积之间,形成一个MBConv块。这些逐点卷积通过围绕空间深度卷积的“扩展因子”6增加或减少激活的维数。虽然这种扩展可以带来良好的任务性能,但它也会创建非常大的激活张量,这可能会主导内存需求,并最终限制可使用的最大批处理大小。

为了解决这三个问题,我们对MBConv块做了一个简单但重要的修改。我们将卷积的组大小从1增加到16;这将带来更好的IPU硬件利用率。然后,为了补偿FLOPs和参数的增加,并解决内存问题,我们将扩展因子降低到4。这将带来一个更高效的内存和计算紧凑的EfficientNet版本,我们称之为G16-EfficientNet。

虽然这些改变主要是由于吞吐量的提高,但我们也发现,在所有模型大小上,它们使我们能够实现比普通的组大小为1 (G1-EfficientNet)基线模型更高的ImageNet验证精度。这一修改导致了实际效率的显著提高。

G1-EfficientNet(基线)与G16(我们的)的理论(左)和实际(右)效率的比较。

代理归一化激活

对卷积和矩阵乘法运算的输出进行归一化已经成为现代CNN的一个基本操作,其中批处理归一化(Batch Normalization)是用于此目的的最常见的形式方法。然而,批处理归一化引入的批大小限制是一个众所周知的问题,它引发了一系列独立于批的替代方法的创新。虽然许多方法在ResNet模型中工作得很好,但我们发现它们都没有达到与EfficientNet的批处理归一化相同的性能。

为了解决批处理归一化替代方法的缺乏问题,我们利用了在最近的一篇论文中介绍的新的批无关的归一化方法——代理归一化(Proxy Normalization)。这种方法建立在已经成功的组(和层)归一化方法的基础上。

组归一化和层归一化受到一个问题的影响,即激活可能成为通道上的非归一化。随着深度的增加,这个问题变得更糟,因为非归一化在每个层面都凸显出来。虽然这个问题可以通过简单地减少组归一化中的组大小来避免,但是,这种组大小的减少将改变表达性并降低性能。

代理归一化提供了一个更好的解决方案,它保留了表达性,同时抵消了两个主要的非归一化来源:仿射变换和激活功能,遵循组归一化或层归一化。具体来说,通过将群范数或层范数的输出同化为一个高斯“代理”变量,并对这个代理变量应用相同的仿射变换和相同的激活函数来抵消非归一化。然后使用非归一化代理变量的统计数据来纠正真实激活中的预期分布偏移。

代理归一化允许我们将组大小最大化(即使用层归一化),即使不存在通道非归一化问题,代理归一化仍然保持了表达能力。

带有附加代理归一化激活操作的卷积块(红色)。

相关论文[2]详细探讨了这种新的归一化技术。

重要的是,这种方法并没有模仿批归一化的任何隐含的正则特征。由于这个原因,在这个工作中需要额外的正则化,我们使用混合和剪切混合的组合。在比较层归一化+代理归一化(LN+PN)与两个批归一化 (BN)基线模型在标准预处理和AutoAugment (AA)下的性能时,我们发现LN+PN在整个模型尺寸范围内都匹配或超过了BN的标准预处理性能。此外,LN+PN几乎和在AA上的BN一样好,尽管AA需要昂贵的训练增广参数的过程。

对不同规模的EfficientNet的不同归一化方法进行比较。

降低分辨率训练

Touvron等人(2020)[3]表明,通过使用比最初训练更大的图像对最后几层进行训练,然后进行微调可以获得显著的精度增益。由于这个微调阶段的成本非常低,因此很明显,这将实现一些实际的训练效率效益。这提出了一些更有趣的研究问题。如何选择训练方案以使效率最大化?考虑到较大的图像测试速度较慢,这如何影响推理效率?

为了研究这些问题,我们比较了两种不同分辨率下的训练,一种是“原生”分辨率(如最初的EfficientNet工作中定义的),另一种是大约一半的像素数。然后我们对各种尺寸的图像进行微调和测试。这使我们能够研究训练分辨率对效率的直接影响,并确定帕累托最优组合,以实现训练和推理的最佳速度-精度折衷。

在比较训练效率时,我们考虑了两种测试场景:在“原生”分辨率上进行测试,或者选择“最佳”分辨率,以在整个分辨率范围内最大化验证精度。

当测试在“原生”分辨率,我们看到训练一半大小的图像产生相当大的理论和实际效率的提高。值得注意的是,对于给定的模型大小,我们发现在一半分辨率下的训练和在“原生”分辨率下的微调甚至比在“原生”分辨率下的训练、微调和测试产生更高的最终精度。这一结论表明,对于ImageNet训练,我们应该始终以比训练时更高的分辨率进行测试。我们现在希望了解这是否也适用于其他领域。

如果我们接下来允许自己在“最佳”图像分辨率进行测试,我们会看到在原生分辨率下的训练在最终精度上有显著的提高,缩小了帕累托前沿的差距。

然而,应该注意到,为了实现这一点,“原生”训练方案的“最佳”测试分辨率最终要比使用一半训练分辨率情况的测试分辨率大得多。这意味着在推理时间它们会更久。

这些结果突出了三种改进对训练效率的改善:

(i)组卷积[G16(我们的研究)vs G1];

(ii)代理归一化激活[LN+PN (我们的) vs GN];

(iii)一半分辨率训练[half(我们的) vs Native]。

注意,基线结果没有进行微调,使用的是原生图像分辨率。

通过比较推理本身的效率,我们可以看到,在一半分辨率下的训练在整个精度范围内产生帕累托最优效率。这是一个显著的结果,因为在推理中根本没有直接的FLOP优势。此外,沿半分辨率推理效率Pareto前沿的点仍然是训练吞吐量的最优点。

理论和实践推理效率。在所有的分辨率上测试;线条突出了帕累托锋面。

在所有模型的效率中,具有代理归一化的模型的表现与具有组归一化的模型相当或略好。这源于精确度的提高,而吞吐量的成本仅为~10%。然而,重要的是,具有代理归一化的模型在整个帕累托前沿使用更少的参数,突出了代理归一化在模型大小方面的效率方面的额外好处。

如何让EfficientNet更高效

在进行这项研究时,我们看到了对EfficientNet模型的几个改进,以提高训练和推理的整体效率。

  • 通过在MBConv块中添加组卷积和降低扩展率,我们提高了空间卷积的IPU硬件利用率,降低了内存消耗。

  • 通过使用一半分辨率的图像进行训练,我们减少了训练时间,并显著地取得了较好的最终精度。

  • 通过利用新的归一化方法——代理归一化,我们在不依赖批处理信息的情况下匹配了批归一化的性能。据我们所知,这是EfficientNet实现这一目标的第一种方法。

综合使用这些方法,我们在IPU上的实际训练效率提高了7倍,实际推理效率提高了3.6倍。这些结果表明,当使用适合处理组卷积(如IPU)的硬件时,EfficientNet可以提供训练和推理效率,使其超越理论,面向实际的、真实的应用。

请阅读我们的论文。

https://arxiv.org/abs/2106.03640

References

[1] M. Tan, Q. V. Le, EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks (2019), arXiv 2019

[2] A. Labatie, D. Masters, Z. Eaton-Rosen, C. Luschi, Proxy-Normalizing Activations to Match Batch Normalization while Removing Batch Dependence (2021), arXiv 2021

[3] H. Touvron, A. Vedaldi, M. Douze, H. Jégou, Fixing the train-test resolution discrepancy: FixEfficientNet (2020), NeurIPS 2019

原文标题:

How we made EfficientNet more efficient

原文链接:

https://towardsdatascience.com/how-we-made-efficientnet-more-efficient-61e1bf3f84b3

编辑:王菁

校对:林亦霖

译者简介

王可汗,清华大学机械工程系直博生在读。曾经有着物理专业的知识背景,研究生期间对数据科学产生浓厚兴趣,对机器学习AI充满好奇。期待着在科研道路上,人工智能与机械工程、计算物理碰撞出别样的火花。希望结交朋友分享更多数据科学的故事,用数据科学的思维看待世界。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

独家 | 使EfficientNet更有效率的三种方法(附链接)相关推荐

  1. C 程序更有效率的 10 种方法

    转至:http://blog.chinaunix.net/space.php?uid=26495963&do=blog&id=3062636 任何代码的美丽不仅在于找到一个给定的问题的 ...

  2. 让你的C程序更有效率的10种方法

    PS:原文翻译的有些地方不太确切,尤其是对于第7点static的使用的翻译容易引起误解,故稍做调整,如有妥之处,还请谅解! 任何代码的美丽不仅在于找到一个给定的问题的解决方案,还在它的简单性,有效性, ...

  3. 独家 | Python处理海量数据集的三种方法

    作者:Georgia Deaconu 翻译:陈超 校对:欧阳锦本文约1200字,建议阅读5分钟 本文介绍了Python处理数据集的方法. 作为一名数据科学家,我发现自己处理"大数据" ...

  4. 实现挂视频的三种方法

    实现挂视频的三种方法 前言 第一种方法:phthon+selenium 第二种方法:使用油猴扩展 第三种方法:使用标签按钮 记录几个坑 前言 2022-8-19 更新0.2版脚本 需要在某学习课堂挂视 ...

  5. excel 删除空白列的三种方法,以及如何批量删除空行空列

    详见:excel删除空白列的三种方法,以及如何批量删除空行空列 本人更倾向于第三种方法: excel删除空白列方法三: 按ALT+F11,打开VBE编辑器,插入--模块,复制下面代码,然后按F5键,运 ...

  6. python三种方法开根号(穷举法、二分法、牛顿拉夫逊法)

    文章目录 方法一:穷举法 方法二:二分法 方法三:牛顿-拉夫逊算法 总结 方法一:穷举法 positive_num = int(input("输入一个正数:")) #无穷逼近法 a ...

  7. android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法

    @Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...

  8. 独家 | 将时间信息编码用于机器学习模型的三种编码时间信息作为特征的三种方法...

    作者:Eryk Lewinson 翻译:汪桉旭 校对:zrx本文约4400字,建议阅读5分钟 本文研究了三种使用日期相关的信息如何创造有意义特征的方法. 标签:时间帧,机器学习,Python,技术演示 ...

  9. html这一段div居中显示,使一个div居中显示的三种方法

    使一个我自址哈这工边识框处己按后大都加控不架的div居中显示比抖朋要插支一圈不者地器享说几的三种方法 1. div居中 /*第一种方法*/ div{ width: 200px; height: 200 ...

最新文章

  1. html表单c 后台如何接受,前台提交整个表单数据,后台实体类接收
  2. iOS 工程师被要求写小程序,过分吗?| 每日趣闻
  3. 由点到面 旅游让丝路明珠敦煌更加智慧
  4. ASP.NET生成缩略图类C#代码
  5. 红帽linux更新指令,CentOS7.0命令更新新版特性详解
  6. ITK:自适应直方图均衡图像滤波器
  7. Ubuntu Terminal Shortcut
  8. Linux下使用curl
  9. Linux学习-逻辑滚动条管理员 (Logical Volume Manager)
  10. 前端如何更精准的评估开发时间
  11. 2012总结--第5篇--人脉篇
  12. VSCode 写python,打印中文输出乱码
  13. linux 线程的基本知识
  14. [Python爬虫] 3-数据解析(lxml/bs4/正则)
  15. PHP Encoder (ioncube 10) 加密工具的使用
  16. 南京大学计算机实验教程,南京大学 计算机系统基础 课程实验 2018(PA2)
  17. 出圈!迅镭激光切割设备亮相热播剧《麓山之歌》
  18. 这有几个常见的电脑故障解决方法,需要的朋友快来
  19. 专有名词collect
  20. SqlServer无备份下误删数据恢复

热门文章

  1. 【c语言】蓝桥杯算法训练 薪水计算
  2. Open*** 配置参数详解
  3. UVA 11491 Erasing and Winning 奖品的价值 (贪心)
  4. Java中的多线程编程(超详细总结)
  5. keras技巧——如何获取某一个网络层的输出
  6. 从具体案例了解知识图谱
  7. 创新方法系列 如何找联系 符号化就是找数学中的等于==关系,遇到等号请留意
  8. logsoftmax(dim=1)是对批量样本中的每个样本取概率,而不是针对每个特征
  9. UCI机器学习数据集库
  10. A.CPP (blur.CPP)如何调用B.CPP (zeros.cpp)中定义的方法