人工智能行业面临百万量级的人才缺口,正值春招求职季,雷锋网 AI 慕课学院与雷锋网旗下学术频道 AI 科技评论联合腾讯课堂共同开启一场关于AI 求职的经验分享盛宴——「AI 求职季·AI 工程师 offer 直通车系列直播」栏目。
4 月 10 日的第一场分享嘉宾——Momenta 高级视觉算法研究员李翔带来了《打造自动驾驶大脑——看 Paper Reading 直播,拿 Momenta 顶级 offer》的直播分享。
李翔,南京理工大学 PCALab 博士在读,阿里巴巴天池首届大数据竞赛冠军,滴滴 Di-Tech 首届大数据竞赛冠军。知乎专栏 DeepInsight 作者。早期负责 Momenta 车道线检测相关模块,现专注于神经网络基础算法研发。
以下是李翔在雷锋网「AI 求职季·AI 工程师 offer 直通车系列直播」栏目的分享内容精选。
本次 Paper Reading 我们并没有关注某些特定的 paper,而是用一个视角对现有的代表性的卷积神经网络设计进行总结。
聚合-转移框架
卷积神经网络通常都是由许多不同的层级结构组成的。上图的蓝框部分是被定义的 L 层网络单元,它总体包含聚合(Aggregation)和转移(Transformer)两个部分。具体来说,聚合可用图示的函数表示,聚合函数 A 代表通过选择 L 以前层的 X 的一个子集作为输入,得到聚合特征 S;转移的部分比较简单,将聚合特征 S 通过转移函数 T 得到 L 层的 X。
这便是聚合-转移框架的视角,从这个视角出发,可对现有的卷积神经网络的架构进行解读。
为了更加形象的理解,我们举一个具体的且耳熟能详的例子——DenseNet。DenseNet 是 CVPR 2017 的最佳论文。从聚合-转移框架的视角(以上两个表达式)来看,subset 子集收敛到所有的 L 层之前的 X 上;聚合函数 A 具体化为 channel 维度的拼接(concatenation),拼接可用两条竖线的符号标记;这是聚合部分的情况。
对于转移部分,一般在 DenseNet 中,转移函数 T 通常具象化为顺序 2 次的 BN+ReLU+Conv。
接下来,从子集的构成和聚合函数 A 入手,分别讨论他们目前已有的主流的形式。
对于聚合函数 A 而言,第一种情况是子集(subset)只是选取 L-1 层的 X。这个模式普遍出现于早期的 feed-forward 的神经网络中,主要代表有 LeNet、AlexNet、VGG、GoogLeNet、InceptionV2 V3、MobileNetV1。
第二种情况是子集(subset)选择 L 层之前所有层的 X,这是较为常见的。主要代表作有 ResNet 系列、DenseNet 系列以及基于 ResNet 或者 DenseNet 提出改进的一些网络结构。
DenseNet 是选择之前所有层进行密集的链接,但是 ResNet 是怎么回事?难道 ResNet 不是 skip connection 吗?下面将为大家推导解答 ResNet 和 DenseNet 在拓扑结构上的等价性。
首先分析图中(a)的拓扑结构,这个拓扑结构基本上是 DenseNet 的结构,符号和聚合-转移框架是保持一致的,于是可以写出它数学上的表达式,具体化为 channel 维度的拼接,进行一步的转移后得到 DenseNet 标准的表达式,也是其论文中的原始定义。
再看图中(b)ResNet 的结构,是一个标准的 skip connection 结构。根据 ResNet 的定义可写出表达式(1),从表达式中也体现了 skip connection;同时表达式(2)即是中间 feature X 的表达。在得到表达式(1)和表达式(2)后,可将表达式(1)不断地循环地带入表达式(2)中,最后可以得到一个非常有意思的表达式。
最后,将(a)和(b)两个网络的表达式平行地写在一起,发现两者唯一的区别就在于聚合函数 A,(a)DenseNet 结构表现为 channel 维度的拼接,(b)ResNet 结构表现为逐元素的相加。二者遵循的都是一个相同的 Dense 的拓扑连接结构。这部分的具体细节可以查看 Mixed Link Network 的论文。
提到这里,不得不回顾一个小往事。众所周知,ResNet 前后其实提了两个版本。第一个版本是图(a),也是 CVPR 的最佳论文《Deep Residual Learning for Image Recognition》,第二个版本是图(b),是第一篇论文发表后的第二年发表的论文,名为《Identity Mappings in Deep Residual Networks》。这两个版本的最大区别就是 skip connection 之后是否接 relu。第一个版本接了 relu,如果按照第一个版本,我们之前的推导是无法完成的。从实验上来讲,第一个版本的确也是存在一些问题的,图中是当时的实验结果,第一个版本的 ResNet 随着网络层数从一百层上升到一千多层,性能反而在下降。等到第二个版本,就完全符合了 Dense 的拓扑结构,随着网络变得很深,性能也能够稳定下降。这也充分地告诉我们,Dense 的拓扑结构的确是具有一些非常优秀的性质,使得 RenseNet 和 DenseNet 在现有网络基础上都有着重要的影响力。
以上是在解释为什么 ResNet 其实是选择了之前所有层的 X 进行了聚合。
近期 Google 的一些 network architecture search 的工作(NASNet 和 ENASNet)采用了通过 RNN 去 sample 出 2 个 L 层之前的 X 进行聚合。他们的核心思想就是把 Reinforcement Learning 的思想引入到自动的架构设计中。具体来说,他们会使用一个 RNN 去 sample 出一些基础的连接结构,形成基元模块,使得网络性能更好。
RNN 的输出基本分为两大类,一个是 layer id,也就是选择之前的哪一层;另一个类是基础运算操作。图中红色框部分就是每次 sample 出的两个层的 X。具体细节可以参考论文原文。
接下来介绍聚合函数 A 的几个代表形式。首先是恒等变换,也就是 Identity 函数,在通常的 feed-forward 网络中,聚合的特征是使用了上一层的 feature X,在聚合过程中不会对 feature 进行任何操作,仅是转移至下一层。
第二是逐元素(Element-wise)的相加,这类操作普遍出现在有 skip connection 的网络系列中,例如 PreResNet、ResNeXt、MobileNetV2、SENet-ResNeXt。聚合的方式是在拿到子集(subset)的 feature 后,保证其维度一致,将每个位置的元素累加,随后进入转移环节。
第三是通道(channel)上的拼接,代表作是 DenseNet。这类形式是将所有 feature 在通道维度上进行一个扩增。通常,DenseNet 的 feature X 的维度都比较小,保持量级不会过大,控制最终的 feature 维度在一定范围内。
最后再介绍下混合了 addition 和 concatenation 的两种操作,混合的意思是在聚合的过程中既包括按位置的逐元素的相加,也包括 channel 维度的拼接,其主要代表作是 DPN、MixNex 和 ShuffleNet。DPN 可被视为拥有两条通路的网络,左边的通路为 ResNet,右边的通路为 DenseNet,进行 feature 上的拼接后,在转移过程中包含了逐元素的相加和 channel 维度的拼接。MixNet 也是相似的原理,但去掉了严格意义上的 ResNet 的通路,把逐元素相加平均分摊到不断扩增的所有 feature 上。ShuffleNet 则是在降采样的时候和非降采样的时候使用不同的两种操作,从而最终将其混合起来。
转移如果更加细致的划分可能可以有很多种分类方式,但由于篇幅限制本次只从两个方向简单地介绍转移的部分,分别是单路的转移和多路的转移(Single Path 和 Multiple Path)。通过顺序的卷积、组卷积等基元操作完成特征转移的网络都可被归纳为单路的转移(SinglePath)。在拥有聚合的 feature 之后,可以通过 feed-forward(单向流)的方式,将基础的操作如 concatenation、BN、pooling、激活函数等进行单向的组合,经过这一单路的组合,可以得到转移后的 feature。单路的网络包括 LeNet、AlexNet、VGG、PreResNet、ResNeXT、DenseNet、DPN、MixNet、ShuffleNet、MobileNetV1 V2 等目前主流的网络,目前小型设备上使用的网络 ShuffleNet、MobileNetV1 V2 都是单路转移的设计,不涉及多路的转移。
除了通过顺序的卷积、组卷积等基元操作完成特征转移的网络之外,其他的网络可被归纳为多路的转移(MultiplePath)。首要的代表作是 GoogLeNet 的 Inception 系列,Inception 系列最早就是沿着多路的思路设计的,同一个 feature 会经过不同的深度、感受野的组织路径,进而设计出从 V1 到 V4 的系列版本。在迭代过程中,内部结构的变化越来越多,比如说把大的卷积替换成小的卷积的组合,然后卷积再进行分解,3 乘 3 的分解成 3 乘 1 和 1 乘 3 等等。这一系列中唯一不变的便是其多路转移的设计思路。
值得一提的是,Momenta 在 ImageNet 2017 的夺冠架构 SENet 便可以看作在特征转移的步骤中增加了一个 multiple path,一路是 identity,另一路是 channel 上的 global attention。其实,转移部分还可以从更多更深入的角度在做分类和整理,我们今天仅从单路和多路的角度做了一些梳理,希望能给大家带来启发。
上图是本次分享的回顾,梳理了目前主流的架构。从子集选取的角度出发,可分为三种设计;从聚合函数的角度出发,可分为四种设计;从转移函数的角度出发,可简单分为两种设计。
希望这个表格能在子集选择、设计聚合函数和转移函数时给予大家启发。例如,现在借助网络架构搜索是一个很好的方向,比如 NASNet 和 ENASNet,但其本身具有一定的局限性。首先搜索空间是被定义好的。当基础单元的研究没有到位时,搜索空间可能不会被定义得非常好,甚至有些很多结构在搜索空间里搜不到的,比如说 Google 的 Inception 结构,比如说 DPN 和 MixNet 这类混合的结构。它们在性能上的提升甚至可能往往并不如人工设计的结构。所以,接下来的网络设计应该是基础单元结合架构搜索同时前进,相互补充相互启发,从而达到共同的提高。