当你训练监督机器学习模型时,你经常会听到最小化的、必须选择的损失函数等等。
但是损失是什么?损失函数又是什么?
我将在本文中回答这两个问题。我们将首先介绍高级监督学习过程,以奠定基础。这包括训练监督模型时训练、验证和测试数据的作用。
高级监督学习过程
在真正引入损失的概念之前,我们先来看看高级监督机器学习过程。所有有监督的训练方法都属于这一过程,这意味着它不仅适用于 MLP 或 ConvNets 等深度神经网络,也适用于支持向量机。
让我们来看看这个循环往复的训练过程。
前向传递
我们从特征和目标开始,这些特征和目标也被称为数据集。在训练过程开始前,数据集被分成三部分:训练数据、验证数据和测试数据。训练数据在训练过程中使用,更具体地说,是在前传过程中生成预测结果。然而,在每个训练周期之后,必须对模型的预测性能进行测试。这就是验证数据的用途--它有助于模型优化。
然后是测试数据。假设验证数据本质上是一个统计样本,但并不完全符合它所描述的统计人口。也就是说,样本不能完全代表总体,因此样本的平均值和方差(希望)与实际总体的平均值和方差略有不同。因此,每次使用验证数据对模型进行优化时,都会引入一点偏差。虽然就预测能力而言,该模型可能仍然非常有效,但它可能会失去概括能力。在这种情况下,它将不再适用于以前从未见过的数据,例如来自不同样本的数据。测试数据用于在整个训练过程结束后(即最后一个周期结束后)对模型进行测试,它可以让我们了解机器学习模型的泛化能力。
将训练数据输入机器学习模型的过程称为前向传递。这个名字的由来其实很简单:数据被简单地输入到网络中,这意味着数据以向前的方式通过网络。最终结果是一组预测,每个样本一个预测。这意味着,当我的训练集由 1000 个特征向量(或带特征的行)组成,并伴随着 1000 个目标时,我将在前向传递后得到 1000 个预测结果。
损失
不过,你确实想知道模型在最初设定的目标方面表现如何。一个表现良好的模型在生产使用时会很有趣,而一个表现不佳的模型则必须在实际使用前进行优化。
这就是损失概念的由来。
一般来说,损失允许我们对某些实际目标和预测目标进行比较。它通过对偏离实际目标的每个预测施加 “成本”(或使用另一个术语 “损失”)来实现。
从概念上计算损失相对容易:我们为机器学习预测商定一些成本,将 1000 个目标与 1000 个预测进行比较,计算出 1000 个成本,然后将所有成本相加,得出全局损失。
正如你在上文所描述的机器学习过程中看到的那样,箭头是向后流向机器学习模型的。它们的目标是:对模型的内部结构稍作优化,使其在下一个周期(或称迭代或历时)中表现更好。
逆向传递
计算损失时,必须改进模型。具体做法是将误差向后传播到模型结构,例如模型的权重。这就结束了向前输入数据、生成预测和改进数据之间的学习循环--通过调整权重,模型可能会得到改进(有时改进很大,有时改进很小),从而实现学习。
根据所使用的模型类型,优化模型(即向后传播误差)的方法有很多种。在神经网络中,通常会结合使用基于梯度下降的方法和反向传播方法:梯度下降类似于计算梯度或优化方向的优化器,反向传播则用于实际的误差传播。
在支持向量机等其他模型类型中,严格来说,我们实际上并不向后传播误差。不过,我们会使用二次优化等方法来找到数学最优值,而根据数据的线性可分性(无论是常规空间还是核空间),最优值是一定存在的。不过,将其形象化为 “通过计算误差来调整权重 ”有助于理解。
损失函数
这里,我们将介绍一系列损失函数:其中一些用于回归,另一些用于分类。
用于回归的损失函数
有两种主要的监督学习问题:分类和回归。在前者中,你的目标是将样本归入正确的类别,例如归入 “糖尿病 ”或 “无糖尿病 ”类别。但在后一种情况下,你并不是进行分类,而是估算某个有实际价值的数字。你要做的是从一些输入数据回归一个数学函数,因此称为回归。对于回归问题,有许多损失函数可用。
平均绝对误差(L1 损失)
平均绝对误差(MAE)就是其中之一。它看起来是这样的:
不用担心数学问题,我们现在将直观地介绍 MAE。
你在公式中看到的那个奇怪的类似 E 的符号就是所谓的西格玛符号,它概括了公式背后的含义: |Ei|,在我们的例子中,Ei 是误差(预测值与实际值之间的差值),| 符号表示取绝对值,或将 -3 转换为 3,3 仍然是 3。
在这种情况下,“求和 ”意味着我们对用于训练模型的所有 n 个样本的所有误差进行求和。因此,这样做之后,我们会得到一个非常大的数字。我们将这个数字除以 n,即所用样本的数量,得出平均值或平均绝对误差:即平均绝对误差或 MAE。
在多种回归情况下都可以使用 MAE(Rich,注)。不过,如果你的平均误差非常小,使用我们接下来要介绍的平均平方误差可能会更好。
均方误差
回归中常用的另一个损失函数是均方误差(MSE)。它听起来非常困难,尤其是当你看到公式时(Binieli,2018):
我们将上面的公式分成三个部分,这样就能了解每个元素,以及它们是如何共同作用产生 MSE 的。
MSE 的主要部分是中间部分,称为西格玛符号或求和符号。它的作用其实很简单:从 i 开始计数到 n,每计数一次,就执行一次后面写的内容。在本例中,这就是第三部分--(Yi - Y'i)的平方。
在我们的例子中,i 从 1 开始,n 尚未定义。相反,n 是我们训练集中的样本数,因此也是已经做出的预测数。在上述情况中,n 为 1000。
然后是第三部分。这实际上是我们之前已经直观了解到的数学符号:它是样本的实际目标(Yi)和预测目标(Y'i)之间的差值,后者是从前者中去除的。
但有一点不同:计算的最终结果是平方。这一特性在优化过程中带来了一些数学上的好处(Rich,注)。尤其是,MSE 是连续可变的,而 MAE 却不是(在 x = 0 时)。这意味着优化 MSE 比优化 MAE 更容易。
此外,大误差带来的成本要比小误差大得多(因为差值是平方,而大误差产生的平方要比小误差大得多)。这既是好事,同时也是坏事(Rich,注)。当误差较小时,这是一个很好的特性,因为此时优化工作就会提前进行(Quora, n.d.)。然而,使用 MSE 而不是 MAE 会让你的 ML 模型受到异常值的影响,这将严重干扰训练(通过引入大误差)。
尽管结论可能并不令人满意,但在 MAE 和 MSE 之间做出选择往往在很大程度上取决于你使用的数据集,因此在开始训练之前需要进行一些先验检查。
最后,当我们得到平方误差之和后,将其除以 n,就得到了平均平方误差。
平均绝对百分比误差
平均绝对百分比误差,或称 MAPE,实际上与 MAE 相似,尽管计算公式看起来有些不同:
使用 MAPE 时,我们计算的不是绝对误差,而是相对于实际值的平均误差百分比。也就是说,假设我的预测值是 12,而实际目标值是 10,那么这个预测值的 MAPE 就是 | (10-12 ) / 10 | = 0.2。
与 MAE 类似,我们将所有样本的误差相加,但随后会面临不同的计算: 100%/n. 这看起来很难,但我们可以再次将计算分成更容易理解的部分。更具体地说,我们可以将其写成 100% 和 1/n 的乘法。当将后者与总和相乘时,你会发现与除以 n 的结果相同,而我们在计算 MAE 时就是这样做的。
均方根误差(L2 损失)
还记得 MSE 吗?
还有一种叫 RMSE 的东西,也叫均方根误差或均方根偏差 (RMSD)。它是这样的:
它只是 MSE 的平方根值。
RMSE 或 RMSD 误差是平方的根平方,因此回到了原始目标的比例。这样就能更直观地了解目标的误差。
对数误差
“Log-cosh是预测误差的双曲余弦的对数"。
这就是数学公式:
这就是剧情:
好了,现在我们来介绍一些直观的解释。
TensorFlow 文档是这样写 Logcosh loss 的:
log(cosh(x))(x ** 2) / 2对于较小值x,近似等于;对于较大值,abs(x) - log(2)近似等于x。这意味着 'logcosh' 的工作原理与均方误差非常相似,但不会受到偶尔出现的严重错误预测的强烈影响。
它似乎比 MSE 或 L2 loss 有所改进。回想一下,如果数据集包含相当大的误差,MSE 会比 MAE(L1 损失)更好,因为它能更好地捕捉这些误差。不过,这也意味着 MSE 对误差的敏感度远高于 MAE。Logcosh 可以帮助解决这个问题:
因此,如果既有必须检测的较大误差,又有可能无法从数据集中移除的异常值,可以考虑使用 Logcosh!许多框架都可以使用 Logcosh,如上文提到的 TensorFlow,Keras 也可以使用。
Huber los
让我们继续讨论 Huber loss,我们已经在有关 MAE 的章节中提示过了:
或者说,视觉上:
在解释公式时,我们可以看到两个部分:
总结
在本文中,我们探讨了损失函数(也称成本函数)的概念。我们通过说明高层次的机器学习过程和(高层次的)优化过程中发生的事情,解释了为什么需要损失函数。