Gentle Dive into Math Behind Convolutional Neural Networks

在这里插入图片描述
自动驾驶,医疗保健或零售只是计算机视觉允许我们实现直到最近才被认为是不可能的事情的一些领域。 今天,自驾车或自动杂货店的梦想不再那么具有未来感。 事实上,我们每天都在使用计算机视觉 - 当我们用手机解锁手机或者在将照片发布到社交媒体上之前自动修饰照片。 卷积神经网络可能是这一巨大成功背后最重要的组成部分。 这次我们将拓宽我们对神经网络如何与CNN特有的思想一起工作的理解。 请注意,文章将包含相当复杂的数学方程式,但如果您对线性代数和微分方程不满意,请不要气馁。 我的目标不是让你记住那些公式,而是让你直觉了解下面发生的事情。

Introduction

在过去,我们了解了所谓的密集连接的神经网络。 这些网络的神经元被分成组,形成连续的层。 每个这样的单元连接到来自相邻层的每个单个神经元。 这种架构的一个例子如下图所示。
在这里插入图片描述
Figure 1. Densely connected neural network architecture

当我们基于一组有限的定义特征解决分类问题时,这种方法很有效 - 例如,我们根据他在比赛期间记录的统计数据预测足球运动员的位置。 但是,使用照片时情况会变得更加复杂。 当然,我们可以将每个像素的亮度视为一个单独的特征,并将其作为输入传递给我们的密集网络。 不幸的是,为了使其适用于典型的智能手机照片,我们的网络必须包含数十甚至数亿个神经元。 另一方面,我们可以缩小照片,但在此过程中我们会丢失有价值的信息。 我们立即看到传统策略对我们没有任何作用 - 我们需要一种新的巧妙方法来尽可能多地使用数据,但同时减少必要的计算和参数的数量。 那是CNN进场的时候。

Digital photo data structure

让我们先花一点时间来解释数字图像的存储方式。 大多数人可能都意识到它们实际上是巨大的数字矩阵。 每个这样的数字对应于单个像素的亮度。 在RGB模型中,彩色图像实际上由对应于三个颜色通道的三个这样的矩阵组成 - 红色,绿色和蓝色。 在黑白图像中,我们只需要一个矩阵。 这些矩阵中的每一个都存储从0到255的值。该范围是存储关于图像的信息(256个值完全适合1个字节)的效率与人眼的灵敏度(我们区分有限数量的阴影)之间的折衷。 相同的颜色)。

在这里插入图片描述
Figure 2. Data structure behind digital images

Convolution

内核卷积不仅用于CNN,还是许多其他计算机视觉算法的关键元素。 这是一个我们采用一个小数字矩阵(称为内核或过滤器)的过程,我们将它传递给我们的图像并根据过滤器的值对其进行转换。 根据以下公式计算后续特征映射值,其中输入图像由f表示,我们的内核由h表示。 结果矩阵的行和列索引分别用m和n标记。
在这里插入图片描述
在这里插入图片描述

Figure 3. Kernel convolution example

将滤镜放在选定的像素上后,我们从内核中取出每个值,并将它们与图像中的相应值成对相乘。 最后,我们总结了所有内容,并将结果放在输出要素图中的正确位置。 上面我们可以看到这样的操作在微观尺度上看起来如何,但更有趣的是,我们可以通过在完整图像上执行它来实现。 图4显示了使用几个不同滤波器的卷积结果。

在这里插入图片描述
Figure 4. Finding edges with kernel convolution [Original Image]

Valid and Same Convolution

正如我们在图3中看到的,当我们使用3x3内核对6x6图像执行卷积时,我们得到4x4特征映射。 这是因为我们只有16个独特的位置可以将滤镜放在这张图片中。 由于每次执行卷积时我们的图像都会缩小,因此在我们的图像完全消失之前,我们只能进行有限次数的渲染。 更重要的是,如果我们看看我们的内核如何在图像中移动,我们会发现位于郊区的像素的影响远小于图像中心的像素。 这样我们就失去了图片中包含的一些信息。 您可以在下面看到像素的位置如何改变其对要素图的影响。

