zombee0 2018-09-03
机器通过损失函数学习。它是一种评估特定算法对给定数据建模的好坏的方法。如果预测偏离实际结果太多,损失函数就会给出一个非常大的数字。在一些优化函数的帮助下,损失函数逐渐学会减少预测中的误差。在本文中,我们将讨论一些损失函数及其在机器/深度学习领域中的应用。
在机器学习中,算法并没有一个放之四海而皆准的损失函数。对于特定的问题,选择损失函数涉及到很多因素,比如选择的机器学习算法的类型,计算导数的容易程度以及数据集中异常值的百分比。
从广义上讲,损失函数可以根据我们所处理的学习任务的类型分为两大类——回归损失和分类损失。在分类中,我们试图从有限的分类值集合中预测输出即给定手写数字的大量数据集,将它们分类为0-9个数字之一。另一方面,回归处理的是预测一个连续的值,例如给定的建筑面积,房间的数量,房间的大小,预测房间的价格。
NOTE
n -训练示例的数量。
i -数据集中的第i个训练例子。
y(i) -第i个训练示例的Ground truth label.
y_hat(i) -第i个训练示例的预测。
均方误差/平方损失/ L2损失
数学公式 : -
均方误差
顾名思义,均方误差测量为预测与实际观测之间的平方差的平均值。它只关注平均误差幅度而不管它们的方向。然而,由于平方,与较少偏离的预测相比,远离实际值的预测会受到严重惩罚。加上MSE具有很好的数学特性,可以更容易地计算梯度。
Python示例代码如下:
import numpy as np
y_hat = np.array([0.000, 0.166, 0.333])
y_true = np.array([0.000, 0.254, 0.998])
def rmse(predictions, targets):
differences = predictions - targets
differences_squared = differences ** 2
mean_of_differences_squared = differences_squared.mean()
rmse_val = np.sqrt(mean_of_differences_squared)
return rmse_val
print("d is: " + str(["%.8f" % elem for elem in y_hat]))
print("p is: " + str(["%.8f" % elem for elem in y_true]))
rmse_val = rmse(y_hat, y_true)
print("rms error is: " + str(rmse_val))
平均绝对误差/ L1损失
数学公式 : -
平均绝对误差
另一方面,平均绝对误差被测量为预测和实际观察之间的绝对差之和的平均值。与MSE一样,这也可以在不考虑方向的情况下测量误差的大小。与MSE不同,MAE需要更复杂的工具,如线性编程来计算梯度。加上MAE对异常值更加稳健,因为它不使用平方。
Python示例代码如下:
import numpy as np
y_hat = np.array([0.000, 0.166, 0.333])
y_true = np.array([0.000, 0.254, 0.998])
print("d is: " + str(["%.8f" % elem for elem in y_hat]))
print("p is: " + str(["%.8f" % elem for elem in y_true]))
def mae(predictions, targets):
differences = predictions - targets
absolute_differences = np.absolute(differences)
mean_absolute_differences = absolute_differences.mean()
return mean_absolute_differences
mae_val = mae(y_hat, y_true)
print ("mae error is: " + str(mae_val))
平均偏差误差
这在机器学习领域中并不常见。这和MSE是一样的只是我们不取绝对值。显然,有必要谨慎,因为正偏差和负偏差可能相互抵消。虽然在实践中不准确,它可以确定模型具有正偏差或负偏差。
数学公式:
平均偏差误差
Hinge Loss/多类SVM损失
简单地说,正确类别的得分应该大于所有不正确类别的得分之和。因此,Hinge Loss用于最大边距分类,尤其是支持向量机。虽然不可微,但它是一个凸函数,可以很容易地使用机器学习领域中常用的凸优化器。
数学公式:
SVM Loss or Hinge Loss
考虑一个例子,我们有三个训练例子和三个预测类-狗,猫和马。下面是我们的算法预测的每个类的值:-
Hinge Loss/多类SVM损失
计算所有3个训练样例的Hinge Loss,Python代码如下: -
## 1st training example
max(0, (1.49) - (-0.39) + 1) + max(0, (4.21) - (-0.39) + 1)
max(0, 2.88) + max(0, 5.6)
2.88 + 5.6
8.48 (High loss as very wrong prediction)
## 2nd training example
max(0, (-4.61) - (3.28)+ 1) + max(0, (1.46) - (3.28)+ 1)
max(0, -6.89) + max(0, -0.82)
0 + 0
0 (Zero loss as correct prediction)
## 3rd training example
max(0, (1.03) - (-2.27)+ 1) + max(0, (-2.37) - (-2.27)+ 1)
max(0, 4.3) + max(0, 0.9)
4.3 + 0.9
5.2 (High loss as very wrong prediction)
交叉熵损失/负对数似然
这是最常见的分类问题设置。交叉熵损失随着预测概率偏离实际标签而增加。
数学公式:
交叉熵损失
注意,当实际标签为1 (y(i) = 1)时,函数的后半部分就会消失,而当实际标签为0 (y(i) = 0)时,前半部分就会掉下来。简而言之,我们只是将实际预测概率的对数乘以ground truth类。一个重要的方面是交叉熵损失严重惩罚了那些自信但错误的预测。
Python代码如下:
import numpy as np
predictions = np.array([[0.25,0.25,0.25,0.25],
[0.01,0.01,0.01,0.96]])
targets = np.array([[0,0,0,1],
[0,0,0,1]])
def cross_entropy(predictions, targets, epsilon=1e-10):
predictions = np.clip(predictions, epsilon, 1. - epsilon)
N = predictions.shape[0]
ce_loss = -np.sum(np.sum(targets * np.log(predictions + 1e-5)))/N
return ce_loss
cross_entropy_loss = cross_entropy(predictions, targets)
print ("Cross entropy loss is: " + str(cross_entropy_loss))