tensorflow中代价函数

tensorflow中常用的损失函数有二次代价函数、交叉熵、对数似然代价函数。

二次代价函数

二次代价函数表达式:
C=12nx[y(x)a(x)]2C=\frac{1}{2n}\displaystyle\sum_{x}^{} [y(x)-a(x)]^2
在该表达式中,C表示cost,即代价函数;n表示样本个数,x表示样本,y(x)表示真实值,a(x)表示预测值,即a=σ(z)a=σ(z)z=wjxj+bz=\displaystyle\sum_{}^{} w_jx_j+b
为了简单起见,我们假设只有一个样本,即C=12(ya)2C=\frac{1}{2} (y-a)^2
现在使用梯度下降法来调整权值和偏执值的大小,
tensorflow中代价函数
梯度就是我们说的导数,w和b的梯度跟**函数的梯度成正比(不考虑梯度的方向,即导数的正负),**函数的梯度越大,w和b的大小调整得越快,训练收敛的就越快。如果我们希望模型快速收敛,那就需要**函数的导数稍微大些。如果**函数的导数很小,接近于0,那w和b的调整就几乎为0,即w和b几乎没有调整,这就是我们经常说的梯度消失的问题。
tensorflow中代价函数
我们以sigmoid**函数为例来解释梯度,sigmoid曲线如上图所示。在B点,**函数到导数几乎为0,那w和b的调整就几乎为0,基本没有什么变化。
假如我们目标是使**函数的值收敛到1。A点为0.82离目标比较远,梯度比较大,权值调整比较大。B点为0.98离目标比较近,梯度比较小,权值调整比较小。调整方案合理。
假如我们目标是使**函数的值收敛到0。A点为0.82离目标比较近,梯度比较大,权值调整比较大。B点为0.98离目标比较远,梯度比较小,权值调整比较小。调整方案不合理。

交叉熵代价函数

交叉熵代价函数的表达式:
tensorflow中代价函数
同样,在该表达式中,C表示cost,即代价函数;n表示样本个数,x表示样本,y表示真实值,a表示预测值,即
tensorflow中代价函数
其中,**函数使用的是sigmoid函数,sigmoid表达式为
tensorflow中代价函数
所以,
tensorflow中代价函数
现在使用梯度下降法来调整权值和偏执值的大小,
tensorflow中代价函数
由上述两个表达式可知,权值和偏置值的梯度与**函数的导数无关,即在交叉熵代价函数中,权值和偏执值的调整和**函数的导数是没有关系
同时,在表达式中,σ(z)yσ(z)-y表示输出值与实际值的误差,所以在交叉熵代价函数中,权值和偏执值的调整是和输出值与预测值的差值成正比的,即当误差越大时,梯度就越大,参数w和b的调整就越快,训练的速度也就越快。调整方案非常合理。
注意:
如果输出神经元(即**函数)是线性的,可以选择使用二次代价函数。如果输出神经元是S型函数(即**函数),那么比较适合用交叉熵代价函数。

对数似然代价函数

对数似然代价函数的表达式:
C=xy(x)lna(x)C=-\displaystyle\sum_{x}^{} y(x)*lna(x)
在该表达式中,C表示cost,即代价函数;x表示样本;y表示真实值;a表示预测值。
tensorflow中代价函数
对数似然函数常用来作为softmax回归的代价函数,如果输出层神经元是sigmoid函数,可以采用交叉熵代价函数。而深度学习中更普遍的做法是将softmax作为最后一层,此时常用的代价函数是对数释然代价函数。
对数似然代价函数与softmax的组合和交叉熵与sigmoid函数的组合非常相似。对数释然代价函数在二分类时可以化简为交叉熵代价函数的形式。
如果几乎函数是softmax,而y是one-hot,则对数似然代价函数就设计的非常好。softmax、对数似然代价、one-hot三者是绝配。
用法:
tf.nn.sigmoid_cross_entropy_with_logits()来表示跟sigmoid搭配使用的交叉熵。
tf.nn.softmax_cross_entropy_with_logits()来表示跟softmax搭配使用的交叉熵。
注意:
(1)如果**函数是sigmoid,就选择交叉熵代价函数。
(2)如果**函数是softmax,就选择对数似然代价函数。