从剪枝到 nas。

剪枝

其他的表达方式:network pruning, network sliming

剪枝所收到的生物学启发

人工神经网络中的减枝来自人脑中的突触修剪(synaptic pruning)。突触修剪即轴突和树突完全衰退和死亡,是许多哺乳动物幼年期和青春期间发生的突触消失过程。突触修剪从公出生时就开始了,一直持续到 20 多岁。

img

对于神经网络而言,其实很多的连接并不是一定要存在的,也就说去掉一些连接,可能和压缩之前并没有很大的变化。基于这样的理念,很多剪枝方案也被提出来,从压缩的角度确实带来了很大的效果提升。

深度学习网络包括卷积层和全连接层两部分,剪枝对全连接层的压缩效率是最大的。实验表明,剪枝对全连接层的压缩是最大的,而对卷积层的压缩效果相比全连接层差了很多。所以这也是为什么,在语音的加速上很容易使用到一些剪枝的方案,但是在视觉等需要大量卷积层的应用中剪枝的效果并不理想。

剪枝的基本假设是深度网络的过参数化(over-parameterization)。

在实际应用中,效果很好的深度学习模型,对硬件的存储空间和算力往往有较高的要求。但大多数嵌入式设备的算力相对而言都十分有限,所以模型压缩是十分必要的。

模型压缩(model compression)有很多方法,比如剪枝(Pruning)、量化(Quantization)、低秩分解(Low-rank factorization)、知识蒸馏(Knowledge distillation)。剪枝属于算法层面实现的加速手段,模型量化和 GPU 更加偏向工程的技术。

这里主要展开的是剪枝。剪枝可以从几个角度进行分类:

  • 结构化剪枝 vs 非结构化剪枝

    两者的区别在于剪枝权重的粒度。结构化剪枝的粒度较大,主要是在卷积核的 channel 和 filter 维度进行裁剪,而非结构化剪枝主要是针对单个权重进行裁剪。非结构化剪枝存在一个主要、致命的缺点:大多数框架和硬件都无法加速稀疏矩阵运算,这意味着无论使用多少个零填充向量参数,都不会影响网络的实际成本。

    两者各有优势。其中非结构化剪枝能够实现较高的压缩率,同时保持较高的模型性能,但对于硬件不太友好。结构化剪枝恰恰相反。

image-20211223104357346

  • 静态剪枝 vs 动态剪枝

    静态剪枝方法是根据整个训练集训练后的结果,评估权重的重要程度,永久性裁剪掉重要程度小的权重参数。然而,动态剪枝方法则是保留所有的权重参数,根据每次输入的数据不同衡量权重参数的重要程度,将不重要权重参数忽略计算,从而实现动态剪枝。动态剪枝方法能使CNN网络具备更多的表示形式,因此其通常能够有更好性能表现。

基于剪枝的中常见的套路:训练(training)- 剪枝(pruning)- 微调(fine-tuning) 三部曲。

彩票假说是 ICLR 2019 会议的 best paper, 其假说是 随机初始化的密集神经网络包含 一个初始化的子网,当经过隔离训练时,它可以匹配训练后最多相同迭代次数的原始网络的测试精度。

缺点

rethinking the value of network pruning form Tsinghua University and University of California

对剪枝后的模型进行 fine-tuning,只比使用随机初始化权重训练的网络的性能好一点点,甚至性能更差。

作者总结:

  • 训练一个大型、over-parameterized 的模型对于最终得到一个 efficient 的小模型不是必须的
  • 为了得到剪枝后的小模型,取大模型的 ”important“ weights 不一定有用
  • 剪枝得到的结构本身,而不是”important“ weights 是导致最终模型效果提升的原因。表明一些剪枝算法可以被认为执行了 network architecture search。

todo

https://github.com/SCUT-AILab/DCP/blob/master/dcp/models/pruned_resnet.py

http://123.56.8.10:9988/jeng/front/src/master/libs/nets/pruned_resnet.py

