看了好幾次這個loss了,每次都容易忘,其他的博客還總是不合我的心意,所以打算記一下:
先說二值loss吧,即二分類問題
一、二分類

直接解釋:
假設有兩個類0,1。我們需要做的就是,使得屬於0類的訓練樣本x經過網絡M(x)之后的輸出y盡可能的靠近0,相反則使得屬於1類的訓練樣本x經過網絡M(x)之后的輸出y盡可能的靠近1。
分析上面這個公式,我們訓練網絡的直接手段當然是采用梯度下降法使得Loss函數越小越好(采用梯度上升則相反)。我們假設M(x)最后一層是有sigmoid()函數的,也就是輸出y是在0到1之間的。
1、對於屬於0類的x,標簽
應該是0,那么第一項
就等於0了,第二項變為
,網絡的輸出y越靠近0,loss函數越小,符合我們的期望。
2、對於屬於1類的x,標簽
應該是1,此時第二項
就等於0了,第一項就變為
,網絡的輸出y越靠近1,loss函數越小,符合我們的期望。
以上就是二分類問題了。
二、多分類
對於多分類問題,假設有6個類吧,Loss函數會變:

這個解釋一下是這樣的:
假設屬於第三類的樣本通過網絡N(x)之后的輸出是這樣的:y=[0.23,0.12,0.4,0.05,0.09,0.11]
對應的標簽當然是:
=[0,0,1,0,0,0,]
我們希望的是對應第三類的數字接近1,而其他類接近0。一個最簡單的思想是輸出向量y的每個值都和標簽做差,這樣loss越小肯定是效果越好。但是據前輩們的實踐,沒這個必要,我們只需要使得我們關心的這個類的對應位置靠近1即可,這樣子還可以解決訓練慢,overfitting等等一堆問題(有點類似dropout的思想,因為一些類的loss不用管的話,對應的神經元也就不用訓練了)。這么一說,大家就都懂怎么“秀”了吧?
我們將輸出與對應的標簽乘起來,即上面那個公式。我們重寫一遍如下:

這里的softmax() 函數一是可以讓輸出非負,二是可以讓所有的輸出是以概率的形式呈現出來,即所有的輸出加起來等於1。如果不這樣做,而用sigmoid()函數的話,就會出現即使目標類對應的位置等於0,但我們還是不能確定除了目標類之外的其他類是否接近0。
簡單的例子,還是上面那個例子,簡單一點說,如果輸出的向量y,所有值加起來等於1,第三類接近1的話,那其他類肯定接近0了,這正是我們想要的效果。而如果向量y的所有值加起來不等於1,即使第三類位置上是1,你也不能確定其他類的位置上是不是還有比1更大的數,也就是不能確定第三類對應位置的概率是不是最大的。
softmax()配交叉熵,天長地久,歐耶!
