二次代价函数的局限性
首先来说一下二次代价函数的局限性,看下面这张图:
假设现在使用的激活函数是sigmoid,并且代价函数是二次代价函数,我们收敛得目标是1,那么A点的梯度比较大,B点由于离目标比较近梯度小,所以是合理的;但是如果我们的收敛目标是0,那么A点离目标比较近,所以梯度应该要小于B点,但是图中明明是A点的梯度大于B点,这是不合理的。
交叉熵
正式由于二次大家函数的这个局限性,我们需要引入交叉熵。看下面这张图:
上面这张图中,
C
=
−
1
2
∑
[
y
l
n
a
+
(
1
−
y
)
l
n
(
1
−
a
)
]
C=-\frac{1}{2}\sum[ylna+(1-y)ln(1-a)]
C=−21∑[ylna+(1−y)ln(1−a)]代表的是交叉熵代价函数,对w和b进行求导后得到下面的式子:
现在我们发现w和b的调整已经跟 激活函数的导数(注意是导数哦) 无关了,而是跟输出值和真实值的误差有关,他们的误差越大,梯度也就越大,w和b的收敛速度越快。
总结
虽然二次代价函数有自身的局限性,但是我们也不能因此而丢弃它不用,因为在线性回归问题中它依然用后很大的价值,因此要根据实际需要选择代价函数。底下是一个小结,大家可以在实际中根据需要进行选择:
- 二次代价函数:输出神经元是线性的就选用该代价函数
- 交叉熵代价函数:输出神经元是S型的就选用该代价函数,例如sigmoid激活函数中(tf.nn.sigmoid_cross_entropy_with_logits())
- 对数似然代价函数:输出神经元是softmax的时候选用(tf.nn.softmax_cross_entropy_with_logits())
结束线/
欢迎大家加入Q群讨论:463255841
结束线/