这两个 基于 resnet 进行剪枝还是可以看看的。

https://github.com/VainF/Torch-Pruning

https://github.com/SCUT-AILab/DCP/blob/master/dcp/models/pruned_resnet.py

这个是在 channel 维度进行的 pruning

https://github.com/Roll920/ThiNet

channel 维度上的 pruning

https://github.com/Eric-mingjie/network-slimming

channel 维度上的 pruning

**NAS (Neural Architecture Search) v.s. AutoML **

神经网络架构搜索,简称NAS。开发一个神经网络模型往往需要大量的工程架构方面的设计。有时候可以通过迁移学习完成一个任务,但是如果想要有更好的性能,最好设计自己的网络。

更好的性能,意味着和硬件更加 match,和网络的结构更加 match

AutoML 被称为深度学习的新方法,无需设计复杂的深度网络,字需要运行预设的 NAS 算法。Google 通过提供 Gloud AutoML 将这点发挥到了极致。只需要上传数据,Google 的 NAS 算法即可为你体用简便的网络架构。但是 Google 不能导出模型,只能调用 API 使用,价格高达 2000 美元。

AutoML 基本分为以下方向:

  • 自动数据清理(Auto Clean)
  • 自动特征工程(AutoFE)
  • 超参数优化(HPO)
  • 元学习(meta learning)
  • 神经网络架构搜索(NAS)

从范围上划分,NAS 可以认为是 AutoML 的一个子集。

李沐讲解 NAS

image-20211223173623419

nas 是将网路架构中的超参数转换成可学习的参数,定义搜索空间,然后根据某种机制搜索选择。

比较早的工作使用强化学习作为监督的功能,缺点是贵。对于工业界来说,不那么实用。

image-20211223174056610

one-shot 的思路是一次 train 一个大的模型(包含非常多的自网络,训练这个过程也是非常昂贵的),然后选择子网络重新 train,这样能够复用。

efficientnet 是工业界可以用的思路,因为其相对简单。(局限性是只是对于 CNN 网络进行搜索)

将网络深度、网络宽度和输入图像的resolution 统一到一起,一块调整,只需要调整一个超参,就可以得到不错的结果。φ 也是有实际含义的,表示相对于之前的 FLOP计算量提高的倍数。如果 φ =1,那么将计算量翻了一倍。

计算复杂度= 深度 * 宽度的平方(因为是输入通道 * 输出通道) * 分辨率的平方(数据数据的高宽)

image-20211223175235639

在边缘计算(比如手机,Xavier)上比较有用。

ofa

Once for All: Train One Network and Specialize it for Efficient Deployment

一种新的 NAS 方法,将训练模型和搜索模型解耦。

即使是现在的 AutoML 方法, 也需要不断的重新搜索不断的重新训练, 因此在这样的情况下, 搜索的时间会随着场景的数量线性增长, 使得过去的NAS 并没有办法应付大量而多元的硬件环境.

本论文提出 once-for-all network, 可以在不同的硬件限制下,直接部署,不用重新训练不用重新搜索,只徐哟呵查询表格的方式便可以决定网络的框架,且可以弹性的应对不同的 depths, widths, kernel size 和 resolutions.

Different hardware platforms have different resource constraints. We need to customize our models for each platform to achieve the best accuracy-efficiency trade-off, especially on resouce-constrained edge devices.

这个是用在边缘计算上的.

image-20210727114755636

不同设备的计算能力

challenge: efficient inference on diverse hardware platforms

思路:

decouple model training and architecture design

将 model train 和 architecture 设计分离

训练方法: progressive shrinking

image-20210713192853910

  • train 一个完整的网络(注意这里有四个维度: resolution、kernel size, depth 和 width)
  • 将 model 缩小 和大的网络一块进行 fine-tune
  • 下游任务

image-20210713193212721

和 network pruning 的关系 (写得很清楚了)

progressive shrinking 是如何做的呢?

