Softmax和交叉熵的深度解析和Python實現

2021-02-20 人工智慧頭條

作者 | PARAS DAHAL

譯者 | zzq

出品 | 人工智慧頭條(公眾號ID:AI_Thinker)

【導讀】如果你稍微了解一點深度學習的知識或者看過深度學習的在線課程,你就一定知道最基礎的多分類問題。當中,老師一定會告訴你在全連接層後面應該加上 Softmax 函數,如果正常情況下(不正常情況指的是類別超級多的時候)用交叉熵函數作為損失函數,你就一定可以得到一個讓你基本滿意的結果。而且,現在很多開源的深度學習框架,直接就把各種損失函數寫好了(甚至在 Pytorch中 CrossEntropyLoss 已經把 Softmax函數集合進去了),你根本不用操心怎麼去實現他們,但是你真的理解為什麼要這麼做嗎?這篇小文就將告訴你:Softmax 是如何把 CNN 的輸出轉變成概率,以及交叉熵是如何為優化過程提供度量。為了讓讀者能夠深入理解,我們將會用 Python 一一實現他們。

Softmax函數

Softmax 函數接收一個 這N維向量作為輸入,然後把每一維的值轉換成(0,1)之間的一個實數,它的公式如下面所示:

正如它的名字一樣,Softmax 函數是一個「軟」的最大值函數,它不是直接取輸出的最大值那一類作為分類結果,同時也會考慮到其它相對來說較小的一類的輸出。

說白了,Softmax 可以將全連接層的輸出映射成一個概率的分布,我們訓練的目標就是讓屬於第k類的樣本經過 Softmax 以後,第 k 類的概率越大越好。這就使得分類問題能更好的用統計學方法去解釋了。

使用 Python,我們可以這麼去實現 Softmax 函數:

我們需要注意的是,在 numpy 中浮點類型是有數值上的限制的,對於float64,它的上限是 。對於指數函數來說,這個限制很容易就會被打破,如果這種情況發生了 python 便會返回 nan。

為了讓 Softmax 函數在數值計算層面更加穩定,避免它的輸出出現 nan這種情況,一個很簡單的方法就是對輸入向量做一步歸一化操作,僅僅需要在分子和分母上同乘一個常數 C,如下面的式子所示

理論上來說,我們可以選擇任意一個值作為,但是一般我們會選擇

,通過這種方法就使得原本非常大的指數結果變成0,避免出現 nan的情況。

同樣使用 Python,改進以後的 Softmax 函數可以這樣寫:


Softmax 函數的導數推倒過程

通過上文我們了解到,Softmax 函數可以將樣本的輸出轉變成概率密度函數,由於這一很好的特性,我們就可以把它加裝在神經網絡的最後一層,隨著迭代過程的不斷深入,它最理想的輸出就是樣本類別的 One-hot 表示形式。進一步我們來了解一下如何去計算 Softmax 函數的梯度(雖然有了深度學習框架這些都不需要你去一步步推導,但為了將來能設計出新的層,理解反向傳播的原理還是很重要的),對 Softmax 的參數求導:

根據商的求導法則,對於  其導數為   。對於我們來說

。在 中,  一直都是 ,但是在  中,若且唯若  的時候, 才為。具體的過程,我們看一下下面的步驟:

如果

如果

所以 Softmax 函數的導數如下面所示:

交叉熵損失函數

下面我們來看一下對模型優化真正起到作用的損失函數——交叉熵損失函數。交叉熵函數體現了模型輸出的概率分布和真實樣本的概率分布的相似程度。它的定義式就是這樣: 

在分類問題中,交叉熵函數已經大範圍的代替了均方誤差函數。也就是說,在輸出為概率分布的情況下,就可以使用交叉熵函數作為理想與現實的度量。這也就是為什麼它可以作為有 Softmax 函數激活的神經網絡的損失函數。

我們來看一下,在 Python 中是如何實現交叉熵函數的:


交叉熵損失函數的求導過程

