查看原文
其他

【强基固本】深度学习和神经网络:神经网络的训练和评估

“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。

作者:知乎—人邮异步社区

地址:https://zhuanlan.zhihu.com/p/372204598

本章将介绍训练与评估。由于神经网络可以通过许多不同的方式进行训练与评估,因此我们需要一种一致的方法来对它们进行判断。目标函数评估神经网络并返回得分,训练会根据得分调整神经网络,以便取得更好的结果。通常,目标函数希望得分较低,其试图获得较低得分的过程称为最小化。你可能会设定最大化的问题,此时目标函数需要较高的得分。因此,你可以将大多数训练算法用于最小化或最大化问题。
你可以使用任何连续的优化算法来优化神经网络的权重,如模拟退火、粒子群优化(Particle Swarm Optimization,PSO)、遗传算法、爬山、Nelder-Mead或随机行走等。本章将介绍模拟退火,它是一种简单的训练算法。但是,除了优化算法外,你还可以利用反向传播算法训练神经网络。在第6章“反向传播训练”和第7章“其他传播训练”中将介绍几种算法,它们都基于第6章介绍的反向传播训练算法。

5.1

评估分类
分类是神经网络尝试将输入分为一个或多个类别的过程。评估分类网络的最简单方法是跟踪被错误分类的训练集数据项的百分比。我们通常以这种方式对人类考试评分。如你可能在学校参加了仅有选择题题型的考试,必须为选项A、B、C或D其中之一涂上阴影。如果你在10个问题的考试中选择了一个错误的选项,得分将是90%。以同样的方式,我们可以给计算机评分。但是,大多数分类算法不会简单地选择A、B、C或D。计算机通常将报告每个类别中的置信度百分比,作为分类结果。图5-1展示了计算机和人类可能如何对考试中的问题1做出回应。

图5-1 人类答案与计算机答案

如你所见,人类应试者将第一个问题标记为“B”。计算机对“B”的信心为80%(0.8),对“A”的信心为10%(0.1)。计算机将其余的百分比分布在另外两个选项上。从最简单的意义上讲,如果正确答案为“B”,则该计算机将获得该问题得分的80%。
如果正确答案为“ D”,则该计算机将仅获得5%(0.05)的得分。

5.1.1 二值分类

如果神经网络必须在两个选项之间进行选择,就会发生二值分类,如对/错、是/否、正确/不正确或买入/卖出等。为了理解如何使用二值分类,我们考虑一个发行信用卡的分类系统。该分类系统必须决定如何响应新的潜在客户。该系统要么“发行信用卡”,要么“拒绝发行信用卡”。
当你只考虑两个类别时,目标函数的得分是假阳性(False Positive,FP)预测的数量和假阴性(False Negative,FN)预测的数量。假阴性和假阳性都是错误的类型,理解它们的差异非常重要。对于前面的例子,发行信用卡是阳性的。当向某人发行信用卡会带来严重的信用风险时,就会发生假阳性。当拒绝发给风险很低的人信用卡时,就会产生假阴性。
在假阳性和假阴性这两个选项中,我们可以两害相权取其轻。对于大多数发行信用卡的银行,假阳性比假阴性更糟糕。拒绝一个潜在的、好的信用卡持有人,比接受一个坏信用卡持有人更好,后者会导致银行进行昂贵的收款活动。
分类问题试图将输入分配给一个或多个类别。二值分类采用单输出神经网络,将输入分为两类。让我们考虑汽车MPG数据集。
对于汽车MPG数据集,我们可能会为制造于美国的汽车创建分类。名为origin的字段提供有关汽车总成位置的信息。因此,单输出神经元将给出一个数字,表明该汽车在美国制造的可能性。
要进行这种预测,你需要更改origin字段,让它保存一个值,这个值在1到激活函数的低端范围内。如S型激活函数范围的下限为0;对于双曲正切激活函数,其范围的下限为−1。神经网络将输出一个值,该值表明汽车在美国或其他地方制造的可能性。值接近1表示汽车来自美国的可能性更高,值接近0或−1表示汽车来自美国以外地区的可能性更高。
你必须选择一个判定临界值,将这些预测结果分为美国或非美国。如果美国为1.0,非美国为0.0,那么我们可以选择0.5作为判定临界值。因此,输出为0.6的汽车将来自美国,而输出为0.4的汽车将来自非美国。
这个神经网络在对汽车进行分类时总是会产生错误,美国制造的汽车可能会产生0.45的输出,由于神经网络的输出低于判定临界值,因此无法将汽车归入正确的类别。因为我们设计这个神经网络是为了对美国制造的汽车进行分类,所以该错误称为假阴性。换言之,神经网络表明该汽车不是美国制造的,但该汽车实际上来自美国,产生了阴性结果,因此,分为阴性是错误的。这个错误也称为2型错误。
同样,神经网络可能会错误地将非美国的汽车归类为美国的。这种错误是假阳性或1型错误。更易于产生假阳性的神经网络被称为更具“特异性(specific)”的神经网络。同样,产生更多假阴性的神经网络被称为更具“敏感性(sensitive)”的神经网络。图5-2总结了真/假、阳性/阴性、1型/2型错误,敏感性/特异性之间的关系。

