趋近智
fit() 方法神经网络在学习之前,需要一种方式来衡量其预测的准确度。这项衡量工作由损失函数(也称为成本函数或目标函数)完成。可以将其视为一个分数,用以量化模型预测值与训练数据中实际目标值之间的差异。训练的目标是调整网络权重,使这个分数尽可能低。
在训练过程中,对当前批次数据进行前向传播(进行预测)后,会计算损失函数的值。然后,这个损失值会被优化算法(我们接下来会讨论)在反向传播中使用,以计算梯度,从而确定减少误差所需的权重调整方向和幅度。选择得当的损失函数能有效引导网络做出更好的预测。
损失函数的选择并非随意;它直接取决于您尝试解决的问题类型。使用不合适的损失函数可能导致模型性能不佳,即使网络架构良好也是如此。接下来我们看看常用机器学习任务的标准损失函数。
回归问题涉及预测连续的数值,例如预测房价、温度或股票价值。
均方误差或许是回归最常用的损失函数。它计算预测值 (y^i) 与真实值 (yi) 之间平方差的平均值。
MSE=N1i=1∑N(yi−y^i)2这里,N 是批次中的样本数量。将差异平方化有两个主要作用:
在 Keras 中,您可以使用字符串标识符'mean_squared_error'或'mse'来指定MSE,或者通过导入并使用keras.losses.MeanSquaredError类。
平均绝对误差计算预测值与真实值之间绝对差的平均值。
MAE=N1i=1∑N∣yi−y^i∣MAE衡量误差的平均大小,而不考虑其方向。与MSE不同,它不会不成比例地惩罚大误差,使其更适合处理异常值。如果您的数据集包含您不希望主导损失计算的显著异常值,MAE可能是一个更好的选择。
在 Keras 中,使用标识符'mean_absolute_error'或'mae',或keras.losses.MeanAbsoluteError类。
比较预测目标值2时MSE和MAE的损失。请注意,当预测值偏离真实值较远时(例如,预测值为10),MSE的损失增长要陡峭得多,这表明与MAE相比,它对大误差或异常值更为敏感。
分类问题涉及预测离散的类别或类标签。损失函数的选择取决于它是二分类(两个类别)还是多分类(多于两个类别),以及标签的格式。
用于只有两个可能结果类别(例如,垃圾邮件/非垃圾邮件、猫/狗)的二分类问题。通常,网络处理此类任务的最后一层具有一个带有Sigmoid激活函数的输出单元,生成0到1之间的概率。目标标签应为0或1。
二元交叉熵衡量真实标签(y,为0或1)与预测概率(y^)之间的差异。单个预测的公式为:
Loss=−(ylog(y^)+(1−y)log(1−y^))当预测概率y^接近真实标签y时,损失较低;否则损失较高。例如,如果真实标签y=1,损失简化为−log(y^)。当y^接近1时,此值接近0;当y^接近0时,此值趋于无穷大。反之,如果y=0,损失为−log(1−y^),这会惩罚接近1的预测值。
在 Keras 中,使用标识符'binary_crossentropy'或keras.losses.BinaryCrossentropy类。
用于多分类问题,其中每个样本恰好属于三个或更多类别中的一个(例如,对0-9的数字图像进行分类)。此损失函数期望目标标签采用独热编码。独热编码标签是一个与类别数量相同长度的向量,除了对应真实类别的索引处为1之外,其他所有位置都为零。例如,如果类别是“猫”、“狗”、“鸟”,那么“狗”的标签将是[0, 1, 0]。
网络处理此类任务的最后一层通常具有C个输出单元(其中C是类别数量),并使用Softmax激活函数。Softmax确保输出是所有类别概率之和为1的概率。
分类交叉熵将预测概率(y^)的分布与真实分布(y,独热向量)进行比较。单个样本的公式为:
Loss=−c=1∑Cyclog(y^c)其中C是类别数量,yc在c是真实类别时为1,否则为0,y^c是类别c的预测概率。由于只有一个yc为1(真实类别),所以求和实际上变为−log(y^真实类别)。如果模型为正确类别分配了较低的概率,它会受到严厉的惩罚。
在 Keras 中,使用'categorical_crossentropy'或keras.losses.CategoricalCrossentropy。
此损失函数与分类交叉熵目的相同(多分类),但用于目标标签以整数形式提供而非独热编码向量的情况。例如,对于“狗”的标签,不是[0, 1, 0],而是简单地使用整数1(假设“猫”是0,“狗”是1,“鸟”是2)。
使用稀疏分类交叉熵通常更方便,因为它避免了将整数标签显式转换为独热向量的需要。执行的计算在数学上等同于分类交叉熵;Keras在内部处理转换。与分类交叉熵一样,它要求模型的最后一层使用Softmax激活。
在 Keras 中,使用'sparse_categorical_crossentropy'或keras.losses.SparseCategoricalCrossentropy。根据目标标签的格式纯粹地选择categorical_crossentropy或sparse_categorical_crossentropy:独热向量需要前者,而整数标签需要后者。
您在使用compile()方法编译模型时选择损失函数。您可以使用其字符串标识符(最常见)或通过实例化keras.losses中的损失类来指定它。
import keras
# 回归模型的例子
model.compile(optimizer='adam',
loss='mean_squared_error') # 使用MSE的字符串标识符
# 二分类模型的例子
model.compile(optimizer='rmsprop',
loss='binary_crossentropy', # 使用字符串标识符
metrics=['accuracy'])
# 使用整数标签的多分类模型的例子
model.compile(optimizer='adam',
loss=keras.losses.SparseCategoricalCrossentropy(), # 使用类实例
metrics=['accuracy'])
# 使用独热编码标签的多分类模型的例子
model.compile(optimizer='adam',
loss='categorical_crossentropy', # 使用字符串标识符
metrics=['accuracy'])
选择正确的损失函数是配置训练过程的基础步骤。它定义了模型将努力最小化的量,直接影响模型从数据中学习的方式。定义了损失函数后,接下来的一个环节是优化算法,它决定了根据计算出的损失如何更新模型的权重。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造