二分類情況下sigmoid函數和softmax函數區別


說到softmax和sigmoid二者差別,就得說說二者分別都是什么。其實很簡單,網上有數以千計的優質博文去給你講明白,我只想用我的理解來簡單闡述一下:

  • sigmoid函數針對兩點分布提出。神經網絡的輸出經過它的轉換,可以將數值壓縮到(0,1)之間,得到的結果可以理解成“分類成目標類別的概率P”。而不分類到該類別的概率,就是(1 - P),這也是典型的兩點分布的形式;
  • softmax本身針對多項分布提出,當類別數是2時,它退化為二項分布,而它和sigmoid真正的區別就在這兒——二項分布包含兩個分類類別(姑且分別稱為A和B);而兩點分布其實是針對一個類別的概率分布,其對應的那個類別的分布,直接由1-P粗暴得出。

據上所述,sigmoid函數,我們可以當作成它是對一個類別的“建模”。將該類別建模完成,另一個相對的類別就直接通過1減去得到;

而softmax函數,是對兩個類別建模。同樣的,得到兩個類別的概率之和也是1.

  神經網絡在做二分類時,使用softmax還是sigmoid,做法其實有明顯差別。由於softmax是對兩個類別(正反兩類,通常定義為0/1的label)建模,所以對於NLP模型而言(比如泛BERT模型),Bert輸出層需要通過一個nn.Linear()全連接層壓縮至2維,然后接softmax(pytorch的做法,就是直接接上torch.nn.CrossEntropyLoss);而sigmoid只對一個類別建模(通常就是正確的那個類別),所以Bert輸出層需要通過一個nn.Linear()全連接層壓縮至1維,然后接sigmoid(torch就是接torch.nn.BCEWithLogitsLoss

  總而言之,sotfmax和sigmoid確實在二分類的情況下可以化為相同的數學表達形式,但並不意味着二者有一樣的含義,而且二者的輸入輸出都是不同的。sigmoid得到的結果是“分到正確類別的概率和未分到正確類別的概率”,softmax得到的是“分到正確類別的概率和分到錯誤類別的概率”。

一種常見的錯法,即,錯誤地將softmax和sigmoid混為一談,在把BERT輸出 層壓縮至2維的情況下,卻用sigmoid對結果進行計算。這樣我們得到的結果其意義是什么呢?
假設我們現在BERT輸出層經nn.Linear()壓縮后,得到一個二維的向量:

[-0.9419267177581787, 1.944047451019287]

對應類別分別是(0,1)。我們經過sigmoid運算得到:

tensor([0.2805, 0.8748])

前者0.2805指的是分類類別為0的概率,0.8748指的是分類類別為1的概率。二者相互獨立,可看作兩次獨立的實驗(顯然在這里不適用,因為0-1類別之間顯然不是相互獨立的兩次伯努利事件)。所以顯而易見的,二者加和並不等於1.
若用softmax進行計算,可得:

tensor([0.0529, 0.9471])

這里兩者加和是1,才是正確的選擇。

假設存在A、B兩個類別,它們類別的最終輸出值為a和b。以上計算得到的結果可以如下看待:

sigmoid:

 

 softmax:

 

 差別還是很明顯的,所以,大佬的話果然沒錯,這兩者之間確實有差別,而softmax的處理方式,有時候會得到相較於sigmoid處理方式的微小提升。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM