AI 课程网站首页
返回知识库

损失函数:衡量模型错得有多厉害

把预测变成一个数:均方误差、softmax 与交叉熵。

本篇目录
  1. 衡量直线离数据有多远
  2. 损失地图
  3. 预测类别
  4. 交叉熵损失
  5. 如何选择损失
  6. 小结
  7. 注释
  8. 练习
  9. 参考文献

第 1 篇和第 3 篇把模型描述为一族函数:每选一组参数,就得到一条不同的直线或一个不同的网络。要从数据中学习,我们必须说明哪一组参数更好,而且“更好”必须是计算机能比较的数。损失函数提供的正是这个数:它根据模型在训练数据上的预测,返回一个值,预测好时这个值小,预测差时这个值大。本文先构造预测数值时用的损失,把它画成参数上的一张地图,再构造预测类别时用的损失。

1. 衡量直线离数据有多远

我们回到第 1 篇的房价。图 4.1 给出了三条候选直线:第一条每年都预测同一个价格 1.45;第二条上升得太陡;第三条紧贴着数据。我们一眼就能看出哪条最好,但需要一条计算机能执行的规则。

三幅图,都是同样的十个橙色点和一条蓝色直线,虚线把每个点连到直线上。三幅图的标题分别是 MSE = 0.062、MSE = 0.043 和 MSE = 0.001。

图 4.1 三条直线及其误差。 每幅图都画出房价数据(橙色)和一条直线 y=ϕ0+ϕ1xy = \phi_0 + \phi_1 x(蓝色)。虚线段是误差,即每个数据点与直线之间的竖直距离。a)ϕ0=1.45\phi_0 = 1.45,ϕ1=0\phi_1 = 0:一条水平线,均方误差 0.0622。b)ϕ0=0.9\phi_0 = 0.9,ϕ1=0.15\phi_1 = 0.15:太陡,0.0434。c)ϕ0=1.096\phi_0 = 1.096,ϕ1=0.0857\phi_1 = 0.0857:最好的直线,0.00063。

这条规则从每个样本的误差出发:预测值 f(xi,ϕ)f(x_i, \boldsymbol{\phi}) 与真实值 yiy_i 之差,也就是图 4.1 中的虚线段。为了把十个误差合成一个数,我们把每个误差平方,再取平均:

L(ϕ)=1I∑i=1I(f(xi,ϕ)−yi)2(4.1)L(\boldsymbol{\phi}) = \frac{1}{I} \sum_{i=1}^{I} \big( f(x_i, \boldsymbol{\phi}) - y_i \big)^2 \tag{4.1}

这个计算可以分成三步。首先,对每个训练样本 ii,算出预测值并减去真实值。其次,把结果平方。最后,把全部 II 个样本的平方加起来,再除以 II。这就是均方误差(MSE)。用文字说:均方误差是预测值与真实值之间距离平方的平均。

图 4.1a 的水平线每年都预测 1.45。第 0 年的真实价格是 1.08,误差为 0.370.37,平方为 0.13690.1369;第 9 年的真实价格是 1.85,误差为 −0.40-0.40,平方为 0.160.16。十个平方加起来是 0.62240.6224,除以 I=10I = 10,得到 L=0.0622L = 0.0622。同样的计算,太陡的直线得到 0.04340.0434,紧贴数据的直线得到 0.000630.00063。

平方有两个作用。一是让每个误差都按正数计入,直线上方和下方的误差不会相互抵消。二是让大误差比小误差重要得多:误差 0.4 对损失的贡献是误差 0.1 的 16 倍。有时这并不理想,比如少数数据点本身记录有误时。平均绝对误差改为对 ∣f(xi,ϕ)−yi∣|f(x_i, \boldsymbol{\phi}) - y_i| 取平均,受这类点的影响较小。

2. 损失地图

损失取决于参数。我们的直线只有两个参数 ϕ0\phi_0 和 ϕ1\phi_1,因此可以对每一种组合计算损失,画成一张地图(图 4.2)。地图上的每个点代表一条直线,颜色表示这条直线的损失。

一张地图,横轴是 phi 零,纵轴是 phi 一。颜色深浅形成沿对角线方向的狭长椭圆,中心是白色。标为 a 和 b 的两个橙色点位于较深的区域,标为 c 的绿色点位于中心。

图 4.2 房价直线的损失地图。 每个点 (ϕ0,ϕ1)(\phi_0, \phi_1) 都是一条直线,颜色表示这条直线在十个数据点上的均方误差,蓝色越深损失越大。灰色曲线连接损失相等的直线。点 a 和 b(橙色)是图 4.1a 和 4.1b 中的直线,点 c(绿色)是图 4.1c 中的直线,位于地图的最低点。

训练模型,就是寻找这张地图上的最低点。对一条直线,我们可以直接看到它,就是绿色的点 c。地图还显示了一个不那么显然的现象:低损失区域是一条沿对角线延伸的狭长山谷。提高斜率 ϕ1\phi_1 的同时降低截距 ϕ0\phi_0,直线仍然从数据中部附近经过,所以许多这样的参数组合损失相近。第 5 篇会说明,山谷的形状会影响训练找到谷底的速度。

一个有数百万个参数的网络,它的损失地图有数百万个维度,谁也画不出来。但原理不变:损失给每一组参数分配一个数,训练就是寻找这个数较小的参数。这种图景通常称为损失曲面或损失地形。

3. 预测类别

对分类任务,输出是“猫”“狗”“其他”这样的类别,类别之间的差的平方没有意义。我们改为让网络对每个类别输出一个数,再把这些数转换成概率。

