BCE和CE交叉熵損失函數的區別


首先需要說明的是PyTorch里面的BCELoss和CrossEntropyLoss都是交叉熵,數學本質上是沒有區別的,區別在於應用中的細節。

 

BCE適用於0/1二分類,計算公式就是 “ -ylog(y^hat) - (1-y)log(1-y^hat) ”,其中y為GT,y_hat為預測值。這樣,當gt為0的時候,公式前半部分為0,y^hat需要盡可能為0才能使后半部分數值更小;當gt為1時,后半部分為0,y^hat需要盡可能為1才能使前半部分的值更小,這樣就達到了讓y^hat盡量靠近gt的預期效果。當然,顯然這要求輸入必須在0-1之間,所以為了讓網絡的輸出確保在0-1之間,我們一般都會加一個Sigmoid,而更具體一點來說,使用BCELoss的話只需要網絡輸出一個節點即可,不像CE Loss那樣,往往是有n_class個類就需要網絡最終輸出n_class個節點。

 

而CE因為需要用在多分類上,所以計算公式就變成了sum(-ylog(y^hat))。可能有些同學很敏銳的發現了,這個函數實際上只是在對相應gt=1的那個節點的值做約束,希望這一點的輸出能盡量為1;而其他原本gt為0的節點因為y=0,在計算到sum中的時候無論其相應輸出節點是多少都沒有關系,那這是不是意味着CE的公式還有漏洞呢?話雖這么說,但其實是因為我們忘記了CE之前還有Softmax這個函數,這個函數會讓輸入的n_class個節點中大的更大,小的更小,並且可以確保最終所有節點的輸出的總和為1,這樣一來只要對應gt=1的那個節點輸出足夠靠近1,其他的節點自然輸出就會趨近於0了。

 

上面的兩個例子都是在分類任務中說的,而在分割任務中,BCE和CE的另一個區別就可以說是,BCE只需要輸出一個通道,而CE需要輸出n_class個通道。


免責聲明!

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



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