旷视张祥雨:神经网络架构设计新思路

2021-01-07 10:20:35 浏览数 (1)

作者 | 蒋宝尚

编辑 | 青暮

深度学习模型在很多任务上都取得了不错的效果,但调参却是一项非常痛苦的事情,大量的超参数和网络结构参数会产生爆炸性的组合。因此最近几年神经网络的架构搜索和超参数优化成为一个研究热点。此外,对于架构设计新方法、新机制的探索,也是当下深度学习研究与落地的重点课题之一。

神经网络的架构设计目前进展到哪了?11月27日,旷视研究院主任研究员、智源青年科学家张祥雨在由智源社区举办的 NeurIPS 2020中国预讲会上做了“神经网络架构设计新思路”的主题演讲,从NAS、隐式模型、重参数化模型三个方面介绍了神经网络架构设计的最新进展。

张祥雨在演讲中提到:

  • 神经网络架构搜索中存在一个有趣的现象,即搜索空间中不同模型的收敛速度与最终性能之间常常存在正相关关系,据此我们可以不基于准确率、而是基于收敛速度去判断子结构的优劣,从而实现高效搜索;
  • 隐式模型有低参数量、强表示能力、大感受野等优点,这对设计通用模型结构可以带来很多启发;
  • 重参数化则是一种应用技巧,可以让模型的训练和推理更加高效。

张祥雨是孙剑的首位深度学习博士生,目前是旷视研究院基础模型组负责人。他已经在CVPR、ICCV、ECCV、NeurIPS、ICLR等AI顶会上发表30多篇论文,总引用量超过9万。例如视觉领域广泛使用的ResNet,其二作就是张祥雨。他还是ShuffleNet的一作,该框架以轻量级低功耗和高性能出名,特别适用于移动端设备,旷视凭借此模型拿下了OPPO、小米等手机大厂的视觉订单。如今,张祥雨将注意力转向了AutoML、动态模型等新型神经网络模型设计方法。

以下是讲座全文,AI科技评论&智源社区合作完成,经张老师确认。

这次演讲的题目是“神经网络架构设计新思路”。神经网络架构领域的研究方向演变非常快。例如在视觉方面,过去几年就发生了翻天覆地的变化。

例如在2017年以前,以ResNet、DenseNet为代表的手工模型设计方法是当时的主流,而像MobileNet、ShuffleNet这样的轻量化结构也展现了很强的实用价值。

但在2018年以后,NAS(神经网络架构搜索)大行其道,在多个视觉数据集上达到了最优性能,大有全面超过手工模型设计的趋势。进入2019年之后,动态网络、尤其是动态卷积核网络开始进入人们的视线,为神经网络的高效落地提供了一种新的思路。到了2020年,随着attention技术在CV领域日益成熟,使用attention替换传统的卷积结构直接设计大型神经网络,成为了新的研究热点。例如,在今年的ICLR 2020上就出现了单纯以transformer为基础的神经网络,其性能也比较出众。

那么我们不禁会问,除了以上热门领域之外,神经网络架构设计还有哪些思路?哪些技术有希望主导下一代神经网络的设计思想?本次报告中我将和大家交流我们最近关于架构设计新方法的思考。整个分享分为三个部分:

1.基于收敛性指标的NAS新框架;

2.隐式模型;

3.重参数化模型。

这些思路听起来都比较“小众”,我也是希望能抛砖引玉,和大家一起讨论模型设计的未来方向。

1

基于收敛速度指标的神经网络架构搜索算法

简单来说,神经网络架构搜索(NAS)就是从一个给定的搜索空间中找到一个神经网络架构,使得这个架构在训练完毕之后,在测试集上能够达到最高的性能。

基于此,我们可以设计一种非常简单直接的NAS框架:首先利用agent预测一个结构,在目标数据集上进行训练和测试,再利用测试结果反馈和更新agent。如此反复,直到找到性能最高的网络结构。

