对卷积神经网络进行训练
扫描二维码
随时随地手机看文章
本文重点介绍卷积神经网络 (CNN) 的特性和应用,主要用于模式识别和对象分类。在之前文章中,我们展示了微控制器中经典线性程序执行与 CNN 的区别及其优势。我们讨论了 CIFAR 网络,利用该网络可以对图像中的猫、房屋或自行车等对象进行分类,或执行简单的语音模式识别。本文解释了如何训练这些神经网络来解决问题。
神经网络的训练过程
本系列第一部分讨论的 CIFAR 网络由不同层的神经元组成。32 像素 × 32 像素的图像数据被呈现给网络并经过网络层。CNN 的第一步是检测和研究要区分的对象的独特特征和结构。为此使用过滤矩阵。一旦设计人员对 CIFAR 等神经网络进行建模,这些过滤矩阵最初仍未确定,并且此阶段的网络仍无法检测模式和对象。
为了实现这一点,首先需要确定矩阵的所有参数和元素,以最大限度地提高检测对象的准确度或最小化损失函数。这个过程称为神经网络训练。对于本系列第一部分中描述的常见应用,网络在开发和测试期间只训练一次。之后,它们就可以使用了,参数不再需要调整。如果系统正在对熟悉的对象进行分类,则无需进行额外的训练。只有当系统需要对全新的对象进行分类时,才需要进行训练。
训练网络需要训练数据,之后,我们会使用一组类似的数据来测试网络的准确性。例如,在我们的 CIFAR-10 网络数据集中,数据是十个对象类别中的一组图像:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。但是,在训练 CNN 之前,必须对这些图像进行命名,这是整个 AI 应用程序开发过程中最复杂的部分。本文将讨论的训练过程遵循反向传播原理;网络会连续显示大量图像,并且每次都会同时传达一个目标值。在我们的示例中,这个值是关联的对象类别。每次显示图像时,都会优化过滤矩阵,以使对象类别的目标值和实际值相匹配。完成此过程后,网络还可以检测训练期间未在图像中看到的物体。
过度拟合和欠拟合
在神经网络建模中,经常会出现这样的问题:神经网络应该有多复杂,即它应该有多少层,或者它的滤波矩阵应该有多大。这个问题没有简单的答案。与此相关,讨论网络过拟合和欠拟合很重要。过拟合是模型过于复杂且参数过多的结果。我们可以通过比较训练数据损失和测试数据损失来确定预测模型与训练数据的拟合程度是太差还是太好。如果在训练期间损失较低,而在向网络提供从未显示过的测试数据时损失过度增加,则强烈表明网络记住了训练数据,而不是概括模式识别。这主要发生在网络的参数存储过多或卷积层过多时。在这种情况下,应该减小网络大小。
损失函数和训练算法
学习分为两个步骤。第一步,向网络显示一张图像,然后由神经元网络处理该图像以生成输出向量。输出向量的最高值代表检测到的对象类别,例如我们示例中的狗,这在训练案例中不一定是正确的。此步骤称为前馈。
输出端产生的目标值与实际值之间的差异称为损失,相关函数称为损失函数。网络的所有元素和参数都包含在损失函数中。神经网络学习过程的目标是定义这些参数,使损失函数最小化。这种最小化是通过一个过程实现的,在这个过程中,输出端产生的偏差(损失 = 目标值减去实际值)被反向反馈到网络的所有组件,直到到达网络的起始层。学习过程的这一部分也称为反向传播。
这样,在训练过程中就形成了一个逐步确定滤波矩阵参数的循环,这个前馈和反向传播的过程不断重复,直到损失值降到预先定义的值以下。
优化算法、梯度和梯度下降法
为了说明我们的训练过程,图 3 显示了仅由两个参数 x 和 y 组成的损失函数。z 轴对应于损失。函数本身在这里不起作用,仅用于说明目的。如果我们更仔细地观察三维函数图,我们可以看到该函数具有全局最小值和局部最小值。
可以使用大量数值优化算法来确定权重和偏差。最简单的方法是梯度下降法。梯度下降法基于这样的思想:使用梯度逐步找到从损失函数中随机选择的起点到全局最小值的路径。梯度作为数学运算符描述了物理量的进展。它在损失函数的每个点处提供一个向量(也称为梯度向量),该向量指向函数值变化最大的方向。向量的大小与变化量相对应。梯度向量将指向右下角某点的最小值(红色箭头)。由于表面平坦,震级会较低。在更远的区域,靠近峰顶的情况会有所不同。在这里,矢量(绿色箭头)指向下方,并且震级较大,因为地势起伏较大。
使用梯度下降法,从任意选择的点开始,迭代地寻找下降速度最快、通向山谷的路径。这意味着优化算法计算起点处的梯度,并朝下降速度最快方向迈出一小步。在这个中间点,重新计算梯度,继续通向山谷的路径。这样,就创建了一条从起点到山谷中某一点的路径。这里的问题是,起点不是预先定义的,而是必须随机选择的。在我们的二维图中,细心的读者会把起点放在函数图左侧的某个位置。这将确保(例如蓝色)路径的末端位于全局最小值。另外两条路径(黄色和橙色)要么更长,要么以局部最小值结束。由于优化算法必须优化的不仅仅是两个参数,而是数十万个参数,因此很快就会发现起点的选择只能是偶然正确的。在实践中,这种方法似乎没有帮助。这是因为,根据所选的起点,路径以及训练时间可能会很长,或者目标点可能不在全局最小值,在这种情况下,网络的准确性会降低。这种方法似乎没有什么帮助。这是因为,根据所选的起点、路径以及因此,训练时间可能会很长,或者目标点可能不在全局最小值,在这种情况下,网络的准确性会降低。这种方法似乎没有什么帮助。这是因为,根据所选的起点、路径以及因此,训练时间可能会很长,或者目标点可能不在全局最小值,在这种情况下,网络的准确性会降低。
因此,过去几年中开发了许多优化算法来绕过上述两个问题。一些替代方案包括随机梯度下降法、动量、AdaGrad、RMSProp 和 Adam — 仅举几例。实际使用的算法由网络开发人员决定,因为每种算法都有特定的优缺点。
训练数据
如上所述,在训练过程中,我们向网络提供标有正确对象类别(如汽车、船舶等)的图像。在我们的示例中,我们使用了现有的CIFAR-10 数据集。在实践中,人工智能的应用范围可能不仅限于识别猫、狗和汽车。例如,如果必须开发一种新应用程序来检测制造过程中螺丝的质量,那么还必须使用来自好螺丝和坏螺丝的训练数据来训练网络。创建这样的数据集可能非常费力且耗时,并且通常是开发人工智能应用程序最昂贵的步骤。编译数据集后,将其分为训练数据和测试数据。训练数据用于如前所述进行训练。测试数据用于在开发过程结束时检查训练网络的功能。
结论
现在我们已经定义了该函数所需的所有权重和偏差,我们可以假设网络可以正常工作。在本系列的最后一篇文章中,我们将通过将神经网络转换为硬件来测试它是否能识别猫。