图5-2 错误类型之间的关系
设置输出神经元的判定临界值,就是选择敏感性还是特异性谁更重要。如图5-3所示,可以通过调整判定临界值来使神经网络更具敏感性或特异性。

图5-3 敏感性与特异性
随着判定临界值线向左移动,神经网络将变得更具特异性。真阴性(True Negative,TN)区域的尺寸减小使这种特异性的提高显而易见。相反,随着判定临界值线向右移动,神经网络将变得更具敏感性。真阳性(True Positive,TP)区域的尺寸减小使这种敏感性的提高很明显。
敏感性的提高通常会导致特异性降低。图5-4展示了旨在使神经网络非常敏感的判定临界值。

图5-4 敏感判定临界值
也可以对神经网络进行校准,提高特异性,如图5-5所示。
图5-5 特异判定临界值
达到100%的特异性或敏感性不一定是好事。通过简单地预测每个人都没有患某种疾病,得出医学检验可以达到100%的特异性。该测试永远不会产生假阳性错误,因为它永远不会给出阳性答案。显然,该测试没有意义。高度特异性或敏感性的神经网络会产生同样的毫无意义的结果。我们需要一种方法来评估与判定临界值点无关的神经网络的总有效性。总预测率(Total Prediction Rate,TPR)结合了真阳性和真阴性的百分比。公式5-1可以计算TPR:
(5-1)
此外,你可以使用“受试者工作特征”(Receiver Operator Characteristic,ROC)曲线来可视化TPR,如图5-6所示。
图5-6展示了3种不同的ROC曲线。虚线显示了具有零预测能力的ROC;点线表示预测能力较好的神经网络;实线表示预测能力接近完美的神经网络。要解读ROC图,请先看以0%标记的原点。所有ROC曲线总是从原点开始,然后移动到右上角,在这里真阳性和假阳性均为100%。
  轴显示真阳性率从0%到100%。当你沿  轴向上移动时,真阳性率和假阳性率都会增加。随着真阳性率的增加,敏感性也增加,但是,特异性会下降。ROC曲线允许你选择所需的敏感性级别,但它也显示了达到该敏感性级别必须接受的假阳性率。

图5-6 3种不同的ROC曲线

最差的神经网络(虚线)总是具有50%的总预测率。这样的总预测率并不比随机猜测更好。要获得100%的真阳性率,必定会有100%的假阳性率,这仍然会导致一半的预测错误。
以下网址可让你尝试使用简单的神经网络和ROC曲线:
http://www.heatonresearch.com/aifh/vol3/anneal_roc.html
我们可以用模拟退火在上述网址上训练神经网络。每次“退火期”(annealing epoch)完成时,该神经网络都会改进。我们可以通过均方差(Mean Squared Error,MSE)计算来衡量这种改进。随着MSE的下降,ROC曲线向左上角伸展。我们将在后文详细介绍MSE。现在,将它与预期输出进行比较,只需将它看成对神经网络误差的度量即可。较低的MSE是理想的。图5-7展示了我们对神经网络进行多次迭代训练后的ROC曲线。

图5-7 ROC曲线

重要的是要注意,目标并不总是使总预测率最大化。有时,假阳性比假阴性更好。考虑一个预测桥梁倒塌的神经网络。一方面,假阳性意味着当桥梁实际安全时,程序会预测倒塌。在这种情况下,检查结构合理的桥梁会浪费工程师的时间。另一方面,假阴性意味着神经网络预测桥梁安全时,实际会倒塌。与浪费工程师的时间相比,桥梁倒塌的后果要糟得多。因此,你应该安排具有很高特异性的神经网络。
要评估神经网络的总体有效性,应考虑曲线下的面积(Area Under the Curve,AUC)。最佳AUC为1.0,这是一个100%×100%(1.0×1.0)的矩形,它将曲线下的面积推到最大。解读ROC曲线时,更有效的神经网络在曲线下方有更多空间。图5-6中显示的曲线与这种评估相符。

5.1.2 多类分类

如果要预测多个结果,则将需要多个输出神经元。因为单个神经元可以预测两个结果,所以带有两个输出神经元的神经网络是很少见的。如果要预测3个或更多结果,则将有3个或更多输出神经元。本系列图书的卷1《基础算法》展示了一种方法,该方法可以将3个结果编码为两个输出神经元。
考虑Fisher的鸢尾花数据集。针对3种不同物种的鸢尾花,该数据集包含了4种不同的测量值。
鸢尾花数据集的样本数据如下所示:
sepal_length,sepal_width,petal_length,petal_width,species5.1,3.5,1.4,0.2,Iris-setosa4.9,3.0,1.4,0.2,Iris-setosa7.0,3.2,4.7,1.4,Iris-versicolour6.4,3.2,4.5,1.5,Iris-versicolour6.3,3.3,6.0,2.5,Iris-virginica5.8,2.7,5.1,1.9,Iris-virginica
根据4个测量值可以预测这些物种。对于这种预测,这4个测量值的含义并不重要,重要的是这些测量值将指导神经网络进行预测。图5-8展示了可以预测鸢尾花数据集的神经网络结构。

图5-8 可以预测鸢尾花数据集的神经网络结构

图5-8所示的神经网络接受4个测量结果并输出3个数字。每个输出与一个鸢尾花物种相对应。产生最高数值的输出神经元决定了预测的物种。

5.1.3 对数损失

分类网络可以从输入数据推导出一个分类。如4个鸢尾花测量值可以将数据分组为3种鸢尾花。评估分类的一种简单方法,是将它看成仅有选择题题型的考试,并返回百分比得分。尽管这种方法应用得很普遍,但是大多数机器学习模型都无法像你在学校那样回答多项选择题。请考虑可能会在考试中出现的以下问题:
1.鸢尾花setosa会有萼片长5.1厘米、萼片宽3.5厘米、花瓣长1.4厘米、花瓣宽0.2厘米吗?A) TrueB) False
这正是神经网络在分类任务中必须面对的问题类型。但是,神经网络不会回答True或False。它会用以下方式回答问题:
True: 80%
上面的响应意味着神经网络有80%的概率确信这朵花是setosa。这项技术如果可以应用在你的考试上,则会非常方便。如果你不能在是非题之间做出选择,只需将80%的置信度置于True上即可。得分相对容易,因为你会得到正确答案相应置信度的得分比例。在这个例子中,如果True是正确的答案,则该问题将会获得80%的得分。
但是,对数损失(log loss)不是那么简单的。公式5-2[1]是对数损失的公式:
 (5-2)
你应将这个公式仅用作具有两个分类结果的目标函数。其中变量  是神经网络的预测,变量  是已知的正确答案。在这种情况下,  始终为0或1。训练数据没有概率,神经网络将它分为一类(1)或另一类(0)。
变量  代表训练集中的元素数量,即测验中的问题数量。我们将结果除以  ,因为这个过程按惯例求的是平均。我们在该方程前添加负号,因为对数函数在域0~1上始终为负。这个负号允许最小化训练的正得分。
你会注意到公式5-2中等号右边的两个项之间用加号(+)隔开。每个项都包含一个对数函数。因为  为0或1,所以这两个项之一将被0消除。如果  为0,则第一项为0;如果  为1,则第二项为0。
对于两类预测,如果你对第一类的预测是  ,那么对第二类的预测是1−  本质上,如果你对A类的预测为70%(0.7),那么对B类的预测为30%(0.3)。你的得分会根据你对正确分类的预测对数而增加。如果神经网络对A类预测为1.0,并且正确答案为A,则你的得分将增加lg(1),即0。对于对数损失,我们追求较低的得分,因此正确答案导致得分为0。以下是神经网络对正确类别的概率估计的一些对数值:
  • −lg(1.0) = 0;
  • −lg(0.95) = 0.02;
  • −lg(0.9) = 0.05;
  • −lg(0.8) = 0.1;
  • −lg(0.5) = 0.3;
  • −lg(0.1) = 1;
  • −lg(0.01) = 2;
  • −lg(1.0e−12) = 12;
  • −lg(0.0) = 无穷大。
