计算机视觉
通过神经网络处理计算机视觉问题时的一个比较显著的挑战是输入的数据量会非常大,例如对于一张分辨率仅在 64 x 64 的彩色图片,如果按照图片上的 RGB 通道展开后组装成的特征向量维数就已经是 64 x 64 x 3 = 12288。而对于高清图片来说,输入特征向量的维数将呈指数级上升。同时,在将图片组装成向量的过程中,图片中原本存在的不同像素信息间的空间关系被忽略掉了,这使得网络无法通过这些关系来更加高效的进行模式识别,这对于图像型任务来说是一个重大的损失,聪明的计算机科学家们肯定不会接受神经网络仅能处理低分辨率的图片,卷积神经网络(Convolutional neural network)的应用有效的解决了这个问题。
边缘检测
前面曾简单提到利用神经网络识别物体的时候,网络的浅层会先做微小线条的边缘检测,随着层次的深入再逐步的识别小的局部结构,最后再拼装成一张完整的待识别物体的形状。最基本的边缘检测就是如下图所示的垂直边缘检测和水平边缘检测:
边缘检测的实现过程是将原有的输入图片信息矩阵与一个被称作过滤器(filter),也称作核(kernel)的参数矩阵做卷积运算。这个过滤器矩阵中的参数可以完成对于图片某一个特征的识别,如水平边缘,垂直边缘,成某一角度的边缘,RGB值等,一个典型的垂直边缘检测过滤器如下图所示:
之所以称为垂直边缘检测过滤器是因为原有图片信息与上述过滤器矩阵做卷积运算后会得到原有图片中的垂直边缘所在的位置,如下图所示:
将这个矩阵绕中心点顺时针旋转 90° 后的矩阵则变为水平边缘检测过滤器。需要注意的是这两个过滤器都只是过滤器的典型实例,实际应用中的过滤器的维度和各个位置的参数都是可以变化的,并且是要通过卷积神经网络的训练来确认过滤器各个位置的参数。
这一部分的卷积运算的操作过程与常规的矩阵乘法运算很不一样,所以一定要多看几遍视频并且记住这个运算过程。
图片 Padding
从上面的例子中可以看到:
在每一次做卷积运算后图像都会被压缩,且对于尺寸为 n x n 的图片,使用 f x f 的过滤器,则卷积运算后的图片尺寸为 (n - f + 1) x (n - f + 1)
图片边缘的像素信息在运算中只被使用了一次(可以理解为容易被网络忽略)
这两个现象如果不加以控制,在深度神经网络训练中会产生很多问题,例如图片可以经过多次变换后变成 1x1 的一个像素点,这样大量的图片信息就丢失了。为了解决这个问题,可以采用对图片做 Padding 的方式,即在图片的每一个边缘垂直添加 p 个像素占位,使得卷积运算后图片的尺寸变成 (n + 2p - f + 1) x (n + 2p - f + 1)。上述不加 Padding 的卷积运算方式称为 Valid convolution,而如果想保留图片原有的尺寸,那么这种卷积运算方式称为 Same convolution。此时通过计算可以得到 p = (f - 1) / 2,这就是通常所用的过滤器的维数都是奇数的原因之一,另一个原因是其中心位置可以作为过滤器的位置坐标来便于定位。
但需要注意的是如果步长不是 1 则即便选用 ‘same' padding 的方式输出的尺寸仍然会发生变化,在实际应用中一般选择 s = 1 而将尺寸缩减任务交给池化层。
卷积步长
上述卷积运算过程中过滤器矩阵每次移动一个像素的距离,这个偏移的距离实际上是可以作为超参数进行设置的,被称为步长 stride,用 s 代替,考虑了步长的卷积运算图片尺寸计算公式为:
- (n + 2p - f) / s + 1 x (n + 2p - f) / s + 1
当 (n + 2p - f) / s 不是整数时向下取整,这意味着图片的边缘会有部分像素被舍弃掉,不参与计算。
这里需要注意的另外一点是在神经网络这个领域中的卷积运算与数学教科书上的卷积运算定义是不一致的,如果按照数学领域的定义那么神经网络中的卷积运算应该称为 cross-correlation,但为了遵从这个领域前人的命名习惯,在这里依然将其称为卷积运算。
三维数据的卷积操作 Convolution over volume
上面垂直边缘检测这个例子中卷积运算中使用的图片是灰度图片,由于没有 RGB 通道值,因此都是二维的操作。而对于彩色图像来说,由于其具备 RGB 值,那么就需要使用三维的过滤器。此处约定对于图片和过滤器的尺寸的表示方法为 Height x Width x Channels,对应的符号表示为 nH x nW x nC,且需要进行运算的图片的通道数和过滤器的通道数(也被称为深度)必须一致。
对应下面这个例子来说,由于在计算时是将 27 个位置的乘积求和,因此使用单一的 3 通道边缘检测过滤器运算得到的结果是二维的,在实际运算过程中可以在同一层中使用多个过滤器,从而使该层的输出也是三维的。
单层卷积神经网络
对比之前的 Standard neural network,可以将卷积神经网络中的过滤器理解为带有通道的权重参数矩阵 W,在卷积运算基础上会在输出矩阵的各个元素位置上添加一个偏移量 Bias,也即 b,再用激活函数激活这个线性求和的结果,就得到了单层卷积神经网络的计算输出过程。
为了便于后续说明,课程中相关符号及对应参数表示统一如下:
l 层的过滤器单一通道上的维数:f[ l ]
l 层的 padding 的大小:p[ l ]
l 层的步长的大小:s[ l ]
l 层的单一过滤器的通道数量:nC[ l ]
l 层的单一过滤器的参数矩阵大小:f[ l ] x f[ l ] x nC[ l-1 ]
l 层的 nC[ l ] 个过滤器的参数矩阵 W[ l ] 的大小:f[ l ] x f[ l ] x nC[ l-1 ] x nC[ l ],这里由于上一层过滤器的数量决定了下一层的通道的数量,因此统一采用 nC 表示,并加注层数以便于区分
l 层的 bias 的数量:nC[ l ]
对于 l 层的输入的维数:nH[ l-1 ] x nW[ l-1 ] x nC[ l-1 ]
对于 l 层的输出 a[ l ] 的维数:nH[ l ] x nW[ l ] x nC[ l ]
当使用 m 个样本进行训练的时候,输出矩阵 A[ l ] 的维数表示方法为:m x nH[ l ] x nW[ l ] x nC[ l ]
其中 nH[ l-1 ] = (nH[ l-1 ] + 2p[ l ] - f[ l ]) / s[ l ] + 1, nW[ l-1 ] = (nW[ l-1 ] + 2p[ l ] - f[ l ]) / s[ l ] + 1,不能整除时向下取整
基于体积数据的卷积
在卷积神经网络的应用中,通常都是要将输入图片经过多层的卷积神经网络来进行处理,并且一般初期几层对于图片尺寸的压缩较小,但随着网络的深入会逐渐压缩,相对应的输出在过滤器数量上的维度会变得更大,后续再将最后一个卷积层的输出值展开成一个向量,再将这个向量作为标准神经网络的输入,最后传入到 Logistic 或 softmax 回归中,以判断图片是否包含某个物体或包含某类物体的概率。在此过程中比较耗时是如何选择各层的过滤器的数量,padding 的大小,步长的大小等,后续会对如何选择做介绍。
这里我觉得 Andrew 在计算过滤器的参数时应该是假定不同通道的参数是相同的,这个实际上应该是个错误,但不影响问题说明。
池化层(Pooling layer)
在卷积神经网络应用中,网络内部常见层除了卷积层外还有池化层( Pooling layer)和全连接(Fully connected)层。全连接层就是标准的神经网络层,而池化层的目的在于减小网络中传递的信息量,并提高特征识别的稳健性。其本质仍然是卷积层,只不过池化层所用的过滤器对于输入的运算方式发生了改变,如在最常用的 max pooling 中,会选择输入在过滤器维数大小的矩阵中的最大值,而 average pooling 则是取过滤器矩阵范围内的图片信息的平均值,且一般在较深的层中才偶有应用。
当池化层的操作对象有多个通道时,运算会发生在每一个通道上,因此池化操作不改变通道数。鉴于池化层一般只做上述两种运算,因此池化层过滤器只有两个超参数:f, s,一般都取 f = 2, s = 2,并且图片基本不做 padding,这样的一次池化操作的结果是会将输入在高度和宽度方向的尺度缩小近 50%,个别情况下也有选择 f = 3, s = 2。由于在池化层中没有需要学习的权重参数,也因此在很多相关的文献中会将其与前面一层的卷积层一起记为卷积神经网络的同一层。
Global Average Pooling
其操作方式为对于一个通道上的 Feature Map 上的数值整体取均值,例如对于一组 56x56x256 的输入来说,如果经过 GAP 操作则得到的输出是 1x1x256,即其结果相当于一个全连接层。GAP 与全连接层相比一方面大大减少了参数的值,另一方面也减少了过拟合的风险,因此常常被在网络末期利用 GAP 操作代替全连接层。
卷积神经网络的优势
从上述计算过程可知,卷积神经网络相比标准的全连接神经网络其优势在于参数共享(parameter sharing)和连接的稀疏性(sparsity of connections):
参数共享体现在在实际计算过程中同一个过滤器参数矩阵可以在图片的不同区域得以应用,从而大大减少了参数的量
连接的稀疏性则体现在每一个输出值仅仅由过滤器区域内的几个输入决定,而不是由全体输入共同决定。