【世说知识】干货速来!详析卷积神经网络(CNN)的特性和应用
训练一个能真正用的卷积神经网络,核心其实就是两件事:怎么让网络“学会”,以及怎么确保它“学好”。如果把网络比作一个刚入职的新人,它脑子里一片空白,得靠海量案例和反复练习,才能从一个啥都不懂的“小白”,变成一眼就能认出猫、狗、汽车的“老司机”。

神经网络的训练过程
CIFAR网络本质上就是由一层又一层的神经元堆叠而成。比如一张32×32像素的图片被喂进去之后,会像流水线上的零件一样,顺着网络一层层往下传。CNN先要做的一步,就是从原始图片里提取出有区分度的特征和结构——这活儿得靠“滤波器矩阵”来完成。模型设计好之后,问题就来了:这些矩阵里的参数到底是多少?没人知道。所以当时这个网络基本属于“两眼一抹黑”,根本没法识别任何图案或物体。
于是,核心任务就变成了:找出滤波器矩阵里所有参数的最佳值,让检测对象的精度最高,或者说让损失函数降到最低。这个过程,就是我们常说的“训练”。那些常见的应用,比如人脸识别、图像分类,一旦在开发和测试阶段完成训练,后续使用时就不再需要调整参数。简单说,只要不遇到完全没见过的东西,网络就能直接用。
训练网络需要“喂”数据,这个数据叫训练数据集。同时,还得准备另一组类似的测试数据集,用来检验网络到底学得怎么样。举个例子,CIFAR-10数据集里就包含了十类物体的图像:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、轮船和卡车。在开始训练之前,所有图片都必须提前“命名”好——这一步往往是最折磨人的,也是人工智能开发里最复杂的部分之一。
整个训练过程基于“反向传播”原理。简单说,就是不断地给网络展示海量图片,同时每次都给一个明确的目标值(比如,这张图是“狗”)。每展示一张图,滤波器矩阵就会被优化一次,努力让网络算出来的结果和这个目标值对上。等这一整套流程跑下来,一个从未见过这些图片的“小白”网络,就能变成一个能准确识别物体的“专家”。
过拟合和欠拟合
建模时最让人头疼的问题往往是:到底该建多少层?滤波器矩阵该设多大?这个问题没有标准答案,但我们可以从“过拟合”和“欠拟合”这两个概念入手来理解。
过拟合通常是因为模型搞得太复杂、参数太多导致的。怎么判断?很简单,对比训练数据集和测试数据集的损失。如果网络在训练时表现非常好,损失很低,可一旦给它看从未见过的新数据,损失立马飙升——这基本就说明网络不是在识别模式,而是把训练数据“背”下来了。这种情况,通常是因为参数存储空间太大,或者卷积层太多。对应的解决思路也很直接:适当缩小网络规模。
损失函数和训练算法
网络的学习过程分两步。第一步叫“前向传播”:给网络展示一张图,经过各层处理,输出一个结果向量。这个向量的最大值对应的,就是网络检测出来的对象类——但结果不一定对。至于目标值和实际输出值之间的差距,就叫“损失”,用来计算这个差距的函数就叫“损失函数”。
整个学习过程的目标,就是调整网络参数,让损失函数的值尽可能小。而实现这个目标的核心手段,就是“反向传播”。具体来说,就是计算输出结果带来的偏置(损失 = 目标值 − 实际值),然后把这个偏置从输出层反向“传”回网络的第一层。于是,前向传播和反向传播就形成了一个循环,不断迭代,直到损失值降到某一个可以接受的水平以下。
优化算法、梯度和梯度下降法
为了更好地理解训练过程,我们可以拿一个三维函数图来类比。比如,一个包含x和y两个参数的损失函数,z轴代表损失。这个图里通常既有“全局最小值”,也有“局部最小值”。
目前,有很多数值优化算法能用来确定权重和偏置。最基础的一个方法叫“梯度下降法”。它的核心思路,就是用“梯度算子”在训练过程中,从损失函数的某个随机起点出发,一步步找到通往全局最小值的路径。梯度算子会算出每个点的梯度矢量:方向指向函数值变化最大的方向,幅度则代表变化程度。比如图里右下角那块比较平坦的区域,梯度幅度就很小;而坡度大的地方,梯度幅度就大。
利用梯度下降法,可以从任意选定的起点开始,迭代式地寻找最陡峭的下降路径。算法在起点算一次梯度,沿着最陡方向走一小步;然后在新位置重新计算梯度,再走一小步……以此类推,直到走出一条从起点到“谷底”的路径。问题在于,起点是随机选的。如果起点在函数图左侧,可能正好能走到全局最小值;但如果选得不好,要么路径特别长,训练耗时巨大,要么终点卡在局部最小值,网络精度上不去。
实际操作中,这种方法基本不太现实,因为网络动辄要优化成千上万个参数,不可能每次都靠运气选对起点。所以,过去几年里涌现出了大量替代方案,比如随机梯度下降法、动量法、AdaGrad、RMSProp、Adam等。每一种都有各自的优缺点,最终用哪个,很大程度上取决于网络开发者的经验和偏好。
训练数据
训练过程中,我们给网络展示的每一张图片,都必须事先标注好对应的对象类——比如“汽车”“轮船”等。本文用的是现成的CIFAR-10数据集。但在实际应用中,AI可能被用来识别猫、狗、汽车以外的领域。比如,要检测生产线上螺丝的质量,就必须用区分好坏的螺丝图像数据集来训练网络。
创建这类数据集极其耗时费力,往往是开发AI应用过程中成本最高的一步。最终编译完成的数据集会被分成两份:训练数据集用于训练,测试数据集则用于在开发流程的最后阶段,检验训练好的网络是否真的能用。