使用ReLU作為激活函數還有必要用交叉熵計算損失函數嗎?

最近學習到這樣一個知識:由於sigmoid激活函數具有飽和性質(也就是函數自變數在較大或較小時sigmoid的梯度近乎為0)使得網路權值更新緩慢,因此引入了交叉熵代價函數克服此問題。

但是由於近年來ReLU的興起,很少有人再用sigmoid作為激活函數。然而仍有同學向我推薦使用交叉熵損失函數,在使用ReLU的前提下這種建議是否可取呢?


交叉熵就不是為了解決梯度消失的……他只是分類問題中極大似然估計自然導出的一個損失函數而已。

用sigmoid在交叉熵之前只是為了構造一個 (0,1) 區間內的數用來表示一個概率。

這種做法就只是logistics回歸的形式到了神經網路裡面的利用而已。


輸出層的激活函數損失函數由任務類型決定,見下表。它們與隱藏層的激活函數的選擇是獨立的。


交叉熵代價函數只是解決了反向傳播中,最後一層使用sigmoid函數作為激活函數時梯度消失的問題,對於多層神經網路,如果前面的layer中使用sigmoid函數作為激活函數,仍然會出現梯度消失的問題,使用ReLU就是為了解決這個問題。一般二分類問題最後一層還是使用sigmoid的函數,當然使用交叉熵代價函數更好了。個人理解而已。


你想用什麼用什麼,黑貓白貓抓到老鼠就是好貓


用什麼loss只取決於你選的先驗分布,和梯度有個毛關係。


這跟隱藏層relu激活函數沒關係啊,是否用交叉熵要看你的目標是啥,是分類問題identification一類的,都可以用交叉熵;

另外多分類問題是輸出層的激活函數用softmax;

至於提到的以前使用sigmoid時要配cross-entroy只是在求梯度作傳遞時,同時起到了避免梯度消失


許多網路的輸出都可以看作是條件概率分布,這時使用最大似然對應的代價函數和交叉熵損失是等價的,此外其他一些的代價函數如均方誤差可以看作交叉熵損失的一種特殊情況,即輸出概率分布是高斯條件分布。因此除了消除隱單元的指數帶來的飽和效果,交叉熵損失更具一般性,免了為每個任務單獨設計損失函數。


【以下純屬個人見解,歡迎吐槽】

其實題主可以把問題拆成這樣: 在深度神經網路中, 如果第2~(n-2)層的神經元都採用Relu激活函數計算得到, 那麼在第(n-1)層到第n層輸出還有必要使用交叉熵作為損失函數進行梯度更新么?感覺可以拿caffe中常見的網路設計來粗略看看

1. 當損失是交叉熵的時候, 經常用哪裡?每層的激活情況又是什麼?

layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}

這個就是從`ip2`到`loss`層的連接, 而這個經常在分類問題中見到, 你沒有見過這個`ip2`被`Relu`過一次再丟到`loss`中計算吧?而且這個`ip2`到`loss`的計算方法就是常規的softmax交叉熵損失

frac{e^{w_i*ip2}}{sum_i e^{wi*ip2}}

如果是二分類它就變成了

frac{1}{e^{w_1*ip2}+e^{w_2*ip2}}egin{bmatrix} e^{w_1*ip2}\ e^{w_2*ip2} end{bmatrix}=frac{1}{1+e^{w

證明看UFLDL就行啦, 其實這個就是二分類裡面常見的`sigmoid`函數激活, 那麼如果最後一層使用這個函數激活, 梯度會出現什麼情況呢?網上搜一下有很多答案, 但是統一的結論是, 最後一層使用交叉熵損失(就我所知交叉熵損失裡面的概率一般都是用`sigmoid`計算得到的吧)的結果就是其權重梯度並不會受到`sigmoid`兩端較小的梯度影響, 因為壓根不會乘以`sigmoid`導數這一項, 梯度對比如下(我自己瞎證明過損失函數梯度對比-均方差和交叉熵 - CSDN博客):

ΔMSE=|o?y|?|σ′(wh+b)|?|h|\ Δcross-entropy=|o-y|?|h|

所以交叉熵只是讓最後一層梯度消失得到了緩解, 但是如果前面的層激活還是用`sigmoid`, 那麼鏈式求導法則會發現之前的權重依舊受到`sigmoid`兩端梯度影響(與答者張保成答案一致).

結論1: 損失為交叉熵的時候, 一般用於分類問題中, 它規定了輸出只能是在0~1之間, 所以激活函數不能是`Relu`, 當激活函數是用於計算loss前面的2~(n-1)層的單元輸出值時, 可以是sigmoid(會梯度消失), 也可以是`Relu`(減輕了梯度消失現象)

2. 那使用Relu作為激活函數, 不使用交叉熵可以么?

當然可以啦,比如回歸操作(來源:olddocks/caffe-facialkp)

前面各種卷積、`Relu`、卷積、`Relu`.....最後來個MSE損失, 完全沒交叉熵損失的影子.

layers {
name: "loss"
type: EUCLIDEAN_LOSS
bottom: "ip2"
bottom: "label"
top: "loss"
}

結論2: 對於回歸任務, 可以採用一連串的`Relu`激活, 而不需要使用交叉熵損失.

3. 結論

這樣一溜煙看下來, 就在caffe中設計網路常見情況來看, 結論如下:

  1. 與答者王贇 Maigo的答案相同,根據你的任務而不同, 對於DNN中, 分類和回歸的前面你都可以用`Relu`激活, 只不過前者的最後一層計算loss還是要用交叉熵, 後者計算loss可以採用`Relu`激活得到最後一層預測值
  2. 分類任務中使用交叉熵+`sigmoid`好處在於最後一層梯度不會受到`sigmoid`兩端梯度影響, 如果你用`MSE`+`sigmoid`就容易梯度消失,這差不多就是張保成答案
  3. 回歸任務: 常用MSE+Relu

【個人見解,歡迎拍磚o(╯□╰)o】


損失函數和激活函數根本就不是一個概念。損失函數為模型的優化目標,而激活函數表達的則是如何改變輸入值。


sigmoid的飽和性導致了深層神經網路容易出現梯度消失,和采不採用交叉熵沒有關係,交叉熵是損失函數。

relu的不完全飽和性,也只是緩解了梯度消失而已,並未能完全解決。

你同學推薦你使用交叉熵應該是因為你面臨的是多分類任務吧?


Relu是為了解決在反向傳播中梯度消失問題,而cross-entropy loss是為訓練網路進行分類的,這兩者之間並沒有直接的關聯!


推薦閱讀:

為什麼隨機梯度下降方法能夠收斂?
為什麼 feature scaling 會使 gradient descent 的收斂更好?
尋找全局最小值和防止過擬合之間是不是矛盾的?

TAG:神經網路 | 梯度下降 | 深度學習DeepLearning |