希望训练 once-for-all network 可以同时支持所有的子网络,并使得所有的子网络达到相同程度的收敛(如同独立训练所有的子网络)

训练 elastic 的OFA 要求: 训练的时间不能太长; 不同的子网络不能相互干扰.

在一开始训练 elastic search 的情况下训练最大的(width, depth, kernel size) ,并且 finetune 可以同时支持最大的网络和部分的 (width, depth, kernel size) , 就是 progressive 的方式 (从最大的网络到最小的子网络)

progressive shrinking scheme 有三个优点:

  • 由于子网络比整个网络更加容易收敛,所以 ofa 可以更加容易达到收敛
  • 先训练大的模型然后再训练小的模型, 小的模型更加容易训练, 通过大模型的参数,可以使得小模型有很好的初始值.
  • 先训练大模型然后再训练小模型可以避免子网络使得大网络表现变差.

OFA 训练过程中的几个维度:

  • elastic resolutioin : randomly sample input image size for each batch. 从128 到224, stride=4 的分辨率均可以

  • elastice kernel size: start with full kernel size, smaller kernel takes centered weights via a transformation matrix. 从 3 5 7 中任选

    理想的情况下, $77$ 的 convolutional kernel 中间区域可以当作 $55$ 的 convolutional kernel, 同理 $55$ 的中间区域可以当作 $33$ 的 convolutional kernel. 但是对于不同的角色, 中间的共享参数必然有不同的分布或者不同的特征, 强制使用相同的参数会使得网络的准确性变差. 因此作者在原先 kernel 参数上乘上 kernel transform matrics ,这样就转换成了不同 kernel 的分布.

  • elastic depth: gradully allow later layers in each unit to be skipped to reduce the depth 从 2 3 4 中任选

    在一连串相同 output resolution 的blocks 中, 任意子网络可以从这 N 个block中取来用,剩下的 N-D 个block 就会被跳过, 因此前D 个block 同时被较大的网络和较小的子网络公用.

  • elastic width: gradually shrink the width, keep the most important channels when shrinking via channel sorting 从 3 4 6 中任选

    一开始会训练最大 width 的网络, 使用每一层 weight 的L1 norm 来表示重要的程度. 比如说要从 4-channel-layer 切割成 3-channel-layer ,那么会选择最重要的 3 个 channel-layer (也就是 L1 Norm最大的前 3个). 通过这种方式 ,子网络就被初始化成最重要的 channel.

上述四个点可以参见:https://file.lzhu.me/projects/OnceForAll/OFA%20Slides.pdf

Knowledge Distillation

在训练 OFA 的时候, 会使用 soft label 和 hard label 一起进行训练

Sepcialized Model Deployment with Once-for-all Network

当我们训练好 OFA 之后, 就可以根据不同的需求来选择最好的子网络了, 目标酒水在符合资源要求下 (e.g. latency energy) 的同时, 可以最优化准确率. 而OFA 将训练网络和搜索网络拆分开来, 这个间断是不需要任何的训练成本的.

正常来说, once-for-all 可以和任意的search algorithm 结合,像是 evolutioinary algorithm, gradient descent. 但是这些搜索方法会随着搜索的数量线性增长, 因此族这提出了一种简单的法嗯法来解决搜索时间线性成长的问题. 通过随机从 once-for-all 中取样许多子网络并将其准确率和其他硬件指标弄成一个表格, 因此在给定资源需求的情况下, 便可以从表格中得的最符合需求的子网络, 由于搜索表格时间非常小,所以可以节省搜索的时间成本.

作者从 once-for-all 中sample 了16k 个子网结构建立了准确度表格, 由于 OFA 支持 elastic resoution, 因此相同的子网络会策划四不同尺寸的输入. 而作者发现子网络的准确度会随着输入尺寸的变大而变得平缓. 所以并没有使用所有的尺寸, 而是以 stride= 16 进行预测( e.g. 160, 176 )

虽然建立表格需要 200GPU hours, 但是这只需要付出一次.