事实上最早的一批NAS算法就是这么做的。这样的算法虽然原理可行,但是搜索速度通常并不理想,因为每预测一个结构,我们都需要在整个数据集上进行训练;当数据集规模很大时,算法的效率无疑是非常低的。

为了解决这个问题,学界又提出了基于权重共享的模型搜索(Weight-sharing NAS)这一大类算法,思路是构建一个超网络(SuperNet)。超网络包含了搜索空间的全部子网络,不同的子网络以共享参数的方式嵌入在超网络中。

这样,我们只需要用某种方式训练超网络,就相当于同时训练了搜索空间中的全部子网络,因此搜索效率大幅提升。目前比较流行的基于梯度的NAS算法(如DARTS)、One-Shot类算法(如SPOS)等都属于这类方法。

然而,以上两种思路都存在一些问题。对于早期基于反复采样和重新训练的NAS框架而言,搜索空间的大小动辄10的十几次方数量级,然而在搜索中我们能采样到的网络数量最多只有几千或者几万个。在如此少的采样比例下,我们还能不能有效地探索出最优的结构,其实是难以保证的。而对于权重共享的搜索算法,虽然从优化形式看,它允许对搜索空间的所有模型进行共同优化,但由于子网络之间的权重互相耦合,也存在“优化其中的一个模型,同时拖累其他模型”的缺点。

所以,NAS是否能搜出搜索空间中的最好结构,目前还没有统一的结论。从结果反推,我们知道NAS在前两年取得了非常大的成功,在很多任务中都打败了人类手工设计的神经网络。因此从结果来看NAS确实有效果,但正因为有上述质疑,NAS是否真的work、以及为什么有效果,目前还未彻底解决。比如,有人就会问会不会因为搜索空间构造太简单,所有的空间构造都很同质化,导致NAS算法随便搜一搜,就能得到不错的结果?

去年年初有一个非常著名的工作:随机搜索,它在目前主流的一些搜索空间中随机挑了一些结构,然后发现其性能和目前最好的NAS方法在同一水平。这也从侧面说明了NAS领域的一个比较尴尬的处境,就是由于搜索空间构造的太平凡,导致NAS算法本身其实并没有贡献太多的价值。

当然在后来,经过人们的进一步研究,搜索空间在扩展,搜索算法在更新,目前的NAS算法已经能够稳定打败随机搜索的基准线。换句话说,在更复杂的搜索空间,随机搜索已经无法解释NAS算法是如何工作的了。NAS内部肯定还有别的机制,让它达到非常高的性能。

在ICLR 2020上,有一篇非常棒的论文分析了cell-based搜索空间的神经网络架构搜索算法。通过理论和实验分析,文章提出了一个观点,即gradient-based NAS算法倾向于搜索出收敛速度较快而非性能最好的结构。

此结论听起来像是一个缺点,因为我们当然希望能够真正在搜索空间中找到性能最好的结果。但其实在模型设计领域的经验表明,快速收敛和高性能往往存在强相关性。例如从VGG进化到ResNet,ResNet通过添加shortcut的方式,不仅加快了收敛速度,也明显提升了性能。换句话说,高速收敛通常也意味着高性能。

快速收敛和高性能强相关这一假设,对我们接下来的工作的启示是:对NAS算法而言,除了直接找性能最好的架构之外,是不是还存在一种间接的途径,即寻找拥有快速收敛的特性的网络结构?当然在此之前,我们需要回答一个问题:如何衡量网络的收敛速度?

我们在ECCV 2020上发表的AngleNAS搜索算法,显式地将模型的收敛速度纳入了NAS框架中。它的总体搜索框架基于我们去年提出的Single Path One-shot算法(单路径超网络搜索)。我们都知道,NAS所涉及的搜索空间常常是十分巨大的,如前所述,这会显著降低算法的搜索效率。

因此,当前NAS一个非常主流的方法叫做 Progressive NAS,中文翻译为“渐进式神经网络架构搜索技术”,这种技术在搜索过程中,能够不断的抛弃掉性能比较差的结构。然而在“抛弃”的过程中又会涉及一个标准:应该抛弃哪些东西?

