1. 程式人生 > >損失函式loss大總結

損失函式loss大總結

目標函式objectives

目標函式,或稱損失函式,是編譯一個模型必須的兩個引數之一:

model.compile(loss='mean_squared_error', optimizer='sgd')

可以通過傳遞預定義目標函式名字指定目標函式,也可以傳遞一個Theano/TensroFlow的符號函式作為目標函式,該函式對每個資料點應該只返回一個標量值,並以下列兩個引數為引數:

  • y_true:真實的資料標籤,Theano/TensorFlow張量

  • y_pred:預測值,與y_true相同shape的Theano/TensorFlow張量

from keras import losses

model.compile(loss=losses.mean_squared_error, optimizer='sgd')

真實的優化目標函式是在各個資料點得到的損失函式值之和的均值

請參考目標實現程式碼獲取更多資訊

可用的目標函式

  • mean_squared_error或mse

  • mean_absolute_error或mae

  • mean_absolute_percentage_error或mape

  • mean_squared_logarithmic_error或msle

  • squared_hinge

  • hinge

  • categorical_hinge

  • binary_crossentropy(亦稱作對數損失,logloss)

  • logcosh

  • categorical_crossentropy:亦稱作多類的對數損失,注意使用該目標函式時,需要將標籤轉化為形如(nb_samples, nb_classes)的二值序列

  • sparse_categorical_crossentrop:如上,但接受稀疏標籤。注意,使用該函式時仍然需要你的標籤與輸出值的維度相同,你可能需要在標籤資料上增加一個維度:np.expand_dims(y,-1)

  • kullback_leibler_divergence:從預測值概率分佈Q到真值概率分佈P的資訊增益,用以度量兩個分佈的差異.

  • poisson:即(predictions - targets * log(predictions))

    的均值

  • cosine_proximity:即預測值與真實標籤的餘弦距離平均值的相反數

注意: 當使用"categorical_crossentropy"作為目標函式時,標籤應該為多類模式,即one-hot編碼的向量,而不是單個數值. 可以使用工具中的to_categorical函式完成該轉換.示例如下:

from keras.utils.np_utils import to_categorical

categorical_labels = to_categorical(int_labels, num_classes=None)

分類任務loss:

二分類交叉熵損失sigmoid_cross_entropy:

TensorFlow 介面:

  1. tf.losses.sigmoid_cross_entropy(

  2. multi_class_labels,

  3. logits,

  4. weights=1.0,

  5. label_smoothing=0,

  6. scope=None,

  7. loss_collection=tf.GraphKeys.LOSSES,

  8. reduction=Reduction.SUM_BY_NONZERO_WEIGHTS

  9. )

  10. tf.nn.sigmoid_cross_entropy_with_logits(

  11. _sentinel=None,

  12. labels=None,

  13. logits=None,

  14. name=None

  15. )

keras 介面:

binary_crossentropy(y_true, y_pred)

二分類平衡交叉熵損失balanced_sigmoid_cross_entropy:

該損失也是用於2分類的任務,相比於sigmoid_cross_entrop的優勢在於引入了平衡引數 ,可以進行正負樣本的平衡,得到比sigmoid_cross_entrop更好的效果。

多分類交叉熵損失softmax_cross_entropy:

TensorFlow 介面:

  1. tf.losses.softmax_cross_entropy(

  2. onehot_labels,

  3. logits,

  4. weights=1.0,

  5. label_smoothing=0,

  6. scope=None,

  7. loss_collection=tf.GraphKeys.LOSSES,

  8. reduction=Reduction.SUM_BY_NONZERO_WEIGHTS

  9. )

  10. tf.nn.softmax_cross_entropy_with_logits(

  11. _sentinel=None,

  12. labels=None,

  13. logits=None,

  14. dim=-1,

  15. name=None

  16. )

  17. tf.nn.sparse_softmax_cross_entropy_with_logits(

  18. _sentinel=None,

  19. labels=None,

  20. logits=None,

  21. name=None

  22. )

keras 介面:

  1. categorical_crossentropy(y_true, y_pred)

  2. sparse_categorical_crossentropy(y_true, y_pred)

focal loss:

focal loss為凱明大神的大作,主要用於解決多分類任務中樣本不平衡的現象,可以獲得比softmax_cross_entropy更好的分類效果。

論文中α=0.25,γ=2效果最好。

dice loss:

2分類任務時使用的loss,本質就是不斷學習,使得交比並越來越大。

TensorFlow 介面:

  1. def dice_coefficient(y_true_cls, y_pred_cls):

  2. '''

  3. dice loss

  4. :param y_true_cls:

  5. :param y_pred_cls:

  6. :return:

  7. '''

  8. eps = 1e-5

  9. intersection = tf.reduce_sum(y_true_cls * y_pred_cls )

  10. union = tf.reduce_sum(y_true_cls ) + tf.reduce_sum(y_pred_cls) + eps

  11. loss = 1. - (2 * intersection / union)

  12. tf.summary.scalar('classification_dice_loss', loss)

  13. return loss

合頁損失hinge_loss:

也叫鉸鏈損失,是svm中使用的損失函式。

由於合頁損失優化到滿足小於一定gap距離就會停止優化,而交叉熵損失卻是一直在優化,所以,通常情況下,交叉熵損失效果優於合頁損失。

TensorFlow 介面:

  1. tf.losses.hinge_loss(

  2. labels,

  3. logits,

  4. weights=1.0,

  5. scope=None,

  6. loss_collection=tf.GraphKeys.LOSSES,

  7. reduction=Reduction.SUM_BY_NONZERO_WEIGHTS

  8. )

