文@000520
前沿
深度学习的快速发展,凸显了其在人工智能领域的重要地位。特别是在计算机视觉领域,深度神经网络广泛应用于图像分类、目标检测、语义分割、姿态检测、3D视频等任务,模型精度大大超越了传统基于手工设计的特征。
但是随着深度学习的发展,网络模型设计和参数选择也变得越来越复杂。比如在图像分类上性能很好的模型,在语义分割上的性能可能就会大打折扣,又如,同样的网络结构,超参选择不同,其精度也会有较大的变化。
另一方面,设计一个较好的模型,往往需要较多的算法专业知识。如何能让具备较少算法背景的工程师也能设计出较好的模型,并满足不同端侧部署设备的要求,成为一个研究热点。
广义的机器学习General Machine Learning(GML/AutoML)覆盖到模型生产的每一个环节,从数据准备、特征构造、模型设计、参数优化到模型压缩部署,且不同的任务其流程不尽相同。这里仅针对给定数据集后,在深度学习计算机视觉领域一些通用的机器学习算法和框架介绍,主要内容包括:
-
超参搜索
-
神经网络结构搜索
-
常见的AutoML框架简介
超参搜索
超参搜索Hyper-parameter optimization(HPO)是AutoML中一个非常重要的方向,旨在找到合适的超参以提升模型训练的精度。
超参搜索是传统机器学习中的一个经典问题,在深度学习领域,其优化的目标主要集中在学习率、批大小、正则化因子等和训练相关的超参;以及激活函数、模型深度等和任务、模型相关的参数。
超参搜索的整个pipeline可以归纳为:1. 定义要优化的超参及其搜索空间;2. 应用搜索算法用较短的时间找到较优的结果。
超参及其搜索空间
在熟悉的领域,超参对模型的敏感性影响可以根据经验来进行设定;如果是不熟悉的领域,我们很难知道某个超参对结果的影响如何。这时候,我们可以先针对该超参做一个敏感性测试。在搜索空间设定方面,我们可以等间隔或者对数间隔来进行设定。
超参搜索算法
HPO中一些主要的方法包括网格搜索(Grid Search)、随机搜索(Random Search)和启发式搜索等。网格搜索是一个穷举算法,需要比较多的计算资源,但是当我们对要搜索的超参领域知识比较熟悉,搜索空间不是很大的情况下,网格搜索是一个不错的选择。而且,网格搜索和随机搜索具有很好的可并行性,可用多机多卡来并行整个训练的速度。
启发式搜索通过对观测到的数据对超参进行建模(surrogate model),然后基于建模之后的代理模型决定下一次将要采样评测的样本。常见的启发式搜索算法有贝叶斯优化搜索(BO)和基于树结构的优化搜索算法Tree Parzen Estimators(TPE)。按代理模型是否是参数化可学习的又可以分为参数化模型和非参数化模型。其它的一些变种算法也都是为减少尝试次数服务的。
提前停止策略
由于完整的训练一次任务需要很长的时间。在实践的过程中,有经验的研究员往往可以通过观测某些指标在早期发现一些性能不好的实验。在HPO中,这一经验同样适用。按提前停止策略是否使用了参数化建模有可分为参数化模型和非参数化模型,常见的非参数化模型有median stopping,通过统计已经完成的实验,如果某次实验在step时比大多数的已经完成实验要低比较多,则直接停掉该实验;常见的参数化模型有curve fitting,通过多模型组合对某种配置下其最终能达到的精度进行拟合预测,直接停掉预测精度明显较低的实验。
另一方面,整个超参搜索的过程可以看做一个在有限资源限制下的优化问题,如何进行资源的分配也是一个非常重要的研究课题,典型的算法有Successive halving(SHA)和HyperBand,由多臂机发展而来,把更多的资源分配给精度更高或者优化速度更高的算法。
神经网络结构搜索
作为AutoML里的一个子领域,神经网络结构搜索(NAS)主要要解决的问题是如何自动化的设计性能更好的网络结构。通过设计一个非常大的搜索空间,加上搜索评测算法,NAS能够找到之前没有探索过的网络结构。现有神经网络结构搜索的pipeline可以用下面的流程图进行描述概括:
下面主要从搜索空间、搜索策略和评测策略进一步展开:
搜索空间
搜索空间决定着网络结构搜索的范围,如何设计一个好的搜索空间是非常有挑战的。一方面,更大的搜索空间可能会包含性能更好的网络结构,另一方面,更大的搜索空间也会增加更多的搜索负担。现有的搜索空间为了在这两者之间做一个权衡,通常会遵循粗粒度(macro)和细粒度(micro)的设计思路。粗粒度结构设计决定着整个网络的主干,细粒度结构设计决定着网络单元的细节。有的算法会固定住粗粒度的结构设计,仅搜索细粒度的结构设计,这样能大大减少搜索的时间;有的算法两者都会进行搜索,这样能增加整体的灵活性;也有的算法会仅进行细粒度结构的搜索,再将这一结构进行堆叠。当然不同任务、不同算法对粗粒度、细粒度的定义也会有不同。
通常搜索的维度有分辨率、stage的数目、blocks的数目、blocks的宽度、深度、激活函数类型、层的类型及其参数等。具体到每一个层,根据每个choice之间的权重是否是解耦的可以分为MixOp和SliceOp。如下图示,MixOp由多个单独的Op组成,互相之间的权重不共享,有更大的灵活性,但是也会占用更多的显存。SliceOp由一个大的超级核组成,互相之间权重共享,slice出来的小核是大核的子集,会比较省显存,但耦合的较深也就限制了其灵活性。在backbone搜索部分,基于MobileNet的搜索空间是学术界用的比较多的一种;在特定的task部分,每个算法、任务搜索的维度会有不同。
搜索策略和评测策略
如何从海量的搜索空间中快速找到性能较优的网络结构是一项非常有挑战性的工作。在早期的NAS工作中,常follow超参搜索的思想,从头训练评测一个子网络,然后通过强化学习算法或者遗传算法等来控制整个搜索的进程。这种算法由于每个子网络都需要从头开始训练,非常耗时,常先在小数据上训练一个代理,再将这个代理应用到大数据集上优化子网络结构的选择,由于并不是端到端针对性的优化,代理数据和实际数据之间会存在精度的gap。随着研究的推进,研究者们开始寻求weight-sharing参数共享的思想,即采样的子网络之间会共享一部分参数。每个子网络由于不需要从头开始训练,在整个迭代过程中类似于finetune,这样能大大缩短整个训练评测的时间。
另一方面,按如何构建网络模态也有两种不同的方案。一种是由小向大生长,比如先训练一个层数或者通道数较少的网络,然后再逐渐堆叠层数或增加通道数,直至满足资源限制;另一种是由大向小裁剪,先设计、训练一个超网络,然后再slice出满足资源限制的网络结构。这种方案由于其可以更好的挖掘子网络之间相互关系,应用的相对较多。
针对weight-sharing这一设计思想下的NAS算法,如何训练好超网络是研究的热点和难点。超网络的训练分两个部分:一部分是网络本身的权重,一部分是网络结构的参数。一个直观的想法是把它当做一个二层优化问题(bi-level),交替的优化网络权重和结构参数,但是由于网络结构是离散的,所以在训练时将其连续化,然后在测试时再将其离散化。这种优化方式由于权重参数和结构参数维度相差较大,训练连续-测试离散等原因,使得训练和测试存在较大的gap,后面也有很多的工作在解决这些问题。也有学者从评测器优化的角度来进行考虑,其着重解决的问题是超网络中采样出来的子网络的性能和最终能达到的性能(retrain)有较大的不一致性。最后,为了在多端侧设备上进行部署,有一部分研究者将NAS分为一个双阶段pipeline,即只训练一次超网络,然后根据不同的端侧需求搜索出来不同的子网络结构,且子网络结构采样出来即可用,不需要重训,大大减少了后续的时间。
常见的AutoML框架简介
目前已经出现了很多AutoML开源框架,可以大致分成两类:
- 一类是基于传统机器学习算法,例如 TPOT、Auto-Sklearn、 Hyperopt、H2O。如果你不需要深度神经网络的话则可以考虑使用这几个框架。这些框架支持常见的分类和回归任务,使用这些框架通过输入数据和简单的配置之后就能自动地完成特征工程(特征选择,特征预处理,特征构建等),同时也可以进行模型的选择和参数的调优。
- 另一类则是基于神经网络的AutoML框架,比较流行的有微软的NNI、 谷歌的Auto-keras、亚马逊的Autoglun、以及华为的Vega。
这些框架支持对图像(和其它数据)及其相关的任务建模,利用里面提供的超参搜索、神经网络结构搜索等其它自动化能力,能为数据搜索到一个较好的网络模型和参数配置。
评价一个AutoML框架工具是否好用,应该要从下面这几个方面来考虑:易用性、功能性能领先、可用性、兼容性、灵活性。我们这里简要的介绍对比一下开源的基于神经网络的AutoML框架。
NNI | Auto-keras | Autoglun | Vega | |
---|---|---|---|---|
易用性 | – 需要用户准备少量的配置 – 专门可视化界面 |
– 代码简洁 – 用户只需准备数据,简单的调接口即可 – 可使用keras的可视化界面 |
– 用户可直接在已有代码上加上装饰器使其变得可搜索 – 支持reporter,但可视化做的不是很好 |
– 需用户准备少量的配置 |
功能和性能 | – 支持自动特征工程、NAS、模型压缩、HPO – 支持几乎大部分的sota算法 |
– 支持NAS、HPO – 对sota算法支持度不高 |
– 支持NAS、HPO – 支持大部分sota算法 |
– 支持NAS、模型压缩、HPO、数据增强 – 支持大部分sota算法和自研算法 |
兼容性 | – 支持tf、pytorch | – 基于Keras实现,仅支持Tf | – 基于MxNet框架开发,兼容pytorch | 支持tf、pytorch、MindSpore后端 |
灵活性 | – 能调整里面所有的代码 – 为有经验的用户提供了高灵活性 |
– 为有经验的用户提供了灵活性 | – 方便的调整搜索空间 – 对整个搜索的过程pipeline相对较固定 |
– 为有经验的用户提供了高灵活性 – 可以将多个功能组合成一个完整的pipeline |
PS:除了以上预告技术专题内容,大家如果有感兴趣的技术内容和难点欢迎随时指出,可以多多评论留言。我们也希望能通过本次技术分享让大家了解到更多的自动机器学习前沿技术,也期待和大家一起探讨,更欢迎大家加入我们,一同为AI框架及AI发展贡献力量!最后,我们团队也在AutoML上做一些学术研究和轮子建造,更好的服务于内部的AI生产,正式、实习都有,如果大家感兴趣可以给我简历(wangshiguang@sesnsetime.com),组内有海外教授担任相关技术顾问,GPU卡非常丰富,组员背景丰富。
感谢阅读,欢迎在评论区留言讨论哦~
P.S. 如果喜欢本篇文章,请多多 点赞,让更多的人看见我们 😀
关注 公众号「SenseParrots」,获取人工智能框架前沿业界动态与技术思考。