炼丹诀窍?卷积神经网络的缩放策略

  • 2021 年 3 月 17 日
  • AI

Facebook FAIR团队的一次对模型缩放的系统性分析。


图源网络

当一个深度学习算法工程师在工作时,TA具体在做什么?

算法工程师们通常将对神经网络的训练称为“炼丹”。深度学习作为一门实验性质很强的学科,依赖大量的实验技巧,需要对相关的超参数进行调节。因此工程师也会戏称自己为“调参侠”。


这其中,一些和模型结构相关的参数尤为重要:在设计一个网络时,往往需要先验证一个基线模型,这个基线模型的计算复杂度不高;然后对这一基线模型的结构进行缩放,以提升模型的复杂度,使其拥有更强的表达能力。主要的缩放策略便是对模型的宽度(w)、深度(d)和分辨率(r)进行调整


图源网络

最近的一篇文章通过对缩放策略的分析,得出了一种Fast Compound Scaling策略,先看结论:先对模型宽度进行缩放,深度和分辨率次之。这一策略下得出的模型,能够带来相似精度下,更高的推理速度。

图源[1]

虽然已经被结论给“剧透”了,我建议还是跟着文章一步步推演,顺便检验是否真正掌握了卷积网络的一些基础知识。

首先,我们需要分析缩放策略对模型复杂度的影响。为了衡量模型复杂度,引入三个指标:f(flops,浮点运算次数,表示模型的计算量),p(parameters,可学习的模型参数个数,表示模型的参数量),a(activations,表示卷积层激活输出张量的个数)。

在一个CNN卷积神经网络中,通常包括卷积层、池化层、BN层。但在进行复杂度的分析时,往往只考虑卷积层,而忽略占比较小的其他部分。因此,考虑一个标准卷积层:k*k的卷积核,输入/输出通道数均为w,输入/输出特征长宽为r。那么我们得到其复杂度为:

(算错的可以去面壁了)

进一步的,让k=1,并且考虑卷积网络的深度d(即由d个卷积层构成),可以得到:

从这个公式可以推导出:如果我们定义一个缩放因子s,分别对深度d、宽度w和分辨率r进行缩放,使得模型的flops缩放为s倍。那么,调整宽度w,对a这一指标的增加是最小的。(详见下图)

类似的如下图,我们定义一个缩放因子s,同时对d、w、r的多个进行缩放,使得模型的flops缩放为s倍。有趣的是,EfficientNet论文中通过经验得出的缩放系数1.2*d、1.1*w、1.15*r,恰巧近似于同时对dwr进行缩放,并且s=2。实验和理论殊途同归。

除了标准卷积外,还可以对组卷积、深度可分卷积(组卷积的特殊情况)做同样的复杂度建模。

考虑一个组卷积,输入输出的通道数是w,分组的数量是w/g (每组的通道数是g,对于深度可分卷积g=1),那么它的复杂度为:

类似的可以得到下图的关系:

接下来,我们都关注更快、更高精度的模型,所以我们需要寻找影响模型运算速度的关键因素。也就是说,衡量对于不同的计算量f,参数量p,激活输出量a的缩放策略,模型的运算速度如何变化。

下图是在多个模型下的运算速度(epoch time)分别与f、p、a的关系,不同颜色的点表示不同的模型及缩放策略,黑色表示对多个模型结果的拟合,并求这条拟合线的Pearson相关系数。

从中可以得出有意思的结论是:

  • 运算量flos、参数量parameters,均与运算速度弱相关;

  • activations与运算速度强相关(0.99和0.95),因此可以采用activations作为运算速度的代理指标。


综上,既然activations可以作为运算速度的指标,那么一个缩放策略需要在增加模型复杂度的同时,尽可能带来最小的activation增加。(前面的几个表格告诉我们:对模型宽度w进行提升,影响最小)。

然而,深度学习之所以为深度学习,便在于更深、分辨率更高的网络能够带来更好的性能。因此,在增加w的同时,也要增加d和r。

文中引入fast compound model scaling:优先增加模型宽度,同时少量增加深度和分辨率。为此引入参数alpha,和如下公式。(alpha一般的取值范围在(1/3, 1)之间比较合适。)

当指定一个缩放系数s时,有

至此完成了理论的推演,接下来是实验部分,不再赘述,感兴趣的朋友可以公众号回复“20210315”获取原文。总之就是将这一缩放策略应用于多个基线模型上,都能够提升速度,且精度接近或达到最佳精度。

有用的炼丹技巧又增加了!

参考资料:

[1] //arxiv.org/abs/2103.06877

– END –

新朋友们可以看看我过往的相关文章

【相关推荐阅读】


自动驾驶中的corner cases

AI的复杂度守恒

神经网络的深度 vs 宽度

人脑的算力估算


长按二维码关注我