-
TensorFlow2.3 -
PyTorch1.7.0
01 交叉熵損失(CrossEntropyLoss)
對於單事件的信息量而言,當事件發生的機率越大時,信息量越小,須要明確的是,信息量是對於單個事件來講的,實際事件存在不少種可能,因此這個時候熵就派上用場了,熵是表示隨機變量不肯定的度量,是對全部可能發生的事件產生的信息量的指望。交叉熵用來描述兩個分佈之間的差距,交叉熵越小,假設分佈離真實分佈越近,模型越好。
javascript
在分類問題模型中(不必定是二分類),如邏輯迴歸、神經網絡等,在這些模型的最後一般會通過一個sigmoid函數(softmax函數),輸出一個機率值(一組機率值),這個機率值反映了預測爲正類的可能性(一組機率值反應了全部分類的可能性)。而對於預測的機率分佈和真實的機率分佈之間,使用交叉熵來計算他們之間的差距,換句不嚴謹的話來講,交叉熵損失函數的輸入,是softmax或者sigmoid函數的輸出。交叉熵損失能夠從理論公式推導出幾個結論(優勢),具體公式推導不在這裏詳細講解,以下:php
預測的值跟目標值越遠時,參數調整就越快,收斂就越快;css
不會陷入局部最優解html
交叉熵損失函數的標準形式(也就是二分類交叉熵損失)以下:java
-
BinaryCrossentropy[1]:二分類,常常搭配Sigmoid使用
tf.keras.losses.BinaryCrossentropy(from_logits=False, label_smoothing=0, reduction=losses_utils.ReductionV2.AUTO, name='binary_crossentropy')參數: from_logits:默認False。爲True,表示接收到了原始的logits,爲False表示輸出層通過了機率處理(softmax) label_smoothing:[0,1]之間浮點值,加入噪聲,減小了真實樣本標籤的類別在計算損失函數時的權重,最終起到抑制過擬合的效果。 reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
binary_crossentropy[2]
tf.keras.losses.binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)參數: from_logits:默認False。爲True,表示接收到了原始的logits,爲False表示輸出層通過了機率處理(softmax) label_smoothing:[0,1]之間浮點值,加入噪聲,減小了真實樣本標籤的類別在計算損失函數時的權重,最終起到抑制過擬合的效果。
-
CategoricalCrossentropy[3]:多分類,常常搭配Softmax使用
tf.keras.losses.CategoricalCrossentropy(from_logits=False, label_smoothing=0, reduction=losses_utils.ReductionV2.AUTO, name='categorical_crossentropy')參數: from_logits:默認False。爲True,表示接收到了原始的logits,爲False表示輸出層通過了機率處理(softmax) label_smoothing:[0,1]之間浮點值,加入噪聲,減小了真實樣本標籤的類別在計算損失函數時的權重,最終起到抑制過擬合的效果。 reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
categorical_crossentropy[4]
tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0)參數: from_logits:默認False。爲True,表示接收到了原始的logits,爲False表示輸出層通過了機率處理(softmax) label_smoothing:[0,1]之間浮點值,加入噪聲,減小了真實樣本標籤的類別在計算損失函數時的權重,最終起到抑制過擬合的效果。
-
SparseCategoricalCrossentropy[5]:多分類,常常搭配Softmax使用,和CategoricalCrossentropy不一樣之處在於,CategoricalCrossentropy是one-hot編碼,而SparseCategoricalCrossentropy使用一個位置整數表示類別
tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False, reduction=losses_utils.ReductionV2.AUTO, name='sparse_categorical_crossentropy')參數: from_logits:默認False。爲True,表示接收到了原始的logits,爲False表示輸出層通過了機率處理(softmax) reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
sparse_categorical_crossentropy[6]
tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1)參數: from_logits:默認False。爲True,表示接收到了原始的logits,爲False表示輸出層通過了機率處理(softmax) axis:默認是-1,計算交叉熵的維度
-
BCELoss[7]
torch.nn.BCELoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')參數: weight:每一個分類的縮放權重,傳入的大小必須和類別數量一至 size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction:string類型,'none' | 'mean' | 'sum'三種參數值
-
BCEWithLogitsLoss[8]:其實和TensorFlow是的`from_logits`參數很像,在BCELoss的基礎上合併了Sigmoid
torch.nn.BCEWithLogitsLoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean', pos_weight: Optional[torch.Tensor] = None)參數: weight:每一個分類的縮放權重,傳入的大小必須和類別數量一至 size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction:string類型,'none' | 'mean' | 'sum'三種參數值 pos_weight:正樣本的權重, 當p>1,提升召回率,當p<1,提升精確度。可達到權衡召回率(Recall)和精確度(Precision)的做用。
-
CrossEntropyLoss[9]
torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor]python
= None, size_average=None, ignore_index: int = -100,git
reduce=None, reduction: str = 'mean')
web參數: weight:每一個分類的縮放權重,傳入的大小必須和類別數量一至 size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 ignore_index:忽略某一類別,不計算其loss,其loss會爲0,而且,在採用size_average時,不會計算那一類的loss,除的時候的分母也不會統計那一類的樣本 reduce:bool類型,返回值是否爲標量,默認爲True reduction:string類型,'none' | 'mean' | 'sum'三種參數值
02 KL散度
咱們在計算預測和真實標籤之間損失時,須要拉近他們分佈之間的差距,即模型獲得的預測分佈應該與數據的實際分佈狀況儘量相近。KL散度(相對熵)是用來衡量兩個機率分佈之間的差別。模型須要獲得最大似然估計,乘以負Log之後就至關於求最小值,此時等價於求最小化KL散度(相對熵)。因此獲得KL散度就獲得了最大似然。又由於KL散度中包含兩個部分,第一部分是交叉熵,第二部分是信息熵,即KL=交叉熵−信息熵。信息熵是消除不肯定性所需信息量的度量,簡單來講就是真實的機率分佈,而這部分是固定的,因此優化KL散度就是近似於優化交叉熵。下面是KL散度的公式:
算法
聯繫上面的交叉熵,咱們能夠將公式簡化爲(KL散度 = 交叉熵 - 熵):編程
監督學習中,由於訓練集中每一個樣本的標籤是已知的,此時標籤和預測的標籤之間的KL散度等價於交叉熵。
-
KLD | kullback_leibler_divergence[10]
tf.keras.losses.KLD(y_true, y_pred)
-
KLDivergence[11]
tf.keras.losses.KLDivergence(reduction=losses_utils.ReductionV2.AUTO, name='kl_divergence')參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
KLDivLoss[12]
torch.nn.KLDivLoss(size_average=None, reduce=None, reduction: str = 'mean', log_target: bool = False)參數: size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction-三個值,none: 不使用約簡;mean:返回loss和的平均值;sum:返回loss的和。默認:mean log_target:默認False,指定是否在日誌空間中傳遞目標
03 平均絕對偏差(L1範數損失)
-
梯度恆定,不論預測值是否接近真實值,這很容易致使發散,或者錯過極值點。 -
導數不連續,致使求解困難。這也是L1損失函數不普遍使用的主要緣由。
-
收斂速度比L2損失函數要快,這是經過對比函數圖像得出來的,L1能提供更大且穩定的梯度。 -
對異常的離羣點有更好的魯棒性,下面會以例子證明。
-
MAE | mean_absolute_error[13]
tf.keras.losses.MAE(y_true, y_pred)
-
MeanAbsoluteError[14]
tf.keras.losses.MeanAbsoluteError(reduction=losses_utils.ReductionV2.AUTO, name='mean_absolute_error')參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
MeanAbsolutePercentageError[15]:平均絕對百分比偏差
tf.keras.losses.MeanAbsolutePercentageError(reduction=losses_utils.ReductionV2.AUTO, name='mean_absolute_percentage_error')公式:loss = 100 * abs(y_true - y_pred) / y_true參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
MAPE | mean_absolute_percentage_error[16]:平均絕對百分比偏差
tf.keras.losses.MAPE(y_true, y_pred)公式:loss = 100 * mean(abs((y_true - y_pred) / y_true), axis=-1)
-
Huber[17]
tf.keras.losses.Huber(delta=1.0, reduction=losses_utils.ReductionV2.AUTO, name='huber_loss')公式:error = y_true - y_pred參數: delta:float類型,Huber損失函數從二次變爲線性的點。 reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
L1Loss[18]
torch.nn.L1Loss(size_average=None, reduce=None, reduction: str = 'mean')參數: size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction-三個值,none: 不使用約簡;mean:返回loss和的平均值;sum:返回loss的和。默認:mean
-
l1_loss[19]
torch.nn.functional.l1_loss(input, target, size_average=None, reduce=None, reduction='mean')
-
SmoothL1Loss[20]:平滑版L1損失,也被稱爲 Huber 損失函數。
torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction: str = 'mean', beta: float = 1.0)參數: size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction-三個值,none: 不使用約簡;mean:返回loss和的平均值;sum:返回loss的和。默認:mean beta:默認爲1,指定在L1和L2損耗之間切換的閾值
-
smooth_l1_loss[21]
torch.nn.functional.smooth_l1_loss(input, target, size_average=None, reduce=None, reduction='mean', beta=1.0)
04 均方偏差損失(L2範數損失)
-
收斂速度比L1慢,由於梯度會隨着預測值接近真實值而不斷減少。 -
對異常數據比L1敏感,這是平方項引發的,異常數據會引發很大的損失。
-
它使訓練更容易,由於它的梯度隨着預測值接近真實值而不斷減少,那麼它不會輕易錯過極值點,但也容易陷入局部最優。 -
它的導數具備封閉解,優化和編程很是容易,因此不少迴歸任務都是用MSE做爲損失函數。
MeanSquaredError[22]
tf.keras.losses.MeanSquaredError(reduction=losses_utils.ReductionV2.AUTO, name='mean_squared_error')公式:loss = square(y_true - y_pred)參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
MSE | mean_squared_error[23]
tf.keras.losses.MSE(y_true, y_pred)公式:loss = mean(square(y_true - y_pred), axis=-1)
-
MeanSquaredLogarithmicError[24]
tf.keras.losses.MeanSquaredLogarithmicError(reduction=losses_utils.ReductionV2.AUTO, name='mean_squared_logarithmic_error')公式:loss = square(log(y_true + 1.) - log(y_pred + 1.))參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
MSLE | mean_squared_logarithmic_error[25]
tf.keras.losses.MSLE(y_true, y_pred)公式:loss = mean(square(log(y_true + 1) - log(y_pred + 1)), axis=-1)
-
MSELoss[26]
torch.nn.MSELoss(size_average=None, reduce=None, reduction: str = 'mean')參數: size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction-三個值,none: 不使用約簡;mean:返回loss和的平均值;sum:返回loss的和。默認:mean
-
mse_loss[27]
torch.nn.functional.mse_loss(input, target, size_average=None, reduce=None, reduction='mean')
05 Hinge loss
-
CategoricalHinge[28]
tf.keras.losses.CategoricalHinge(reduction=losses_utils.ReductionV2.AUTO, name='categorical_hinge')公式:loss = maximum(neg - pos + 1, 0) where neg=maximum((1-y_true)*y_pred) and pos=sum(y_true*y_pred)參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
categorical_hinge[29]
tf.keras.losses.categorical_hinge(y_true, y_pred)公式:loss = maximum(neg - pos + 1, 0) where neg=maximum((1-y_true)*y_pred) and pos=sum(y_true*y_pred)
-
Hinge[30]
tf.keras.losses.Hinge( reduction=losses_utils.ReductionV2.AUTO, name='hinge')公式:loss = maximum(1 - y_true * y_pred, 0),y_true值應爲-1或1。若是提供了二進制(0或1)標籤,會將其轉換爲-1或1參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
hinge[31]
tf.keras.losses.hinge(y_true, y_pred)公式:loss = mean(maximum(1 - y_true * y_pred, 0), axis=-1)
-
SquaredHinge[32]
tf.keras.losses.SquaredHinge( reduction=losses_utils.ReductionV2.AUTO, name='squared_hinge')公式:loss = square(maximum(1 - y_true * y_pred, 0)),y_true值應爲-1或1。若是提供了二進制(0或1)標籤,會將其轉換爲-1或1。參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
squared_hinge[33]
tf.keras.losses.squared_hinge(y_true, y_pred)公式:loss = mean(square(maximum(1 - y_true * y_pred, 0)), axis=-1)
-
HingeEmbeddingLoss[34]:當 時, ,當 時,
torch.nn.HingeEmbeddingLoss(margin: float = 1.0, size_average=None, reduce=None, reduction: str = 'mean')參數: margin:float類型,默認爲1. size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction-三個值,none: 不使用約簡;mean:返回loss和的平均值;sum:返回loss的和。默認:mean
06 餘弦類似度
-
CosineSimilarity[35]:請注意,所得值是介於-1和0之間的負數,其中0表示正交性,而接近-1的值表示更大的類似性。若是y_true或y_pred是零向量,則餘弦類似度將爲0,而與預測值和目標值之間的接近程度無關。
tf.keras.losses.CosineSimilarity(axis=-1, reduction=losses_utils.ReductionV2.AUTO, name='cosine_similarity')公式:loss = -sum(l2_norm(y_true) * l2_norm(y_pred))參數: axis:默認-1,沿其計算餘弦類似度的維 reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。
-
cosine_similarity[36]
tf.keras.losses.cosine_similarity(y_true, y_pred, axis=-1)公式:loss = -sum(l2_norm(y_true) * l2_norm(y_pred))參數: axis:默認-1,沿其計算餘弦類似度的維
-
CosineEmbeddingLoss[37]:當 時, ,當 時,
torch.nn.CosineEmbeddingLoss(margin: float = 0.0, size_average=None, reduce=None, reduction: str = 'mean')參數: margin:float類型,應爲-1到1之間的數字,建議爲0到0.5,默認值爲0 size_average:bool類型,爲True時,返回的loss爲平均值,爲False時,返回的各樣本的loss之和 reduce:bool類型,返回值是否爲標量,默認爲True reduction-三個值,none: 不使用約簡;mean:返回loss和的平均值;sum:返回loss的和。默認:mean
7 總結
外鏈地址:
[1] https://www.tensorflow.org/api_docs/python/tf/keras/losses/BinaryCrossentropy
[2] https://www.tensorflow.org/api_docs/python/tf/keras/losses/binary_crossentropy
[3] https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalCrossentropy
[4] https://www.tensorflow.org/api_docs/python/tf/keras/losses/categorical_crossentropy
[5] https://www.tensorflow.org/api_docs/python/tf/keras/losses/SparseCategoricalCrossentropy
[6] https://www.tensorflow.org/api_docs/python/tf/keras/losses/sparse_categorical_crossentropy
[7] https://pytorch.org/docs/stable/generated/torch.nn.BCELoss.html
[8] https://pytorch.org/docs/stable/generated/torch.nn.BCEWithLogitsLoss.html
[9] https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
[10] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLD
[11] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLDivergence
[12] https://pytorch.org/docs/stable/generated/torch.nn.KLDivLoss.html
[13] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MAE
[14] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanAbsoluteError
[15] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanAbsolutePercentageError
[16] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MAPE
[17] https://www.tensorflow.org/api_docs/python/tf/keras/losses/Huber
[18] https://pytorch.org/docs/stable/generated/torch.nn.L1Loss.html
[19] https://pytorch.org/docs/stable/nn.functional.html?highlight=loss#torch.nn.functional.l1_loss
[20] https://pytorch.org/docs/stable/generated/torch.nn.SmoothL1Loss.html
[21] https://pytorch.org/docs/stable/nn.functional.html?highlight=loss#torch.nn.functional.smooth_l1_loss
[22] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanSquaredError
[23] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MSE
[24] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanSquaredLogarithmicError
[25] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MSLE
[26] https://pytorch.org/docs/stable/generated/torch.nn.MSELoss.html
[27] https://pytorch.org/docs/stable/nn.functional.html?highlight=loss#torch.nn.functional.mse_loss
[28] https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalHinge
[29] https://www.tensorflow.org/api_docs/python/tf/keras/losses/categorical_hinge
[30] https://www.tensorflow.org/api_docs/python/tf/keras/losses/Hinge
[31] https://www.tensorflow.org/api_docs/python/tf/keras/losses/hinge
[32] https://www.tensorflow.org/api_docs/python/tf/keras/losses/SquaredHinge
[33] https://www.tensorflow.org/api_docs/python/tf/keras/losses/squared_hinge
[34] https://pytorch.org/docs/stable/generated/torch.nn.HingeEmbeddingLoss.html
[35] https://www.tensorflow.org/api_docs/python/tf/keras/losses/CosineSimilarity
[36] https://www.tensorflow.org/api_docs/python/tf/keras/losses/cosine_similarity
[37] https://pytorch.org/docs/stable/generated/torch.nn.CosineEmbeddingLoss.html
[1] https://www.tensorflow.org/api_docs/python/tf/keras/losses/BinaryCrossentropy
[2] https://www.tensorflow.org/api_docs/python/tf/keras/losses/binary_crossentropy
[3] https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalCrossentropy
[4] https://www.tensorflow.org/api_docs/python/tf/keras/losses/categorical_crossentropy
[5] https://www.tensorflow.org/api_docs/python/tf/keras/losses/SparseCategoricalCrossentropy
[6] https://www.tensorflow.org/api_docs/python/tf/keras/losses/sparse_categorical_crossentropy
[7] https://pytorch.org/docs/stable/generated/torch.nn.BCELoss.html
[8] https://pytorch.org/docs/stable/generated/torch.nn.BCEWithLogitsLoss.html
[9] https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
[10] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLD
[11] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLDivergence
[12] https://pytorch.org/docs/stable/generated/torch.nn.KLDivLoss.html
[13] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MAE
[14] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanAbsoluteError
[15] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanAbsolutePercentageError
[16] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MAPE
[17] https://www.tensorflow.org/api_docs/python/tf/keras/losses/Huber
[18] https://pytorch.org/docs/stable/generated/torch.nn.L1Loss.html
[19] https://pytorch.org/docs/stable/nn.functional.html?highlight=loss#torch.nn.functional.l1_loss
[20] https://pytorch.org/docs/stable/generated/torch.nn.SmoothL1Loss.html
[21] https://pytorch.org/docs/stable/nn.functional.html?highlight=loss#torch.nn.functional.smooth_l1_loss
[22] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanSquaredError
[23] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MSE
[24] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanSquaredLogarithmicError
[25] https://www.tensorflow.org/api_docs/python/tf/keras/losses/MSLE
[26] https://pytorch.org/docs/stable/generated/torch.nn.MSELoss.html
[27] https://pytorch.org/docs/stable/nn.functional.html?highlight=loss#torch.nn.functional.mse_loss
[28] https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalHinge
[29] https://www.tensorflow.org/api_docs/python/tf/keras/losses/categorical_hinge
[30] https://www.tensorflow.org/api_docs/python/tf/keras/losses/Hinge
[31] https://www.tensorflow.org/api_docs/python/tf/keras/losses/hinge
[32] https://www.tensorflow.org/api_docs/python/tf/keras/losses/SquaredHinge
[33] https://www.tensorflow.org/api_docs/python/tf/keras/losses/squared_hinge
[34] https://pytorch.org/docs/stable/generated/torch.nn.HingeEmbeddingLoss.html
[35] https://www.tensorflow.org/api_docs/python/tf/keras/losses/CosineSimilarity
[36] https://www.tensorflow.org/api_docs/python/tf/keras/losses/cosine_similarity
[37] https://pytorch.org/docs/stable/generated/torch.nn.CosineEmbeddingLoss.html
本文分享自微信公衆號 - 視學算法(visualAlgorithm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。