来源:MIT,MIT-IBM Waston AI Lab,paper,ICLR20

总的来说,本文有一下几点值得关注

  • 采用了一次性训练超网并抽取子网的方式,个人感觉这是 cascade 等多阶段思路的延续,及后续网络只是进一步细化/处理较难任务,网络前期就已经有分类能力了
  • 为了增强抽取子网的效果,提出了 PS 的训练方法,训练过程感觉作者说的不是很清楚,感觉是通过多种 loss 共同作用训练子网,同时以共享参数的方式保证超网不会受到太大影响
  • 值得注意的是,即使没有使用PS,从超网中抽取子网依旧是可行的,虽然会有一定准确率的损失,但是依旧是一个不错的结果。

Abstract

  • 为了使深度模型适应特殊的硬件结构,常见的方法是手工设计或者使用 AutoML 来遍历所有的 case 寻找解决方案
  • 本文使用的 Once for all (OFA) 方法将模型训练从网络结构设计中解构出来。根据给定的场景,从训练一次的网络中搜索,选择出子网络。
  • 设计了 progressive shrinking 算法,使得训练一次的网路能够支持 10^9 的子网络使得准确率和单独训练的效果一致
  • 在 ImageNet 上能够是使用 NAS 方法的结果达到更好或者同等的水平,但大幅缩短时间

Introduction

  • 为了适应不同的硬件平台和效率限制,研究人员要么单独设计特殊的网络结构适应移动平台,要么通过压缩网络来加速现有的模型。
  • 本文设计了一个可以在不同的结构设置下直接开发的网络。可以在不重新训练的情况下支持不同的深度、宽度、核大小和分辨率设置。
  • 训练阶段,训练一整个网络,子网络可以从中生成,训练过程中关注子网络在不相互影响下的准确率。搜索结算,权衡准确率和硬件效率(延迟或能量),子网络的权重直接从预训练的权重中得到,不需要重新训练。子网络的准确率是可以再不同的硬件设备中共享的。
  • 网络的训练过程中需要保持子网络的准确率,采用联合优化权重的方法,因此训练一个这样的超网是困难的。首先训练一个 深度、宽度、核大小 都是最大的网络,然后逐渐缩减。
  • Efficient Deep Leaning
    • 重新设计新的网络结构来适应不同的硬件环境
    • 对现有的网络进行压缩,去掉多余的单元、去掉多余的 channel、采用低精度计算
  • NAS
    • 通过 回馈信号 或者 loss 正则项 来使得网络结构搜索能够反映网络效率
    • 对于新的硬件环境需要重新搜索并训练
  • Dynamic Neural Networks
    • 使用 基于输入的跳过连接 来减少深度(ResNet),使用 控制器或者门控模块 来适应性的删除某些单元,使用 提前退出分支 在计算图中根据准确率判断是否可以提前结束,根据输入图像适应性的降低通道数来提高效率
    • 这些方法继承了预先设计的网络结构,同时也受限制于他们的性能,即对于新的场景现有的结构可能不是最优的。可调节的灵活性受到限制

Method

本文从四个维度考虑深度模型的网络结构——深度、宽度、核大小、分辨率。目标就是使得每一个支持的子网络都能得到和单独训练在同一个级别的准确率。

感觉作者描述的训练过程不是很清楚,

网络训练

初步定义

stage:一个序列化的 block 结构,基于相同的分辨率

优化目标 方法
弹性分辨率 在网络层面使得网络能够接受不同尺寸的图像输入
弹性深度 在 stage 层面使得网络能够跳过 stage 中的部分 block 来变化深度
弹性宽度和卷积核大小 在 block 层面,允许 block 使用不同数量的通道和卷积核大小
渐进收缩算法 (Progressive Shrinking Approach)

overall

上图展示了算法的整个步骤,首先训练整个网络,然后从不同角度收缩网络进行 fine-tune。作者描述这个算法具有以下优点:

  • 子网络相比超网是更容易收敛的,因为结构更加简单

  • 通过超网提供的初始化参数,子网络更容易训练。子网的参数选择过程使用了重要性评价的方式,并且通过知识蒸馏能够使子网络获得更好的监督

  • 因为进行了参数的排序,因此能够防止子网络影响超网的性能

    ?如果子网络使用不重要的参数,确实可以做到,但是子网络会难以训练;如果使用重要的参数则相反。不知道作者具体怎么处理【结果:在 channel 排序中选择重要的参数。那么,重要的参数修改真的不会影响超网的性能吗?还是说重要性评价实际上并不太有效?如果使用不重要的参数会怎样?】