如你所见,为正确答案给出低置信度对得分的影响最大。因为lg(0)是负无穷大,所以我们通常强加一个最小值。当然,以上对数值是针对单个训练集元素的。我们将对整个训练集的对数值进行求平均。

5.1.4 多类对数损失

如果对两个以上的结果进行分类,则必须使用多类对数损失(multi-class log loss,mlogloss)。这个损失函数与刚才描述的二值对数损失密切相关。公式5-3是多类对数损失的公式:
 (5-3)
在公式5-3中,  是训练集元素的数量,  是分类过程的类别数量。从概念上讲,多类对数损失函数的作用类似于单个对数损失函数。上面的等式本质上为你提供一个得分,该得分是每个数据集上正确类别预测的负对数的平均值。公式5-3中最里面的求和作为一个if-then语句,仅允许  为1.0的正确分类对求和有贡献。


5.2

评估回归
均方差(MSE)计算是评估回归机器学习的最常用方法。大多数神经网络、支持向量机和其他模型的示例都采用了MSE[2],如公式5-4所示:
(5-4)
在公式5-4中,  是理想输出,  是实际输出。均方差的本质是各个差的平方的均值。因为对单个差求平方,所以差的正负性不影响MSE的值。
你可以用MSE评估分类问题。为了用MSE评估分类输出,每个分类的概率都被简单地看成数字输出。对于正确的类,预期的输出就是1.0,对于其他类,预期的输出则为0。如果第一类是正确的,而其他三类是错误的,则预期结果向量将如下:
[1.0, 0, 0, 0]
这样,你几乎可以将任何回归目标函数用于分类。各种函数,如均方根(Root Mean Square,RMS)和误差平方和(Sum of Squares Error,SSE),都可以用于评估回归,我们在本系列图书卷1《基础算法》中讨论了这些函数。


5.3

模拟退火训练
要训练神经网络,必须定义它的任务。目标函数(也称为计分或损失函数)可以生成这些任务。本质上,目标函数会评估神经网络并返回一个数值,表明该神经网络的有用程度。训练会在每次迭代中修改神经网络的权重,从而提高目标函数返回的值。
模拟退火是一种有效的优化技术,已在本系列图书卷1中进行了探讨。在本章中,我们将回顾模拟退火,展示任意向量优化函数如何改善前馈神经网络的权重。在第6章中,我们将利用可微损失函数,研究更高级的优化技术。
回顾一下,模拟退火的工作原理是首先将神经网络的权向量赋为随机值,然后将这个向量看成一个位置,程序会评估从该位置开始的所有可能移动。要了解神经网络权重向量如何转换为位置,请考虑只有3个权重的神经网络。在现实世界中,我们用  、  和  坐标来考虑位置。我们可以将任意位置写成有3个分量的向量。如果我们希望只在其中1个维度上移动,那么向量总共可以在6个方向上移动。我们可以选择在  、  或  维度上向前或向后移动。
通过在所有可用的维度上向前或向后移动,模拟退火实现其功能。如果该算法采取了最佳移动,那么将形成简单的爬山算法。爬山只会提高得分,因此,它也被称为贪心算法。为了达到最佳位置,算法有时需要移到较低的位置。因此,模拟退火很多时候有进两步、退一步的表现。
换言之,模拟退火有时会允许移动到具有较差得分的权重配置。接受这种移动的概率开始很高,而后逐渐降低。这种概率称为当前温度,它模拟了实际的冶金退火过程。图5-9展示了模拟退火的整个过程。

图5-9 模拟退火的整个过程