假设网络看了一张照片后,输出的分数是:猫 z1=2.0z_1 = 2.0,狗 z2=0.5z_2 = 0.5,其他 z3=−1.0z_3 = -1.0。分数可以是任意的数,正负都可以。softmax 函数把它们转换成概率:

pk=ezk∑j=1Kezj(4.2)p_k = \frac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}} \tag{4.2}

其中 KK 是类别数,eze^{z} 是指数函数。这个计算可以分成两步。首先,取指数使每个分数都变为正数,且保持大小顺序:e2.0=7.389e^{2.0} = 7.389,e0.5=1.649e^{0.5} = 1.649,e−1.0=0.368e^{-1.0} = 0.368。其次,除以它们的和 9.4069.406,使它们加起来等于 1。得到的概率是 p1=0.786p_1 = 0.786、p2=0.175p_2 = 0.175、p3=0.039p_3 = 0.039(图 4.3a–b)。用文字说:softmax 把分数变成概率,分数越高,概率一定越高。

三幅图。a)猫、狗、其他三根柱子,高度分别为 2.0、0.5 和 -1.0。b)三根柱子,高度分别为 0.786、0.175 和 0.039。c)一条在接近零处急剧下降、在 1 处降到零的曲线,曲线上标出两个点。

图 4.3 从分数到分类损失。 a)网络对三个类别给出的分数。b)softmax(式 4.2)把它们变成加起来等于 1 的概率。c)交叉熵损失 −log⁡p-\log p,其中 pp 是分给正确类别的概率。如果照片里是猫,p=0.786p = 0.786,损失为 0.241(蓝);如果是狗,p=0.175p = 0.175,损失为 1.741(橙)。

4. 交叉熵损失

好的分类器应当给正确类别很高的概率。交叉熵损失用对数来衡量这一点:

L=−log⁡pc(4.3)L = -\log p_c \tag{4.3}

其中 pcp_c 是模型分给正确类别 cc 的概率,log⁡\log 是自然对数。在整个训练集上,我们对所有样本的这个量取平均,正如均方误差对样本取平均一样。

图 4.3c 展示了这个损失的性质。如果照片里确实是猫,损失为 −log⁡0.786=0.241-\log 0.786 = 0.241;如果是狗,模型只给了正确答案 0.175 的概率,损失为 −log⁡0.175=1.741-\log 0.175 = 1.741;如果两者都不是,损失为 −log⁡0.039=3.241-\log 0.039 = 3.241。正确类别的概率趋近 1 时,损失趋近 0;概率趋近 0 时,损失无限增大。因此,一个很自信却答错的模型,受到的惩罚远大于一个拿不准的模型。

只有两个类别时,比如垃圾邮件和正常邮件,网络常常只输出一个分数 zz,再用 sigmoid 函数 p=1/(1+e−z)p = 1 / (1 + e^{-z}) 把它转换成第一类的概率。对第一类的样本,损失为 −log⁡p-\log p;对另一类的样本,损失为 −log⁡(1−p)-\log(1 - p)。这称为二元交叉熵,是式 4.3 在两个类别时的特例。

5. 如何选择损失

损失由输出的类型决定:

任务 输出 常用损失
回归(价格、气温) 一个数 均方误差,或平均绝对误差
二分类(是否垃圾邮件) 一个概率 二元交叉熵
多分类(猫、狗、其他) 每个类别一个概率 softmax 之后的交叉熵
目标检测 框和类别 框的误差(如坐标的绝对误差)加上类别的交叉熵
分割 每个像素一个类别 每个像素的交叉熵,对所有像素取平均

损失用于训练,所以参数稍有变化时,它也必须平滑地变化,原因在第 5 篇解释。这就是为什么训练分类器用交叉熵,而不用答对的百分比:答对的百分比会从一个值跳到另一个值,无法提示参数该往哪个方向调整。不过在报告模型好坏时,我们仍然使用百分比之类的评估指标,第 6 篇会介绍它们。

小结

损失函数把模型在训练数据上的预测变成一个数,衡量预测错得有多厉害。预测数值时,均方误差对预测值与真实值之差的平方取平均。损失取决于参数,因此可以画成一张地图,训练就是寻找地图的最低点。预测类别时,softmax 把网络的分数变成概率,交叉熵损失是分给正确类别的概率取对数后的相反数。

注释

为什么用这些损失。 均方误差和交叉熵都可以从同一个原理推出,即最大似然:选择使观测到的训练数据出现概率最大的参数。假设误差服从正态(高斯)分布,就得到均方误差;把输出看作每个类别的概率,就得到交叉熵。《Understanding Deep Learning》[1] 第 5 章详细推导了这一方法,并用它构造其他类型输出的损失。

求和还是平均。 有些书把平方误差损失定义为对样本求和,而不是求平均。两者只相差一个常数因子 II,所以最低点相同。

分数与概率。 softmax 之前的分数常称为 logits。给每个分数加上同一个常数,概率不变,所以真正起作用的只是分数之间的差。

练习

练习 4.1 一条直线对三年的预测分别是 1.50、1.60 和 1.70,这三年的真实价格是 1.40、1.65 和 1.70。它的均方误差是多少?(答案:(0.01+0.0025+0)/3≈0.00417(0.01 + 0.0025 + 0)/3 \approx 0.00417。)

练习 4.2 一个网络对三个类别输出的分数是 (1,1,1)(1, 1, 1)。softmax 给出的概率是多少?无论哪个类别正确,交叉熵损失是多少?(答案:每个概率都是 1/31/3,损失为 log⁡3≈1.099\log 3 \approx 1.099。)

练习 4.3 解释为什么式 4.3 中的损失不可能是负数。

参考文献