可視化理解 Binary Cross-Entropy

2021-01-14 PyVision








這篇屬於經典的一圖賽千言。再多的文字也不如一張直觀的圖更通俗易懂。


介紹

如果你正在訓練一個二分類器,很有可能你正在使用的損失函數是二值交叉熵/對數(binary cross-entropy / log)。

你是否想過使用此損失函數到底意味著什麼?問題是,鑑於如今庫和框架的易用性,很容易讓人忽略所使用損失函數的真正含義。

動機

我一直在尋找一個可以向學生展示的以清晰簡潔可視化的方式解釋二值交叉熵/對數損失背後概念的博客文章。但由於我實在找不到,只好自己承擔了編寫的任務:-)

一個簡單的分類問題

讓我們從10個隨機點開始:

x = [-2.2, -1.4, -0.8, 0.2, 0.4, 0.8, 1.2, 2.2, 2.9, 4.6]

這是唯一的特徵:x

▲ 圖0:特徵

現在,讓我們為點分配一些顏色:紅色和綠色。這些是我們的標籤。

▲ 圖1:數據

因此,我們的分類問題非常簡單:給定特徵x,我們需要預測其標籤:紅或綠。

由於這是二分類,我們還可以提出以下問題:「該點是綠色嗎? 」,或者更好的問法,「 該點是綠色的概率是多少?」 理想情況下,綠點的概率為1.0(為綠色),而紅點的概率為0.0(為綠色)。

在此設置中,綠點屬於正類(是,它們是綠色),而紅點屬於負類(否,它們不是綠色)。

如果我們擬合模型來執行此分類,它將預測每個點是綠色的概率。假定我們了解點的顏色,我們如何評估預測概率的好壞?這就是損失函數的全部目的!對於錯誤的預測,它應該返回高值,對於良好的預測,它應該返回低值。

對於像我們的示例這樣的二分類,典型的損失函數是binary cross-entropy / log。

損失函數:二值交叉熵/對數(Binary Cross-Entropy / Log )損失

如果您查看此損失函數,就會發現:

▲ 二值交叉熵/對數

其中y是標籤(綠色點為1 , 紅色點為0),p(y)是N個點為綠色的預測概率。

這個公式告訴你,對於每個綠點(y = 1),它都會將log(p(y))添加到損失中,即,它為綠色的對數概率。相反,它為每個紅點(y = 0)添加log(1-p(y)),即它為紅色的對數概率。看起來不難,但好像不大直觀……

此外,熵與這一切有什麼關係?我們為什麼首先要對數概率?這些是有意義的問題,我希望在下面的「 向我展示數學 」部分中回答。

但是,在介紹更多公式之前,讓我向你展示上述公式的直觀表示 ...

計算損失-可視化方式

首先,讓我們根據它們的類(正或負)分開所有點,如下圖所示:

▲ 圖2:拆分數據!

現在,讓我們訓練一個Logistic回歸來對我們的點進行分類。擬合回歸是一個sigmoid曲線,代表對於任何給定的x,一個點是綠色的概率。看起來像這樣:

▲ 圖3:擬合Logistic回歸


那麼,對於屬於正類(綠色)的所有點,我們的分類器給出的預測概率是多少?看sigmoid曲線下對應點x坐標上的綠色條。

▲ 圖4:正確分類正類中的點的概率


OK,到目前為止還不錯!那負類的點又如何呢?請記住,sigmoid曲線下方的綠色條表示給定點為綠色的概率。那麼,給定點為紅色的概率是多少呢?當然是sigmoid曲線以上的紅色條啦 :-)


▲ 圖5:正確分類負類中的點的概率

放在一起,我們最終得到這樣的結果:

▲ 圖6:所有概率加在一起!


條形圖表示與每個點的對應真實類別相關的預測概率!

好的,我們有了預測的概率…是時候通過計算二值交叉熵/對數損失來評估它們了!

這些概率就是我們要的,因此,讓我們去掉x軸,將各個方條彼此相鄰:

▲ 圖7:所有點的概率

這樣,吊起來的方條不再有意義,所以讓我們重新定位一下:

▲ 圖8:所有點的概率—看起來好多了 :-)


由於我們正在嘗試計算損失,因此我們需要對錯誤的預測進行懲罰,對吧?如果實際的類的概率是1.0,我們需要它的損失是零。相反,如果概率低,比如0.01,我們需要它的損失是巨大的!

事實證明,對於這個目的,採用概率的(負)對數非常適合(由於0.0和1.0之間的值的對數為負,因此我們採用負對數以獲得損失的正值)。

實際上,我們為此使用對數的原因是由於交叉熵的定義,請查看下面的「 告訴我數學 」部分,以獲取更多詳細信息。

下面的圖給了我們一個清晰的展示 - 實際的類的預測概率越來越接近於零,則損失指數增長:

▲ 圖9:不同概率的對數丟失


很公平!讓我們取概率的(負)log -這些是每個點相應的損失。

最後,我們計算所有這些損失的平均值。

