卷积层
在上面的几篇文章中,我们已经看到了全链接层的威力,但是,这还远远不够。在本文中,我们将看到DNN的一个重要特性,卷积层。
熟悉信号处理的朋友对于卷积的概念不会陌生,这就是我们常用的滤波。只是在很多应用场景中,不是我们常见的一维滤波,而是图像处理中常见的2D滤波(比如最常见的锐化,就是一个简单的高通滤波)。在深度学习的术语中,滤波器被叫做卷积核(kernal)。
在以图像为输入的DNN网络中,一个卷积核其实是针对于输入所有通道的一个滤波器组(group of filters)。比如以常见的MNIST数据为例,每个输入数据是28x28x3的像素集合(28x28是尺寸,3是RGB 通道)。一种常见的卷积核尺寸是5x5x3,就是说每5x5x3的立方体内所有的像素点都与系数做内积,得到输出的特征图上的一个点。
卷积核的常见参数包括
参数 | 含义 |
---|---|
H×W | Heights and Width |
CI×CO | 输入与输出的信号数目 |
S | Stride 步长,即滤波器每次移动的像素点数,也可以理解为滤波之后的降采样因子 |
Padding,填充。为了保持输出的尺寸在输入边界的位置填入的“0”的数目 |
经过简单的计算可以得到,在长或者宽的维度上,输入尺寸
HDI×WDI×CI
与输出尺寸
HDO×WDO×CO
之间的关系可以表述为
一般而言,为了简化控制流,我们会约定
下面这篇文章对于卷积层的归纳相当不错,对比来看就会发现,还是信号处理中熟悉的味道 :)。
https://zhuanlan.zhihu.com/p/30074309?utm_source=wechat_session&utm_medium=social
卷积层的计算
正向传播
卷积层的正向传播和反向传播的基本运算是单通道的2D卷积(滤波)。为了简化下文的推导和展示,本文添加了一个虚拟层来表示单通道 2D卷积的输出。虚拟层进行加权求和之后可以得到卷积层的真正输出。
我们定义, p,q 代表在图像平面上的坐标。 cx=1…CI 代表输入的通道号, cy=1…CO 代表输出的通道号。
从上面的计算可以看到,一个卷积层需要的参数的数目是 HK×WK×CI×CO (bias未计入),通常而言这都是一个非常巨大的数目。即使是一个最简单的MNIST训练集和一层卷积层,你就会很明显的感受到训练速度的下降。
反向传播
简单起见,在进行反向传播的推导过程中,本文将仅仅计算最简单的
S=1
的情况。对于步长大于1 的情况,相当于在虚拟的卷积输出层进行upsample操作之后再进行反向传播计算。
从上面的式子可以看出,卷积层的反向传播也是2D卷积的求和,只是区别在于要将二维卷积系数进行上下和左右的反转。
系数更新
卷积层的系数更新跟全连接层并没有太大的变化。
深度可分离的卷积(Depth-Separatable)
下面一部分是对于深度可分离的卷积的一点想法。如上面所述,可以将一个完整的卷积层拆分为两层,一个是二维的平面卷积,另外一个是将平面卷积结果作为输入的一维卷积(类似于全连接层)。
这样的话,参数的数目将为 HK×WK×CI+CO
我们来分两步看反向传播。
v→y
相当于一个全连接层。
x→v 是二维卷积。