损失函数:
在机器学习任务中,大部分监督学习算法都会有一个目标函数(Objective Function),算法对该目标函数进行优化,称为优化算法的过程。例如在分类或者回归任务中,使用损失函数(Loss Function)作为其目标函数对算法模型进行优化。
均方误差(MSE)损失函数和交叉熵损失函数,如下图所示,可以清晰地观察到不同的损失函数在梯度下降过程中的收敛速度和性能都是不同的。特别是针对自定义的深度神经网络,深度神经网络中的输出结果包括分类和回归问题,损失函数的模型会变得更加复杂。
如图所示:MSE损失函数收敛速度慢,可能会陷入局部最优解:而交叉熵损失函数的收敛速度较MSE快,且较为容 易找到函数最优解。
损失函数定义:
在神经网络中,损失函数用来评价网络模型输出的预测值Y^ =f(X)与真实值Y之间的差异。这里使用L(Y^, Y)来表示损失函数,它是一个非负实值函数。损失值越小,网络模型的性能就越好,所以优化算法目的就是让损失函数尽可能的小。
假设网络模型中有N个样本,样本的输入和输出向量为(X,Y)=(x,.y)i∈[1,N]那么总损失函数L(Y, Y)为每一个输出预测值与真实值的误差之和:
回归损失函数:
1.均方误差损失函数
运用均方误差(MeanSquaredErrorLoss,MSE)的典型回归算法有线性回归(Linear Regression),均方误差损失函数的定义如下:
实际上,均方误差损失函数的计算公式可以看作欧式距离的计算公式。欧式距离的计算简单方便,而且是一种很好的相似性度量标准,因此通常使用MSE作为标准的衡量指标。
2.平均绝对误差损失函数
平均绝对误差损失(Mean Absolute Error Loss, MAE),是对数据的绝对误差求平均,平均绝对误差损失函数的定义如下:
3.均方误差对数损失函数
均方误差对数损失( Mean Squared Log Error Loss, MSLE)的定义如下:
4.平均绝对百分比误差损失函数
回归损失函数总结
尽管回归模型的损失函数有很多种,但是均方误差仍然是使用最广泛的,并且在大部分情况下,均方误差有着不错的性能,因此被用作损失函数的基本衡量指标。MAE则会比较有效地惩罚异常值,如果数据异常值较多,需要考虑使用平均绝对误差损失作为损失函数。一般情况下,为了不让数据出现太多异常值,可以对数据进行预处理操作。
均方误差对数损失与均方误差的计算过程类似,多了对每个输出数据进行对数计算,目的是缩小函数输出的范围值。平均绝对百分比误差损失则计算预测值与真实值的相对误差。均方误差对数损失与平均绝对百分比误差损失实际上是用来处理大范围数据(如[-10’, 10])的,但是在神经网络中,我们常把输入数据归一化到一个合理范围的(如[-1, 1]),然后再使用均方误差或者平均绝对误差损失来计算损失。
分类损失函数:
1.Logistic损失函数
神经网络中涉及多分类问题时最常用的是Logistic损失函数。神经网络模型会为每一个分类产生一个有效的概率。为了让某一分类的概率最大,而引入了最大似然估计函数。在最大似然估计函数中,定义一个损失函数为loss(Y, P(Y|X)),公式表示样本X在分类Y的情况下,使概率P(Y|X)达到最大值。换句话说,就是利用已知的样本X分布,找到最有可能的参数,使样本X属于Y的概率P(MX)最大。假设二分类有P(Y=1|X)=Y、P(Y=0|X)=1-Y,因此对于多分类有:
在这里使用最大似然函数,目的是使每个分类都最大化,预测其所属正确分类的概率:
2.负对数似然损失函数
为了方便数学运算,在处理概率乘积时通常把最大似然函数转化为概率的对数,这样可以把最大似然函数中的连乘转化为求和。在前面加一个负号之后,最大化概率P(Y|X)等价于寻找最小化的损失。最后,Logistic 损失函数变成了常见的负对数似然函数(Negative Log Likelihood Loss):
3.交叉熵损失函数
由于Logistic 损失函数和负对数似然损失函数都只能处理:二 分类问题,从两个类别扩展到M个类别,于是有了交叉熵损失函数(Cross Entropy Loss);
神经网络中常用的损失函数
神经网络中的损失函数可以自定义,前提是需要考虑数据本身和用于求解的优化方案。自定义损失函数需要考虑输入的数据形式和对损失函数求导的算法。自定义损失函数其实是有些难度的,在实际工程项目上,结合激活函数来选择损失函数是常见的做法,常用组合有以下3种。
ReLU + MSE
均方误差损失函数无法处理梯度消失问题,而使用LeakReLU激活函数能够减少计算时梯度消失的问题,因此在神经网络中如果需要使用均方误差损失函数,一般采用Leak ReLU等可以减少梯度消失的激活函数。另外,由于均方误差具有普遍性,一般作为衡量损失值的标准,因此使用均方误差作为损失函数表现既不会太好也不至于太差。
Sigmoid + Logistic
Sigmoid函数会引起梯度消失问题:根据链式求导法,Sigmoid 函数求导后由多个[0, 1]范围的数进行连乘,如其导数形式为s(x)[1-s<(x)],当其中一个数很小时,连成后会无限趋近于零直至最后消失。而类Logistic 损失函数求导时,加上对数后连乘操作转化为求和操作,在一定程度上避免了梯度消失,所以我们经常可以看到Sigmoid激活函数+交叉熵损失函数的组合。
Softmax + Logisitc
在数学上,Softmax 激活函数会返回输出类的互斥概率分布,也就是能把离散的输出转换为一个同分布互斥的概率,如(0.2, 0.8)。另外,类Logisitc 损失函数是基于概率的最大似然估计函数而来的,因此输出概率化能够更加方便优化算法进行求导和计算,所以我们经常可以看到输出层使用Softmax激活函数+交叉熵损失函数的组合。
代码实现:
import numpy as np
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt
def mean_squared_error(y_true, y_pred):
return np.mean(np.square(y_pred - y_true), axis=-1)
def mean_absolute_error(y_true, y_pred):
return np.mean(np.abs(y_pred - y_true), axis=-1)
def mean_squared_logarithmic_error(y_true, y_pred):
first_log = np.log(np.clip(y_pred, 10e-6, None) + 1.)
second_log = np.log(np.clip(y_true, 10e-6, None) + 1.)
return np.mean(np.square(first_log - second_log), axis=-1)
def mean_absolute_percentage_error(y_true, y_pred):
diff = np.abs((y_pred - y_true) / np.clip(np.abs(y_true), 10e-6, None))
return 100 * np.mean(diff, axis=-1)
def hinge(y_true, y_pred):
return np.mean(np.maximum(1. - y_true * y_pred, 0.), axis=-1)
def cross_entropy(y_true, y_pred):
return -np.mean(y_true * np.log(y_pred + 10e-6))