在这里插入图片描述

Figure 5. Impact of pixel position
为了解决这两个问题,我们可以使用额外的边框填充图像。 例如,如果我们使用1px填充,我们将照片的大小增加到8x8,因此使用3x3滤镜的卷积输出将为6x6。 通常在实践中我们用零填充额外的填充。 根据我们是否使用填充,我们正在处理两种类型的卷积 - 有效和相同。 命名是非常不幸的,所以为了清晰起见:有效 - 意味着我们使用原始图像,相同 - 我们使用它周围的边框,以便输入和输出的图像大小相同。 在第二种情况下,填充宽度应满足以下等式,其中p是填充,f是滤波器尺寸(通常是奇数)。
在这里插入图片描述

Strided Convolution

在这里插入图片描述
Figure 6. Example of strided convolution

在前面的例子中,我们总是将内核移动一个像素。 但是,步长也可以视为卷积层超参数之一。 在图6中,我们可以看到如果我们使用更大的步幅,卷积是如何形成的。 在设计我们的CNN架构时,如果我们希望感知字段重叠较少或者我们想要特征贴图的较小空间维度,我们可以决定增加步骤。 输出矩阵的尺寸 - 考虑填充和步幅 - 可以使用以下公式计算。
在这里插入图片描述

The transition to the third dimension

卷上卷积是一个非常重要的概念,它不仅可以使用彩色图像,更重要的是可以在单个图层中应用多个滤镜。 第一个重要规则是过滤器和要应用它的图像必须具有相同数量的通道。 基本上,我们非常类似于图3中的示例,但是这次我们将三维空间中的值对相乘。 如果我们想在同一个图像上使用多个滤镜,我们分别对每个滤镜执行卷积,将结果叠加在另一个上面并将它们组合成一个整体。 接收张量的尺寸(可以称为我们的3D矩阵)满足以下等式,其中:n - 图像大小,f - 滤波器大小,nc - 图像中的通道数,p-使用填充,s - 使用 stride,nf - 过滤器数量。

在这里插入图片描述
在这里插入图片描述
Figure 7. Convolution over volume

Convolution Layers

时间终于来到了我们今天所学到的一切,并构建了我们CNN的单层。我们的方法几乎与我们用于密集连接的神经网络的方法相同,唯一的区别是不是使用简单的矩阵乘法,而是这次我们将使用卷积。前向传播包括两个步骤。第一个是计算中间值Z,该中间值Z是作为来自前一层的输入数据与W张量(包含滤波器)的卷积,然后加上偏差b而获得的。第二个是对我们的中间值应用非线性激活函数(我们的激活用g表示)。矩阵方程的风扇将在下面找到合适的数学公式。如果您不清楚任何相关操作,我强烈推荐我之前的文章,其中我详细讨论了密集连接的神经网络中发生的情况。顺便说一句,在下面的插图中,您可以看到一个小的可视化,描述方程中使用的张量的维数。在这里插入图片描述
在这里插入图片描述
Figure 8. Tensors dimensions

Connections Cutting and Parameters Sharing

在文章的开头我提到由于需要学习大量的参数,密集连接的神经网络在处理图像方面很差。 现在我们已经了解了卷积的全部内容,让我们考虑它如何允许我们优化计算。 在下图中,2D卷积已经以稍微不同的方式可视化 - 用数字1-9标记的神经元形成接收后续像素的亮度的输入层,而单元A-D表示计算的特征地图元素。 最后但同样重要的是,I-IV是来自内核的后续值 - 必须学习这些值。

在这里插入图片描述

Figure 9. Connections cutting and parameters sharing

现在,让我们关注卷积层的两个非常重要的属性。 首先,您可以看到并非两个连续层中的所有神经元都相互连接。 例如,单元1仅影响A的值。其次,我们看到一些神经元共享相同的权重。 这两个属性都意味着我们学习的参数要少得多。 顺便说一下,值得注意的是,过滤器中的单个值会影响要素图的每个元素 - 在反向传播的背景下它将是至关重要的。