AngleNAS这篇文章中提出了一个标准,当超网络训练一段时间之后,其中的每个子结构的权重相对于初始的位置的角度更新量变化的越大,我们就认为该结构更容易收敛,根据前面的假设,得到性能更高的结构的概率也更大。因此,我们更有理由在训练过程中裁剪掉那些角度更新量较小的结构,从而减小搜索空间。

那么这里为什么会用角度更新量、而不是其他距离度量来衡量收敛速度呢?这是因为现在的神经网络一般都包含BN,它赋予了模型各层的放缩不变性。换句话说,各层权重的模长已经不起决定性作用了;角度则更重要,也能够衡量速度快慢。

我们也做了简单的模拟实验,观察角度更新量和最后性能之间的关系,结果如上图所示。角度更新量变化的越大,模型的最终性能更高的概率也越大。因此,角度更新量是衡量性能的一个重要指标。

从上图我们还可以发现一个有趣的现象,在搜索指标和最终性能的排序相关度方面,角度更新量指标甚至超过了直接使用SuperNet Accuracy。这是为什么?虽然SuperNet Accuracy是非常符合直觉的,但是因为我们使用权重共享架构,其不同子结构之间的权重相互干扰,直接使用它们的Accuracy可能并不能准确衡量每个子结构单独训练的质量。

另外,关于网络性能的度量方面,最近有一篇名为 NAS without Training的文章非常有趣。主要想法是:对于一个已经初始化完毕的神经网络,去计算其损失函数关于输入数据的雅可比矩阵。当数据变化的时候,就把相应的雅可比矩阵看成一个长向量,比较这些向量之间的相关性。作者发现了一个非常有趣的现象:性能越好的结构,在不同数据之间,其雅可比矩阵越不相关。这样我们就可以在不训练的情况下,快速判断一个网络的好坏。

从以上工作中,我们可以得出一个结论:很多时候没有必要基于accuracy设计衡量标准。我们只需评判神经网络的收敛速度,就可以大概知道这个结构最终的性能,从而实现快速高效的神经网络架构搜索。

在我们最新的文章“NAS with Random Label”中,我们设计了一个NAS框架,它在搜索过程中完全不使用ground-truth label,仅使用random label,就能得到和使用真实标签相同的性能。它的出发点是“一个好的结构应该是通用的,不应该依赖特定的标签分布,以至于在随机label下也应该能产生效果”。当然,我们需要解决如何基于随机标签进行搜索的问题,如果直接拟合,效果当然会非常差。

这里基于前面介绍的几个工作,我们提出了采用收敛速度指标进行搜索:我们没必要直接比较准确度(因为标签是随机的,准确度并不可靠),只比较每个结构的收敛速度的快慢。接着,我们利用Single Path One-shot搜索框架,找到在random label上收敛速度最快的那个结构。至于收敛速度的衡量标准,我们直接使用了我们在AngleNAS中提出的角度更新量作为指标。

如上图,从实验来看,结果非常理想。在只使用random label的情况下,在多个数据集、多个搜索空间上都达到了非常好的结果。

总结一下,基于收敛度量的神经网络架构搜索是一个非常新的领域。首先,相对传统的基于精度的搜索方案,它是一个强而高效的基准线。其次,收敛度量还可以作为NAS算法中生成候选架构的有效策略,对理解神经网络模型的训练过程也带来了新的启发。

2

隐式模型

下面介绍另一种神经网络架构设计思路:隐式模型。在通常的神经网络里,每一层都可以写成显式函数的形式,即y=f(x;w)。而隐式模型则是使用隐函数,例如f(x,y;w)=0,来建模其中的各个层。这种做法粗看起来多此一举,因为隐式模型在推理阶段还需要求解方程(或优化问题),并不如普通的显式模型用起来方便。但是隐式模型也有很多好处,例如同等参数量下更强的表示能力,非常大的感受野等等。

