通过网络架构的设计来达到减少参数量的效果。等一下 要跟大家介绍深度可分离卷积(depthwise separable convolution)。在讲这个方法之前,先复 习一下CNN。在 CNN 的这种卷积层里面,每一个层的输入是一个特征映射。如图1 所 示,在这个例子里面,特征映射有两个通道,每一个滤波器的高度是2,而且这个滤波器并不 是一个长方形,而是一个立方体,通道有多少,的滤波器就得有多厚。再把这个滤波器扫过这 个特征映射,就会得到另外一个正方形。我们有几个滤波器,输出特征映射就有几个通道。这 边有4个滤波器,每一个滤波器都是立方体,输出特征映射就有4个通道。总共有4个滤波 器,每一个滤波器的参数量是3×3×2,要注意一下每一个滤波器,其实立方体总共的参数 量是3×3×2×4=72个参数。
图1 标准卷积
接下来介绍下深度可分离卷积。深度可分离卷积分成两个步骤,第一个步骤称为深度卷 积(depthwise convolution)。如图 2所示,深度卷积要做的事情是有几个通道,我们就有 几个滤波器,每一个滤波器只管一个通道。举例来说,假设输入特征映射是两个通道,在深度 的卷积层里面,只放两个滤波器。不像之前在一般的卷积层里面,滤波器的数量跟通道的数量 是无关的。图17.9 中的通道只有两个,但滤波器可以有四个。但在深度卷积里面滤波器数量 与通道数量相同,每一个滤波器就只负责一个通道而已。假设浅蓝色的滤波器管第一个通道, 浅蓝色的滤波器在第一个通道上面滑过去,就算出一个特征映射。深蓝色的滤波器管第二个 通道,它就在第二个通道上面做卷积,也得到另外一个特征映射。因此在深度卷积里面,输入有几个通道,输出的通道的数量会是一模一样的,这个跟一般的卷积层不一样。一般的卷积层 里面,输入跟输出的通道数量可以不一样,但在深度卷积里面,输入跟输出的通道数量是一模 一样的。
图2 深度卷积
但是如果只做深度卷积,会遇到一个问题:通道和通道之间没有任何的互动。假设有某一 个模式是跨通道才能够看得出来的,深度卷积对这种跨通道的模式是无能为力的,所以再多 加一个点卷积。点卷积是指现在一样有一堆滤波器,这个跟一般的卷积层是一样的。但这边做 一个限制是滤波器的大小,核大小通通都是1×1。在一般的卷积层里面,滤波器大小可能开 2×2,3×3,4×4。但是在点卷积里面,我们限制大小一定是1×1。如图3所示,1×1的 滤波器的作用是去考虑不同通道之间的关系。所以第一个1×1的滤波器就是去扫过这个深 度卷积出来的特征映射,然后得到另外一个特征映射。这边有另外三个滤波器,它们做的事情 也是一样,每一个滤波器会产生一个特征映射,所以点卷积跟一般的卷积层是一样的地方是, 输入跟输出的通道数量可以不一样。但是点卷积有一个非常大的限制,强制要求滤波器的大 小只准是1×1,只要考虑通道之间的关系就好了,不要考虑同一个通道内部的关系了。深度 卷积已经做完同一个通道内部的关系,所以点卷积只专注于考虑通道跟通道间的关系就好。
图3 点卷积
如图4 所示,先来计算一下这个方法的参数量。深度卷积里面两个滤波器,每一个滤 波器大小是3×3,所以总共是3×3×2=18个参数。在点卷积里面,有四个滤波器,每一 个滤波器的大小是2,每个滤波器只用了两个参数,所以总共是2×4=8个参数。左边图是 一般的卷积,右边这个图是深度卷积加点卷积。
图 4 深度可分离卷积参数计算
现在来比较一下这两者参数量的差异。假设我们先预设好,输入通道数量就是I 个通道, 输出通道数量就是O个通道。核大小都是k×k。如果是一般的卷积,要有k×k的核大小, 输入I 个通道,输出O个通道,到底会需要多少参数呢?每一个滤波器的大小应该是k×k, 核大小乘上输入通道的数量也就是k×k×I。如果要输出O个通道,就需要O个滤波器,一 个滤波器的参数量是k×k×I。总参数量是(k×k×I)×O。
如果是深度卷积加点卷积,要达到输入 I 个通道,输出 O 个通道。深度卷积的滤波器 是没有厚度的,它的滤波器是没有厚度的,所以深度卷积所有的滤波器加起来的参数量只有 k×k×I 而已,跟一般的卷积里面的一个滤波器的参数量是一样的。点卷积的参数量是I×O。 假设输入通道的数量是I,每一个1×1的卷积的高度会是I。假设要输出O个通道,就要有O个1×1的卷积,所以点卷积的总参数量是I×O。如下式所示,把这两者进行比较,因为O通常是一个很大的值,通道数量可能设置为256或512,所以先忽略 1/ O , 1/kxk 常是比较在这一整项里面是比较关键的数值。这一整项的大小跟 1/ k×k 通 k×k 是比较有关系的。假设核大小可能是3×3或者是2×2。假设核大小是2×2,把一般的卷积换成深度卷积加点卷 积组合的话,网络大小就变成 1 /4 。假设核大小是3×3,从卷积变成深度卷积加点卷积的时候, 网络大小就变成原来的 1 /9 。
在深度可分离卷积之前,就已经有一个方法是用低秩近似(lowrankapproximation)来 减少一层网络的参数量。如图5所示,假设有某一个层有N 个神经元,输出有M 个神 经元。假设输入是N 个神经元,输出是M 个神经元,这两层之间的参数量是N×M。只要 N 跟M其中一者很大,W 的参数就很多了。怎么减少这个参数量呢?有一个非常简单的方 法是在N 跟M中间再插一层,这一层就不用激活函数,这一层神经元的数量是K。原来本 来只有一层,现在拆成两层,这两层里面的第一层用V 来表示,第二层用U 来表示。这两层 的网络参数量反而是比较少的。原来一层的网络的参数量是M×N。如果拆成两层网络,第 一层是N×K,第二层是K×M。如果K远小于M 跟N,U 跟V 的参数量加起来是比W 还要少的多。W 是N×M,U 跟V 的参数量加起来是K×(N+M),只要K够小,整 体而言U+V 的参数量就会变少。之前过去常有的做法就是N =1000,M =1000,可以塞 个20或50,参数量就减少蛮多的。这样子的方法虽然可以减少参数量,但它还是会有一些限 制。把W 拆解成U×V 的时候,把W 用U 跟V 两层来分开表示的时候,我们会减少W 的可能性,本来W 可以放任何的参数。但假设把W 拆成U 跟V,矩阵W 的秩会小于等于 K。如果不知道秩是什么也没有关系,反正就是W 会有一些限制,所以会变成说不是所有的 W 都可以变成当作参数,参数会变成有一些限制。这个方法就是拿来减少参数的一个非常常 用的做法。其实刚才讲的深度卷积加点卷积(pointwise convolution)其实用的就是把一层拆 成两层的概念。
图5 低秩近似示例
怎么说呢?如图6所示,先来看一下原来的卷积。在原来的卷积里面,左上角红色的 这一个矩的这个参数是怎么来的。是不是有一个红色的这个滤波器放在特征输入的特征映射 的左上角以后所得到的。在这个例子里面,一个滤波器的参数量是3×3×2=18,把滤波器 里面的18个参数跟输入特征映射左上角的这18个数值做内积以后,就会得到这边输出特征 映射左上角的值,所以每一个滤波器有18个参数。
图6 标准卷积与深度可分离卷积对比
如果拆成深度卷积加点卷积两阶段,左上角输出特征映射,左上角这个数值来自于中间 的深度卷积的输出。所以左上角这个值来自于中间深度卷积的输出,左上角这两个值来自于 输入特征映射,第一个通道左上角这9个值跟第二个通道左上角这9个值。我们有两个滤波 器,这两个滤波器分别是9个输入,得到输出,接下来这两个滤波器的输出再把它综合起来, 得到最终的输出。所以本来是直接从这18个数值变成一个数值,现在是分两阶,18个数值 变两个数值再变一个数值。如果看黄色的这个特征映射左下角这个参数黄色的特征映射。左下角来自于深度卷积的输出。而左下角这两个数值来自于这个滤波器左下这来自于这个深度 卷积,来自于输入的这个特征映射。左下角的这 18 个数值,把一般的卷积拆成深度卷积加 点卷积的时候,就可以看成是把一层的网络拆解成两层的网络,其原理跟低秩近似是一样的, 把一层拆成两层,这个时候它对于参数的需求反而是减少了,这个是有关网络架构(network architecture)的设计。