由于网络包括5个单元,所以候选的子网大概有 $$ ((3×3)^2+(3×3)^3+(3×3)^4)^5=2×10^{19} $$ 个不同的子网,并且是在25个不同输入分辨率下进行训练。所有的子网都共享权重,只需要7.7M的参数量。

然而,要训练 once-for-all 并不是一件容易的是事情, 因为训练这样一个网络其实等同训来年非常多的自网络

once-for-all 的目标是同时优化所有的子网. 在不考虑计算代价的情况下,每次梯度的更新可以由全体子网计算得到.虽然这样是准确的,但是计算代价过高,并不实际. 需要有更好的训练策略才能训练超网络. 本文提出了 progressive shrinking 策略来解决上述问题.

  • 先训练最大的 kernel size, depth , width 的网络
  • 微调网络来支持子网, 即将小型子网加入到采样空寂那.比如说,当微调 kernel size 时候,其他的几个选项保持最大值
  • 采用了知识蒸馏的方法, 让最大的超网来指导子网的学习.

先;训练最大的,然后训练小的.

下面就是扎实的实验结果

Once-for-all is 2.6x faster than EfficientNet and 1.5x faster than MobileNetV3 on Google Pixel1 without loss of accuracy.

summary

  • we introduce once-for-all network for efficient inference on diverse hardware platforms
  • we present an effective progressive shrinking approach for training once-for-all networks
  • once-for-all network supasses MobileNetV3 and efficientNet by a large margin under all scenarios.
  • released 50 different pre-trained OFA models on diverse hardware platforms (cpu /gpu )
  • released the training code & pretrained OFA network that provides diverse sub-networks without training.

(如果有官方作者的 ppt,那么作者的ppt 一定比其他的讲解更加 focus 在论文的 selling point)

特定化网络部署主要受以下条件约束

  • 部署的硬件设备不同
  • 相同射比上不同的部署要求,比如期望的延迟

扎实的实验结果。

参考文献

model zoo

官网:https://ofa.mit.edu/

https://www.cnblogs.com/pprp/p/14821967.html

https://medium.com/ai-academy-taiwan/nas%E8%AB%96%E6%96%87%E5%B0%8E%E8%AE%80-once-for-all-train-one-network-and-specialize-it-for-efficient-deployment-1aee927d8dd5

Rethinking Pre-training and Self-training

Our study reveals the generality and flexibility of the self-training with three additiional insights:

  • Stronger data augmentation adn more labeled data further diminish the value of pre-training

  • unlike pre-training, self-training is always helpful when using stronger data augmentation, in both low-data and high-data regimes.

  • in the case that pre-training is helpful, self-training improves upon pre-training.

中文版

  • 对于 Pre-training

    • 当使用更强大的数据增强方案时,预训练反而会损害模型的性能
    • 可用标注数据越多,预训练的作用越小,价值越低
  • 对于 Self-training

    • Self-training 在使用高强度数据增强策略时仍能够提升性能,即使当预训练已经会损害性能时
    • Self-training 在各种标注数据规模下都具能提升性能,并可以与预训练共同起作用
  • 对于 Self-supervised pre-training 同样在高强度数据增强策略时会损害性能

A stark contrast to pre-training is self-training. An increasingly popular pre-training method is self-supervised learning.

Our results suggest that both supervised and self-supervised pre-training methods fail to scale as the labeled dataset size grows, while self-training is still useful.

Supervised ImageNet pre-training is the most widely-used initialization method for machine vision

aggressive data augmentation

image-20210804115452040

对于不同程度的 data augmentation 这里都是有定义的, 所以自己在进行 augmentation 的时候,可以参考一下.

image-20210804115621761

Pre-training hurts performance when stronger data augmentation is used.

这个结论还是好好理解的.

More labeled data diminishes the value of pre-training

参考资料

https://medium.com/%E5%B7%A5%E4%BA%BA%E6%99%BA%E6%85%A7/review-rethinking-pre-training-and-self-training-series-2-of-3-737afae25317