1、 卷积神经网络 CNN 从入门到精通卷积神经网络算法的一个实现前言从理解卷积神经到实现它,前后花了一个月时间,现在也还有一些地方没有理解透彻,CNN 还是有一定难度的,不是看哪个的博客和一两篇论文就明白了,主要还是靠自己去专研,阅读推荐列表在末尾的参考文献。目前实现的 CNN 在 MINIT 数据集上效果还不错,但是还有一些 bug,因为最近比较忙,先把之前做的总结一下,以后再继续优化。卷积神经网络 CNN 是 Deep Learning 的一个重要算法,在很多应用上表现出卓越的效果,1中对比多重算法在文档字符识别的效果,结论是 CNN 优于其他所有的算法。CNN 在手写体识别取得最好的效果,
2、2将 CNN 应用在基于人脸的性别识别,效果也非常不错。前段时间我用 BP 神经网络对手机拍照图片的数字进行识别,效果还算不错,接近 98%,但在汉字识别上表现不佳,于是想试试卷积神经网络。1、CNN 的整体网络结构卷积神经网络是在 BP 神经网络的改进,与 BP 类似,都采用了前向传播计算输出值,反向传播调整权重和偏置;CNN 与标准的 BP 最大的不同是:CNN 中相邻层之间的神经单元并不是全连接,而是部分连接,也就是某个神经单元的感知区域来自于上层的部分神经单元,而不是像 BP 那样与所有的神经单元相连接。CNN 的有三个重要的思想架构:局部区域感知权重共享空间或时间上的采样局部区域感知
3、能够发现数据的一些局部特征,比如图片上的一个角,一段弧,这些基本特征是构成动物视觉的基础3;而 BP 中,所有的像素点是一堆混乱的点,相互之间的关系没有被挖掘。CNN 中每一层的由多个 map 组成,每个 map 由多个神经单元组成,同一个map 的所有神经单元共用一个卷积核(即权重) ,卷积核往往代表一个特征,比如某个卷积和代表一段弧,那么把这个卷积核在整个图片上滚一下,卷积值较大的区域就很有可能是一段弧。注意卷积核其实就是权重,我们并不需要单独去计算一个卷积,而是一个固定大小的权重矩阵去图像上匹配时,这个操作与卷积类似,因此我们称为卷积神经网络,实际上,BP 也可以看做一种特殊的卷积神经网
4、络,只是这个卷积核就是某层的所有权重,即感知区域是整个图像。权重共享策略减少了需要训练的参数,使得训练出来的模型的泛华能力更强。采样的目的主要是混淆特征的具体位置,因为某个特征找出来后,它的具体位置已经不重要了,我们只需要这个特征与其他的相对位置,比如一个“8”,当我们得到了上面一个“o“ 时,我们不需要知道它在图像的具体位置,只需要知道它下面又是一个“o”我们就可以知道是一个8了,因为图片中“8“在图片中偏左或者偏右都不影响我们认识它,这种混淆具体位置的策略能对变形和扭曲的图片进行识别。CNN 的这三个特点是其对输入数据在空间(主要针对图像数据)上和时间(主要针对时间序列数据,参考 TDNN
5、)上的扭曲有很强的鲁棒性。CNN 一般采用卷积层与采样层交替设置,即一层卷积层接一层采样层,采样层后接一层卷积.这样卷积层提取出特征,再进行组合形成更抽象的特征,最后形成对图片对象的描述特征,CNN 后面还可以跟全连接层,全连接层跟 BP 一样。下面是一个卷积神经网络的示例:图 1(图片来源)卷积神经网络的基本思想是这样,但具体实现有多重版本,我参考了 matlab 的Deep Learning 的工具箱 DeepLearnToolbox,这里实现的 CNN 与其他最大的差别是采样层没有权重和偏置,仅仅只对卷积层进行一个采样过程,这个工具箱的测试数据集是MINIST,每张图像是 28*28 大
6、小,它实现的是下面这样一个 CNN:图 22、网络初始化CNN 的初始化主要是初始化卷积层和输出层的卷积核(权重)和偏置,DeepLearnToolbox 里面对卷积核和权重进行随机初始化,而对偏置进行全 0 初始化。3、前向传输计算前向计算时,输入层、卷积层、采样层、输出层的计算方式不相同。3.1 输入层:输入层没有输入值,只有一个输出向量,这个向量的大小就是图片的大小,即一个 28*28 矩阵;3.2 卷积层:卷积层的输入要么来源于输入层,要么来源于采样层,如上图红色部分。卷积层的每一个 map 都有一个大小相同的卷积核,Toolbox 里面是 5*5 的卷积核。下面是一个示例,为了简单起
7、见,卷积核大小为 2*2,上一层的特征 map 大小为 4*4,用这个卷积在图片上滚一遍,得到一个一个(4-2+1)*(4-2+1)=3*3的特征 map,卷积核每次移动一步,因此。在 Toolbox 的实现中,卷积层的一个map 与上层的所有 map 都关联,如上图的 S2 和 C3,即 C3 共有 6*12 个卷积核,卷积层的每一个特征 map 是不同的卷积核在前一层所有 map 上作卷积并将对应元素累加后加一个偏置,再求 sigmod 得到的。还有需要注意的是,卷积层的 map 个数是在网络初始化指定的,而卷积层的 map 的大小是由卷积核和上一层输入 map 的大小决定的,假设上一层的
8、 map 大小是 n*n、卷积核的大小是 k*k,则该层的 map 大小是(n-k+1)*(n-k+1),比如上图的 24*24 的 map 大小 24=(28-5+1) 。 斯坦福的深度学习教程更加详细的介绍了卷积特征提取的计算过程。 图 33.3 采样层( subsampling,Pooling):采样层是对上一层 map 的一个采样处理,这里的采样方式是对上一层 map 的相邻小区域进行聚合统计,区域大小为scale*scale,有些实现是取小区域的最大值,而 ToolBox 里面的实现是采用 2*2 小区域的均值。注意,卷积的计算窗口是有重叠的,而采用的计算窗口没有重叠,ToolBox
9、 里面计算采样也是用卷积(conv2(A,K,valid) 来实现的,卷积核是 2*2,每个元素都是 1/4,去掉计算得到的卷积结果中有重叠的部分,即: 图 44、反向传输调整权重反向传输过程是 CNN 最复杂的地方,虽然从宏观上来看基本思想跟 BP 一样,都是通过最小化残差来调整权重和偏置,但 CNN 的网络结构并不像 BP 那样单一,对不同的结构处理方式不一样,而且因为权重共享,使得计算残差变得很困难,很多论文15和文章4 都进行了详细的讲述,但我发现还是有一些细节没有讲明白,特别是采样层的残差计算,我会在这里详细讲述。4.1 输出层的残差和 BP 一样, CNN 的输出层的残差与中间层的
10、残差计算方式不同,输出层的残差是输出值与类标值得误差值,而中间各层的残差来源于下一层的残差的加权和。输出层的残差计算如下:公式来源这个公式不做解释,可以查看公式来源,看斯坦福的深度学习教程的解释。4.2 下一层为采样层(subsampling )的卷积层的残差当一个卷积层 L 的下一层(L+1)为采样层,并假设我们已经计算得到了采样层的残差,现在计算该卷积层的残差。从最上面的网络结构图我们知道,采样层(L+1)的 map 大小是卷积层 L 的 1/(scale*scale) ,ToolBox 里面,scale 取 2,但这两层的 map 个数是一样的,卷积层 L 的某个 map 中的 4 个单
11、元与 L+1 层对应 map的一个单元关联,可以对采样层的残差与一个 scale*scale 的全 1 矩阵进行克罗内克积进行扩充,使得采样层的残差的维度与上一层的输出 map 的维度一致,Toolbox的代码如下,其中 d 表示残差,a 表示输出值:net.layersl.dj = net.layersl.aj .* (1 - net.layersl.aj) .* expand(net.layersl + 1.dj, net.layersl + 1.scale net.layersl + 1.scale 1)扩展过程:图 5利用卷积计算卷积层的残差:图 64.3 下一层为卷积层(subsam
12、pling )的采样层的残差当某个采样层 L 的下一层是卷积层(L+1),并假设我们已经计算出 L+1 层的残差,现在计算 L 层的残差。采样层到卷积层直接的连接是有权重和偏置参数的,因此不像卷积层到采样层那样简单。现再假设 L 层第 j 个 map Mj 与 L+1 层的 M2j 关联,按照 BP 的原理, L 层的残差 Dj 是 L+1 层残差 D2j 的加权和,但是这里的困难在于,我们很难理清 M2j 的那些单元通过哪些权重与 Mj 的哪些单元关联,Toolbox 里面还是采用卷积(稍作变形)巧妙的解决了这个问题,其代码为:convn(net.layersl + 1.dj, rot180
13、(net.layersl + 1.kij), full);rot180 表示对矩阵进行 180 度旋转(可通过行对称交换和列对称交换完成) ,为什么这里要对卷积核进行旋转,答案是:通过这个旋转,full 模式下得卷积的正好抓住了前向传输计算上层 map 单元与卷积和及当期层 map 的关联关系,需要注意的是 matlab 的内置函数 convn 在计算卷积前,会对卷积核进行一次旋转,因此我们之前的所有卷积的计算都对卷积核进行了旋转:a =1 1 11 1 11 1 1k =1 2 34 5 67 8 9 convn(a,k,full)ans =1 3 6 5 35 12 21 16 912 2
14、7 45 33 1811 24 39 28 157 15 24 17 9convn 在计算前还会对待卷积矩阵进行 0 扩展,如果卷积核为 k*k,待卷积矩阵为 n*n,需要以 n*n 原矩阵为中心扩展到(n+2(k-1)*(n+2(k-1) ,所有上面convn(a,k,full)的计算过程如下:图 7实际上 convn 内部是否旋转对网络训练没有影响,只要内部保持一致(即都要么旋转,要么都不旋转) ,所有我的卷积实现里面没有对卷积核旋转。如果在 convn 计算前,先对卷积核旋转 180 度,然后 convn 内部又对其旋转 180 度,相当于卷积核没有变。为了描述清楚对卷积核旋转 180
15、与卷积层的残差的卷积所关联的权重与单元,正是前向计算所关联的权重与单元,我们选一个稍微大一点的卷积核,即假设卷积层采用用 3*3 的卷积核,其上一层采样层的输出 map 的大小是 5*5,那么前向传输由采样层得到卷积层的过程如下:图 8这里我们采用自己实现的 convn(即内部不会对卷积核旋转) ,并假定上面的矩阵A、B 下标都从 1 开始,那么有:B11 = A11*K11 + A12*K12 + A13*K13 + A21*K21 + A22*K22 + A23*K23 + A31*K31 + A32*K32 + A33*K33B12 = A12*K11 + A13*K12 + A14*K
16、13 + A22*K21 + A23*K22 + A24*K23 + A32*K31 + A33*K32 + A34*K33B13 = A13*K11 + A14*K12 + A15*K13 + A23*K21 + A24*K22 + A25*K23 + A33*K31 + A34*K32 + A35*K33B21 = A21*K11 + A22*K12 + A23*K13 + A31*K21 + A32*K22 + A33*K23 + A41*K31 + A42*K32 + A43*K33B22 = A22*K11 + A23*K12 + A24*K13 + A32*K21 + A33*K2
17、2 + A34*K23 + A42*K31 + A43*K32 + A44*K33B23 = A23*K11 + A24*K12 + A25*K13 + A33*K21 + A34*K22 + A35*K23 + A43*K31 + A44*K32 + A45*K33B31 = A31*K11 + A32*K12 + A33*K13 + A41*K21 + A42*K22 + A43*K23 + A51*K31 + A52*K32 + A53*K33B32 = A32*K11 + A33*K12 + A34*K13 + A42*K21 + A43*K22 + A44*K23 + A52*K31
18、 + A53*K32 + A54*K33B33 = A33*K11 + A34*K12 + A35*K13 + A43*K21 + A44*K22 + A45*K23 + A53*K31 + A54*K32 + A55*K33我们可以得到 B 矩阵每个单元与哪些卷积核单元和哪些 A 矩阵的单元之间有关联:A11 K11 B11A12 K12, K11 B12, B11A13 K13, K12, K11 B12, B13, B11A14 K13, K12 B12, B13A15 K13 B13A21 K21, K11 B21, B11A22 K22, K21, K12, K11 B12, B22
19、, B21, B11A23 K23, K22, K21, K13, K12, K11 B23, B22, B21, B12, B13, B11A24 K23, K22, K13, K12 B23, B12, B13, B22A25 K23, K13 B23, B13A31 K31, K21, K11 B31, B21, B11A32 K32, K31, K22, K21, K12, K11 B31, B32, B22, B12, B21, B11A33 K33, K32, K31, K23, K22, K21, K13, K12, K11 B23, B22, B21, B31, B12, B1
20、3, B11, B33, B32A34 K33, K32, K23, K22, K13, K12 B23, B22, B32, B33, B12, B13A35 K33, K23, K13 B23, B13, B33A41 K31, K21 B31, B21A42 K32, K31, K22, K21 B32, B22, B21, B31A43 K33, K32, K31, K23, K22, K21 B31, B23, B22, B32, B33, B21A44 K33, K32, K23, K22 B23, B22, B32, B33A45 K33, K23 B23, B33A51 K31
21、 B31A52 K32, K31 B31, B32A53 K33, K32, K31 B31, B32, B33A54 K33, K32 B32, B33A55 K33 B33然后再用 matlab 的 convn(内部会对卷积核进行 180 度旋转)进行一次convn(B,K,full),结合图 7,看红色部分,除去0,A11=B33*K33=B11*K11,发现 A11 正好与 K11、B11 关联对不对;我们再看一个A24=B34*K21+B35*K22+B44*K31+B45*K32=B12*K23+B13*K22+B22*K13+B23*K12,发现参与 A24 计算的卷积核单元与
22、B 矩阵单元,正好是前向计算时关联的单元,所以我们可以通过旋转卷积核后进行卷积而得到采样层的残差。残差计算出来后,剩下的就是用更新权重和偏置,这和 BP 是一样的,因此不再细究,有问题欢迎交流。5、代码实现详细的代码不再这里贴了,我依旧放在了 github,欢迎参考和指正。我又是在重造车轮了,没有使用任何第三方的库类,这里贴一下调用代码:public static void runCnn() /创建一个卷积神经网络LayerBuilder builder = new LayerBuilder();builder.addLayer(Layer.buildInputLayer(new Size(2
23、8, 28);builder.addLayer(Layer.buildConvLayer(6, new Size(5, 5);builder.addLayer(Layer.buildSampLayer(new Size(2, 2);builder.addLayer(Layer.buildConvLayer(12, new Size(5, 5);builder.addLayer(Layer.buildSampLayer(new Size(2, 2);builder.addLayer(Layer.buildOutputLayer(10);CNN cnn = new CNN(builder, 50)
24、;/导入数据集String fileName = “dataset/train.format“;Dataset dataset = Dataset.load(fileName, “,“, 784);cnn.train(dataset, 3);/String modelName = “model/n“;cnn.saveModel(modelName); dataset.clear();dataset = null;/预测/ CNN cnn = CNN.loadModel(modelName); Dataset testset = Dataset.load(“dataset/test.format
25、“, “,“, -1);cnn.predict(testset, “dataset/test.predict“);6、参考文献1.YANN LECUN. Gradient-Based Learning Applied to Document Recognition.2.Shan Sung LIEW. Gender classification: A convolutional neural network approach.3 D. H. Hubel and T. N. Wiesel, “Receptive fields, binocular interaction teraction,and
26、 functional architecture in the cats visual cortex,”4 tornadomeet. http:/ Jake Bouvrie. Notes on Convolutional Neural Networks.6 C+实现的详细介绍. http:/ matlab DeepLearnToolbox https:/ Neural Networks:CNN)是人工神经网络(ANN)的一种,是深度学习的一种学习算法。它在图像识别和分类、自然语言处理广告系统中都有应用。有意思是,卷积神经网络的提出其实就是来自于生物视觉模型。1981 年的诺贝尔医学奖,颁发给了
27、 David Hubel、Torsten Wiesel。他们的工作给人们呈现了视觉系统是如何将来自外界的视觉信号传递到视皮层,并通过一系列处理过程(包括边界检测、运动检测、立体深度检测和颜色检测),最后在大脑中构建出一幅视觉图像。这个发现激发了人们对于神经系统的进一步思考,神经-中枢-大脑的工作过程,或许是一个不断迭代、不断抽象的过程。如下图所示,从原始信号摄入开始(瞳孔摄入像素 Pixels),首先进行初步处理(大脑皮层某些细胞发现边缘和方向),抽象(大脑判定眼前的物体的形状是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。六十年代的生理学的发现,促成了计算机人工智能在四十年后的突
28、破性发展。1989 年, Yann LeCun (纽约大学教授,现 Facebook AI 研究室主任) 提出了卷积神经网络,这是第一个真正成功训练多层网络结构的学习算法,但在当时的计算能力下效果欠佳。直到 2006 年, Geoffrey Hinton 提出基于深信度网(Deep Belief Net)和限制波尔兹曼机(RestrictedBoltzmann Machine)的学习算法,重新点燃了人工智能领域对于神经网络的热情。卷积神经网络现在计算机视觉领域表现出众。 ImageNet Classification with Deep Convolutional Neural Network
29、s,这篇发表于 NIPS2012 的文章,是Hinton 与其学生为了回应别人对于 Deep Learning 的质疑而将 CNN 结合 GPU并行技术用于 Imagenet Challenge(图像识别目前最大的数据库,被誉为计算机视觉圣杯),最终取得了非常惊人的结果。他们的算法在 2012 年取得世界最好结果,使分类错误率从 26.2%下降到 16%。2013 年 Matthew Zeiler 的算法继续将错误率下降到 11.2%。 Matthew Zeiler 还创立了 Clarifai,让我们可以有机会使用他们的图像识别算法对图片标注分类或图像搜索。The convnet from K
30、rizhevsky et al.s NIPS 2012 ImageNet classification paper.在月初 Kaggle 结束的 Galaxy Zoo challenge 中,参赛者要对星系图像进行分类(Spiral/Elliptical, Merging/Not merging, Clockwise/Anti-clockwise),获胜的算法也是使用了卷积神经网络。Sander Dieleman 已放出了代码和详尽的文档: My solution for the Galaxy Zoo challenge2014 年 3 月,Facebook 刚刚公布了他们在 CVPR2014
31、 的文章: DeepFace: Closing the Gap to Human-Level Performance in Face Verification。他们用四百万人脸图片训练了一个九层的卷积神经网络来获得脸部特征,神经网络处理的参数高达 1.2 亿。他们在著名的公共测试数据集 LFW(labeled face in the wild,1:1 地判断是否两个照片是一个人)上达到了 97.25%的正确率。这个数字已经基本接近人眼的辨识水平。北京 Face+团队的算法达到 97.27%的正确率,在美图秀秀中就有应用,他们的主页提供了 API、demo 展示和论文。现在的最新进展是,香港中文
32、大学基于 Fisher Discriminant Analysis 的算法将Face Verification 正确率提高到 98.52%,超过了人类水平( 97.53%)。System overview in Face+ paper in ICCV2013除了计算机视觉领域,卷积神经网络在人工智能和 robotics 也有很大潜力。Hinton 的另外一个学生创立了人工智能公司 DeepMind,没有商业产品,只凭一篇论文,就已被 Google 招聘式收购。 他们使用深度学习(CNN)结合强化学习(Reinforcement Learning),在 Stella 模拟机上让机器自己玩了 7
33、个 Atari 2600 的游戏,结果不仅战胜了其他机器人,甚至在其中 3 个游戏中超越了人类游戏专家。很有意思,具体可以见 InfoQ 的 看 DeepMind 如何用Reinforcement learning 玩游戏,以及论文原文 Playing Atari with Deep Reinforcement Learning从线性分类器到卷积神经网络前言本文大致分成两大部分,第一部分尝试将本文涉及的分类器统一到神经元类模型中,第二部分阐述卷积神经网络(CNN)的发展简述和目前的相关工作。本文涉及的分类器(分类方法)有:线性回归逻辑回归(即神经元模型)神经网络(NN)支持向量机(SVM)卷积
34、神经网络(CNN)从神经元的角度来看,上述分类器都可以看成神经元的一部分或者神经元组成的网络结构。各分类器简述逻辑回归说逻辑回归之前需要简述一下线性回归。图 1 单变量的线性回归图 1 中描述了一个单变量的线性回归模型:蓝点代表自变量 x 的分布显然 x 呈现线性分布。于是我们可以用下面的式子对其进行拟合,即我们的目标函数可以写成:y=x+b从单变量到多变量模型,需要将 x 变成向量 x ,同时权重 也需要变成向量 。y= x +b而一般线性回归的损失函数会用欧氏距离来进行衡量,即常说的最小二乘法,单个样本的损失函数可以写成:=12(yy)2而逻辑回归,可以简单理解成线性回归的结果加上了一个
35、sigmoid 函数。图 2 sigmoid 函数图像从本质上来说,加上 sigmoid 函数的目的在于能够将函数输出的值域从(,)映射到 (0,1)之间,于是可以说逻辑回归的输出能够代表一个事件发生的概率。逻辑分类的目标函数和单样本损失函数是:y=sigmoid(w x +b)=ylog(y)(1y)log(1y)这里为何要使用一个复杂的损失函数这构造了一个凸函数,而如果直接使用最小二乘进行定义,损失函数会变成非凸函数。实际上逻辑回归模型虽然名字带有回归,实际上一般用于二分类问题。即对 y设置一个阈值(一般是 0.5) ,便实现了二分类问题。而逻辑回归模型的另外一个名称为神经元模型即我们认为
36、大脑的神经元有着像上述模型一样的结构:一个神经元会根据与它相连的神经元的输入(x)做出反应,决定自身的激活程度(一般用 sigmoid 函数衡量激活程度) ,并将激活后的数值(y)输出到其他神经元。图 3 逻辑回归模型,即单个的神经元模型神经网络(Neural Network,简称 NN)逻辑回归的决策平面是线性的,所以,它一般只能够解决样本是线性可分的情况。如果样本呈现非线性的时候,我们可以引入多项式回归。图 4 多项式回归解决样本线性不可分的情况,图片来自 Andrew Ng 的 Machine Learning 课程的课件其实,多项式回归也可以看成是线性回归或者逻辑回归的一个特例将线性回
37、归或者逻辑回归的特征 x 转化为 x2,x3等非线性的特征组合,然后对其进行线性的拟合。多项式回归虽然能够解决非线性问题,但需要人工构造非线性的特征,那么,是否有一种模型,既能够应付样本非线性可分的情况,又同时能够自动构造非线性的特征呢?答案是有的,这个模型就是神经网络。图 5 带一个隐层的神经网络模型如图 5 所示,每个圆圈都是一个神经元(或者说是一个逻辑回归模型) 。所以神经网络可以看成“线性组合- 非线性激活函数 -线性组合-非线性激活函数” 这样的较为复杂网络结构,它的决策面是复杂的,于是能够适应样本非线性可分的情况。另一方面,图 5 中中间一列的橙色神经元构成的层次我们成为隐层。我们
38、认为隐层的神经元对原始特征进行了组合,并提取出来了新的特征,而这个过程是模型在训练过程中自动“学习”出来的。神经网络的 fomulation 相对较为复杂,已经超出本文的范围,可参考Standford 的深度学习教程支持向量机(简称 SVM)神经网络的出现一度引起研究热潮,但神经网络有它的缺点:一般来说需要大量的训练样本代价函数边界复杂,非凸,存在多个局部最优值。参数意义模糊,比如隐层的神经元个数应该取多少一直没有定论。浅层神经网络对于特征学习的表达能力有限。深层神经网络的参数繁多,一方面容易导致过拟合问题,另一方面因为训练时间过长而导致不可学习。于是,在上世纪 90 年代 SVM 被提出来后
39、,神经网络一度衰落了。那么 SVM 是什么?SVM,更准确的说是 L-SVM,本质上依然是一个线性分类器,SVM 的核心思想在于它的分类准则最大间隔(max margin).图 6 L-SVM 本质上是最大分类间隔的线性分类器同为线性分类器的拓展,逻辑回归和 L-SVM 有着千丝万缕的关系,Andrew Ng 的课件有一张图很清晰地把这两者的代价函数联系起来了(见图 7) 。图 7 L-SVM 和逻辑回归的代价函数对比,SVM 的有一个明显的转折点由于 L-SVM 是线性分类器,所以不能解决样本线性不可分的问题。于是后来人们引入了核函数的概念,于是得到了 K-SVM(K 是 Kernel 的意
40、思)。从本质上讲,核函数是用于将原始特征映射到高维的特征空间中去,并认为在高为特征空间中能够实现线性可分。个人认为,这个跟多项式回归的思想是类似的,只不过核函数涵括的范围更加广,以及形式上更加优雅,使得它能够避免维数灾难。图 8 Kernel 能够对特征进行非线性映射(图片 from pluskid)SVM 比起神经网络有着以下的优点:代价函数是凸函数,存在全局最优值。能够应付小样本集的情况不容易过拟合,并且有着不错的泛化性能和鲁棒性核函数的引入,解决了非线性问题,同时还避免了维数灾难更多关于 SVM 的内容可以参考 July 的这篇文章:支持向量机通俗导论(理解 SVM 的三层境界)然而,其
41、实我们依然可以将 SVM 看成一种特殊的神经元模型:L-SVM 本质上跟单神经元(即逻辑回归)模型的最大差别,只是代价函数的不同,所以可以将 SVM 也理解成一种神经元,只不过它的激活函数不是 sigmoid 函数,而是 SVM 独有的一种激活函数的定义方法。K-SVM 只是比起 L-SVM 多了一个负责用于非线性变换的核函数,这个跟神经网络的隐层的思想也是一脉相承的。所以 K-SVM 实际上是两层的神经元网络结构:第一层负责非线性变换,第二层负责回归。基于核函数的 SVM 机与三层前向神经网络的关系一文中,认为这两者从表达性来说是等价的。 (注:这里的“三层前向神经网络 ”实际上是带一个隐层
42、的神经网络,说是三层是因为它把网络的输入也看成一个层。 )卷积神经网络近年来,神经网络又重新兴盛起来了。尤以“卷积神经网络 ”为其代表。于是本文下面的篇幅主要围绕卷积神经网络进行展开。生物学基础引自 Deep Learning(深度学习)学习笔记整理系列之(七) 。1962 年 Hubel 和 Wiesel 通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984 年日本学者 Fukushima 基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。神经认知机将一个视觉模式
43、分解成许多子模式(特征) ,然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。通常神经认知机包含两类神经元,即承担特征抽取的 S-元和抗变形的 C-元。S-元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者则控制对特征子模式的反应程度。许多学者一直致力于提高神经认知机的性能的研究:在传统的神经认知机中,每个 S-元的感光区中由 C-元带来的视觉模糊量呈正态分布。如果感光区的边缘所产生的模糊效果要比中央来得大,S-元将会接受这种非正态模糊所导致的更大的变形容忍性。我们希望得到的是,训练模式与变形刺激模式在
44、感受野的边缘与其中心所产生的效果之间的差异变得越来越大。为了有效地形成这种非正态模糊,Fukushima 提出了带双 C-元层的改进型神经认知机。基本的网络结构一个较为出名的 CNN 结构为 LeNet5,它的 demo 可以参看这个网站。图 9 是 LeNet 的结构示意图。图 9 LeNet5 的网络结构示意图图中的 Convolutions 对应了上一段说的 S-元,Subsampling 对应了上一段中说的 C-元。对于 Convolution 层的每个神经元,它们的权值都是共享的,这样做的好处是大大减少了神经网络的参数个数。对于 Sampling 层的每个神经元,它们是上一层 Con
45、volution 层的局部范围的均值(或者最大值 ),能够有效地提供局部的平移和旋转不变性。为何神经网络重新兴起?卷积神经网络属于一种深度的神经网络,如上文所说,深度神经网络在之前是不可计算的,主要是由于网络层次变深后会导致下面问题:由于网络参数增多,导致了严重的过拟合现象在训练过程中,对深度网络使用 BP 算法传播时候梯度迅速减少,导致前面的网络得不到训练,网络难以收敛。而这两个问题在目前都得到了较好的解决:共享权值:即上文提到的卷积层的卷积核权值共享,大大减少了网络中参数的数量级。加大数据量:一个是通过众包的方式来增加样本的量级,比如,目前ImageNet 已经有了 120 万的带标注的图
46、片数据。另一个是通过对已有的样本进行随机截取、局部扰动、小角度扭动等方法,来倍增已有的样本数。改变激活函数:使用 ReLU)作为激活函数,由于 ReLU 的导数对于正数输入来说恒为 1,能够很好地将梯度传到位于前面的网络当中。Dropout 机制:Hinton 在 2012 提出了 Dropout 机制,能够在训练过程中将通过随机禁止一半的神经元被修改,避免了过拟合的现象。GPU 编程:使用 GPU 进行运算,比起 CPU 时代运算性能有了数量级的提升。上述问题得到有效解决后,神经网络的优势就得到充分的显现了:复杂模型带来的强大的表达能力有监督的自动特征提取于是神经网络能够得到重新兴起,也就可
47、以解释了。下文会选取一些样例来说明神经网络的强大之处。CNN 样例 1 AlexNet在 ImageNet 举办的大规模图像识别比赛 ILSVRC2012 中分类比赛中,Hinton 的学生 Alex 搭建了一个 8 层的 CNN,最终 top-5 的漏报率是 16%,抛离而第二名的 27%整整有 11 个百分点。图 10 AlexNet 的 CNN 结构,包括 5 个卷积层,和 3 个全连接层,最后一个 softmax 分类器这个网络中用到的技术有:ReLU 激活函数多 GPU 编程局部正则化(Local Response Normalization)重叠的下采样(Overlapping Pooling)通过随机截取和 PCA 来增加数据DropoutCNN 样例 2 deconvnet在下一年的比赛 ILSVRC2013 中,在同样的数据集同样的任务下,Matthew 进一步将漏报率降到了 11%。他使用了一个被命名为“Deconvolutional Network”(简称 deconvnet)的技术。Matthew 的核心工作在于尝试将 CNN 学习出来的特征映射回原图片,来对每个卷积层最具有判别性的部分实现可视化也就是,观察 CNN 在卷积层中学习到了什么。图 11 deconvnet 的思想是将网络的输出还原成输入CNN 样例