学无止境,在学习损失函数loss function的理论及使用方法时,有以下文章及github开源代码为我提供了很大帮助,特此附上链接,表示感谢!希望对您也有参考借鉴的意义!
备注: y_hat – 真实值; y – 预测值
TensorFlow 接口:
tf.losses.sigmoid_cross_entropy(
multi_class_labels,
logits,
weights=1.0,
label_smoothing=0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
tf.nn.sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
Keras 接口:
binary_crossentropy(y_true, y_pred)
该损失也是用于2分类的任务,相比于sigmoid_cross_entrop的优势在于引入了平衡参数 ,可以进行正负样本的平衡,得到比sigmoid_cross_entrop更好的效果。
tf.losses.softmax_cross_entropy(
onehot_labels,
logits,
weights=1.0,
label_smoothing=0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
tf.nn.softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
dim=-1,
name=None
)
tf.nn.sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
Keras 接口:
categorical_crossentropy(y_true, y_pred)
sparse_categorical_crossentropy(y_true, y_pred)
MSE表示了预测值与目标值之间差值的平方和,然后求平均。
L2损失表示了预测值与目标值之间差值的平方和然后开根方,L2表示的是欧几里得距离。
MSE和L2的曲线走势都一样。区别在于一个是求的平均np.mean(),一个是求的根方np.sqrt()。
TensorFlow 接口:
tf.losses.mean_squared_error(
labels,
predictions,
weights=1.0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
tf.metrics.mean_squared_error(
labels,
predictions,
weights=None,
metrics_collections=None,
updates_collections=None,
name=None
)
Keras 接口:
mean_squared_error(y_true, y_pred)
L1表示了预测值与目标值之间差值的绝对值,L1也叫做曼哈顿距离。
MAE和L1的区别在于一个求了均值np.mean(),一个没有求np.sum()。二者的曲线走势也是完全一致的。
TensorFlow 接口:
tf.metrics.mean_absolute_error(
labels,
predictions,
weights=None,
metrics_collections=None,
updates_collections=None,
name=None
)
Keras 接口:
mean_absolute_error(y_true, y_pred)
MAE损失对于局外点更鲁棒,但它的导数不连续使得寻找最优解的过程低效;MSE损失对于局外点敏感,但在优化过程中更为稳定和准确。
Huber loss具备了MAE和MSE各自的优点,当δ趋向于0时它就退化成了MAE,而当δ趋向于无穷时则退化为了MSE。
Smooth L1 loss也具备了L1 loss和L2 loss各自的优点,本质就是L1和L2的组合。
Huber loss和Smooth L1 loss具有相同的曲线走势,当Huber loss中的δ等于1时,Huber loss等价于Smooth L1 loss。
对于Huber损失来说,δ的选择十分重要,它决定了模型处理局外点的行为。当残差大于δ时使用L1损失,很小时则使用更为合适的L2损失来进行优化。
Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数,同时可以利用MSE梯度随误差减小的特性来得到更精确的最小值,也对局外点具有更好的鲁棒性。
但Huber损失函数的良好表现得益于精心训练的超参数δ。
TensorFlow 接口:
tf.losses.huber_loss(
labels,
predictions,
weights=1.0,
delta=1.0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)