设计高效的计算机视觉模型是一个具有挑战性但重要的问题:从自动驾驶汽车到增强现实的无数应用都需要高度精确的compact models——即使在功率、计算、内存和延迟方面受到限制。可能的约束和架构组合的数量非常大,使得手工设计几乎不可能。
尽管NAS在网路架构方面取得了非常好的结果,比如EfficientNet、MixNet、MobileNetV3等等。但无论基于梯度的NAS,还是基于super net的NAS,亦或基于强化学习的NAS均存在这几个缺陷
,作者提出了JointNAS,同时对网络架构与训练策略进行搜索,将网络架构与对应的训练策略通过NAS联合搜索,之前的NAS方法主要聚焦在网络架构,而没有在意网络性能验证时的训练参数的设置是否合适,这可能导致模型性能下降,而JointNAS可以在资源约束的情况下,搜索 最 准 确 的 训 练 参 数 以 及 网 络 结 构 \textcolor{red}{最准确的训练参数以及网络结构} 最准确的训练参数以及网络结构。
作为解决方案,最近的工作采用神经架构搜索(NAS)来设计最先进的高效深度神经网络。NAS的一个类别是可区分神经架构搜索(DNAS)。这些路径搜索算法是高效的,通常在训练一个网络所需的时间内完成一次搜索。然而,DNAS不能搜索对模型性能至关重要的非架构超参数。此外,基于超网的NAS方法受到搜索空间的限制,因为整个超图必须适合内存以避免缓慢的收敛[Proxylessnas]或paging。
其他方法包括强化学习(RL) [MnasNet]和进化算法(ENAS) [Large-scale evolution of image classifiers]。然而,这些方法都有几个缺点:
为了克服这些挑战,本文提出了Neural Architecture-Recipe Search(NARS)来解决上述限制。本文的见解有三个方面:
在顺序执行预测器预训练,约束迭代优化和基于预测器的进化搜索后,NARS产生了可概括的训练配方和紧凑的模型,在ImageNet上获得了最先进的性能,超过了所有现有的手动设计或自动搜索的神经网络。本文的贡献总结如下:
网 络 架 构 与 训 练 策 略 同 时 进 行 搜 索 \textcolor{red}{网络架构与训练策略同时进行搜索} 网络架构与训练策略同时进行搜索。这是之前的方法所并未尝试的一个点,之前的方法主要聚焦在网络架构,而训练方法则是采用比较常规的一组训练方式。
FBnetV3将网络架构与对应的训练策略通过NAS联合搜索。在ImageNet数据集上,FBNetV3取得了媲美EfficientNet与ResNeSt性能的同时具有更低的FLOPs(1.4x and 5.0x fewer);更重要的是,该方案可以跨网络、跨任务取得一致性的性能提升。
本文的目标是找到最准确的架构和训练方法组合,以避免像以前的方法那样忽略架构配方对。然而,搜索空间通常组合起来很大,不可能进行彻底的评估。为了解决这个问题,本文训练一个准确度预测器,该预测器接受架构和训练配方表示。为此,本文采用了一个三阶段流水线(算法1):
JointNAS,分粗粒度和细粒度两个阶段,对网络架构和训练超参都进行搜索。
粗粒度阶段(coarse-grained),该阶段主要迭代式地寻找高性能的候选网络结构-超参数对以及训练准确率预测器。
- 粗粒度搜索生成准确率预测器和一个高性能候选网络集, 这 个 预 测 器 是 一 个 多 层 感 知 器 构 成 的 小 型 网 络 \textcolor{green}{这个预测器是一个多层感知器构成的小型网络} 这个预测器是一个多层感知器构成的小型网络,包含了两个部分,一个代理预测器(Proxy Predictor),一个是准确率预测器(Accuracy Predictor)
- 预测器的结构如下图所示,包含一个结构编码器以及两个head,分别为辅助的代理head以及准确率head。代理head预测网络的属性(FLOPs或参数量等),主要在编码器预训练时使用,准确率head根据训练参数以及网络结构预测准确率,使用代理head预训练的编码器在迭代优化过程中进行fine-tuned。
- Neural Acquisition Function,即预测器,见上图。它包含编码架构与两个head:
- (1)Auxiliary proxy head用于预训练编码架构、预测架构统计信息(比如FLOPs与参数两)。注:网络架构通过one-hot方式进行编码;
- (2)精度预测器,它接收训练策略与网路架构,同时迭代优化给出架构的精度评估。
- Early-stopping,作者还引入一种早停策略以降低候选网络评估的计算消耗;
- Predictor training,得到候选网络后,作者提出训练50个epoch同时冻结嵌入层,然后对整个模型再次训练50个epoch。作者采用Huber损失训练该精度预测器。该损失有助于使模型避免异常主导现象(prevents the model from being dominated by outliers)。
细粒度阶段(fine-grained stages),借助粗粒度阶段训练的准确率预测器,对候选网络进行快速的进化算法搜索,该搜索集成了论文提出的超参数优化器AutoTrain。
本文的预测器旨在预测给定架构和训练配方表示的准确性。使用one-hot分类变量(例如,对于块类型)和最小-最大归一化连续值(例如,对于通道计数)对架构和训练配方进行编码。参见下表中的完整搜索空间。
本文实验中的网络结构配置和搜索空间。MBConv、MBPool、k、e、c、n、s、se和act。
分别参考逆残差块[MobilenetV2]、efficient last stage[MobilenetV3]、核大小、扩展、#通道、#层数、步幅、挤压-激励、激活函数。res、lr、optim、ema、p、d、m和wd分别指分辨率、初始学习率、优化器类型、EMA、dropout率、随机深度dropout概率、mixup率和权重衰减。
EMA:指数移动平均(Exponential Moving Average)也叫权重移动平均(Weighted Moving Average),是一种给予近期数据更高权重的平均方法。
- 假设我们有n个数据: [ θ 1 , θ 2 , θ 3 , . . . , θ n ] [θ_1,θ_2,θ_3,...,θ_n] [θ1,θ2,θ3,...,θn].平均数为 v ˉ = 1 n ∑ i = 1 n θ i \bar{v}=\frac{1}{n}\sum_{i=1}^n\theta_i vˉ=n1∑i=1nθi.
- EMA: v t = β ⋅ v t − 1 + ( 1 − β ) ⋅ θ t v_t=β·v_{t-1}+(1-β)·θ_t vt=β⋅vt−1+(1−β)⋅θt,其中 v t v_t vt表示前 t 部分的平均值,β为加权权重值(一般为0.9~0.999),v0=0
- 当 β = n − 1 n β=\frac{n-1}{n} β=nn−1时,EMA与普通的平均数两式形式上相等。
上面讲的是广义的ema定义和计算方法,特别的,在深度学习的优化过程中, θ t θ_t θt 是t时刻的模型权重weights, v t v_t vt是t时刻的影子权重(shadow weights)。在梯度下降的过程中,会一直维护着这个影子权重,但是这个影子权重并不会参与训练。基本的假设是,模型权重在最后的n步内,会在实际的最优点处抖动,所以取最后n步的平均,能使得模型更加的鲁棒。
实际使用中,如果令 v 0 = 0 v_0=0 v0=0,步数较少的情况下,ema的计算结果会有一定偏差。
理想的平均是绿色的,因为初始值为0,所以得到的是紫色的。因此可以加一个偏差修正(bias correction)。
v t = v t 1 − α t v_t=\frac{v_t}{1-\alpha^t} vt=1−αtvt
显然,当t很大时,修正近似于1。
令第n时刻的模型权重(weights)为 v n v_n vn,梯度为 g n g_n gn,可得:
- θ n = θ n − 1 − g n − 1 = θ n − 2 − g n − 1 − g n − 2 = θ 1 − ∑ i = 1 n − 1 g i θ_n=θ_{n-1}-g_{n-1}\\ =θ_{n-2}-g_{n-1}-g_{n-2}\\ =θ_{1}-\sum_{i=1}^{n-1}g_{i} θn=θn−1−gn−1=θn−2−gn−1−gn−2=θ1−i=1∑n−1gi
令第n时刻EMA的影子权重为 v n v_n vn ,可得:
v n = α v n − 1 + ( 1 − α ) θ n = α ( α v n − 2 + ( 1 − α ) θ n − 1 ) + ( 1 − α ) θ n = α n v 0 + ( 1 − α ) ( θ n + α θ n − 1 + α 2 θ n − 2 + . . . + α n − 1 θ 1 ) 代 入 上 面 θ n 的 表 达 , 令 v 0 = θ 1 展 开 上 面 的 公 式 , 可 得 : v n = θ 1 − ∑ i = 1 n − 1 ( 1 − α n − i ) g i v_n=\alpha{v_{n-1}}+(1-\alpha)\theta_n\\ =\alpha(\alpha{v_{n-2}}+(1-\alpha)\theta_{n-1})+(1-\alpha)\theta_n\\ =α^nv_0+(1-α)(θ_n+αθ_{n-1}+α^2θ_{n-2}+...+α^{n-1}θ_{1})\\ 代入上面 θ_n 的表达,令 v_0=θ_1 展开上面的公式,可得:\\ v_n=θ_1-\sum_{i=1}^{n-1}(1-α^{n-i})g_i vn=αvn−1+(1−α)θn=α(αvn−2+(1−α)θn−1)+(1−α)θn=αnv0+(1−α)(θn+αθn−1+α2θn−2+...+αn−1θ1)代入上面θn的表达,令v0=θ1展开上面的公式,可得:vn=θ1−i=1∑n−1(1−αn−i)gi
EMA对第i步的梯度下降的步长增加了权重系数 1 − α n − i 1-α^{n-i} 1−αn−i ,相当于做了一个learning rate decay。
斜线左边的扩展用于阶段中的第一个块,而右边的扩展用于其余块。括号中的三元组代表最低值、最高值和步长;二值元组意味着步长为1,括号中的元组表示搜索过程中所有可用的选择。请注意,如果optim选择SGD,lr将乘以4。
具有相同上标的架构参数在搜索期间共享相同的值。
预测器结构是一个多层感知器(下图),由几个完全连接的层和两个头组成:
在此步骤中,本文训练预测器并生成一组high-promise候选项。如前所述,本文的目标是在给定的资源限制下找到最准确的架构和训练方法组合。因此,本文将架构搜索公式化为约束优化问题:
max ( A , h ) ∈ Ω a c c ( A , h ) s . t . g i ( A ) ≤ C i , i = 1 , . . . , γ ( 1 ) \max\limits_{(A,h)\inΩ}~acc(A,h)\\ s.t.~g_i(A)\leq{C_i},i=1,...,γ~(1) (A,h)∈Ωmax acc(A,h)s.t. gi(A)≤Ci,i=1,...,γ (1)
其中A、h和Ω分别指神经网络架构、训练配方和设计的搜索空间。acc将架构和训练方法映射到准确性。gi(A)和γ是指资源约束的公式和计数,如计算成本、存储成本和运行时延迟。
本文首先使用准蒙特卡罗(QMC) [Random number generation and quasiMonte Carlo methods]抽样来从搜索空间生成架构-配方对的样本池。然后,迭代地训练预测器:本文的(a)通过基于预测精度选择有利候选的子集来缩小候选空间,(b)使用early-stopping试探法来训练和评估候选,以及©使用 H u b e r 损 失 \textcolor{blue}{Huber损失} Huber损失来微调预测器。候选空间的这种迭代收缩避免了不必要的评估并提高了探索效率。
Huber损失函数
相比平方误差损失,Huber损失对于数据中异常值的敏感性要差一些。在值为0时,它也是可微分的。它基本上是绝对值,在误差很小时会变为平方值。误差使其平方值的大小如何取决于一个超参数δ,该参数可以调整。当δ~ 0时,Huber损失会趋向于MAE;当δ~ ∞(很大的数字),Huber损失会趋向于MSE。当预测偏差小于 δ 时,它采用平方误差,当预测偏差大于 δ 时,采用的线性误差。
L δ ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2 f o r ∣ y − f ( x ) ∣ ≤ δ δ ∣ y − f ( x ) ∣ − 1 2 δ 2 otherwise L_δ(y,f(x))=\begin{cases} \frac{1}{2}(y-f(x))^2 &for|y-f(x)|\leqδ\\ δ|y-f(x)|-\frac{1}{2}δ^2 &\text{otherwise}\\ \end{cases} Lδ(y,f(x))={21(y−f(x))2δ∣y−f(x)∣−21δ2for∣y−f(x)∣≤δotherwise
δ 是 HuberLoss 的参数,y是真实值,f(x)是模型的预测值, 且由定义可知 Huber Loss 处处可导。δ的选择非常关键,因为它决定了你如何看待异常值。残差大于δ,就用L1(它对很大的异常值敏感性较差)最小化,而残差小于δ,就用L2“适当地”最小化。
def huber(true, pred, delta):
loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))
return np.sum(loss)
相比于最小二乘的线性回归,HuberLoss降低了对离群点的惩罚程度,所以 HuberLoss 是一种常用的鲁棒的回归损失函数。
Training candidates with early-stopping.
Training the predictor with Huber loss.
在仅配方搜索实验中,本文将early-stop等级相关阈值设置为0.92,并且发现对应的early-stop时期为103。在基于预测器的进化搜索中,本文将初始代的群体设置为100(来自约束迭代优化的50个最佳执行候选和50个随机生成的样本)。
从每个候选对象中产生24个子对象,并为下一代挑选前40名候选对象。大部分的设置都是由建筑和训练配方的联合搜索共享的,除了提早停止的纪元是108。准确度预测器由一个嵌入层(架构编码器层)和一个额外的隐藏层组成。对于联合搜索,嵌入宽度是24(注意,对于仅配方搜索,没有预训练的嵌入层)。对于联合搜索,本文将最小和最大FLOPs约束分别设置为400M和800M。
在约束迭代优化中选择m个性能最佳的样本包括两个步骤:
本文在下表中显示了详细的搜索训练配方。也发布搜索到的模型。
对于最终的模型,本文使用具有8个节点的分布式训练,并且通过分布式节点的数量来按比例增加学习速率(例如,对于8节点训练是8倍)。每个节点的批处理大小设置为256。本文在训练中使用标签平滑和自动增强。此外,本文将批量标准化参数的重量衰减和动量分别设置为零和0.9。
本文将EMA模型实现为原始网络的副本(它们在t = 0时共享相同的权重)。在每次反向传递和模型权重更新后,本文将EMA权重更新为:
w t + 1 e m a = α w t e m a + ( 1 − α ) w t + 1 , ( 2 ) w_{t+1}^{ema}=αw_t^{ema}+(1-α)w_{t+1},(2) wt+1ema=αwtema+(1−α)wt+1,(2)
其中 w t + 1 e m a w^{ema}_{t+1} wt+1ema、 w t e m a w^{ema}_t wtema和 w t + 1 w_{t+1} wt+1是指步骤t+1的EMA权重、步骤t的EMA权重和t+1的模型权重。本文在ImageNet、CIFAR-10和COCO上的实验中分别使用了0.99985、0.999和0.9998的EMA衰减α。本文在下图中进一步提供了FBNetV3-G的训练曲线。
Training curve of the search recipe on FBNetV3-G.
基线模型(例如AlexNet、ResNet、DenseNet和ResNeXt)采用PyTorch开源实现,没有任何架构变化。输入分辨率为224×224。
本文了解到EfficientNet不使用蒸馏。为了公平比较,本文报告了未经蒸馏的FBNetV3精度。本文在下表中提供了一个例子:与EfficientNet相比,在没有蒸馏的情况下,FBNetV3实现了更高的精度,同时FLOPs减少了27%。然而,本文所有的训练技巧(包括EMA和蒸馏)都在其他基线中使用,包括BigNAS和OnceForAll。
Generality of stochastic weight averaging via EMA.
本文观察到,通过EMA进行随机加权平均可以显著提高分类任务的准确性,如之前所述[Large scale gan training for high fidelity natural image synthesis,Momentum contrast for unsupervised visual representation learning]。本文假设这种机制可以作为一种通用技术来改进其他DNN模型。为了验证这一点,本文使用ResNet50和ResNet101主干,在COCO对象检测上训练RetinaNet。本文遵循大多数默认的训练设置,但引入了EMA和余弦学习率。本文观察到与分类任务相似的训练曲线和行为,如下图所示:
具有ResNet101主干的RetinaNet在COCO对象检测上的训练曲线。
生成的具有ResNet50和ResNet101主链的RetinaNets 分别达到40.3和41.9的mAP,两者都大大优于[Detectron2]中报道的最佳值(ResNet50和ResNet101分别为38.7和40.4)。一个有希望的未来方向是研究这样的技术,并将其扩展到其他DNNs和应用。