就像我們之前所說的,Softmax 函數和交叉熵損失函數是一對好兄弟,我們用上之前推導 Softmax 函數導數的結論,配合求導交叉熵函數的導數:

加上 Softmax 函數的導數:

y 代表標籤的 One-hot 編碼,因此 ,並且 。因此我們就可以得到:

可以看到,這個結果真的太簡單了,不得不佩服發明它的大神們!最後,我們把它轉換成代碼:

小結

需要注意的是,正如我之前提到過的,在許多開源的深度學習框架中,Softmax 函數被集成到所謂的 CrossEntropyLoss 函數中。比如 Pytorch 的說明文檔,就明確地告訴讀者 CrossEntropyLoss 這個損失函數是 Log-Softmax 函數和負對數似然函數(NLLoss)的組合,也就是說當你使用它的時候,沒有必要再在全連接層後面加入 Softmax 函數。還有許多文章中會提到 SoftmaxLoss,其實它就是 Softmax 函數和交叉熵函數的組合,跟我們說的 CrossEntropyLoss 函數是一個意思,這點需要讀者自行分辨即可。

原文連結:

https://deepnotes.io/softmax-crossentropy

GitHub 地址:

https://github.com/parasdahal/deepnet

參考連結:

The Softmax function and its derivative  

Bendersky, E., 2016.

https://eli.thegreenplace.net/2016/the-softmax-function-and-its-derivative/

CS231n Convolutional Neural Networks for Visual Recognition

Andrej Karpathy, A.K., 2016.

http://cs231n.github.io/convolutional-networks/

