【深度學習】CNN 用 ReLU,RNN 用 tanh ?

作者:LogM

本文原載於 https://segmentfault.com/u/logm/articles ,不允許轉載~

1. CNN 用 ReLU ?

sigmoid 的導數在 [0, 0.25] 範圍裏;tanh 的導數在 [0, 1] 範圍裏;ReLU 的導數爲 {0, 1}。

如果 CNN 的每一層都使用 sigmoid,小於1的導數的多次連乘引發"梯度消失"。

那爲什麼不使用 tanh? tanh 的導數雖然可以達到1,但在邊緣仍有"梯度消失"的問題出現。只能說 tanh 在一定程度上緩解了"梯度消失"。

ReLU 的正半區沒有"梯度消失",但負半區存在"梯度消失",(但也有人認爲負半區的存在可以使參數矩陣稀疏,有一定正則化的效果)。

最最重要的是,ReLU 的計算量是遠小於 sigmoid 和 tanh 的。

A four-layer convolutional neural network with ReLUs (solid line) reaches a 25% training error rate on CIFAR-10 six times faster than an equivalent network with tanh neurons (dashed line).

ReLU 最先不是針對深度網絡發明出來的,所以我們很難從發明者的角度探尋 ReLU 的誕生解決了深度網絡的什麼問題。事實情況是,當學者們把 ReLU 用在深度網絡上發現效果很好,就陸陸續續提出了一些理論來解釋爲什麼 ReLU 的效果好。所以,這些支持 ReLU 的理論是有一些生硬的。

因爲 ReLU 不是專門爲深度網絡研發的,ReLU 移植到深度網絡中後,仍有許多問題存在,還有很大的改進空間。

參考:Krizhevsky等人是怎麼想到在CNN裏用Dropout和ReLU的?

2. RNN 用 tanh ?

"RNN 用 tanh" 主要是說 GRU 和 LSTM 的隱狀態的激活函數一般用的 tanh;它們內部的各種門,因爲是 0-1 的輸出,所以一般用 sigmoid 函數。

RNN 每個時間步的參數矩陣 W 是相同的,不加激活函數的話相當於 W 的連乘,那麼 W 中絕對值小於1的元素會在連乘中快速變爲0,絕對值大於1的元素會在連乘中快速變爲無窮。所以說,RNN 比 CNN 更容易出現"梯度消失"和"梯度爆炸"。

明白了 RNN "梯度爆炸"的來源,就應該能明白爲什麼不推薦 ReLU 了。

At first sight, ReLUs seem inappropriate for RNNs because they can have very large outputs, so they might be expected to be far more likely to explode than units that have bounded values.

明白了 RNN "梯度消失"的來源,就應該能明白爲什麼 tanh 也不是非常適合。(tanh 會有梯度消失的問題,雖然相比 sigmoid 已經小很多了。)

所以,ReLu 和 tanh 都不是完美的,會有 RNN + ReLU + 梯度裁剪GRU/LSTM + tanh 兩套方案哪個更好的爭論。

參考:RNN中爲什麼要採用tanh而不是ReLu作爲激活函數?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章