對於單事件的信息量而言,當事件發生的概率越大時,信息量越小,需要明確的是,信息量是對於單個事件來說的,實際事件存在很多種可能,所以這個時候熵就派上用場了,熵是表示隨機變量不確定的度量,是對所有可能發生的事件產生的信息量的期望。交叉熵用來描述兩個分布之間的差距,交叉熵越小,假設分布離真實分布越近,模型越好。
在分類問題模型中(不一定是二分類),如邏輯回歸、神經網絡等,在這些模型的最後通常會經過一個sigmoid函數(softmax函數),輸出一個概率值(一組概率值),這個概率值反映了預測為正類的可能性(一組概率值反應了所有分類的可能性)。而對於預測的概率分布和真實的概率分布之間,使用交叉熵來計算他們之間的差距,換句不嚴謹的話來說,交叉熵損失函數的輸入,是softmax或者sigmoid函數的輸出。交叉熵損失可以從理論公式推導出幾個結論(優點),具體公式推導不在這裡詳細講解,如下:
交叉熵損失函數的標準形式(也就是二分類交叉熵損失)如下:
其中, 表示樣本 的標籤,正類為1,負類為0, 表示樣本 預測為正的概率。其中, 表示類別的數量, 表示變量(0或1),如果該類別和樣本 的類別相同就是1,否則是0, 表示對於觀測樣本 屬於類別 的預測概率。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,定義對損失的計算方式。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,計算交叉熵的維度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的基礎上合併了Sigmoidtorch.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)的作用。torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor]
= None, size_average=None, ignore_index: int = -100,
reduce=None, reduction: str = 'mean')
參數: weight:每個分類的縮放權重,傳入的大小必須和類別數量一至 size_average:bool類型,為True時,返回的loss為平均值,為False時,返回的各樣本的loss之和 ignore_index:忽略某一類別,不計算其loss,其loss會為0,並且,在採用size_average時,不會計算那一類的loss,除的時候的分母也不會統計那一類的樣本 reduce:bool類型,返回值是否為標量,默認為True reduction:string類型,'none' | 'mean' | 'sum'三種參數值我們在計算預測和真實標籤之間損失時,需要拉近他們分布之間的差距,即模型得到的預測分布應該與數據的實際分布情況儘可能相近。KL散度(相對熵)是用來衡量兩個概率分布之間的差異。模型需要得到最大似然估計,乘以負Log以後就相當於求最小值,此時等價於求最小化KL散度(相對熵)。所以得到KL散度就得到了最大似然。又因為KL散度中包含兩個部分,第一部分是交叉熵,第二部分是信息熵,即KL=交叉熵−信息熵。信息熵是消除不確定性所需信息量的度量,簡單來說就是真實的概率分布,而這部分是固定的,所以優化KL散度就是近似於優化交叉熵。下面是KL散度的公式:
聯繫上面的交叉熵,我們可以將公式簡化為(KL散度 = 交叉熵 - 熵):
監督學習中,因為訓練集中每個樣本的標籤是已知的,此時標籤和預測的標籤之間的KL散度等價於交叉熵。
KLD | kullback_leibler_divergence[10]tf.keras.losses.KLD(y_true, y_pred)tf.keras.losses.KLDivergence(reduction=losses_utils.ReductionV2.AUTO, name='kl_divergence')參數: reduction:傳入tf.keras.losses.Reduction類型值,默認AUTO,定義對損失的計算方式。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,指定是否在日誌空間中傳遞目標L1範數損失函數,也被稱為最小絕對值偏差(LAD),最小絕對值誤差(LAE)。總的說來,它是把目標值 與估計值 的絕對差值的總和 最小化:
梯度恆定,不論預測值是否接近真實值,這很容易導致發散,或者錯過極值點。導數不連續,導致求解困難。這也是L1損失函數不廣泛使用的主要原因。收斂速度比L2損失函數要快,這是通過對比函數圖像得出來的,L1能提供更大且穩定的梯度。MAE | mean_absolute_error[13]tf.keras.losses.MAE(y_true, y_pred)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)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,定義對損失的計算方式。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的和。默認:meantorch.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損耗之間切換的閾值torch.nn.functional.smooth_l1_loss(input, target, size_average=None, reduce=None, reduction='mean', beta=1.0)L2範數損失函數,也被稱為最小平方誤差(LSE)。總的來說,它是把目標值 與估計值 的差值的平方和 最小化:
收斂速度比L1慢,因為梯度會隨著預測值接近真實值而不斷減小。對異常數據比L1敏感,這是平方項引起的,異常數據會引起很大的損失。它使訓練更容易,因為它的梯度隨著預測值接近真實值而不斷減小,那麼它不會輕易錯過極值點,但也容易陷入局部最優。它的導數具有封閉解,優化和編程非常容易,所以很多回歸任務都是用MSE作為損失函數。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)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的和。默認:meantorch.nn.functional.mse_loss(input, target, size_average=None, reduce=None, reduction='mean')有人把hinge loss稱為鉸鏈損失函數,它可用於「最大間隔(max-margin)」分類,其最著名的應用是作為SVM的損失函數。hinge loss專用於二分類問題,標籤值 ,預測值 。二分類問題的目標函數的要求如下:當 大於等於 或者小於等於 時,都是分類器確定的分類結果,此時的損失函數loss為0。而當預測值 時,分類器對分類結果不確定,loss不為0。顯然,當 時,loss達到最大值。對於輸出 ,當前 的損失為:
擴展到多分類問題上就需要多加一個邊界值,然後疊加起來。公式如下: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,定義對損失的計算方式。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)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,定義對損失的計算方式。tf.keras.losses.hinge(y_true, y_pred)公式:loss = mean(maximum(1 - y_true * y_pred, 0), axis=-1)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,定義對損失的計算方式。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餘弦相似度是機器學習中的一個重要概念,在Mahout等MLlib中有幾種常用的相似度計算方法,如歐氏相似度,皮爾遜相似度,餘弦相似度,Tanimoto相似度等。其中,餘弦相似度是其中重要的一種。餘弦相似度用向量空間中兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。相比距離度量,餘弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。餘弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用用戶對內容評分來區分用戶興趣的相似度和差異,同時修正了用戶間可能存在的度量標準不統一的問題(因為餘弦相似度對絕對數值不敏感),公式如下: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,定義對損失的計算方式。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上面這些損失函數是我們在日常中經常使用到的,我將TensorFlow和PyTorch相關的API都貼出來了,也方便查看,可以作為一個手冊文章,需要的時候點出來看一下。還有一些其他的損失函數,後續也會都加進來。[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
想要了解更多資訊,請掃描下方二維碼,關注機器學習研究會
轉自:極市平臺