相關焦點

  • Softmax函數與交叉熵
    先對所有的輸出用softmax進行轉換為概率值,再套用交叉熵的公式。(labels=label, logits=y))TensorFlow已經實現好函數,用來計算label和logits的softmax交叉熵。
  • 【小知識】Softmax函數與交叉熵
    先對所有的輸出用softmax進行轉換為概率值,再套用交叉熵的公式。(labels=label, logits=y))TensorFlow已經實現好函數,用來計算label和logits的softmax交叉熵。
  • 關於交叉熵損失
    1.4 交叉熵 Cross Entropy設 p(x),q(x)分別是 離散隨機變量X的兩個概率分布,其中p(x)是目標分布,p和q的交叉熵可以看做是使用分布q(x)表示目標分布p(x)的困難程度:2.2 和交叉熵等價最大似然估計、相對熵、交叉熵的公式如下:
  • Pytorch 中交叉熵 Loss 趣解
    背景最近一直在總結Pytorch中Loss的各種用法,交叉熵是深度學習中最常用的計算方法,寫這個稿子把交叉熵的來龍去脈做一個總結。KL散度與交叉熵理解了信息量和信息熵之後,接下來就是交叉熵的概念了。介紹交叉熵之前,Loss是繞不開的。
  • 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激活函數,是因為在多目標或者多分類的問題下有些函數是不可用的,而TensorFlow本身也提供了多種交叉熵算法的實現。TensorFlow的交叉熵函數TensorFlow針對分類問題,實現了四個交叉熵函數,分別是詳細內容請參考API文檔 https://www.tensorflow.org/versions/master/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits
  • 多分類利器-保姆級告訴你什麼是SoftMax
    我們觀察公式的分子和分母可以得到通過這種方法,每個經過轉換後的新元素的和就為1。所以,SoftMax函數有個別名叫做歸一化指數函數。那這樣的一組向量代表了什麼意思?我們注意到向量中每個元素都是小於1的小數,代表了屬於每個分類的概率。所以分類結果就可以去分類概率最大的那個分類,就能解決多分類的問題了。     SoftMax損失函數使用到交叉熵的形式:
  • Logistic和Softmax回歸實戰(附代碼)
    當然和其他線性模型一樣,我們也可以對Logistic進行正則化。上面我們用的數據集是有三個類別,然而我們的logistic卻只能處理二分類的問題,對多分類情況,logistic該如何處理呢?Softmax回歸在機器學習尤其是深度學習中,softmax是個非常常用而且比較重要的函數,尤其在多分類的場景中使用廣泛。
  • 【Softmax】乾貨 | 淺談Softmax函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • GitHub | 機器學習&深度學習&nlp&cv從入門到深入全套資源分享
    && FocalLoss 對樣本不平衡的權重調節和減低損失值 && focal_loss 多類別和二分類 Pytorch代碼實現 && 多分類focal loss及其tensorflow實現堪比Focal Loss!
  • 乾貨分享 | 機器學習、深度學習、nlp、cv從入門到深入全套資源分享
    && FocalLoss 對樣本不平衡的權重調節和減低損失值 && focal_loss 多類別和二分類 Pytorch代碼實現 && 多分類focal loss及其tensorflow實現堪比Focal Loss!
  • 交叉熵(Cross Entropy)從原理到代碼解讀
    原理部分:要想搞懂交叉熵需要先清楚一些概念,順序如下:==1.自信息量—>2.信息熵(熵)—>3.相對熵(KL散度)—>4.交叉熵==1.自信息量隨機事件交叉熵=信息熵+相對熵為什麼這麼定義呢,先看相對熵,我們對相對熵計算公式展開得:可以看出相對熵展開後的第一項正好是信息熵的負值。
  • 用Python實現機器學習算法——Softmax 回歸算法
    最近一位名叫Anna-Lena Popkes的小姐姐在GitHub上分享了自己如何使用Python(3.6及以上版本)實現7種機器學習算法的筆記,並附有完整代碼。所有這些算法的實現都沒有使用其他機器學習庫。這份筆記可以幫大家對算法以及其底層結構有個基本的了解,但並不是提供最有效的實現。Softmax 回歸算法,又稱為多項式或多類別的 Logistic 回歸算法。
  • 熵、交叉熵和KL散度的基本概念和交叉熵損失函數的通俗介紹
    但是,由於當今龐大的庫和框架的存在以及它們的易用性,我們中的大多數人常常在不了解熵的核心概念的情況下著手解決問題。所以,在這篇文章中,讓我們看看熵背後的基本概念,把它與交叉熵和KL散度聯繫起來。我們還將查看一個使用損失函數作為交叉熵的分類問題的示例。什麼是熵?
  • 什麼是交叉熵啊?| 小白深度學習入門
    大家在學習深度學習的過程中,都會碰到cross-entropy這個詞,中文叫「交叉熵」,多麼高大上的名詞!
  • 熵、交叉熵和散度,這是一篇最純碎的理解!
    主題:交叉熵小明通過研究哈登的歷史進攻動作發生頻率(三分 1/2,上籃 1/4,灌籃和兩分 1/8),做了一套編碼(定義為哈登編碼),每次傳遞一次信息只用 1.75 比特。熵和交叉熵的總結在下圖。根據上面公式計算各種熵和交叉熵,得到用哈登編碼傳遞哈登進攻信息 H(p) = 1.75 比特用哈登編碼傳遞威少進攻信息 Hp
  • 乾貨 | 對數線性模型之 Logistic 回歸、SoftMax 回歸和最大熵模型
    首先以概率的方式解釋了logistic回歸為什麼使用sigmoid函數和對數損失,然後將二分類擴展到多分類,導出sigmoid函數的高維形式softmax函數對應softmax回歸,最後最大熵模型可以看作是softmax回歸的離散型版本,logistic回歸和softmax回歸處理數值型分類問題,最大熵模型對應處理離散型分類問題。
  • 乾貨 | 淺談Softmax函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • 乾貨 | 淺談 Softmax 函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • 【softmax】詳解softmax函數以及相關求導過程
    舉一個我最近碰到利用softmax的例子:我現在要實現基於神經網絡的句法分析器。用到是基於轉移系統來做,那麼神經網絡的用途就是幫我預測我這一個狀態將要進行的動作是什麼?比如有10個輸出神經元,那麼就有10個動作,1動作,2動作,3動作...一直到10動作。