前馈神经网络可以利用模拟退火来学习鸢尾花数据集。以下程序展示了这种训练的输出:
Iteration #1, Score=0.3937, k=1,kMax=100,t=343.5891,prob=0.9998Iteration #2, Score=0.3937, k=2,kMax=100,t=295.1336,prob=0.9997Iteration #3, Score=0.3835, k=3,kMax=100,t=253.5118,prob=0.9989Iteration #4, Score=0.3835, k=4,kMax=100,t=217.7597,prob=0.9988Iteration #5, Score=0.3835, k=5,kMax=100,t=187.0496,prob=0.9997Iteration #6, Score=0.3835, k=6,kMax=100,t=160.6705,prob=0.9997Iteration #7, Score=0.3835, k=7,kMax=100,t=138.0116,prob=0.9996...Iteration #99, Score=0.1031, k=99,kMax=100,t=1.16E-4,prob= 2.8776E-7Iteration #100, Score=0.1031, k=100,kMax=100,t=9.9999E-5,prob= 2.1443E-70Final score: 0.1031[0.22222222222222213, 0.6249999999999999, 0.06779661016949151, 0.04166666666666667] -> Iris-setosa, Ideal: Iris-setosa[0.1666666666666668, 0.41666666666666663, 0.06779661016949151, 0.04166666666666667] -> Iris-setosa, Ideal: Iris-setosa...[0.6666666666666666, 0.41666666666666663, 0.711864406779661, 0.9166666666666666] -> Iris-virginica, Ideal: Iris-virginica[0.5555555555555555, 0.20833333333333331, 0.6779661016949152, 0.75] -> Iris-virginica, Ideal: Iris-virginica[0.611111111111111, 0.41666666666666663, 0.711864406779661, 0.7916666666666666] -> Iris-virginica, Ideal: Iris-virginica[0.5277777777777778, 0.5833333333333333, 0.7457627118644068, 0.9166666666666666] -> Iris-virginica, Ideal: Iris-virginica[0.44444444444444453, 0.41666666666666663, 0.6949152542372881, 0.7083333333333334] -> Iris-virginica, Ideal: Iris-virginica[1.178018083703488, 16.66575553359515, -0.6101619300462806, -3.9894606091020965, 13.989551673146842, -8.87489712462323, 8.027287801488647, -4.615098285283519, 6.426489182215509, -1.4672962642199618, 4.136699061975335, 4.20036115439746, 0.9052469139543605, -2.8923515248132063, -4.733219252086315, 18.6497884912826, 2.5459600552510895, -5.618872440836617, 4.638827606092005, 0.8887726364890928, 8.730809901357286, -6.4963370793479545, -6.4003385330186795, -11.820235441582424, -3.29494170904095, -1.5320936828139837, 0.1094081633203249, 0.26353076268018827, 3.935780218339343, 0.8881280604852664, -5.048729642423418, 8.288232057956957, -14.686080237582006, 3.058305829324875, -2.4144038920292608, 21.76633883966702, 12.151853576801647, -3.6372061664901416, 6.28253174293219, -4.209863472970308, 0.8614258660906541, -9.382012074551428, -3.346419915864691, -0.6326977049713416, 2.1391118323593203, 0.44832732990560714, 6.853600355726914, 2.8210824313745957, 1.3901883615737192, -5.962068350552335, 0.502596306917136]
最初的随机神经网络,多类对数损失得分很高,即30。随着训练的进行,该值一直下降,直到足够低时训练停止。对于这个例子,一旦错误降至10以下,训练就会停止。要确定错误的良好停止点,你应该评估神经网络在预期用途下的运行情况。低于0.5的对数损失通常在可接受的范围内;但是,神经网络可能无法对所有数据集都达到这个得分。
以下网址展示了经过模拟退火训练的神经网络的示例:
http://www.heatonresearch.com/aifh/vol3/anneal_roc.html


5.4

本章小结

目标函数可以评估神经网络。它们只返回一个数值,该值表示神经网络的成功程度。回归神经网络通常使用MSE。分类神经网络通常使用对数损失或多类对数损失函数。这些神经网络可创建自定义的目标函数。

本文摘自《人工智能算法(卷3):深度学习和神经网络》

自早期以来,神经网络就一直是人工智能(Artificial Intelligence,AI)的支柱。现在,令人兴奋的新技术(如深度学习和卷积)正在将神经网络带入一个全新的方向。本书将演示各种现实世界任务中的神经网络,如图像识别和数据科学。我们研究了当前的神经网络技术,包括ReLU激活、随机梯度下降、交叉熵、正则化、Dropout及可视化等。

本书适合作为人工智能入门读者以及对人工智能算法感兴趣的读者阅读参考。

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“强基固本”历史文章


更多强基固本专栏文章,

请点击文章底部“阅读原文”查看


分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存