2.5 代价函数

代价函数(Cost Function)是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。本节主要介绍代价函数的作用及其原理、常见代价函数、代价函数为什么需要非负及用交叉熵代替二次代价函数的原因。

2.5.1 为什么需要代价函数

为了得到训练逻辑回归模型的参数,需要一个代价函数,通过训练代价函数来得到参数,用于找到最优解的目的函数。

2.5.2 代价函数作用原理

在回归问题中,通过代价函数来求解最优解,常用的是平方误差代价函数。假设函数图像如图2-4所示,当参数发生变化时,假设函数状态也会随着变化。

图2-4 函数图像

想要拟合图中的离散点,我们需要尽可能找到最优的参数来使这条直线更能代表所有数据。如何找到最优解呢?这就需要使用代价函数来求解,以平方误差代价函数为例,假设函数为hx)=θ0x,图中代表函数为y=Ax+B

平方误差代价函数的主要思想就是将实际数据给出的值与拟合出的线的对应值作差,求出拟合出的直线与实际的差距。在实际应用中,为了避免因个别极端数据产生的影响,要采用类似方差再取1/2的方式来减小个别数据的影响。因此,引出代价函数:

最优解即为代价函数的最小值。如果是1个参数,代价函数一般通过二维曲线便可直观看出。如果是2个参数,那么通过三维图像可看出代价函数的效果,参数越多,越复杂。

当参数为2个时,代价函数是三维图像,如图2-5所示。

图2-5 代价函数三维图像举例

2.5.3 常见代价函数

二次代价函数(Quadratic Cost)

其中,J表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本的总数,L表示整个神经网络的层数。使用一个样本为例简单说明,此时二次代价函数为:

假如使用梯度下降法(Gradient Descent)来调整权值参数的大小,权值w和偏置b的梯度推导如下:

其中,z表示神经元的输入,σ表示激活函数。权值w和偏置b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,权值w和偏置b的大小调整得越快,训练收敛得就越快。

注:神经网络常用的激活函数为sigmoid函数,该函数的曲线如图2-6所示。

图2-6 sigmoid函数曲线

对0.88和0.98两个点进行比较:

假设目标收敛到1.0。0.88离目标1.0比较远,梯度比较大,权值调整比较大。0.98离目标1.0比较近,梯度比较小,权值调整比较小。调整方案合理。

假如目标收敛到0。0.88离目标0比较近,梯度比较大,权值调整比较大。0.98离目标0比较远,梯度比较小,权值调整比较小。调整方案不合理。

原因:在使用sigmoid函数的情况下,初始的代价(误差)越大,训练越慢。

交叉熵代价函数(Cross-Entropy)

其中,J表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。

权值w和偏置b的梯度推导如下:

当误差越大时,梯度就越大,权值w和偏置b调整就越快,训练的速度也就越快。

二次代价函数适合输出神经元是线性的情况,交叉熵代价函数适合输出神经元是S型函数的情况。

对数似然代价函数(Log-likelihood Cost)

对数似然代价函数常用来作为softmax回归的代价函数。深度学习中普遍的做法是将softmax作为最后一层,此时常用的代价函数是对数似然代价函数。

对数似然代价函数与softmax的组合和交叉熵与sigmoid函数的组合非常相似。对数似然代价函数在二分类时可以化简为交叉熵代价函数的形式。

在TensorFlow中,与sigmoid搭配使用的交叉熵函数是tf.nn.sigmoid_cross_entropy_with_logits();与softmax搭配使用的交叉熵函数是tf.nn.softmax_cross_entropy_with_logits()。

在PyTorch中,与sigmoid搭配使用的交叉熵函数是torch.nn.BCEWithLogitsLoss();与softmax搭配使用的交叉熵函数是torch.nn.CrossEntropyLoss()。

2.5.4 为什么代价函数要非负

目标函数存在一个下界,在优化过程中,如果优化算法能够使目标函数不断减小,根据单调有界准则,这个优化算法就能证明是收敛有效的。

只要设计的目标函数有下界,基本上都可以,代价函数非负时优化过程更为方便。

2.5.5 为什么用交叉熵代替二次代价函数

此问题分为两个方面:为什么不用二次方代价函数和为什么要用交叉熵。

为什么不用二次方代价函数

假设权值w和偏置b的偏导数分别为,偏导数受激活函数的导数影响,sigmoid函数导数在输出接近0和1时非常小,会导致一些实例在刚开始训练时学习得非常慢。

为什么要用交叉熵

交叉熵函数权值w和偏置b的梯度推导为:

由以上公式可知,权重学习的速度受到σz)-y影响,误差更大,就有更快的学习速度,避免了二次代价函数方程中因σ'(z)导致的学习缓慢的情况。