收藏 分销(赏)

卷积神经网络CNN从入门到精通.doc

上传人:人****来 文档编号:3130357 上传时间:2024-06-19 格式:DOC 页数:110 大小:3.26MB 下载积分:20 金币
下载 相关 举报
卷积神经网络CNN从入门到精通.doc_第1页
第1页 / 共110页
卷积神经网络CNN从入门到精通.doc_第2页
第2页 / 共110页


点击查看更多>>
资源描述
卷积神经网络CNN从入门到精通 卷积神经网络算法的一个实现 前言   从理解卷积神经到实现它,前后花了一个月时间,现在也还有一些地方没有理解透彻,CNN还是有一定难度的,不是看哪个的博客和一两篇论文就明白了,主要还是靠自己去专研,阅读推荐列表在末尾的参考文献。目前实现的CNN在MINIT数据集上效果还不错,但是还有一些bug,因为最近比较忙,先把之前做的总结一下,以后再继续优化。   卷积神经网络CNN是Deep Learning的一个重要算法,在很多应用上表现出卓越的效果,[1]中对比多重算法在文档字符识别的效果,结论是CNN优于其他所有的算法。CNN在手写体识别取得最好的效果,[2]将CNN应用在基于人脸的性别识别,效果也非常不错。前段时间我用BP神经网络对手机拍照图片的数字进行识别,效果还算不错,接近98%,但在汉字识别上表现不佳,于是想试试卷积神经网络。 1、CNN的整体网络结构   卷积神经网络是在BP神经网络的改进,与BP类似,都采用了前向传播计算输出值,反向传播调整权重和偏置;CNN与标准的BP最大的不同是:CNN中相邻层之间的神经单元并不是全连接,而是部分连接,也就是某个神经单元的感知区域来自于上层的部分神经单元,而不是像BP那样与所有的神经单元相连接。CNN的有三个重要的思想架构: 局部区域感知 权重共享 空间或时间上的采样   局部区域感知能够发现数据的一些局部特征,比如图片上的一个角,一段弧,这些基本特征是构成动物视觉的基础[3];而BP中,所有的像素点是一堆混乱的点,相互之间的关系没有被挖掘。   CNN中每一层的由多个map组成,每个map由多个神经单元组成,同一个map的所有神经单元共用一个卷积核(即权重),卷积核往往代表一个特征,比如某个卷积和代表一段弧,那么把这个卷积核在整个图片上滚一下,卷积值较大的区域就很有可能是一段弧。注意卷积核其实就是权重,我们并不需要单独去计算一个卷积,而是一个固定大小的权重矩阵去图像上匹配时,这个操作与卷积类似,因此我们称为卷积神经网络,实际上,BP也可以看做一种特殊的卷积神经网络,只是这个卷积核就是某层的所有权重,即感知区域是整个图像。权重共享策略减少了需要训练的参数,使得训练出来的模型的泛华能力更强。   采样的目的主要是混淆特征的具体位置,因为某个特征找出来后,它的具体位置已经不重要了,我们只需要这个特征与其他的相对位置,比如一个“8”,当我们得到了上面一个"o"时,我们不需要知道它在图像的具体位置,只需要知道它下面又是一个“o”我们就可以知道是一个'8'了,因为图片中"8"在图片中偏左或者偏右都不影响我们认识它,这种混淆具体位置的策略能对变形和扭曲的图片进行识别。   CNN的这三个特点是其对输入数据在空间(主要针对图像数据)上和时间(主要针对时间序列数据,参考TDNN)上的扭曲有很强的鲁棒性。CNN一般采用卷积层与采样层交替设置,即一层卷积层接一层采样层,采样层后接一层卷积...这样卷积层提取出特征,再进行组合形成更抽象的特征,最后形成对图片对象的描述特征,CNN后面还可以跟全连接层,全连接层跟BP一样。下面是一个卷积神经网络的示例: 图1(图片来源)   卷积神经网络的基本思想是这样,但具体实现有多重版本,我参考了matlab的Deep Learning的工具箱DeepLearnToolbox,这里实现的CNN与其他最大的差别是采样层没有权重和偏置,仅仅只对卷积层进行一个采样过程,这个工具箱的测试数据集是MINIST,每张图像是28*28大小,它实现的是下面这样一个CNN: 图2 2、网络初始化   CNN的初始化主要是初始化卷积层和输出层的卷积核(权重)和偏置,DeepLearnToolbox里面对卷积核和权重进行随机初始化,而对偏置进行全0初始化。 3、前向传输计算   前向计算时,输入层、卷积层、采样层、输出层的计算方式不相同。   3.1 输入层:输入层没有输入值,只有一个输出向量,这个向量的大小就是图片的大小,即一个28*28矩阵;   3.2 卷积层:卷积层的输入要么来源于输入层,要么来源于采样层,如上图红色部分。卷积层的每一个map都有一个大小相同的卷积核,Toolbox里面是5*5的卷积核。下面是一个示例,为了简单起见,卷积核大小为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的大小决定的,假设上一层的map大小是n*n、卷积核的大小是k*k,则该层的map大小是(n-k+1)*(n-k+1),比如上图的24*24的map大小24=(28-5+1)。 斯坦福的 深度学习教程更加详细的介绍了卷积特征提取的计算过 程。                                                                           图3   3.3 采样层(subsampling,Pooling):采样层是对上一层map的一个采样处理,这里的采样方式是对上一层map的相邻小区域进行聚合统计,区域大小为scale*scale,有些实现是取小区域的最大值,而ToolBox里面的实现是采用2*2小区域的均值。注意,卷积的计算窗口是有重叠的,而采用的计算窗口没有重叠,ToolBox里面计算采样也是用卷积(conv2(A,K,'valid'))来实现的,卷积核是2*2,每个元素都是1/4,去掉计算得到的卷积结果中有重叠的部分, 即:                                                                 图4 4、反向传输调整权重   反向传输过程是CNN最复杂的地方,虽然从宏观上来看基本思想跟BP一样,都是通过最小化残差来调整权重和偏置,但CNN的网络结构并不像BP那样单一,对不同的结构处理方式不一样,而且因为权重共享,使得计算残差变得很困难,很多论文[1][5]和文章[4]都进行了详细的讲述,但我发现还是有一些细节没有讲明白,特别是采样层的残差计算,我会在这里详细讲述。   4.1输出层的残差   和BP一样,CNN的输出层的残差与中间层的残差计算方式不同,输出层的残差是输出值与类标值得误差值,而中间各层的残差来源于下一层的残差的加权和。输出层的残差计算如下: 公式来源   这个公式不做解释,可以查看公式来源,看斯坦福的深度学习教程的解释。   4.2 下一层为采样层(subsampling)的卷积层的残差   当一个卷积层L的下一层(L+1)为采样层,并假设我们已经计算得到了采样层的残差,现在计算该卷积层的残差。从最上面的网络结构图我们知道,采样层(L+1)的map大小是卷积层L的1/(scale*scale),ToolBox里面,scale取2,但这两层的map个数是一样的,卷积层L的某个map中的4个单元与L+1层对应map的一个单元关联,可以对采样层的残差与一个scale*scale的全1矩阵进行克罗内克积进行扩充,使得采样层的残差的维度与上一层的输出map的维度一致,Toolbox的代码如下,其中d表示残差,a表示输出值: net.layers{l}.d{j} = net.layers{l}.a{j} .* (1 - net.layers{l}.a{j}) .* expand(net.layers{l + 1}.d{j}, [net.layers{l + 1}.scale net.layers{l + 1}.scale 1])   扩展过程: 图5   利用卷积计算卷积层的残差: 图6   4.3 下一层为卷积层(subsampling)的采样层的残差   当某个采样层L的下一层是卷积层(L+1),并假设我们已经计算出L+1层的残差,现在计算L层的残差。采样层到卷积层直接的连接是有权重和偏置参数的,因此不像卷积层到采样层那样简单。现再假设L层第j个map Mj与L+1层的M2j关联,按照BP的原理,L层的残差Dj是L+1层残差D2j的加权和,但是这里的困难在于,我们很难理清M2j的那些单元通过哪些权重与Mj的哪些单元关联,Toolbox里面还是采用卷积(稍作变形)巧妙的解决了这个问题,其代码为: convn(net.layers{l + 1}.d{j}, rot180(net.layers{l + 1}.k{i}{j}), 'full'); rot180表示对矩阵进行180度旋转(可通过行对称交换和列对称交换完成),为什么这里要对卷积核进行旋转,答案是:通过这个旋转,'full'模式下得卷积的正好抓住了前向传输计算上层map单元与卷积和及当期层map的关联关系,需要注意的是matlab的内置函数convn在计算卷积前,会对卷积核进行一次旋转,因此我们之前的所有卷积的计算都对卷积核进行了旋转: a = 1 1 1 1 1 1 1 1 1 k = 1 2 3 4 5 6 7 8 9 >> convn(a,k,'full') ans = 1 3 6 5 3 5 12 21 16 9 12 27 45 33 18 11 24 39 28 15 7 15 24 17 9    convn在计算前还会对待卷积矩阵进行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与卷积层的残差的卷积所关联的权重与单元,正是前向计算所关联的权重与单元,我们选一个稍微大一点的卷积核,即假设卷积层采用用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*K33 B12 = A12*K11 + A13*K12 + A14*K13 + A22*K21 + A23*K22 + A24*K23 + A32*K31 + A33*K32 + A34*K33 B13 = A13*K11 + A14*K12 + A15*K13 + A23*K21 + A24*K22 + A25*K23 + A33*K31 + A34*K32 + A35*K33 B21 = A21*K11 + A22*K12 + A23*K13 + A31*K21 + A32*K22 + A33*K23 + A41*K31 + A42*K32 + A43*K33 B22 = A22*K11 + A23*K12 + A24*K13 + A32*K21 + A33*K22 + A34*K23 + A42*K31 + A43*K32 + A44*K33 B23 = A23*K11 + A24*K12 + A25*K13 + A33*K21 + A34*K22 + A35*K23 + A43*K31 + A44*K32 + A45*K33 B31 = A31*K11 + A32*K12 + A33*K13 + A41*K21 + A42*K22 + A43*K23 + A51*K31 + A52*K32 + A53*K33 B32 = A32*K11 + A33*K12 + A34*K13 + A42*K21 + A43*K22 + A44*K23 + A52*K31 + A53*K32 + A54*K33 B33 = A33*K11 + A34*K12 + A35*K13 + A43*K21 + A44*K22 + A45*K23 + A53*K31 + A54*K32 + A55*K33   我们可以得到B矩阵每个单元与哪些卷积核单元和哪些A矩阵的单元之间有关联: A11 [K11] [B11] A12 [K12, K11] [B12, B11] A13 [K13, K12, K11] [B12, B13, B11] A14 [K13, K12] [B12, B13] A15 [K13] [B13] A21 [K21, K11] [B21, B11] A22 [K22, K21, K12, K11] [B12, B22, B21, B11] A23 [K23, K22, K21, K13, K12, K11] [B23, B22, B21, B12, B13, B11] A24 [K23, K22, K13, K12] [B23, B12, B13, B22] A25 [K23, K13] [B23, B13] A31 [K31, K21, K11] [B31, B21, B11] A32 [K32, K31, K22, K21, K12, K11] [B31, B32, B22, B12, B21, B11] A33 [K33, K32, K31, K23, K22, K21, K13, K12, K11] [B23, B22, B21, B31, B12, B13, B11, B33, B32] A34 [K33, K32, K23, K22, K13, K12] [B23, B22, B32, B33, B12, B13] A35 [K33, K23, K13] [B23, B13, B33] A41 [K31, K21] [B31, B21] A42 [K32, K31, K22, K21] [B32, B22, B21, B31] A43 [K33, K32, K31, K23, K22, K21] [B31, B23, B22, B32, B33, B21] A44 [K33, K32, K23, K22] [B23, B22, B32, B33] A45 [K33, K23] [B23, B33] A51 [K31] [B31] A52 [K32, K31] [B31, B32] A53 [K33, K32, K31] [B31, B32, B33] A54 [K33, K32] [B32, B33] A55 [K33] [B33]   然后再用matlab的convn(内部会对卷积核进行180度旋转)进行一次convn(B,K,'full'),结合图7,看红色部分,除去0,A11=B'33*K'33=B11*K11,发现A11正好与K11、B11关联对不对;我们再看一个A24=B'34*K'21+B'35*K'22+B'44*K'31+B'45*K'32=B12*K23+B13*K22+B22*K13+B23*K12,发现参与A24计算的卷积核单元与B矩阵单元,正好是前向计算时关联的单元,所以我们可以通过旋转卷积核后进行卷积而得到采样层的残差。   残差计算出来后,剩下的就是用更新权重和偏置,这和BP是一样的,因此不再细究,有问题欢迎交流。 5、代码实现   详细的代码不再这里贴了,我依旧放在了github,欢迎参考和指正。我又是在重造车轮了,没有使用任何第三方的库类,这里贴一下调用代码: public static void runCnn() { //创建一个卷积神经网络 LayerBuilder builder = new LayerBuilder(); builder.addLayer(Layer.buildInputLayer(new Size(28, 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); //导入数据集 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", ",", -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 functional architecture in the cat’s visual cortex,” [4] tornadomeet.  [5] Jake Bouvrie. Notes on Convolutional Neural Networks. [6] C++实现的详细介绍. [7] matlab DeepLearnToolbox     转载自: 卷积神经网络 卷积神经网络(Convolutional Neural Networks:CNN)是人工神经网络(ANN)的一种,是深度学习的一种学习算法。它在图像识别和分类、自然语言处理广告系统中都有应用。 有意思是,卷积神经网络的提出其实就是来自于生物视觉模型。1981年的诺贝尔医学奖,颁发给了David Hubel、Torsten Wiesel。他们的工作给人们呈现了视觉系统是如何将来自外界的视觉信号传递到视皮层,并通过一系列处理过程(包括边界检测、运动检测、立体深度检测和颜色检测),最后在大脑中构建出一幅视觉图像。这个发现激发了人们对于神经系统的进一步思考,神经-中枢-大脑的工作过程,或许是一个不断迭代、不断抽象的过程。如下图所示,从原始信号摄入开始(瞳孔摄入像素Pixels),首先进行初步处理(大脑皮层某些细胞发现边缘和方向),抽象(大脑判定眼前的物体的形状是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。 六十年代的生理学的发现,促成了计算机人工智能在四十年后的突破性发展。1989年,Yann LeCun (纽约大学教授,现Facebook AI研究室主任) 提出了卷积神经网络,这是第一个真正成功训练多层网络结构的学习算法,但在当时的计算能力下效果欠佳。直到2006年,Geoffrey Hinton提出基于深信度网(Deep Belief Net)和限制波尔兹曼机(RestrictedBoltzmann Machine)的学习算法,重新点燃了人工智能领域对于神经网络的热情。 卷积神经网络现在计算机视觉领域表现出众。ImageNet Classification with Deep Convolutional Neural Networks,这篇发表于NIPS2012的文章,是Hinton与其学生为了回应别人对于Deep Learning的质疑而将CNN结合GPU并行技术用于Imagenet Challenge(图像识别目前最大的数据库,被誉为计算机视觉圣杯),最终取得了非常惊人的结果。他们的算法在2012年取得世界最好结果,使分类错误率从26.2%下降到16%。2013年Matthew Zeiler的算法继续将错误率下降到11.2%。Matthew Zeiler还创立了Clarifai,让我们可以有机会使用他们的图像识别算法对图片标注分类或图像搜索。 The convnet from Krizhevsky 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 challenge 2014年3月,Facebook刚刚公布了他们在CVPR2014的文章: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展示和论文。现在的最新进展是,香港中文大学基于 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个Atari 2600的游戏,结果不仅战胜了其他机器人,甚至在其中3个游戏中超越了人类游戏专家。很有意思,具体可以见InfoQ的看DeepMind如何用Reinforcement learning玩游戏,以及论文原文Playing Atari with Deep Reinforcement Learning 从线性分类器到卷积神经网络 前言 本文大致分成两大部分,第一部分尝试将本文涉及的分类器统一到神经元类模型中,第二部分阐述卷积神经网络(CNN)的发展简述和目前的相关工作。 本文涉及的分类器(分类方法)有: 线性回归 逻辑回归(即神经元模型) 神经网络(NN) 支持向量机(SVM) 卷积神经网络(CNN) 从神经元的角度来看,上述分类器都可以看成神经元的一部分或者神经元组成的网络结构。 各分类器简述 逻辑回归 说逻辑回归之前需要简述一下线性回归。 图1 单变量的线性回归 图1中描述了一个单变量的线性回归模型:蓝点代表自变量x的分布——显然x呈现线性分布。于是我们可以用下面的式子对其进行拟合,即我们的目标函数可以写成: y^=ωx+b 从单变量到多变量模型,需要将x变成向量x⃗ ,同时权重ω也需要变成向量ω⃗ 。 y^=ω⃗ ⋅x⃗ +b 而一般线性回归的损失函数会用欧氏距离来进行衡量,即常说的最小二乘法,单个样本的损失函数可以写成: ε=12(y−y^)2 而逻辑回归,可以简单理解成线性回归的结果加上了一个sigmoid函数。 图2 sigmoid 函数图像 从本质上来说,加上sigmoid函数的目的在于能够将函数输出的值域从(−∞,∞)映射到(0,1)之间,于是可以说逻辑回归的输出能够代表一个事件发生的概率。 逻辑分类的目标函数和单样本损失函数是: y^=sigmoid(w⃗ ⋅x⃗ +b) ε=−ylog(y^)−(1−y)log(1−y^) 这里为何要使用一个复杂的损失函数这构造了一个凸函数,而如果直接使用最小二乘进行定义,损失函数会变成非凸函数。 实际上逻辑回归模型虽然名字带有回归,实际上一般用于二分类问题。即对y^设置一个阈值(一般是0.5),便实现了二分类问题。 而逻辑回归模型的另外一个名称为神经元模型——即我们认为大脑的神经元有着像上述模型一样的结构:一个神经元会根据与它相连的神经元的输入(x)做出反应,决定自身的激活程度(一般用sigmoid函数衡量激活程度),并将激活后的数值(y)输出到其他神经元。 图3 逻辑回归模型,即单个的神经元模型 神经网络(Neural Network,简称NN) 逻辑回归的决策平面是线性的,所以,它一般只能够解决样本是线性可分的情况。 如果样本呈现非线性的时候,我们可以引入多项式回归。 图4 多项式回归解决样本线性不可分的情况,图片来自Andrew Ng的Machine Learning课程的课件 其实,多项式回归也可以看成是线性回归或者逻辑回归的一个特例——将线性回归或者逻辑回归的特征x转化为x2,x3…等非线性的特征组合,然后对其进行线性的拟合。 多项式回归虽然能够解决非线性问题,但需要人工构造非线性的特征,那么,是否有一种模型,既能够应付样本非线性可分的情况,又同时能够自动构造非线性的特征呢? 答案是有的,这个模型就是神经网络。 图5 带一个隐层的神经网络模型 如图5所示,每个圆圈都是一个神经元(或者说是一个逻辑回归模型)。所以神经网络可以看成“线性组合-非线性激活函数-线性组合-非线性激活函数…”这样的较为复杂网络结构,它的决策面是复杂的,于是能够适应样本非线性可分的情况。 另一方面,图5中中间一列的橙色神经元构成的层次我们成为隐层。我们认为隐层的神经元对原始特征进行了组合,并提取出来了新的特征,而这个过程是模型在训练过程中自动“学习”出来的。 神经网络的fomulation相对较为复杂,已经超出本文的范围,可参考Standford的深度学习教程 支持向量机(简称SVM) 神经网络的出现一度引起研究热潮,但神经网络有它的缺点: 一般来说需要大量的训练样本 代价函数边界复杂,非凸,存在多个局部最优值。 参数意义模糊,比如隐层的神经元个数应该取多少一直没有定论。 浅层神经网络对于特征学习的表达能力有限。 深层神经网络的参数繁多,一方面容易导致过拟合问题,另一方面因为训练时间过长而导致不可学习。 于是,在上世纪90年代 SVM被提出来后,神经网络一度衰落了。 那么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的意思)。从本质上讲,核函数是用于将原始特征映射到高维的特征空间中去,并认为在高为特征空间中能够实现线性可分。个人认为,这个跟多项式回归的思想是类似的,只不过核函数涵括的范围更加广,以及形式上更加优雅,使得它能够避免维数灾难。 图8 Kernel能够对特征进行非线性映射(图片from pluskid) SVM比起神经网络有着以下的优点: 代价函数是凸函数,存在全局最优值。 能够应付小样本集的情况 不容易过拟合,并且有着不错的泛化性能和鲁棒性 核函数的引入,解决了非线性问题,同时还避免了维数灾难 更多关于SVM的内容可以参考July的这篇文章:支持向量机通俗导论(理解SVM的三层境界) 然而,其实我们依然可以将SVM看成一种特殊的神经元模型: L-SVM本质上跟单神经元(即逻辑回归)模型的最大差别,只是代价函数的不同,所以可以将SVM也理解成一种神经元,只不过它的激活函数不是sigmoid函数,而是SVM独有的一种激活函数的定义方法。 K-SVM只是比起L-SVM多了一个负责用于非线性变换的核函数,这个跟神经网络的隐层的思想也是一脉相承的。所以K-SVM实际上是两层的神经元网络结构:第一层负责非线性变换,第二层负责回归。 《基于核函数的SVM机与三层前向神经网络的关系》一文中,认为这两者从表达性来说是等价的。(注:这里的“三层前向神经网络”实际上是带一个隐层的神经网络,说是三层是因为它把网络的输入也看成一个层。) 卷积神经网络 近年来,神经网络又重新兴盛起来了。尤以“卷积神经网络”为其代表。于是本文下面的篇幅主要围绕卷积神经网络进行展开。 生物学基础 引自Deep Learning(深度学习)学习笔记整理系列之(七)。 1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。 通常神经认知机包含两类神经元,即承担特征抽取的S-元和抗变形的C-元。S-元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者则控制对特征子模式的反应程度。许多学者一直致力于提高神经认知机的性能的研究:在传统的神经认知机中,每个S-元的感光区中由C-元带来的视觉模糊量呈正态分布。如果感光区的边缘所产生的模糊效果要比中央来得大,S-元将会接受这种非正态模糊所导致的更大的变形容忍性。我们希望得到的是,训练模式与变形刺激模式在感受野的边缘与其中心所产生的效果之间的差异变得越来越大。为了有效地形成这种非正态模糊,Fukushima提出了带双C-元层的改进型神经认知机。 基本的网络结构 一个较为出名的CNN结构为LeNet5,它的demo可以参看这个网站。图9是LeNet的结构示意图。 图9 LeNet5的网络结构示意图 图中的Convolutions对应了上一段说的S-元,Subsampling对应了上一段中说的C-元。 对于Convolution层的每个神经元,它们的权值都是共享的,这样做的好处是大大减少了神经网络的参数个数。 对于Sampling层的每个神经元,它们是上一层Convolution层的局部范围的均值(或者最大值),能够有效地提供局部的平移和旋转不变性。 为何神经网络重新兴起? 卷积神经网络属于一种深度的神经网络,如上文所说,深度神经网络在之前是不可计算的,主要是由于网络层次变深后会导致下面问题: 由于网络参数增多,导致了严重的过拟合现象 在训练过程中,对深度网络使用BP算法传播时候梯度迅速减少,导致前面的网络得不到训练,网络难以收敛。 而这两个问题在目前都得到了较好的解决: 共享权值:即上文提到的卷积层的卷积核权值共享,大大减少了网络中参数的数量级。 加大数据量:一个是通过众包的方式来增加样本的量级,比如,目前ImageNet已经有了120万的带标注的图片数据。另一个是通过对已有的样本进行随机截取、局部扰动、小角度扭动等方法,来倍增已有的样本数。 改变激活函数:使用ReLU)作为激活函数,由于ReLU的导数对于正数输入来说恒为1,能够很好地将梯度传到位于前面的网络当中。 Dropout机制:Hinton在2012提出了Dropout机制,能够在训练过程中将通过随机禁止一半的神经元被修改,避免了过拟合的现象。 GPU编程:使用GPU进行运算,比起CPU时代运算性能有了数量级的提升。 上述问题得到有效解决后,神经网络的优势就得到充分的显现了: 复杂模型带来的强大的表达能
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服