刷脸背后,卷积神经网络的数学原理原来是这样的

选自towardsdatascience,做者:Piotr Skalski,机器之心编译,参与:Nurhachu Null、张倩算法

计算机视觉技术在平常生活中有着很是广泛的应用:发朋友圈以前自动修图、网上购物时刷脸支付……在这一系列成功的应用背后,卷积神经网络功不可没。本文将介绍卷积神经网络背后的数学原理。

自动驾驶、医疗以及零售这些领域,计算机视觉让咱们完成了一些直到最近都被认为是不可能的事情。今天,自动驾驶汽车和无人商店听起来再也不那么梦幻。事实上,咱们天天都在使用计算机视觉技术——咱们用本身的面孔解锁手机,将图片上传到社交网络以前进行自动修图……卷积神经网络多是这一巨大成功背后的关键组成模块。此次,咱们将要使用卷积神经网络的思想来拓宽咱们对神经网络工做原理的理解。打个预防针,本文包含至关复杂的数学方程,可是,你也没必要为本身不喜欢线性代数和微积分而沮丧。个人目标并非让你记住这些公式,而是为你提供一些关于底层原理的直觉认知。网络

简介

过去咱们接触到了密集链接的神经网络。那些神经网络中,全部的神经元被分红了若干组,造成了连续的层。每一个这样的单元都与相邻层的每个单独的神经元相链接。下图所示的是这样一个架构。数据结构

图 1:
密集链接的神经网络架构

当咱们基于一个有限的固定特征集合解决分类问题的时候,这种方法是很奏效的——例如,咱们根据足球运动员在比赛中记录的统计数据来预测他的位置。可是,当处理照片的时候,问题变得更加复杂。固然,咱们能够把每一个像素的亮度视做一个单独的特征,而后将它做为密集网络的输入传递进去。不幸的是,为了让它可以应付一张典型的智能手机照片,咱们的网络必须包含数千万甚至上亿的神经元。另外一方面,虽然咱们能够将照片缩小,可是咱们也会在这个过程当中损失有价值的信息。因此咱们立刻就会发现,传统的策略是没有用的——咱们须要一种新的聪明的方法,来尽量多的利用数据,但同时还要减小必需的计算量和参数。这就是 CNN 发挥做用的时候了。架构

数字照片的数据结构app

让咱们先花少量时间解释一下数字图像的存储方式。大多数人可能意识到了,图像实际上就是巨大的数字矩阵。每一个数字表明的是一个单独像素的亮度。在 RGB 模型中,彩色图片是由 3 个这样的矩阵组成的,每一个矩阵对应着 3 个颜色通道(红、绿、蓝)中的一个。在黑白图像中,咱们仅使用一个矩阵。每一个矩阵都存储着 0 到 255 的数值。这个数值范围是图像存储信息的效率(256 个数值恰好对应一个字节)和人眼敏感度之间的折中(咱们仅能区分同种颜色的几种有限色度)。框架

图 2. 数字图像的数据结构

卷积函数

核卷积并不只仅用在卷积神经经网络中,它也是不少其余计算机视觉算法的关键元素。这个过程是这样的:咱们有一个小的数字矩阵(称做卷积核或滤波器),咱们将它传递到咱们的图像上,而后基于滤波器的数值进行变换。后续的特征图的值要经过下面的公式计算,其中输入图像被记做 f,咱们的卷积核为 h。计算结果的行列索引分别记为 m 和 n。学习

图 3. 核卷积的例子

在将咱们的滤波器放在选中的像素上以后,咱们将卷积核中的每个数值和图像中对应的数值成对相乘。最后将乘积的结果相加,而后把结果放在输出特征图的正确位置上。咱们在上边的动画中能够以一个微观的形式看到这个运算的过程,可是更有趣的是咱们在整幅图像上执行这个运算获得的结果。图 4 展现了用数个滤波器作卷积的结果。优化

图 4. 用卷积核寻找边缘

Valid 和 Same 的卷积动画

如图 3 所示,当咱们在用 3x3 的卷积核在 6x6 的图像上执行卷积时,咱们获得了 4x4 的特征图。这是由于在咱们的图像里面,只有 16 个独特的位置来放置卷积核。因为咱们的图像的尺寸在每次卷积的时候都会收缩,在图像彻底消失以前,咱们只能作有限次的卷积。此外,若是咱们注意一下卷积核是如何在图像上移动的,咱们会发现,边缘的像素会比中央的像素影响更小。这样的话咱们会损失图片中包含的一些信息,你能够在下图看到,像素的位置是如何改变它对特征图的影响的。

图 5. 像素位置的影响

为了解决这两个问题,咱们可使用一个额外的边界来填充图像。例如,若是咱们使用 1 像素的填充,咱们将图像的尺寸增大到了 8x8,这样,3x3 的滤波器的输出将会成为 6x6。一般在实际中咱们用 0 来作额外的填充。根据咱们是否使用填充,咱们会进行两种类型的卷积——Valid 和 Same。命名至关使人费解,因此在这里解释一下:valid 表明咱们使用的是原始图像,same 表明咱们在图像周围使用了边界,所以输入和输出的图像大小相同。在第二种状况下,扩充的宽度应该知足下面的方程,其中 p 是 padding(填充),f 是滤波器的维度(一般是奇数)。


跨步卷积

图 6. 跨步卷积的例子

在以前的例子中,咱们老是将卷积核移动一个像素。可是,步长也能够看作是卷积层的一个参数。在图 6 中,咱们能够看到,若是咱们使用更大的步长,卷积会成为何样子。在设计 CNN 结构时,若是咱们想让接受域有更少的重叠或者想让特征图有更小的空间维度,那么咱们能够决定增大步长。考虑到扩充和跨步,输出矩阵的维度可使用下面的公式计算:



