數學 · 神經網路(三)· 損失函數
關於損失函數寬泛而準確的數學定義,我感覺我不會說得比 Wiki 更好,所以這一章主要還是介紹一些神經網路中常用的損失函數。然而即使把範圍限制在 NN,如何選、為何選相應的損失函數仍然是一個不平凡的數學問題。囿於時間(和實力)、這一章講的主要是幾個損失函數的定義、直觀感受和求導方法
從名字上可以看出,損失函數是模型對數據擬合程度的反映,擬合得越差、損失函數的值就應該越大。同時我們還期望,損失函數在比較大時、它對應的梯度也要比較大,這樣的話更新變數就可以更新得快一點。我們都接觸過的「距離」這一概念也可以被用在損失函數這裡,對應的就是最小平方誤差準則(MSE):
其中即是我們的模型、它根據輸入矩陣輸出一個預測向量
這個損失函數的直觀意義相當明確:預測值和真值的歐式距離越大、損失就越大,反之就越小。它的求導也是相當平凡的:
其中 w 是模型中的一個待訓練的參數
由於 MSE 比較簡單、所以我們能夠從一般意義上來討論它。為便於理解,以下的部分會結合 NN 這個特定的模型來進行闡述。回顧 BP 演算法章節中的式子:
這裡的其實就是。在 NN 中,我們通過最後一層的 CostLayer 利用和真值得出一個損失、然後 NN 通過最小化這個損失來訓練模型
注意到上式的最後除了損失函數自身的導數以外、還有一項激活函數的導數。事實上,結合激活函數來選擇損失函數是一個常見的做法,用得比較多的組合有以下四個:
- Sigmoid 系以外的激活函數 + MSE
- MSE 是個萬金油,它不會出太大問題、同時也基本不能很好地解決問題。這裡特地指出不能使用 Sigmoid 系激活函數,是因為 Sigmoid 系激活函數在圖像兩端都非常平緩、從而會引起梯度消失的現象。MSE 這個損失函數無法處理這種梯度消失、所以一般來說不會用 Sigmoid 系激活函數 + MSE 這個組合。以 Sigmoid 函數為例:上面這張圖對應的情況是輸入為、預測為但真值為 0。可以看到,即使此時預測值和真值之間的誤差幾乎達到了極大值,但由於太小、最終得到的梯度也會很小、導致收斂速度很慢
- Sigmoid + Cross Entropy
- Sigmoid 激活函數之所以有梯度消失的現象是因為它的導函數形式為。想要解決這個問題的話,比較自然的想法是定義一個損失函數、使得它的分母上有這一項。經過數學家們的工作,我們得到了 Cross Entropy 這個(可能是基於熵理論導出來的)損失函數,其形式為:
- 它的合理性較直觀:當時、起作用的只有,此時越接近、就越小;的情況幾乎同理。下面給出其導數形式:可見其確實滿足要求
- 交叉熵背後是有一套數學理論的,感興趣的觀眾老爺們可以戳這裡
- Softmax + Cross Entropy / log-likelihood
- 這兩個組合的核心都在於前面用了一個 Softmax。Softmax 不是一個損失函數而是一個變換,它具有相當好的直觀:能把普通的輸出歸一化成一個概率輸出。比如若輸出是 (1, 1, 1, 1),經過 Softmax 之後就是 (0.25, 0.25, 0.25, 0.25)。它的定義式也比較簡潔:注意,這裡的通常是一個線性映射:亦即 Softmax 通常是作為一個 Layer 而不是一個 SubLayer
之所以要進行這一步變換,其實和它後面跟的損失函數也有關係。Cross Entropy 和 log-likelihood 這兩個損失函數都是用概率來定義損失的、所以把輸出概率化是一個自然的想法。Cross Entropy 上面已有介紹,log-likelihood 的定義則是:
亦即預測概率輸出中對應的類概率的負對數。當預測概率輸出中類概率為的話、損失就是;當概率趨於時、損失會趨於 - Cross Entropy 的求導上面也說了,下面就給出 Softmax + log-likelihood 的求導公式:其中
以上、大概講了一些損失函數相關的基本知識。下一章的話會講如何根據梯度來更新我們的變數、亦即會講如何定義各種 Optimizers 以及會講背後的思想是什麼。可以想像會是一個相當大的坑……
希望觀眾老爺們能夠喜歡~
(猛戳我進入下一章! ( σω)σ )
推薦閱讀:
※為什麼一個數是3的倍數當且僅當它的各位數之和是3的倍數?
※數學中最完美的數是什麼,還會有此類數出現嗎?
※為什麼紙張要做成方型?
※去掉首位還是斐波那契數的最大斐波那契數是多少?
※「1 堆麥子 + 1 堆麥子 = 1 堆麥子」這樣的例子是否可以用數學語言解釋?