說到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處理方式的微小提升。