如果我有一个金额预测的神经网络,在普遍使用MSE或者L1损失的情况下:
假设 真实值为 2:
我的预测值为1或者为3, loss都是1,那网络为什么可以往2去预测呢?而不是往0或者4那边预测呢?
感谢
答案:
神经网络中使用MSE损失函数时,预测值与实际值的误差越大,在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。但是当误差很大时,参数的梯度就会又减小了,而且MSE的梯度与sigmoid函数对z的偏导有关系,当sigmoid函数的偏导数接近于0的时候,w、b的梯度不会发生变化,即梯度消失,所以MSE在分类问题中不适用。
提示可以考虑使用交叉熵损失函数,交叉熵的梯度中不再含有sigmoid的导数,有的是sigmoid的值和实际值之间的差,也就满足了误差越大下降的越快的要求。
具体实现上可以直接使用tensorflow中的tf.keras.losses.CategoricalCrossentropy或者tf.keras.losses.BinaryCrossentropy损失函数。例如:
import tensorflow as tf
model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy())
参考资料中还提到了交叉熵和均方误差在梯度计算中的区别,均方误差的梯度跟激活函数的梯度成正比,激活函数的梯度越大,误差越大参数的梯度就越大,训练收敛得就越快。但是交叉熵的梯度没有这个关系,而是满足了误差越大下降越快的要求。因此,在分类问题中广泛使用交叉熵损失函数,而在回归问题中使用均方误差损失函数。
关于为什么神经网络的损失值总是正数,可以看作是损失函数设计的一种正则化约束,通过限制损失函数的取值范围,使得神经网络可以更好地完成任务。比如,线性回归模型的损失函数为MSE,它是所有误差平方的平均值,因此总是大于等于0。
但是应该注意到,在一些特殊的情况下,神经网络的损失值可以为负数,比如在对某些指标进行最大化时,可以使用负对数似然损失函数,而对于某些任务例如异常检测等,需要最小化神经网络的重构误差,则可以使用负重构误差作为损失函数。
因为mse的计算公式里有平方,而L1是绝对值,所以loss值为正数。
至于为什么往2而不是往偏离的方向预测,可能是因为深度学习追求的是loss的最小化,所以会往真实值的方向进行预测。