文章目录
引言
在上文「深度学习|模型训练:手写 SimpleNet」中,我们以简单的 Python 代码演示了神经网络的整个训练过程,我们知道了神经网络的学习
就是从数据样例中自动学得神经网络的权重参数最优解的过程。其中不难发现,要想让模型参数在模型训练的迭代中得到一次次的优化,其中损失函数起着至关重要的作用,损失函数是衡量模型参数好坏的基准,选择合适的损失函数是决定模型可以有效训练的前提条件。
本文我们将进一步介绍更多不同的损失函数,介绍它们的定义与代表的含义,以及它们在神经网络训练中的如何起到“促进”的作用。
均方误差
均方误差
(Mean Squared Error
, MSE
)是深度学习和机器学习中最常用的损失函数,尤其在回归问题中。
均方误差是模型的预测值( y ^ \hat{y} y^)与实际值( y y y)之间差异的平方的平均值,其数学公式为式 1:
MSE = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 (1) \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 \tag{1} MSE=N1i=1∑N(yi−y^i)2(1)
其中 N N N 是样本数量; y i y_i yi 是实际值; y ^ i \hat{y}_i y^i 是预测值。
从均方误差的定义可以看出,它对于量化预测值与实际结果之间的差异非常有效。均方误差越小,说明模型的预测越准确(衡量预测精度)。在训练神经网络时,我们通常会使用均方误差作为损失函数,通过优化该损失函数,使得模型的预测结果尽可能接近实际结果,以最小化预测误差,从而提高模型性能。
计算示例
假设我们有四组预测值和实际值如下:
- 预测值: y ^ = [ 3.0 , − 0.5 , 2.0 , 7.0 ] \hat{y} = [3.0, -0.5, 2.0, 7.0] y^=[3.0,−0.5,2.0,7.0]
- 实际值: y = [ 2.5 , 0.0 , 2.0 , 8.0 ] y = [2.5, 0.0, 2.0, 8.0] y=[2.5,0.0,2.0,8.0]
我们首先计算每个样本的平方误差:
- ( 3.0 − 2.5 ) 2 = ( 0.5 ) 2 = 0.25 (3.0 - 2.5)^2 = (0.5)^2 = 0.25 (3.0−2.5)2=(0.5)2=0.25
- ( − 0.5 − 0.0 ) 2 = ( − 0.5 ) 2 = 0.25 (-0.5 - 0.0)^2 = (-0.5)^2 = 0.25 (−0.5−0.0)2=(−0.5)2=0.25
- ( 2.0 − 2.0 ) 2 = ( 0.0 ) 2 = 0.0 (2.0 - 2.0)^2 = (0.0)^2 = 0.0 (2.0−2.0)2=(0.0)2=0.0
- ( 7.0 − 8.0 ) 2 = ( − 1.0 ) 2 = 1.0 (7.0 - 8.0)^2 = (-1.0)^2 = 1.0 (7.0−8.0)2=(−1.0)2=1.0
然后,将这些平方误差求和,并求其平均值:
MSE = 1 4 ( 0.25 + 0.25 + 0.0 + 1.0 ) = 1.5 4 = 0.375 \text{MSE} = \frac{1}{4} \left(0.25 + 0.25 + 0.0 + 1.0\right) = \frac{1.5}{4} = 0.375 MSE=41(0.25+0.25+0.0+1.0)=41.5=0.375
均方误差常用于回归问题,能够有效地衡量预测值与实际值之间的平均平方差。由于较大的误差值被平方,提高了其对模型训练过程中的重要性(敏感度
),使模型能够更倾向于“关注”出错较大的样本,因此均方误差在深度学习和许多统计模型中被广泛应用。
矩阵形式
在大多时候模型单个样例的输出不是一个单值,而是一个包含 k 个值的数组(向量),我们可以将对上文单值输出的均方误差推广到对数组输出的均方误差计算。求一批预测结果的数组输出的均方误差,可以用式 2 表示:
MSE = 1 2 N ∑ i = 1 N ∑ j = 1 k ( y i j − y ^ i j ) 2 (2) \text{MSE} = \frac{1}{2N} \sum_{i=1}^{N} \sum_{j=1}^{k}(y_{ij} - \hat{y}_{ij})^2 \tag{2} MSE=2N1i=1∑Nj=1∑k(yij−y^ij)2(2)
其中 N N N 表示样本数量,k 表示输出数组的长度; y i j y_{ij} yij 是第 i 个样例的第 j 个输出的实际值; y ^ i j \hat{y}_{ij} y^ij 是第 i 个样例的第 j 个输出的预测值。取 1 2 \frac{1}{2} 21 是为了方便后续计算方便,在求导中化掉。
在前文的手写数字识别任务中,我们知道神经网络输出的 one-hot
表示的 10 个 y 值,分别代表了推理结果为 0 ~ 9 的概率。
假设我们有两组预测和实际值如下:
- 预测值 1:
[0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
(索引位 2 的概率值最大,表示预测结果为数字 2); - 预测值 2:
[0.5, 0.05, 0.2, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
(索引位 0 的概率值最大,表示预测结果为数字 0); - 实际值:
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
(实际结果为数字 2); - 实际值:
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(实际结果为数字 0);
按照式 2 计算均方误差:
MSE = 1 2 ( E 1 + E 2 ) = 1 2 × 2 ( ∑ k ( y k − t k ) 2 + ∑ k ( y k − t k ) 2 ) = 1 2 × 2 ( [ ( 0.1 − 0 ) 2 + ( 0.05 − 0 ) 2 + ( 0.6 − 1 ) 2 + . . . + ( 0.0 − 0 ) 2 ] + [ ( 0.5 − 1 ) 2 + ( 0.05 − 0 ) 2 + ( 0.2 − 0 ) 2 + . . . + ( 0.0 − 0 ) 2 ] ) = 1 2 × 2 ( 0.195 + 0.315 ) = 0.1275 \text{MSE} = \frac{1}{2} (E_1 + E_2) \\ = \frac{1}{2 \times 2} (\sum_{k}(y_k - t_k)^2 + \sum_{k}(y_k - t_k)^2) \\ = \frac{1}{2 \times 2} ([(0.1 - 0)^2 + (0.05 - 0)^2 + (0.6 - 1)^2 + ... + (0.0 - 0)^2] + [(0.5 - 1)^2 + (0.05 - 0)^2 + (0.2 - 0)^2 + ... + (0.0 - 0)^2]) \\ = \frac{1}{2 \times 2} (0.195 + 0.315) \\ = 0.1275 MSE=21(