Convolutional Layer Backpropagation

任何试图从头开始编写自己的神经网络的人都知道,前向传播不到成功的一半。当你想回去时,真正的乐趣就开始了。如今,我们不需要为反向传播而烦恼 - 深度学习框架为我们做了,但我觉得值得了解幕后发生的事情。就像在密集连接的神经网络中一样,我们的目标是计算导数,然后使用它们在一个称为梯度下降的过程中更新我们的参数值。

在我们的计算中,我们将使用链规则 - 我在之前的文章中提到过。我们想要评估参数变化对结果特征图的影响,然后评估最终结果。在我们开始详细讨论之前,让我们就我们将使用的数学符号达成一致 - 为了让我的生活更轻松,我将放弃偏导数的完整符号,而不是下面提到的缩短的符号。但请记住,当我使用这种表示法时,我将始终意味着成本函数的偏导数。
在这里插入图片描述

在这里插入图片描述
图10.前向和后向传播中单个卷积层的输入和输出数据

我们的任务是计算dW [1]和db [l] - 它们是与当前层参数相关的导数,以及dA [l -1]的值 - 它将被传递给前一层。 如图10所示,我们收到dA [l]作为输入。 当然,张量dW和W,db和b以及dA和A的尺寸分别相同。 第一步是通过将激活函数的导数应用于输入张量来获得中间值dZ [1]。 根据链规则,此操作的结果将在以后使用。
在这里插入图片描述

现在,我们需要处理卷积本身的向后传播,为了实现这个目标,我们将利用一个称为完全卷积的矩阵运算 - 下面将对此进行可视化。 请注意,在此过程中我们使用内核,我们之前旋转了180度。 该操作可以通过以下公式描述,其中滤波器由W表示,并且dZ [m,n]是属于从前一层获得的偏导数的标量。在这里插入图片描述
在这里插入图片描述

    Figure 11. Full convolution

Pooling Layers

除了卷积层之外,CNN经常使用所谓的汇集层。 它们主要用于减小张量的大小并加快计算速度。 这个层很简单 - 我们需要将图像划分到不同的区域,然后对每个部分执行一些操作。 例如,对于Max Pool Layer,我们从每个区域中选择一个最大值,并将其放在输出中的相应位置。 与卷积层的情况一样,我们有两个超参数可用 - 过滤器大小和步幅。 最后但并非最不重要的是,如果要为多通道图像执行池化,则应分别完成每个通道的池化。
在这里插入图片描述
Figure 12. Max pooling example

Pooling Layers Backpropagation

在本文中,我们将仅讨论最大池反向传播,但我们将学习的规则 - 稍作调整 - 适用于所有类型的池层。 由于在这种类型的层中,我们没有任何我们必须更新的参数,我们的任务只是适当地分配gradiwents。 我们记得,在最大池的前向传播中,我们从每个区域中选择最大值并将它们传输到下一层。 因此很明显,在反向传播期间,梯度不应影响未包括在前向通道中的矩阵元素。 在实践中,这是通过创建一个掩码来实现的,该掩码记住第一阶段中使用的值的位置,我们稍后可以使用该掩码来传递梯度。

在这里插入图片描述
Figure 13. Max pooling backward pass

Conclusion

恭喜你能成功到达这里。 非常感谢阅读本文所花费的时间。 如果您喜欢这个帖子,请考虑与您的朋友,或两个朋友或五个朋友分享。 如果您发现思维,公式,动画或代码方面有任何错误,请告诉我。

本文是“神经网络之谜”系列的另一部分,如果您还没有机会,请阅读其他文章。 此外,如果您喜欢我的工作,请在Twitter和Medium上关注我,并在GitHub和Kaggle上查看我正在处理的其他项目。 保持好奇!

猜你喜欢

转载自blog.csdn.net/weixin_41697507/article/details/89298853