卷积神经网络工作原理直观的解释?
从最基础的开始
对二维数字信号(图像)的操作,可以写成矩阵形式。
<img src="https://pic4.zhimg.com/50/v2-6c3ecd5935b257fbd52cd57d0ac2402b_hd.png" data-rawwidth="389" data-rawheight="377" class="content_image" width="389">比如对图像做平滑,一个典型的8领域平滑,其结果中的每个值都来源于原对应位置和其周边8个元素与一个3X3矩阵的乘积:
<img src="https://pic2.zhimg.com/50/v2-b92779a7dba6c9105b2c86dff70fef65_hd.png" data-rawwidth="703" data-rawheight="368" class="origin_image zh-lightbox-thumb" width="703" data-original="https://pic2.zhimg.com/v2-b92779a7dba6c9105b2c86dff70fef65_r.png">也就相当于对原矩阵,按照顺序将各区域元素与W矩阵相乘,W 矩阵为
<img src="https://pic2.zhimg.com/50/v2-837dfd79c625629a0f04e57c0ffb10ed_hd.png" data-rawwidth="277" data-rawheight="130" class="content_image" width="277">这也被称作核(Kernel, 3X3)
其处理效果如下:
<img src="https://pic4.zhimg.com/50/v2-ccdd4c56e745b3c4b279f3dc52a88737_hd.png" data-rawwidth="900" data-rawheight="411" class="origin_image zh-lightbox-thumb" width="900" data-original="https://pic4.zhimg.com/v2-ccdd4c56e745b3c4b279f3dc52a88737_r.png">也就是,这个核对图像进行操作,相当于对图像进行了低通滤波。因此这个核也被称为滤波器,整个操作过程按照概念称为卷积。
扩展来讲,对二维图像的滤波操作可以写成卷积,比如常见的高斯滤波、拉普拉斯滤波(算子)等。
<img src="https://pic1.zhimg.com/50/v2-6cc428eebcf692486a8e6b52d3a558c0_hd.png" data-rawwidth="275" data-rawheight="307" class="content_image" width="275">滤波器跟卷积神经网络有什么关系呢。不如我们预想一个识别问题:我们要识别图像中的某种特定曲线,也就是说,这个滤波器要对这种曲线有很高的输出,对其他形状则输出很低,这也就像是神经元的**。
我们设计的滤波器和想要识别的曲线如下:
<img src="https://pic4.zhimg.com/50/v2-c5d4c0c3fac68a7a711b3e31b552313f_hd.png" data-rawwidth="615" data-rawheight="271" class="origin_image zh-lightbox-thumb" width="615" data-original="https://pic4.zhimg.com/v2-c5d4c0c3fac68a7a711b3e31b552313f_r.png">假设上面的核(滤波器)按照卷积顺序沿着下图移动:
那么当它移动到上面的位置时,按照矩阵操作,将这个区域的图像像素值与滤波器相乘,我们得到一个很大的值(6600):
<img src="https://pic2.zhimg.com/50/v2-8b9d835be42ae0253c20108dbb976f3d_hd.png" data-rawwidth="705" data-rawheight="261" class="origin_image zh-lightbox-thumb" width="705" data-original="https://pic2.zhimg.com/v2-8b9d835be42ae0253c20108dbb976f3d_r.png">而当这个滤波器移动到其他区域时,我们得到一个相对很小的值:
<img src="https://pic3.zhimg.com/50/v2-ff07f869ed9446ee048ac218e6c77bce_hd.png" data-rawwidth="702" data-rawheight="251" class="origin_image zh-lightbox-thumb" width="702" data-original="https://pic3.zhimg.com/v2-ff07f869ed9446ee048ac218e6c77bce_r.png">如此,我们对整个原图进行一次卷积,得到的结果中,在那个特定曲线和周边区域,值就很高,在其他区域,值相对低。这就是一张**图。对应的高值区域就是我们所要检测曲线的位置。
在训练卷积审计网络(CNN)的某一个卷积层时,我们实际上是在训练一系列的滤波器(filter)。比如,对于一个32x32x3(宽32像素x高32像素xRGB三通道)的图像,如果我们在CNN的第一个卷积层定义训练12个滤波器,那就这一层的输出便是32X32X12.按照不同的任务,我们可以对这个输出做进一步的处理,这包括**函数,池化,全连接等。
<img src="https://pic2.zhimg.com/50/v2-4d49151943dd467c46ea9e055e82f9c1_hd.png" data-rawwidth="552" data-rawheight="420" class="origin_image zh-lightbox-thumb" width="552" data-original="https://pic2.zhimg.com/v2-4d49151943dd467c46ea9e055e82f9c1_r.png">简单来说,训练CNN在相当意义上是在训练每一个卷积层的滤波器。让这些滤波器组对特定的模式有高的**,以达到CNN网络的分类/检测等目的。
<img src="https://pic1.zhimg.com/50/v2-c29a52fa109192d2f6df1869bd78f8b0_hd.jpg" data-rawwidth="560" data-rawheight="558" class="origin_image zh-lightbox-thumb" width="560" data-original="https://pic1.zhimg.com/v2-c29a52fa109192d2f6df1869bd78f8b0_r.jpg"><Fig. 一个实际CNN(AlexNet)第一个卷积层的滤波器>
卷积神经网络的第一个卷积层的滤波器用来检测低阶特征,比如边、角、曲线等。随着卷积层的增加,对应滤波器检测的特征就更加复杂(理性情况下,也是我们想要的情况)。比如第二个卷积层的输入实际上是第一层的输出(滤波器**图),这一层的滤波器便是用来检测低价特征的组合等情况(半圆、四边形等),如此累积,以检测越来越复杂的特征。实际上,我们的人类大脑的视觉信息处理也遵循这样的低阶特征到高阶特征的模式(Owl of Minerva:为什么无彩色系(黑白灰色)在色彩搭配中可以和谐地与任何彩色搭配?)。最后一层的滤波器按照训练CNN目的的不同,可能是在检测到人脸、手写字体等时候**[1]。
所以,在相当程度上,构建卷积神经网络的任务就在于构建这些滤波器。也就是,将这些滤波器变成这样(改变滤波器矩阵的值,也就是Weight)的——能识别特定的特征。这个过程叫做训练。
在训练开始之时,卷积层的滤波器是完全随机的,它们不会对任何特征**(不能检测任何特征)。这就像刚出生的孩子,TA不知道什么是人脸、什么是狗,什么是上下左右。TA需要学习才知道这些概念,也就是通过接触人脸、狗、上下左右,并被告知这些东西分别是人脸、狗、上下左右。然后TA才能在头脑中记住这些概念,并在之后的某一次见到之后能准确的给出结果。
把一个空白的滤波其,修改其权重(weights)以使它能检测特定的模式,整个过程就如工程里面的反馈。
<img src="https://pic2.zhimg.com/50/v2-36a36bcf10325397b6d8ea62d3acd629_hd.png" data-rawwidth="800" data-rawheight="329" class="origin_image zh-lightbox-thumb" width="800" data-original="https://pic2.zhimg.com/v2-36a36bcf10325397b6d8ea62d3acd629_r.png">想想一下,如果有一只无意识的猴子,完全随机的修改一个5X5滤波器矩阵的25个值,那完全可能经过一定的轮次之后,这个滤波器能够检测棱角等特征。这是一种无反馈的训练情况。对神经网络的训练当然不能如此,我们不可能靠运气去做这件事情。
举个例子,我们要训练一个用于分类的神经网络,让它能判定输入图像中的物体最可能是十个类别的哪一类。那么,训练过程就是这样的:
第一次训练,输入一张图像,这个图像通过各层卷积处理输出量一组向量[1,1,1,1,1,1,1,1,1,1], 也就是,对于完全由随机滤波器构建的网络,其输出认为这张图等概率的是十个类别中的某一种。但是对于训练,我们有一个Gound Thuth, 也就是这张图中物体所属的类别:[0,0,1,0,0,0,0,0,0,0],也就是属于第三类。这时候我们可以定义一个损失函数,比如常见的MSE(mean squared error).我们假定L是这个损失函数的输出。这时候我们的目的就是,让L的值反馈(这种神经网络概念下称为 back propagation, 反向传输)给整个卷积神经网络,以修改各个滤波器的权重,使得损失值L最小。
<img src="https://pic4.zhimg.com/50/v2-c2e7f995f2ece459495df5a0cdf4ff43_hd.png" data-rawwidth="304" data-rawheight="238" class="content_image" width="304">这是一个典型的最优化问题。当然地,在工程上我们几乎不可能一次就把滤波器的权重W修改到使L最小的情况,而是需要多次训练和多次修改。
<img src="https://pic4.zhimg.com/50/v2-5b17d0411f1b341a3f08ed035956a253_hd.png" data-rawwidth="284" data-rawheight="208" class="content_image" width="284">如果情况理想的话,权重修改的方向是使得L的变化收敛的。这也就是说很可能达到了我们训练这个神经网络的目的——让各个卷积层的滤波器能够组合起来最优化的检测特定的模式。
--------
[1] Zeiler, M. D., & Fergus, R. (2014, September). Visualizing and understanding convolutional networks. In European conference on computer vision (pp. 818-833). Springer, Cham.
更多回答
http://scs.ryerson.ca/~aharley/vis/conv/
不过需要电脑才能打开,不方便的童鞋呐,可以看下边的文章预热一下~
http://m.huxiu.com/article/138857/1.html
开始正式的答题,学历尚浅,多有偏颇之处,还望指正
来源资料:PRML,cs231n,以及部分论文
其实我们在做线性回归也好,分类(逻辑斯蒂回归)也好,本质上来讲,就是把数据进行映射,要么映射到一个多个离散的标签上,或者是连续的空间里面,一般简单的数据而言,我们很好拟合,只要线性变化一下,然后学习出最好的W就可以了,但是对于一些比较复杂的数据怎么办呢?比如说,对于一个二分类问题,特别是高纬度复杂化之后,数据不一定是线性可分的,这个时候,我们的basis function隆重登场,我们可以把数据进行一定的映射,转变,非线性的线性的,转变之后,就可以进行分类,最明显的例子在andrew NG在讲SVM里面的例子就很好的说明了,但是这个时候问题来了,对于一个很复杂,高维度的数据,我们如何才能找到最好的basis function呢?这个时候,神经网络隆重登场,我们把我们的basis function打开来,我们把误差转递到basis function的里面,通过这样的方式,来得到最好的basis function,同理,我们可以无限打开basis function,一直打开,对应的也就是一层神经网络(具体出自于prml关于神经网络的章节最开始简介的部分),但是问题来了,对于图片怎么办?我们知道,对于图片而言,图片是一个二维度的数据,我们怎样才能通过学习图片正确的模式来对于一张图片有正确的对于图片分类呢?这个时候,有人就提出了一个观点,我们可以这样,对于所有的像素,全部都连接上一个权值,我们也分很多层,然后最后进行分类,这样也可以,但是对于一张图片来说,像素点太多,参数太多了。然后就有人提出来,我们只看一部分怎么样,就是对于一张图片来说,我们只看一个小窗口就可以了,对于其他的地方,我们也提供类似的小窗口,我们知道,当我们对图片进行卷积的时候,我们可以对图片进行很多操作,比如说图片整体模糊,或者是边缘的提取,卷积操作对于图片来说可以很好的提取到特征,而且通过BP误差的传播,我们可以根据不同任务,得到对于这个任务最好的一个参数,学习出相对于这个任务的最好的卷积核,之所以权值共享的逻辑是:如果说一个卷积核在图片的一小块儿区域可以得到很好的特征,那么在其他的地方,也可以得到很好的特征。
这就有了alex net的提出,通过对图片进行五层(不知道有没有记忆错误)的卷积,然后后面三层的全连接,我们可以得到一个很好的结果,特别的相对于更大的数据集而言,最好参数越多越好,也就是网络最好更加深,更加的宽。
但是神经网络到底是什么?对于一批数据我们有很多的问题,为什么设置五层最好,batchsize多少比较好,每一层多少个卷积核(这个到现在我依旧没有一个更好的解释,每一个应该多少卷积核),宽度多少?要不要LRN?每一层都代表了什么?
这些的解释,就要好好看看今年CVPR的文章Visualizing and Understanding Convolutional Networks 这篇文章写的很棒,而且2015 CVPR出了很多对于卷积神经网络理解的文章,这篇文章提出了一个反卷积的方法(De-convolution)的方法,这样我们就可以好好看看每一层卷积神经网络到底做了什么事情:
首先第一层的返卷积(上面是反卷积的图片,下面对于第一层来说,**值最大的图片):
<img src="https://pic1.zhimg.com/50/d68d271178e7dd3a0fd47ec44e7fefa0_hd.png" data-rawwidth="403" data-rawheight="552" class="content_image" width="403">我们看到,第一个卷积层只是表达了简单的图片的边缘而已,我们来看第二层:
<img src="https://pic4.zhimg.com/50/8906f1eb5cc9bc86d15d1630c40a5b9f_hd.png" data-rawwidth="1147" data-rawheight="562" class="origin_image zh-lightbox-thumb" width="1147" data-original="https://pic4.zhimg.com/8906f1eb5cc9bc86d15d1630c40a5b9f_r.png">第二层稍稍复杂了一点点,可以包含的不仅仅是一个边缘,可以是几个边缘的组合
第三层:
<img src="https://pic2.zhimg.com/50/6f600422e7aeb19850b19c55aea04a11_hd.png" data-rawwidth="1472" data-rawheight="549" class="origin_image zh-lightbox-thumb" width="1472" data-original="https://pic2.zhimg.com/6f600422e7aeb19850b19c55aea04a11_r.png">第四层:
<img src="https://pic4.zhimg.com/50/f9c5fe43099bde52bd9673db4383e10f_hd.png" data-rawwidth="666" data-rawheight="833" class="origin_image zh-lightbox-thumb" width="666" data-original="https://pic4.zhimg.com/f9c5fe43099bde52bd9673db4383e10f_r.png">第五层:
<img src="https://pic1.zhimg.com/50/074357f5b07e0c14ecf740ca47a3c728_hd.png" data-rawwidth="667" data-rawheight="823" class="origin_image zh-lightbox-thumb" width="667" data-original="https://pic1.zhimg.com/074357f5b07e0c14ecf740ca47a3c728_r.png">我们看到,每一层都是对于一张图片从最基础的边缘,不断到最复杂的图片自己本身。
同时在进行反卷积的时候M.D. Zeiler and R. Fergus也发现,对于第一层的alexnet,会得到频度很高的像素(也就是颜色很深),所以他们也提出了应该要减小窗口,这样可以得到频度比较适中的像素:
<img src="https://pic1.zhimg.com/50/1f0c506afdf7c4493d398bb9c2d20408_hd.png" data-rawwidth="561" data-rawheight="232" class="origin_image zh-lightbox-thumb" width="561" data-original="https://pic1.zhimg.com/1f0c506afdf7c4493d398bb9c2d20408_r.png">当图片卷积完之后,会把一个图片对于这一类本身最独特的部分凸显出来,然后来进行判断,这一类到底是什么?有下面的实验截图:
<img src="https://pic3.zhimg.com/50/4ef49fb833cc7a3510f81da4343ed1ae_hd.png" data-rawwidth="1448" data-rawheight="262" class="origin_image zh-lightbox-thumb" width="1448" data-original="https://pic3.zhimg.com/4ef49fb833cc7a3510f81da4343ed1ae_r.png">最左边的图像是原图像,作者盖住不同的区域,来分析对于一张图片,经过五次卷积之后,到底是如何判断的,我们看到卷积到最后(左三),比较凸显出来的是狗的头部,左二和右二的意思是,当我们遮住不同的区域,判断是狗的几率,红色区域代表概率很高,蓝色区域代表概率很低,我们发现,当我们遮挡住狗的头的地方的时候,我们得到这个物体时狗的概率最低,这个侧面证明了,所谓卷积神经网络,就是会自动的对于一张图片学习出最好的卷积核以及这些卷积核的组合方式,也就是对于一张图片的任务来说,求出最好的图片对于本任务的特征的表达,然后来进行判断
还有一篇文章也助于理解,
UnderstandingDeepImageRepresentationsbyInvertingThem
这篇对于卷积每一层都不断的还原到最原始的图片:
<img src="https://pic1.zhimg.com/50/c3292580aa367cb7d07d5409d3d76f1c_hd.png" data-rawwidth="1759" data-rawheight="366" class="origin_image zh-lightbox-thumb" width="1759" data-original="https://pic1.zhimg.com/c3292580aa367cb7d07d5409d3d76f1c_r.png">越是到后面,图片越模糊,但是它自己独特的部分,却凸显了出来。(也就是这个猩猩还是狒狒的头的部分)
还望指正,多谢
反正我写的也没什么人看,随意干啥都行,标明作者就好了。
最后打一个小广告,有兴趣报考人工智能/CS硕士的童鞋,可以看看我的live