▲ 圖10:最後,損失!


瞧!我們已經成功地計算了這個玩具示例的二值交叉熵/對數損失。是0.3329!

給我看代碼

如果你想仔細檢查我們得到的值,只需運行下面的代碼 :-)

from sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import log_lossimport numpy as np
x = np.array([-2.2, -1.4, -.8, .2, .4, .8, 1.2, 2.2, 2.9, 4.6])y = np.array([0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])
logr = LogisticRegression(solver='lbfgs')logr.fit(x.reshape(-1, 1), y)
y_pred = logr.predict_proba(x.reshape(-1, 1))[:, 1].ravel()loss = log_loss(y, y_pred)
print('x = {}'.format(x))print('y = {}'.format(y))print('p(y) = {}'.format(np.round(y_pred, 2)))print('Log Loss / Cross Entropy = {:.4f}'.format(loss))

告訴我數學(真的嗎?!)

這篇文章並不傾向於從數學上解釋……但是對於一些的讀者,希望了解熵,對數在所有方面的作用,好, 我們開始吧:-)

分布

讓我們從點的分布開始。y代表我們點的類別(我們有3個紅點和7個綠點),這是它的分布,我們稱其為q(y),如下所示:

▲ 圖11:q(y),我們的點的分布

熵(Entropy)

熵是一個與給定的分布q(y)相關的不確定性的量度。

如果我們所有的點都是綠色的,這種分布的不確定性是什麼?零,對嗎?畢竟,毫無疑問,點的顏色:它總是綠色!因此,熵為零!

另一方面,如果我們確切知道該點的一半是綠色和另一半是紅色?那是最壞的情況,對吧?我們絕對不可能猜到一個點的顏色:它是完全隨機的!在這種情況下,熵由下面的公式給出(我們有兩個類(顏色)–紅色或綠色-因此為2):

▲ 一半一半分布的熵

對於介於兩者之間的所有其它情況,我們可以用以下公式計算分布的熵,例如q(y),其中C是類的數量:

▲ 熵


因此,如果我們知道隨機變量的真實分布,則可以計算其熵。但是,如果是這樣的話,為什麼還要訓練分類器呢?畢竟,我們知道真正的分布…

但是,如果我們不知道真實分布呢?我們可以嘗試用其他一些分布(例如p(y))來近似真實分布嗎?我們當然可以!:-)

交叉熵(Cross-Entropy)

假設我們的點遵循這個其它分布p(y) 。但是,我們知道它們實際上來自真(未知)分布q(y) ,對吧?

如果我們這樣計算熵,我們實際上是在計算兩個分布之間的交叉熵:

▲ 交叉熵

如果我們奇蹟般地將p(y)與q(y)完美匹配,則交叉熵和熵的計算值也將匹配。

由於這可能永遠不會發生,因此交叉熵將比在真實分布上計算出的熵具有更大的值。

▲ 交叉熵減去熵


事實上,交叉熵和熵之間的差還有個名字……

KL散度(Kullback-Leibler Divergence)

Kullback-Leibler Divergence,簡稱「 KL散度 」,是兩個分布之間差異的一種度量:

▲ KL散度

這意味著,p(y)越接近q(y) ,差異越少,因此交叉熵也越小。

因此,我們需要找到一個合適的p(y)……但是,這不就是我們的分類器應該做的嗎?確實如此!它尋找可能的最佳p(y),以最小化交叉熵的值。

損失函數

在訓練過程中,分類器使用其訓練集中的N個點中的每一個來計算交叉熵損失,從而有效地擬合分布p(y)!由於每個點的概率為1 / N,因此交叉熵的計算公式為:

▲ 交叉熵 —— 點對點


還記得上面的圖6至圖10嗎?我們需要在與每個點的實際類相關的概率上計算交叉熵。這意味著對正類(y = 1)中的點使用綠色條,對負類(y = 0)中的點使用紅色的懸掛條,或者從數學角度看:

▲ 對應於圖10的數學表達式 :-)


最後一步是計算兩個正負類所有點的平均

▲ 二進位交叉熵 —— 在正負類上計算

最後,我們通過一點小處理,正類或負類中任何一點都可以用相同的公式:

▲ 二進位交叉熵 —— 通用公式

瞧!我們回到了二進位交叉熵/對數損失的原始公式 :-)

最後

我真的希望這篇文章能夠為一個常被認為是理所當然的概念- 二值交叉熵作為損失函數的概念-提供新的思路。此外,我也希望它能向您展示一些機器學習和資訊理論如何聯繫在一起的。


來源:https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a

