Tensorflow中的损失函数loss
- 回归问题
- 均方根误差 MSE
- 回归问题中最常用的损失函数
- 优点:便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛
- 缺点:受明显偏离正常范围的利群样本的影响较大
- 平方绝对误差 MAE
- 想格外增强对离群样本的健壮性时使用
- 优点:克服MSE的缺点,受偏离正常范围的离群样本影响较小
- 缺点:收敛速度比MSE慢,因为当误差大或小时都保持相同速度下降,在某一点还不可求导,计算机求导比较困难
- Huber Loss
- 集合MSE和MAE的优点,但是需要手动调参
- 检测真实值和预测值之差的绝对值在超参数φ内时,使用MSE来计算loss,在φ外是使用类MAE计算。
- sklearn中建议将 φ=1.35 以达到95%的有效性
- 均方根误差 MSE
- 分类问题
- 先sigmoid再求交叉熵
- 二分类问题首选
- 使用时不需要将预测值 y_pred 进行sigmoid处理,因为函数内部包含 sigmoid激活。
- 真实值y_true 要求是One-hot编码形式
- 球的结果是一组向量,是每个维度单独的交叉熵。求总的交叉熵,用reduce_sum求和即可。求loss则用reduce_mean进行平均
- 交叉熵 log_loss
- 预测值计算完成后,如果已经先进行了 sigmoid 处理,使用此函数求loss
- 先softmax再求交叉熵
- 多分类问题首选
- 预测值是没有经过softmax处理的值,真实值要求是One-hot编码形式
- 带权重的sigmoid交叉熵
- 正负样本数量差距过大时
- 增加权重系数,用来平衡正负样本差距。
- 铰链损失 hinge_loss
- SVM中使用
- 求出不同类别间的“最大间隔”
- 优点:小样本量就有不错的效果,对噪音包容性强
- 缺点:样本量大时效率低,又是很难找到合适的区分方法
- 先sigmoid再求交叉熵
- 自定义loss函数
"""
TensorFLow中的损失函数LossFunction汇总
参考:https://zhuanlan.zhihu.com/p/44216830
"""
import tensorflow as tf
y_true = tf.Variable()
y_pred = tf.Variable()
# ====== 1、回归问题 ======
# 1.1 均方根误差 MSE
# 使用tf集成的函数
mse = tf.losses.mean_squared_error(y_true,y_pred)
# 手工实现
mse1 = tf.reduce_mean(tf.square(y_true - y_pred))
# 1.2 平均绝对误差 MAE
maes = tf.losses.absolute_difference(y_true, y_pred)
maes_loss = tf.reduce_mean(maes)
# 1.3 Huber loss
hubers = tf.losses.huber_loss(y_true, y_pred)
hubers_loss = tf.reduce_mean(hubers)
# ====== 2、分类问题 ======
# 2.1 先 sigmoid 再交叉熵
# tf集成的函数
sigmoids = tf.nn.sigmoid_cross_entropy_with_logits(labels=y_true,logits=y_pred)
sigmoids_loss = tf.reduce_mean(sigmoids)
# 手工实现
y_pred_si = 1.0 / ( 1 + tf.exp(-y_pred) )
sigmoids1 = -y_true * tf.log(y_pred_si) - (1 - y_true) * tf.log(1 - y_pred_si)
sigmoids1_loss = tf.reduce_mean(sigmoids1)
# 2.2 交叉熵
# tf集成的函数
logs = tf.losses.log_loss(labels=y_true,logits=y_pred)
logs_loss = tf.reduce_mean(logs)
# 手工实现
logs1 = -y_true * tf.log(y_pred) - (1-y_true) * tf.log(1 - y_pred)
logs_loss = tf.reduce_mean(logs)
# 2.3 先softmax再交叉熵
softmaxs = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_true,logits=y_pred)
softmaxs_loss = tf.reduce_mean(softmaxs)
# 2.4 如果2.3真实值不是One-hot形式,
softmaxs_spare = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true,logits=y_pred)
softmaxs_spare_loss = tf.reduce_mean(softmaxs_spare)
# 2.5 带权重的 sigmoid 交叉熵
# tf集成的函数
pos_weight = 0.5
sigmoid_weighted = tf.nn.weighted_cross_entropy_with_logits(targets=y_true,logits=y_pred,pos_weight=pos_weight)
sigmoid_weighted_loss = tf.reduce_mean(sigmoid_weighted)
# 手工实现
sigmoid_weighted1 = -y_true * tf.log(y_pred) * pos_weight - (1 - y_true) * tf.log(1 - y_pred)
sigmoid_weighted1_loss = tf.reduce_mean(sigmoid_weighted1)
# 2.6 铰链损失函数 hinge_loss
weights = 0.5
hings = tf.losses.hinge_loss(labels=y_true,logits=y_pred,weights=weights)
hings_loss = tf.reduce_mean(hings)
# ====== 3、自定义损失函数 ======
# 预测值比真实值大,用 (y_pred-y_true)*loss_more;反之,(y_true-y_pred)*loss_less
# loss = tf.reduce_sum(tf.where(tf.greater(y_pred, y_true), (y_pred-y_true)*loss_more,(y_true-y_pred)*loss_less))