我们已经知道神经网络由层层相互连接的神经元组成,并利用激活函数引入非线性。但网络究竟是如何学习的呢?它是如何从随机初始猜测变为做出有效预测的呢?这个过程始于量化其预测的错误程度。这就是损失函数的作用。想象你在学玩飞镖。你投掷一枚飞镖(网络做出预测),它落在靶盘上的某个位置。损失函数就像一个计分规则,它告诉你你的飞镖($ \hat{y} $,预测值)距离靶心($ y $,实际目标值)有多远。自然地,目标是在多次投掷后,最小化这个“距离”或错误分数。在深度学习中,损失函数(也称为成本函数或目标函数)计算一个单一的标量值,表示网络预测输出($ \hat{y} $)与给定输入数据的真实目标值($ y $)之间的差异。整个训练过程都围绕着最小化这个损失值。通过系统地调整网络的权重和偏置(我们很快将在梯度下降和反向传播中讨论),我们试图找到能产生最低损失的参数设置,这意味着根据我们选择的度量标准,预测值尽可能接近实际值。损失函数的选择并非随意;它主要取决于你试图解决的问题类型,即是回归任务还是分类任务。回归问题的损失函数回归问题涉及预测连续的数值。例子包括预测房价、股票价值或温度。对于这些任务,损失函数衡量预测值与实际值之间的差异。均方误差 (MSE)均方误差或许是回归问题中最常见的损失函数。它计算预测值与实际值之间平方差的平均值。MSE的公式为: $$ \text{均方误差} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$ 其中:$ n $ 是数据点(样本)的数量。$ y_i $ 是第 $ i $ 个数据点的真实目标值。$ \hat{y}_i $ 是第 $ i $ 个数据点的预测值。为什么要平方差值? 平方有两个目的:无论预测值过高还是过低,它确保误差的贡献始终为正。它对较大的误差施加重罚。10的差值对总和贡献100,而2的差值仅贡献4。对大误差的这种强惩罚使MSE对异常值敏感。如果你的数据集中包含一些具有异常大误差的点,它们可能会主导损失值,并在训练过程中显著影响生成的模型参数。然而,MSE在数学上很方便,特别是因为它的导数易于计算,这有助于基于梯度的优化方法。平均绝对误差 (MAE)平均绝对误差为回归损失提供了一个不同的视角。它不将差值平方,而是取它们的绝对值。MAE的公式为: $$ \text{平均绝对误差} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$ 在这里,误差贡献与差值呈线性关系。10的差值对总和贡献10,而2的差值贡献2。因为MAE不平方误差,所以与MSE相比,它对异常值不那么敏感。单个大误差不会那么大程度地主导总损失。这使得MAE成为一个可能更好的选择,如果你的数据集包含你不想过度影响模型的显著异常值。主要缺点是绝对值函数在零点处梯度未定义,在其他地方是常数,这有时会使优化比MSE的光滑梯度稍不直接,尤其是在最小值附近。MSE与MAE对比示意下面的图表显示了MSE和MAE的损失贡献如何随绝对误差($|y - \hat{y}| $)的增加而增加。注意MSE(蓝线)的上升速度远快于MAE(橙线),这反映了它对较大误差更强的惩罚。{"layout": {"xaxis": {"title": "绝对误差 |y - y_hat|"}, "yaxis": {"title": "损失贡献"}, "title": "MSE与MAE损失惩罚对比"}, "data": [{"x": [0, 1, 2, 3, 4, 5], "y": [0, 1, 4, 9, 16, 25], "type": "scatter", "mode": "lines+markers", "name": "MSE", "line": {"color": "#4263eb"}}, {"x": [0, 1, 2, 3, 4, 5], "y": [0, 1, 2, 3, 4, 5], "type": "scatter", "mode": "lines+markers", "name": "MAE", "line": {"color": "#fd7e14"}}]}预测误差增加时,均方误差(MSE)和平均绝对误差(MAE)的损失值比较。MSE呈二次方增长,而MAE呈线性增长。分类问题的损失函数分类问题涉及将输入数据分配到几个离散类别或分类中的一个。例子包括识别垃圾邮件(垃圾邮件/非垃圾邮件)、识别手写数字(0-9)或图像分类(猫/狗/鸟)。对于分类问题,我们通常处理概率。网络输出一个关于可能类别的概率分布(例如,80%的几率是猫,15%的狗,5%的鸟)。我们需要一个损失函数来衡量预测概率分布与实际分布(真实类别具有100%的概率,其他类别为0%)的匹配程度。MSE和MAE通常不适用于此,因为它们不能有效地衡量概率分布之间的距离。标准选择是交叉熵损失。交叉熵损失交叉熵源于信息论,并提供了一种衡量两个概率分布之间差异的方法。在我们的语境中,这些是预测概率分布(来自网络的输出层,通常在Sigmoid或Softmax激活之后)和真实概率分布(表示实际标签)。较低的交叉熵值表示预测分布更接近真实分布。交叉熵损失的具体形式取决于类别的数量。二元交叉熵 (BCE)用于二元分类任务,其中只有两个可能的输出类别(例如,0或1,真或假,垃圾邮件或非垃圾邮件)。这个损失函数通常与输出层中的Sigmoid激活函数一起使用,因为Sigmoid将输出压缩到0和1之间的值,表示正类别(类别1)的概率。二元交叉熵(也称为对数损失)的公式为: $$ \text{二元交叉熵损失} = - \frac{1}{n} \sum_{i=1}^{n} [ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) ] $$ 其中:$ n $ 是数据点的数量。$ y_i $ 是样本 $ i $ 的真实标签(0或1)。$ \hat{y}_i $ 是样本 $ i $ 属于类别1的预测概率(Sigmoid函数的输出)。让我们为一个单独的样本($n=1$)进行分解:如果真实标签 $ y $ 是1,损失变为 $ - \log(\hat{y}) $。如果 $ \hat{y} $(类别1的预测概率)接近1,损失较小;如果 $ \hat{y} $ 接近0,损失非常大。如果真实标签 $ y $ 是0,损失变为 $ - \log(1 - \hat{y}) $。如果 $ \hat{y} $ 接近0(表示 $ 1 - \hat{y} $ 接近1),损失较小;如果 $ \hat{y} $ 接近1,损失非常大。BCE有效地惩罚那些自信地给出错误预测的情况。多类别交叉熵 (CCE)用于多类别分类任务,其中每个样本属于 $ C $ 个可能类别中的一个($ C > 2 $)。这个损失函数通常与输出层中的Softmax激活函数配合使用。Softmax将网络对每个类别的原始输出分数(logits)转换为概率分布,其中所有概率之和为1。多类别交叉熵的公式为: $$ \text{多类别交叉熵损失} = - \frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{C} y_{ij} \log(\hat{y}_{ij}) $$ 其中:$ n $ 是数据点的数量。$ C $ 是类别的数量。$ y_{ij} $ 是一个二元指示符(如果样本 $ i $ 确实属于类别 $ j $,则为1,否则为0)。这通常对应于真实标签的独热编码表示(例如,如果真实类别是4个中的第3个,则为 [0, 0, 1, 0])。$ \hat{y}_{ij} $ 是样本 $ i $ 属于类别 $ j $ 的预测概率(Softmax函数对类别 $ j $ 的输出)。对于单个样本 $ i $,因为只有一个 $ y_{ij} $ 值是1(对于真实类别 $ k $),其余为0,所以内层求和简化为 $ - \log(\hat{y}_{ik}) $。也就是说,该样本的损失仅仅是网络分配给正确类别的概率的负对数。网络会根据分配给正确类别的概率有多低而受到惩罚。注: 有时你可能会遇到“稀疏多类别交叉熵”。它在数学上与CCE相同,但接受整数标签(例如,第3个类别为 2),而不是要求独热编码标签,这可以更节省内存。选择正确的损失函数选择合适的损失函数对成功的模型训练非常重要。主要的指导原则是你的任务性质:对于回归任务,使用MSE或MAE。如果你怀疑显著的异常值可能会过度影响训练,则选择MAE;否则,由于其数学特性,MSE通常是默认选择。对于二元分类任务,使用二元交叉熵,通常搭配Sigmoid输出激活。对于多类别分类任务,使用多类别交叉熵(或稀疏CCE),通常搭配Softmax输出激活。既然我们有了一种利用损失函数精确衡量网络表现的方法,下一步就是找出如何调整网络参数(权重和偏置)以最小化这个损失。这个优化过程是本章其余部分的议题,将从核心算法:梯度下降开始。