相關焦點

  • TensorFlow四種Cross Entropy算法實現和應用
    ➤TensorFlow的交叉熵函數TensorFlow針對分類問題,實現了四個交叉熵函數,分別是tf.nn.sigmoid_cross_entropy_with_logits、tf.nn.softmax_cross_entropy_with_logits、tf.nn.sparse_softmax_cross_entropy_with_logits
  • TensorFlow四種Cross Entropy算法的實現和應用
    sigmoid_cross_entropy_with_logits我們先看sigmoid_cross_entropy_with_logits,為什麼呢,因為它的實現和前面的交叉熵算法定義是一樣的,也是TensorFlow最早實現的交叉熵算法。
  • 什麼是機器學習中的cross entropy
    entropy是用於表示二元分類器的誤差,而cross entropy則用於表示多元分類器的誤差。對於一個用的測試樣本的元分類器,那麼cross entropy的計算公式如下:比如一個三元分類問題,有兩個測試樣本,第一個樣本:預測出來的概率為,實際標籤為,寫成one-hot的形式是;第二個樣本:預測出來概率為
  • AAAI 2019 |把Cross Entropy梯度分布拉「平」,就能輕鬆超越Focal...
    直接把 cross entropy 產生的 gradient distribution 標準化到 uniform 就可以輕鬆訓練單階段物體檢測模型。該論文已經被 AAAI 2019 會議接受為 Oral 論文,基於 PyTorch+MMDet 的代碼已經放出。
  • AAAI 2019 | 把Cross Entropy梯度分布拉「平」,就能輕鬆超越Focal Loss
    直接把 cross entropy 產生的 gradient distribution 標準化到 uniform 就可以輕鬆訓練單階段物體檢測模型。該論文已經被 AAAI 2019 會議接受為 Oral 論文,基於 PyTorch+MMDet 的代碼已經放出。
  • tf.keras.losses.binary_crossentropy
    loss越小,表示模型預測結果與真實值偏差越小binary_crossentropy,二分類交叉熵,與sparse_categorical_crossentropy類似,可以更精確的評估預測效果與sparse_categorical_crossentropy不同,binary_crossentropy是一個二分類損失評估,而前者是一個多分類,也就是說
  • 推薦 | 一份關於MULTI-SCALE ENTROPY的指南!
    Sample entropy calculated for the four sample noise signals are shown in the figure on the right (r = 0.15, m = 2; matlab code for sample entropy calculation).
  • 單目可見光靜默活體檢測 Binary or Auxiliary Supervision論文解讀
    所屬範疇:單目可見光靜默活體簡介:作者認為現存大多數活體算法用binary classification監督不夠合理,也不能說明預測結果的依據(模型是否學習到真正的活體與攻擊之間差異),故提出CNN-RNN框架,採用pixel-wise的深度圖監督方式和sequence-wise的rPPG信號監督方式(如下圖),並提出高解析度+豐富PIE的數據集SiW
  • PyTorch可視化理解卷積神經網絡
    如今,機器已經能夠在理解、識別圖像中的特徵和對象等領域實現99%級別的準確率。生活中,我們每天都會運用到這一點,比如,智慧型手機拍照的時候能夠識別臉部、在類似於谷歌搜圖中搜索特定照片、從條形碼掃描文本或掃描書籍等。造就機器能夠獲得在這些視覺方面取得優異性能可能是源於一種特定類型的神經網絡——卷積神經網絡(CNN)。
  • 語義分割之dice loss深度分析(梯度可視化)
    意味著某像素點的loss以及梯度值不僅和該點的label以及預測值相關,和其他點的label以及預測值也相關,這點和ce (交叉熵cross entropy) loss 不同。因此分析起來比較複雜,這裡我們簡化一下,首先從loss曲線和求導曲線對單點輸出方式分析。然後對於多點輸出的情況,利用模擬預測輸出來分析其梯度。
  • 全球熵ETV 什麼是熵 解析entropy熵的概況 如何理解熵原理與熵增定律
    19世紀 中期德國的著名物理學家和數學家克勞修斯在全世界第一個真正提出entropy熵的概念,克勞修斯是全球公認的熱力學理論奠基人,分子運動理論奠基者。熵是表徵物質狀態的參量之一,物理意義指複雜,無或者混亂的度量。2 如何理解熵原理與熵增定律?
  • 教程| 通過可視化隱藏表示,更好地理解神經網絡
    本文使用的工具是 Neural Embedding Animator,大家可以利用該工具更好地理解模型行為、理解訓練過程中數據表示的變化、對比模型、了解此詞嵌入的變化。為便於可視化,需要將權重降維到二維或三維。然後,在散點圖上可視化這些點以觀察它們是如何在空間中分離的。有一些比較流行的降維技術,如 T-SNE 或 UMAP。儘管上述步驟是對訓練完成後的數據點進行可視化,但我認為可以實現一個有趣的拓展,即在訓練過程中在多個時間點進行可視化。
  • 詞談|Nonbinary:男女之外,性別的第三個選項
    關鍵詞:Nonbinary 非二元(性別)的你是男人,還是女人
  • cross什麼意思
    cross什麼意思cross的英文解釋很多Police dogs are often a cross between a retriever and a German Shepherd.第四種:英式英語中,cross做名詞可以指用來標示位置信息或者標示錯誤的叉號×。作動詞是金融專業名詞,指的是在支票中間劃兩道線(用來指明需要轉入銀行帳戶中)。