神经网络:关于卷积层和卷积核
卷积层和卷积网络从20世纪90年代就已经出现了。它们因ILSVRC challenge(ImageNet)而普及,这是一个巨大的图像识别挑战。为了赢得这一挑战,数据科学家创造了许多不同类型的卷积。
今天,我将专注于核大小以及数据科学家如何设法减少Convnet的权重,同时让层更深。
全连接与卷积层
局部特征的一些属性
卷积层在检测空间特征方面并不比完全连接层更好。这意味着无论卷积层可以学习什么特征,全连接层也可以学习它。Irhum Shafkat在他的文章中以4x4到2x2的图像为例,用一个全连接层,有一个通道:
全连接核,用于flattened 4x4输入和2x2输出
我们可以使用相应的全连接核来模拟3x3卷积核:我们向参数添加等式约束和零约束。
一个3x3卷积核的全连接等价于一个flattened 4×4输入和2×2输出
dense kernel可以采用3x3卷积核的值。
对于较大的输入和输出向量,以及具有多个输入和输出通道,情况仍然如此。
更有趣的是,对于3x3、5x5或任何相关的核大小,都是如此。
注意:这需要网络输入具有相同的大小。大多数Convnets在最后使用全连接方式,或者有固定数量的输出。
基本上,一个全连接层在任何时候都可以像任何卷积层一样。那么,在特征检测方面,全连接层比卷积层好吗?
遗憾的是,对于神经网络来说,并不是这样的。
核大小
全连接层将每个输入与其核项中的每个输出相连。因此,核大小= n_inputs * n_outputs。
它还添加了一个偏差项,每个输出偏差大小= n_outputs。
通常,偏差项比核大小小很多,所以我们会忽略它。
如果考虑3D输入,那么输入尺寸将是宽度和高度和深度的乘积。
卷积层充当3D输入和输出之间的全连接层。输入是像素的“窗口”,通道为深度。这与被视为1×1像素“窗口”的输出相同。
卷积层的核大小是k_w * k_h * c_in * c_out。
它的偏差项的大小为c_out。
全连接层很重
步长为1的“same padding”卷积层产生与输入相同宽度和高度的输出。
为了简化,让我们考虑我们有一个带有c通道的大小为l的方形图像,我们想要产生相同大小的输出。
让我们以大小为k的卷积层为例。我们的核大小为k²*c²。
现在,如果我们希望全连接层具有相同的输入和输出大小,则需要核大小为(l²* c)²。
核大小比为l⁴/k²。
对于32x32(MNIST,CIFAR 10)的小图像和11x11的核大小,我们已经达到了8,600的factor 。
如果我们得到一个更逼真的224x224图像(ImageNet)和更适中的核大小3x3,我们可以达到270,000,000。
在最坏的情况下,卷积层计算天真地为每个l²输出像素使用l²/ k²的比例计算。
这使得大图像和小卷积核的比率为5,500,对于小图像和大核,比率为8.5。
我们已经可以看到卷积层大大减少了所需的权重数量。权重的数量取决于核大小而不是输入大小,这对图像非常重要。卷积层可以减少内存使用量并加快计算速度。
过度拟合
具有如此大量的参数具有另一个缺点:过度拟合。
过分的是,当机器学习算法从训练数据中学习太多而失去了泛化的能力。
神经网络将学习对可能相同的东西的不同解释。通过强制空间维度之间的共享权重,并大幅减少权重的数量,卷积核充当学习框架。
卷积层比全连接层更有效,因为它们更轻,更有效地学习空间特征。
更深
神经网络有一个经验法则。深胜于宽。这在StackExchange问题中得到了很好的解释。长故事短、更宽的网络往往具有太多的权重和过度配合。而更深层的网络将会学到更多有趣的特征,前一层的特征。
实现这一点的一个好方法是让每一层都变轻。这也将有利于内存使用和计算速度。
记住:更深层而不是更宽。
减少核大小
让我们来看看ILSVRC的获奖者。
2012年,AlexNet进行了第一次大小为11x11的卷积。
2013年,ZFNet用7x7取代了这个卷积层。
2014年,GoogleNet最大的卷积核为5x5。它保留了第一个7x7卷积层。
同年,VGG,二等奖,仅使用3x3卷积核。
在后来的版本中,第一版GoogleNet的5x5卷积层已经被2个堆叠的3x3卷积层取代,复制了VGG16。
当我们需要大量通道时,这使得大卷积核的成本效率更高,甚至更大。
记住:n =k²* c_in * c_out(核)。
常见的选择是将核大小保持在3x3或5x5。
第一个卷积层通常保持较大。它的大小不那么重要,因为只有一个第一层,它有较少的输入通道:3,颜色。
垂直堆叠卷积
我们可以将5x5或7x7卷积核替换为多个3x3卷积。
5x5卷积与等效堆叠3x3卷积
原始吞吐量保持不变:一个2个卷积层的核大小为3x3的块的行为就像一个5x5卷积窗口扫描输入一样。
(2 + 1 + 2) (5x5)等于1 + (1 + 1 + 1)+ 1 (3x3, 3x3)
但它会导致更少的参数:
n_5x5 = 5²* c²> 2 * n_3x3 = 2 * 3²* c²。
5x5卷积核的比值是1.4,7x7卷积核的比值是2。
基于3x3的Convnet(橙色)和等效的基于5x5的Convnet(蓝色)的验证准确度
以上是使用Keras的CIFAR10数据集的简单示例。我们有2种不同的Convnet。它们由2个卷积块和2个dense 层组成。只有一个块的构造发生变化。
在橙色中,块由2个堆叠的3x3卷积组成。
在蓝色中,块由单个5x5卷积组成。
注意堆叠卷积层如何在更轻的情况下产生更好的结果。
研究核深度
很多技巧用于减少卷积核的大小。他们正在研究通道深度和通道的连接方式。
1x1卷积
卷积层比完全连接的层轻。但是它们仍然将每个输入通道与核窗口中每个位置的每个输出通道连接起来。这是赋予权重数量的c_in * c_out乘法因子的原因。
ILSVRC的Convnets使用了很多通道。例如,在VGG16的卷积层中使用512个通道。
1x1卷积是一种解决方案来弥补这一点。
它显然没有在空间层面带来任何东西:核一次作用于一个像素。但它在像素方面充当全连接层。
我们通常有3x3核大小,256个输入和输出通道。取而代之的是,我们首先做一个1x1卷积层,将通道数减少到32个。然后我们用3x3核大小执行卷积。我们最终制作了另一个1x1卷积层,再次拥有256个通道。
在2个核大小为1x1的卷积层之间包装卷积称为bottleneck。这用于ResNet,这是2015年发布的一个论文。
bottleneck中的空间(绿色)和层(蓝色)连接
一种解决方案需要3²256²= 65,536个权重。第二个需要1 ²256 * 32 + 3 32²²+ 1 ²* 32 * 256 = 25600点的权重。卷积核的权重减轻了2倍多。
1x1卷积核充当嵌入解决方案。它减小了输入向量的大小,通道的数量。它使它更有意义。
1x1卷积层也称为逐点卷积。
分组卷积或水平堆叠卷积
卷积层通常组合每个输入通道,以产生每个输出通道。
可以制作输入通道的子组。它们将独立于其他组合并到其输出通道中。这就是我们所说的Grouped Convolution。
这可以将层拆分为子组,在每个层上进行卷积,然后将输出层堆叠在一起。
它减少了所需的权重数量,因为每个子组充当较小尺寸的分离卷积。
有2组和512层,我们有2 *k²*256²而不是k²*512²,核大小为k²。
带有分组卷积的bottleneck中的空间(绿色)和层(蓝色)连接
这用于ResNeXt的bottleneck。
它使得更轻的卷积核具有更有意义的特征。
可分离的卷积
当组的数量是通道数时,卷积核不会组合层。
这种极端是我们所谓的深度卷积。它通常与Pointwise卷积层结合,以解耦空间和层计算。
可分离卷积中的空间(绿色)和层(蓝色)连接
深度卷积层所需的卷积核大小为n_ depthwise = c *(k²*1²)。解耦
解除这两个耦合可以减少所需的权重:
n_separable = c *(k²*1²)+1²*c²。考虑到5x5卷积层,k²小于c> 128.这让我们的核表面的比率大约为9或25.
对于可分离的卷积,瓶颈在于1x1卷积。通过近似卷积核表面,等效的可分离卷积层更轻。
基于3x3的Convnet(橙色)和等效的基于可分离卷积的Convnet(红色)的验证准确性
以上是使用Keras的CIFAR10数据集的简单示例。我们有2种不同的Convnet。它们由2个卷积块和2个dense 层组成。只有一个块的构造发生变化。
在橙色中,块由2个正常的3x3卷积组成。
在红色中,块由2个可分离的3x3卷积组成。
即使可分离卷积效率稍低,它也要轻9倍。