转换到第三个维度

立体卷积是一个很是重要的概念,它不只让咱们可以处理彩色图像,并且更重要的是,能够在一个单独的层上使用多个滤波器。最重要的规则是,滤波器和你想在其上应用滤波器的图像必须拥有相同的通道数。基本上,咱们继续使用和图 3 相似的示例,尽管咱们此次从第三个维度让矩阵中的数值对相乘。若是咱们想在同一张图像上应用多个滤波器,咱们会为每一个滤波器独立地计算卷积,而后将计算结果逐个堆叠,最后将他们组合成一个总体。获得的张量(3D 矩阵能够被称做张量)知足下面的方程,其中:n 是图像的大小,f 是滤波器的大小,n_c 是图像中的通道数,p 是所用的填充,s 是所用的步长,n_f 是滤波器的数量。

图 7. 立体卷积

卷积层

使用咱们今天所学内容构造一个卷积层的时间到了。咱们的方法几乎与用在密集链接神经网络上的方法相同,惟一的差异就是不使用简单的矩阵相乘,这一次咱们将会使用卷积。前向传播包含两个步骤。第一步是计算中间结果 Z,它是由前一层的输入数据与张量 W(包含滤波器)的卷积结果,加上偏置项 b 获得的。第二步是给咱们的中间结果应用一个非线性的激活函数(咱们的激活函数记做 g)。矩阵方程的爱好者将在下面找到合适的数学公式。在下面的插图中,你能够看见一个小型的可视化,它描述了咱们方程中用到的张量的维度。

图 8. 张量维度

链接剪切和参数共享

在本文开始,因为须要学习的参数数量巨大,我提到密集链接神经网络在处理图像方面是很弱的。既然咱们已经了解了关于卷积的全部内容,让咱们来考虑一下它是如何优化计算的吧。在下图中,2D 卷积以一种稍微不一样的方式进行了可视化——用数字 1-9 标记的神经元组成接收后续像素亮度的输入层,A-D 这 4 个单元表明的是计算获得的特征图元素。最后但同等重要的是,I-IV 是卷积核中的数值——它们必须被学习到。

图 9. 链接剪切和参数共享

如今,让咱们聚焦于卷积层的两个重要属性。第一,你能够看到,连续两层中,并非全部的神经元都是彼此相连的。例如,单元 1 仅仅会影响到 A 的值。第二,咱们发现,一些神经元会共享相同的权重。这两个属性都意味着咱们要学习的参数数量要少不少。顺便说一下,值得注意的是,滤波器中的每一个值都会影响到特征图中的每一个元素——这在反向传播中是特别重要的。

卷积层反向传播

任何一个曾经试图从零编写本身的神经网络的人都知道,前向传播远远不到成功的一半。真正有趣的是当你开始反向传播的时候。如今,咱们没必要在反向传播上花心思——深度学习框架都为咱们作好了,可是我认为,了解背后发生的东西是很值得的。就像在密集链接神经网络中同样,咱们的目标是在一个叫作梯度降低的过程当中计算导数,而后使用它们来更新参数值。

在计算中咱们会使用链式法则——这个我在以前的文章中提到过。咱们想要评估参数的变化对结果特征图的影响,而后评估它对最终结果的影响。在开始进入细节以前,让咱们来统一一下将会用到的数学符号——为了让事情变得容易一些,我会放弃偏导数的完整符号,而会使用下面的简写符号。可是请记住,这个符号始终表明代价函数的偏导数。

图 10. 一个卷积层在前向和反向传播中的输入和输出数据

咱们的任务是计算 dW^[l] 和 db^[l]——它们是与当前层的参数相关的导数,还要计算 dA^[ l -1],它们会被传递到以前的层。如图 10 所示,咱们以 dA^[ l ] 为输入。固然,这些对应张量的维度都是相同的,dW 和 W,db 和 b,以及 dA 和 A。第一步就是经过在咱们的输入张量上应用咱们的激活函数的导数,获得中间值 dZ^[l]。根据链式法则,这个运算的结果在后面会被用到。

如今,咱们须要处理卷积神经网络自身的反向传播,为了达到这个目的,咱们会使用一个叫作全卷积的矩阵运算——见下图。请注意,咱们在这里使用的卷积核会提早旋转 180°。这个运算能够经过下面的公式描述,其中的滤波器记做 W,dZ[m,n] 是一个标量,它属于从前一层获得的偏导数。

图 11. 全卷积

池化层

除了卷积层,CNN 一般会用到所谓的池化层。它们最先被用来减少张量的大小以及加速运算。这些层是比较简单的——咱们须要将咱们的图像分红不一样的区域,而后在每个部分上执行一些运算。例如,对 Max Pool 层而言,咱们会选择每一个区域的最大值,并将它放到对应的输出区域。与卷积层的状况同样,咱们有两个可用的超参数——滤波器大小和步长。最后但一样重要的一点是,若是你对一个多通道的图像执行池化操做,那么每个通道的池化应该单独完成。

图 12. 最大池化(max pooling)的例子

池化层反向传播

咱们在这篇文章中只讨论最大池化反向传播,可是咱们学到的规则是适用于全部类型的池化层的——只须要作微小的调整便可。由于在这种层中,咱们没有任何须须更新的参数,因此咱们的任务就是合适地分配梯度。咱们记得,在最大池化的前向传播中,咱们选择的是每一个区域的最大值,并将它传递到了下一层。因此在反向传播中也是很清晰的,梯度不该该影响前向传播中不包含的矩阵的元素。实际上,这是经过建立一个掩膜来完成的,这个掩膜记住了前一阶段数值的位置,咱们能够在后面转移梯度的时候用到。


图 13. 最大池化反向传播

相关文章
相关标签/搜索