隐式模型的研究历史比较长远,例如已经有不少工作将CRF、维纳滤波、Tree Filter等图像处理常用的隐式模型引入到神经网络里。但给我印象最深的是NeurIPS 2019的深度不动点模型(DEQ)。其主要想法是把各层的函数映射写成不动点迭代的形式。例如,输入是x,输出是z,但是输出z同时也出现在了输入x里。因此,必须要把方程解出来,才能得到输出z。这篇文章采用了牛顿迭代的方法,在前向传播中求解z;而在反向传播的时候,使用了隐函数求导的链式法则,如此可以非常高效地求出梯度。

在今年NeurIPS,这篇文章的作者进一步把这个思路推广到了主流的CV任务里(如分类、语义分割),并提出多尺度深度不动点模型(MDEQ),在很多任务中都取得了相对比较高的性能。

我们最近也参考了这类工作,把深度不动点模型运用到了目标检测领域。在目标检测中,FPN(Feature Pyramid Network)是非常常用的多尺度融合的模型,通常可以写成某种显函数的形式。而在我们的工作中,如上图所示,借用深度不动点模型的思想,将其写成了一个隐函数。这样做的好处是使得浅层和深层的信息实现彻底的融合,同时参数量也非常少,仅相当于一层fpn的参数量。

实验结果可以看出,采用了这样的一种隐函数FPN设计以后,在目前主流的检测模型上都取得了非常明显的提升。因此,我们认为隐式模型是模型设计的下一个发展方向之一,值得深入研究。

当然,目前隐函数模型也存在一些问题,例如解方程的速度非常慢,很大程度上影响了模型的实用性。这也需要学界共同努力解决。

3

重参数化模型

最后我们介绍重参数化模型,这是实用化模型的一种设计范式。所谓重参数化就是指在训练的时候使用一种神经网络结构,而在推理阶段使用另一种结构,同时保证这两个结构在数学上是等效或近似等效的。通过这样的变换技巧,我们希望模型在训练阶段比较容易收敛,容易得到更高的性能;而在推理阶段,模型结构能够在执行上比较高效,减少模型的冗余或碎片化。

下面介绍一些比较有代表性的工作,例如我的一个实习生做的ACNet V1/V2。在ACNet中,作者在实验中观察到了一个现象:对于卷积神经网络的一个kernel来说,其不同空间位置的权重重要性是不同的。一般而言,靠近kernel中心的位置,重要性会更高。

于是ACNet这篇文章设计了重参数化kernel:把一个大的3×3卷积核拆解成一个3×3加上一个1×3再加一个3×1。在这种重参数化表示模式下,kernel总参数量、总自由度其实和单个3×3是相同的,但在训练的时候,这会使得每个kernel的不同位置权重发生一些变化,它会学出一个中间权重赋值大,两边赋值比较小的结构。通过实验验证发现,这样是可以比较明显提升性能的。并且在推理阶段,上述三个卷积可以合并成一个等效的卷积运算,不增加参数量和计算量,相当于“免费涨点”。

而在ACNet V2中,我们进一步提出了一种性能更好的重参数化方法,把一个类似 Inception block的复杂结构来重参数化k×k卷积核。同样可以取得训练时的性能提升,同时推理也保持高效。

我们最新的工作RepVGG,同样是利用重参数方法,使得我们可以从头开始训练经典的VGG网络,达到媲美ResNet的高性能的同时还保持了高的推理速度。

这是如何实现的呢?原理非常简单,我们把每一个3×3卷积核拆成一个3×3卷积、一个1×1卷积,再加上一个恒等映射,共三个分支。这样,在模型训练的时候,它的表现更接近于ResNet,即更容易训练。而推理阶段,我们将三条支路合并为一个3×3卷积,从而变回了VGG网络。从应用角度来看,这种VGG网络的所有层都是3×3卷积,非常方便硬件加速,同时也缓存友好,推理高效。

总结一下,模型重参数化是一种模型等价变换技巧,它让模型在训练的时候具有容易收敛的特性,而在推理的时候又有高效推理的能力,具有很强的实用价值。

0 人点赞