文章目录
一、处理回归问题
1. 均方根误差(MSE)
tf.losses.mean_squared_error
# Tensorflow中集成的函数
mse = tf.losses.mean_squared_error(y_true, y_pred)
# 利用Tensorflow基础函数手工实现
mse = tf.reduce_mean(tf.square(y_true - y_pred))
优点是便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛。
缺点是受明显偏离正常范围的离群样本的影响较大
2. 平均绝对误差(MAE)
tf.losses.absolute_difference
maes = tf.losses.absolute_difference(y_true, y_pred)
maes_loss = tf.reduce_sum(maes)
优点是其克服了 MSE 的缺点,受偏离正常范围的离群样本影响较小。
缺点是收敛速度比 MSE 慢,因为当误差大或小时其都保持同等速度下降,而且在某一点处还不可导,计算机求导比较困难。
3. Huber loss —— 集合 MSE 和 MAE 的优点,但是需要手动调超参数
tf.losses.huber_loss
hubers = tf.losses.huber_loss(y_true, y_pred)
hubers_loss = tf.reduce_sum(hubers)
sklearn 关于 huber 回归的文档中建议将 δ=1.35 以达到 95% 的有效性。
二、处理分类问题
交叉熵损失(CE loss)& KL散度
参考:
【1】Tensorflow 中的损失函数 —— loss 专题汇总 https://zhuanlan.zhihu.com/p/44216830
【2】白话TensorFlow+实战系列(三)常用损失函数以及参数优化 https://zhuanlan.zhihu.com/p/26454768
- 先搞明白几个概念
- 对于事件 X X X,发生的概率是 P ( X ) P(X) P(X),对于发生概率越大的事情,其包含的信息量越少 (比如,人一天吃三顿饭,对于我们没有任何信息量)
- 信息量 y = − l o g ( P ( X ) ) y=-log(P(X)) y=−log(P(X))
- 熵:熵越大,混乱程度越高
- 期望本身 E ( X ) = ∑ X ∗ P ( X ) E(X)= \sum X*P(X) E(X)=∑X∗P(X), 数值✖️发生的概率,类比熵——信息量*发生的概率
交叉熵(KL散度)
-
交叉熵(KL散度):衡量对于同一个随机变量x的两个分布 p ( x ) p(x) p(x)和 p ( x ) p(x) p(x)之间的差异。一般 p ( x ) p(x) p(x)指真实分布, q ( x ) q(x) q(x)指预测的分布。两者的分布越接近,KL散度越小
-
简单记忆:p分布1,q分布2,kl loss,分布1 比 分布2,乘分布1的期望。
-
交叉熵
机器学习中,我们常常使用KL散度来评估predict和label之间的差别,但是由于KL散度的前半部分是一个常量,所以我们常常将后半部分的交叉熵作为损失函数,其实交叉熵和KL散度是一样的。
MSE和CE
- 回归问题用MSE进行数值逼近,比较合适;
- 分类问题用CE更为优秀;
- 原因:MSE在梯度求解的时候,最终梯度公式仍然有sigmoid函数,导致收敛速度和误差大小不成正比;
而CE函数中最后不存在sigmoid,有的是sigmoid的值和实际值之间的差,也就满足了我们之前所说的错误越大,下降的越快。