keras 介面:

hinge(y_true, y_pred)

Connectionisttemporal classification(ctc loss):

對於預測的序列和label序列長度不一致的情況下,可以使用ctc計算該2個序列的loss,主要用於文字分類識別和語音識別中。

TensorFlow 介面:

  1. tf.nn.ctc_loss(

  2. labels,

  3. inputs,

  4. sequence_length,

  5. preprocess_collapse_repeated=False,

  6. ctc_merge_repeated=True,

  7. ignore_longer_outputs_than_inputs=False,

  8. time_major=True

  9. )

keras 介面:

  1. tf.keras.backend.ctc_batch_cost(

  2. y_true,

  3. y_pred,

  4. input_length,

  5. label_length

  6. )

編輯距離 edit loss:

編輯距離,也叫萊文斯坦Levenshtein 距離,指的是兩個字串之間,由一個轉換成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。
該損失函式的優勢在於類似於ctc loss可以計算2個長度不等的序列的損失。
TensorFlow 介面:

  1. tf.edit_distance(

  2. hypothesis,

  3. truth,

  4. normalize=True,

  5. name='edit_distance'

  6. )

KL散度:

KL散度( Kullback–Leibler divergence),也叫相對熵,是描述兩個概率分佈P和Q差異的一種方法。它是非對稱的,這意味著D(P||Q) ≠ D(Q||P)。特別的,在資訊理論中,D(P||Q)表示當用概率分佈Q來擬合真實分佈P時,產生的資訊損耗,其中P表示真實分佈,Q表示P的擬合分佈。

TensorFlow 介面:

  1. tf.distributions.kl_divergence(

  2. distribution_a,

  3. distribution_b,

  4. allow_nan_stats=True,

  5. name=None

  6. )

  7. tf.contrib.distributions.kl(

  8. dist_a,

  9. dist_b,

  10. allow_nan =False,

  11. name=None

  12. )

最大間隔損失large margin softmax loss:

用於拉大類間距離的損失函式,可以訓練得到比傳統softmax loss更好的分類效果。

最大間隔損失主要引入了夾角cos值進行距離的度量。假設bias為0的情況下,就可以得出如上的公式。

其中fai(seita)需要滿足下面的條件。

為了進行距離的度量,在cos夾角中引入了引數m。該m為一個正整數,可以起到控制類間間隔的作用。M越大,類間間隔越大。當m=1時,等價於傳統交叉熵損失。基本原理如下面公式

論文中提供的滿足該條件的公式如下

中心損失center loss:

中心損失主要主要用於減少類內距離,雖然只是減少了累內距離,效果上卻可以表現出累內距離小了,類間距離就可以增大的效果。該損失不可以直接使用,需要配合傳統的softmax loss一起使用。可以起到比單純softmax loss更好的分類效果。



迴歸任務loss:

均方誤差mean squareerror(MSE)和L2範數:

MSE表示了預測值與目標值之間差值的平方和然後求平均

L2損失表示了預測值與目標值之間差值的平方和然後開更方,L2表示的是歐幾里得距離。

MSE和L2的曲線走勢都一樣。區別在於一個是求的平均np.mean(),一個是求的更方np.sqrt()

TensorFlow 介面:

  1. tf.losses.mean_squared_error(

  2. labels,

  3. predictions,

  4. weights=1.0,

  5. scope=None,

  6. loss_collection=tf.GraphKeys.LOSSES,

  7. reduction=Reduction.SUM_BY_NONZERO_WEIGHTS

  8. )

  9. tf.metrics.mean_squared_error(

  10. labels,

  11. predictions,

  12. weights=None,

  13. metrics_collections=None,

  14. updates_collections=None,

  15. name=None

  16. )

keras 介面:

mean_squared_error(y_true, y_pred)

平均絕對誤差meanabsolute error(MAE )和L1範數:

MAE表示了預測值與目標值之間差值的絕對值然後求平均

L1表示了預測值與目標值之間差值的絕對值,L1也叫做曼哈頓距離

MAE和L1的區別在於一個求了均值np.mean(),一個沒有求np.sum()。2者的曲線走勢也是完全一致的。

TensorFlow 介面:

  1. tf.metrics.mean_absolute_error(

  2. labels,

  3. predictions,

  4. weights=None,

  5. metrics_collections=None,

  6. updates_collections=None,

  7. name=None

  8. )

keras 介面:

mean_absolute_error(y_true, y_pred)

MSE,MAE對比:

MAE損失對於局外點更魯棒,但它的導數不連續使得尋找最優解的過程低效;MSE損失對於局外點敏感,但在優化過程中更為穩定和準確。

Huber Loss和smooth L1:

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介面:

  1. tf.losses.huber_loss(

  2. labels,

  3. predictions,

  4. weights=1.0,

  5. delta=1.0,

  6. scope=None,

  7. loss_collection=tf.GraphKeys.LOSSES,

  8. reduction=Reduction.SUM_BY_NONZERO_WEIGHTS

  9. )

對數雙曲餘弦logcosh:

其優點在於對於很小的誤差來說log(cosh(x))與(x**2)/2很相近,而對於很大的誤差則與abs(x)-log2很相近。這意味著logcosh損失函式可以在擁有MSE優點的同時也不會受到局外點的太多影響。它擁有Huber的所有優點,並且在每一個點都是二次可導的。

keras 介面:

logcosh(y_true, y_pred)