【深度学习】轻量级神经网络设计思路

0. 前言

随着深度学习技术在各个领域获得了表现出极大的潜力,但大部分神经网络模型的计算复杂度都使其无法在计算资源受限的情况下(如移动端设备)得到很好的应用,于是,神经网络的轻量化备受关注。那么如何将神经网络模型设计得小型化、轻量化呢?部分研究成果为我们打开了思路,也一定程度上促成了AI技术的推广和落地。

1. 轻量级神经网络设计

轻量级神经网络设计的主要思路:

  • 有限的计算复杂度下实现尽可能高的模型表达能力
    模型表达能力一定程度上同通道数相关,换言之,就是要不过分减少通道数的情况下,降低模型计算成本。
  1. 深度可分离卷积
    更详细可参考【深度学习】轻量级神经网络之MobileNetMobileNet便是基于这种思路实现的,如1-1为MobileNet的深度可分离卷积,其通过将普通卷积拆分为一个depthwise convolution和一个1*1的卷积pointwise convolution操作,实现了模型通道数不降低的情况下,参数量和计算量都降低到原先的 优化概率神经网络 神经网络 优化设计_深度学习 (K=3的情况下,参数量和计算量都降低到原先的 优化概率神经网络 神经网络 优化设计_优化概率神经网络_02 之间)
  2. 优化概率神经网络 神经网络 优化设计_优化概率神经网络_03

  3. 图1-1 深度可分离卷积
  4. 通道的稀疏连接
    通道的稀疏连接的主要目的是降低网络节点(神经元)之间的连通性不降低网络的宽度。典型案例如Google出品的Xception模型,下面为经典Inception模块到等价的简化版Inception模块的演变,就是Xception结构的核心结构分组卷积的原理。

优化概率神经网络 神经网络 优化设计_深度学习_04

优化概率神经网络 神经网络 优化设计_边缘计算_05

优化概率神经网络 神经网络 优化设计_神经网络_06

经典Inception模块

简化的Inception模块

等价的简化版Inception模块

但是上述结构是存在一定问题的,那就是各个分组之间缺少信息交流

所以旷视提出了通道重排(Channel Shuffle)来解决这个问题,并提出了ShuffleNet,论文链接。图1-2所示为ShuffleNet的Channel Shuffle的示意图。

channel shuffle的思想可以看下面的Figure 1。这就要先从group操作说起,一般卷积操作中比如输入feature map的数量是N,该卷积层的filter数量是M,那么M个filter中的每一个filter都要和N个feature map的某个区域做卷积,然后相加作为一个卷积的结果。假设你引入group操作,设group为g,那么N个输入feature map就被分成g个group,M个filter就被分成g个group,然后在做卷积操作的时候,第一个group的M/g个filter中的每一个都和第一个group的N/g个输入feature map做卷积得到结果,第二个group同理,直到最后一个group,如Figure1(a)。不同的颜色代表不同的group,图中有三个group。这种操作可以大大减少计算量,因为你每个filter不再是和输入的全部feature map做卷积,而是和一个group的feature map做卷积。但是如果多个group操作叠加在一起,如Figure1(a)的两个卷积层都有group操作,显然就会产生边界效应,什么意思呢?就是某个输出channel仅仅来自输入channel的一小部分。这样肯定是不行的的,学出来的特征会非常局限。于是就有了channel shuffle来解决这个问题,先看Figure1(b),在进行GConv2之前,对其输入feature map做一个分配,也就是每个group分成几个subgroup,然后将不同group的subgroup作为GConv2的一个group的输入,使得GConv2的每一个group都能卷积输入的所有group的feature map,这和Figure1(c)的channel shuffle的思想是一样的。
————————————————
原文链接:

优化概率神经网络 神经网络 优化设计_卷积_07

  1. 图1-2 channel shuffle ShuffleNet的其他设计要点:类似ResNet的结构单元、“快速”降采样。

优化概率神经网络 神经网络 优化设计_边缘计算_08

  1. 图1-3 ShuffleNet结构