优化目标 详细方法 备注
弹性分辨率 神经网络应该允许不同尺寸的图像输入,但是作者发现如果输入的分辨率是悬链过程中没有见过的,则会造成明显的性能损失,因此作者对分辨率进行了采样,让输入的分辨率在一定范围内变化 直接通过修改 data loader 实现
弹性卷积核大小 如果训练效果好,大卷积核的中心是可以被当做小卷积核使用的。难点在于小的卷积核是需要被共享的,而小的卷积核在不同的角色中可能有不同的分布和量级,因此作者引入了 核变换矩阵(输入大核的中心,输入小核)来完成,该矩阵在channel间共享
kernel
转移矩阵的通道共享性质值得思考。共享和不共享相比对模型的性能有何影响?根据作者的描述,小核的参数和转移矩阵是一起训练的,那么使用的是端到端还是阶段性方法
弹性深度 通过跳过 stage 中的部分 block 实现,但采用收缩的方式跳过,即只是一次跳过后面的几个block
depth
这里使用的方法应该和cascade的思想是已知的,不但是引入跳过连接,而是因此多阶段的loss回传,从而使得浅层模块具备单独使用的能力
弹性宽度 对不同的 channel 进行排序,通过重要性重新组织 channels,这个指标通过 channel 权重的 L1 norm 来衡量,值大的更加重要
width
L1 norm 在语义理解比较简单,但有一个问题,既然卷积是“加权求和”,那么为什么不同ones卷积结果(即保留正负)或者其他控制分布的方式而使用绝对值呢——我感觉评价参数的分布值(例如方差等)应该更有意义一些

知识蒸馏:出了常规的 label 之外,还引入了 soft label (通过整个网络的前向传播给出),通过作用于子网的训练

Loss=Losshard+λLosssoftLoss=Loss_{hard}+\lambda{Loss_{soft}}

即子网络同时学习超网的辨识能力,这在超网效果较好的情况下能够提供好的结果,但是超网是一次训练的,相当于一个 roof,稍有偏差都会对子网造成不小的影响吧。

网络专门化

这个阶段并不需要训练网络。通过随机取样(文中选择了16K个结构)来建立准确率表和延迟表,这样在给定硬件设置之后只需要检索这个表就能够做出结构的选择了。

网路结构变化部分按照上述的方式进行,分辨率变化采用每16一个步长建立表格,缺失的分辨率通过加权计算得到,例如:

Acci(164)=(Acci(176)Acci(160)×FLOPi(164)FLOPi(160)FLOPi(176)FLOPi(160)+Acci(160))Acc_{i}(164)=(Acc_{i}(176)-Acc_{i}(160)\times{\frac{FLOP_{i}(164)-FLOP_{i}(160)}{FLOP_{i}(176)-FLOP_{i}(160)}}+Acc_{i}(160))

文中这个过程使用了 200 GPU 小时,即平均 45s 一个结构,完成整个测试过程。

实验

OFA 网络共包含 2×1019\approx2\times{10^{19}} 种子结构,使用 ImageNet 数据集 batch size 为 2048,在 32 块 V100 上训练 150 个 epoch,共计 1200 小时。

不算 input resolution 的变化,平均一个子结构用时 6e-12s,是我理解的不对吗,fine-tune也没有这么快吧…(更离谱的是独立模型训练速度是这个速度的8倍)

应该是没有遍历左右情况,比如 depth 是可以同时训练三种深度的?其他结构上的变化也同时一次性训练?这样的话作者说 fine-tune 是啥个意思?

真正的训练过程应该是:

  • 端到端训练 OFA 网络,不加 ps 算法等任何操作
  • 从上述训练结果中使用 ps 算法抽取子结构,在一次前向传播中得到所有子结构的输出,结合知识蒸馏的 loss 共同执行反向传播(这里梯度好像容易爆,不知道作者有没有控制传播深度)。最终得到 ps 之后的 OFA 网络

感觉只有这样才能在有限的时间内训练完…不知道对不对

progressive shrink 对比结果

with and without PS

作者使用 progressive shrink 也只有 2% 左右的提升。感觉这个算法的作用也不是很大

一直有一个疑问,在子结构 fine-tune 之后新产生的参数是也会被超网共享呢还是没有呢?如果说是所有结构一起训练,那么结构之间一定共享参数——按照作者的思路,应该是这种解释。

Note 8

在 三星 Note8 上的测试结果,和之前的结果一致——使用 ps 能够提升 2% 左右。结果进行少量 fine-tune 提升的效果十分有限(0.3%)

latency

不同的延迟测试结果,从这个对比来看感觉此方法还是有不小的提升的。

all results

感觉作者的方法最优势的地方就是体现在低延迟限制条件下也能够做到较高的准确率,而而其他的方案在延迟要求严格的情况下准确率下降的很厉害。