![](https://csdnimg.cn/release/download_crawler_static/85122571/bg1.jpg)
【深度学习系列】卷积神经⽹络CNN原理详解(⼀)——基本
原理
上篇⽂章我们给出了⽤paddlepaddle来做⼿写数字识别的⽰例,并对⽹络结构进⾏到了调整,提⾼了识别的精度。有的同学表⽰不是很理解原理,为
什么传统的机器学习算法,简单的神经⽹络(如多层感知机)都可以识别⼿写数字,我们要采⽤卷积神经⽹络CNN来进⾏别呢?CNN到底是怎么识别
的?⽤CNN有哪些优势呢?我们下⾯就来简单分析⼀下。在讲CNN之前,为避免完全零基础的⼈看不懂后⾯的讲解,我们先简单回顾⼀下传统的神
经⽹络的基本知识。
⼤家可能会疑惑,对于同⼀个分类任务,我们可以⽤机器学习的算法来做,为什么要⽤神经⽹络呢?⼤家回顾⼀下,⼀个分类任务,我们在⽤机
器学习算法来做时,⾸先要明确feature和label,然后把这个数据"灌"到算法⾥去训练,最后保存模型,再来预测分类的准确性。但是这就有个问题,
即我们需要实现确定好特征,每⼀个特征即为⼀个维度,特征数⽬过少,我们可能⽆法精确的分类出来,即我们所说的⽋拟合,如果特征数⽬过多,
可能会导致我们在分类过程中过于注重某个特征导致分类错误,即过拟合。
举个简单的例⼦,现在有⼀堆数据集,让我们分类出西⽠和冬⽠,如果只有两个特征:形状和颜⾊,可能没法分区来;如果特征的维度有:形
状、颜⾊、⽠瓤颜⾊、⽠⽪的花纹等等,可能很容易分类出来;如果我们的特征是:形状、颜⾊、⽠瓤颜⾊、⽠⽪花纹、⽠蒂、⽠籽的数量,⽠籽的
颜⾊、⽠籽的⼤⼩、⽠籽的分布情况、⽠籽的XXX等等,很有可能会过拟合,譬如有的冬⽠的⽠籽数量和西⽠的类似,模型训练后这类特征的权重较
⾼,就很容易分错。这就导致我们在特征⼯程上需要花很多时间和精⼒,才能使模型训练得到⼀个好的效果。然⽽神经⽹络的出现使我们不需要做⼤
量的特征⼯程,譬如提前设计好特征的内容或者说特征的数量等等,我们可以直接把数据灌进去,让它⾃⼰训练,⾃我“修正”,即可得到⼀个较好的
效果。
在⼀个传统的机器学习分类问题中,我们“灌”进去的数据是不能直接灌进去的,需要对数据进⾏⼀些处理,譬如量纲的归⼀化,格式的转化等
等,不过在神经⽹络⾥我们不需要额外的对数据做过多的处理,具体原因可以看后⾯的详细推导。
在⾯对⼀个分类问题时,如果⽤SVM来做,我们需要调整的参数需要调整核函数,惩罚因⼦,松弛变量等等,不同的参数组合对于模型的效果也
不⼀样,想要迅速⽽⼜准确的调到最适合模型的参数需要对背后理论知识的深⼊了解(当然,如果你说全部都试⼀遍也是可以的,但是花的时间可能会
更多),对于⼀个基本的三层神经⽹络来说(输⼊-隐含-输出),我们只需要初始化时给每⼀个神经元上随机的赋予⼀个权重w和偏置项b,在训练过程中,
这两个参数会不断的修正,调整到最优质,使模型的误差最⼩。所以从这个⾓度来看,我们对于调参的背后理论知识并不需要过于精通(只不过做多了
之后可能会有⼀些经验,在初始值时赋予的值更科学,收敛的更快罢了)
应⽤⾮常⼴,不过⼤家注意⼀点,我们现在所说的神经⽹络,并不能称之为深度学习,神经⽹络很早就出现了,只不过现在因为不断的加深了⽹
络层,复杂化了⽹络结构,才成为深度学习,并在图像识别、图像检测、语⾳识别等等⽅⾯取得了不错的效果。
⼀个神经⽹络最简单的结构包括输⼊层、隐含层和输出层,每⼀层⽹络有多个神经元,上⼀层的神经元通过激活函数映射到下⼀层神经元,每个
神经元之间有相对应的权值,输出即为我们的分类类别。
去年中旬我参考吴恩达的UFLDL和mattmazur的博客写了篇⽂章详细讲解了⼀个最简单的神经⽹络从前向传播到反向传播的直观推导,⼤家可以
先看看这篇⽂章--。
前⾯说了很多优点,这⾥就不多说了,简单说说缺点吧。我们试想⼀下如果加深我们的⽹络层,每⼀个⽹络层增加神经元的数量,那么参数的个
数将是M*N(m为⽹络层数,N为每层神经元个数),所需的参数会⾮常多,参数⼀多,模型就复杂了,越是复杂的模型就越不好调参,也越容易过
拟合。此外我们从神经⽹络的反向传播的过程来看,梯度在反向传播时,不断的迭代会导致梯度越来越⼩,即梯度消失的情况,梯度⼀旦趋于0,那
么权值就⽆法更新,这个神经元相当于是不起作⽤了,也就很难导致收敛。尤其是在图像领域,⽤最基本的神经⽹络,是不太合适的。后⾯我们会详
细讲讲为啥不合适。