沒想到那麼快就出此系列的第二篇了,真的沒時間做啦!!!! 沒事,剛好記錄一下我的筆記XD
此篇要講的是我們訓練類神經網路中,會用到的另一個也是非常非常重要的東西 :: activation function
。他有多重要呢? 記得之前在「股票預測需要什麼樣的NN模型?」提過tensorflow playground
,裡面有個很難去用機器逼近的點分布,而我用了不少hidden layers
和大的batch size
以及使用relu
的激勵函數才能使圖形收斂至如下圖 :
tensorflow playground
的實作結果
其中最為重要的關鍵就在relu
的使用,而relu
其實就是一種activation function
,所以讓我們理解它吧!
什麼? 一上來就談應用嗎? 放輕鬆~ 從應用講回來會更好理解 !! 我們先來看看如果沒有activation function
會發生什麼事情? 就拿上面的漩渦圖當作範例 :
activation function
,放再久都是這樣
tanh
,我訓練了1500個epoch才比較收斂
relu
,同樣約1500個epoch的結果,已經算是收斂得很好了
sigmoid
可以自己嘗試一下Orz 它估計是更久上面有提到的主要三個activation function
分別是sigmoid
、tanh
和relu
,他們會放在每個layers
的後面,而為什麼要這麼做呢? 原因很簡單,為了要有「非線性現象」。 我們的類神經網路用算是由最基本的Ax + b = y
式子而來,這個運算式無疑是在「線性代數」的範疇底下,歸根結柢總為「線性」逼近,對於一個離散型的、非線性的、或是複雜的資料,如何能夠用「線性」去描述?
答案是 : 無法
所以此時引入activation function
放在各個y = Ax + b
後面,對y
做激勵(的感覺),可以這個寫作每一層的laysers output = act(Ax + b)
, 其中act
就是activation function
(抱歉,因為太長了,式子會很醜,所以自動減少了XD)
那麼,來看看有那些activation function
吧!
其實不多 ! 大致可以分為3種~ Sigmoid
、tanh
以及relu
不就上面用到的那三種嘛!!!?
對的,但其實relu
還有其他變形,我們來看看它會對y
做什麼樣的激勵吧!
- | Sigmoid | tanh | ReLU |
---|---|---|---|
簡單示意圖 |
其中,relu
是最好理解的,就是「y大於0我就保留,y小於0我就丟掉」,也最容易計算,速度自然最快,當然有利就有弊,雖然它的效能和函式都很簡單,但它對模型的預測上
...
...
...
...
也是最強的!!!!
我自己是非常意外的,當我看到sigmoid
的式子或是tanh
的式子,我在看到relu
就想...這什麼東西 ? 但從歷史的角度,是先有sigmoid
才有tanh
,最後才是relu
,而實際觀察也可以理解,relu的「非線性現象」最為明顯,雖然可能會造成0以下的結果都被丟掉了,但所得到的好處卻可以遠蓋過這些。sigmoid
和tanh
都有一個非常致面的缺點 :: 會有梯度爆炸和梯度消失問題,詳情請見沒有實作所以只好講幹話系列(三) (別點進去不然我會被殺),簡單講梯度消失或是爆炸就是因為在更新模型參數的時候要取梯度,當然也要對激勵函數做梯度下降,拿sigmoid
來說,對sigmoid
微分後,只有在[0-1]的範圍內有梯度更新,其餘都是0,所以在y > 1 or y < 0
的區段是「沒有梯度的」,這就是 梯度消失 ,反之,若是在[0-1]之間就沒問題嗎? 有的,在這中間的梯度會持續被放大,對於一個深一點的模型,在越深的地方就會收到連續的放大倍數,梯度會變很大,此稱為 梯度爆炸 。觀察一下sigmoid
和tanh
皆會有這兩個問題,反觀relu
的微分是一個常數,或是0,解決了梯度消失和爆炸問題 !!
activation function
的比較- | 簡單示意圖 | 梯度消失(飽和) | 非0中心輸出 | 負區域死亡 | exp()計算 | 參數數量2倍 |
---|---|---|---|---|---|---|
Sigmoid | YES | YES | - | YES | - | |
tanh | YES | - | - | - | - | |
ReLU | - | YES | YES | - | - | |
Leaky Relu | - | - | - | - | - | |
ELU | - | - | - | YES | - | |
Maxout | - | - | - | - | - | YES |
今天理解了activation function
為何物,並得出結論 :: 用relu
就對了
其實真的無法說準
凡有規則必有例外,LSTM
網路就必須使用tanh
,這與LSTM
的更新網路有關(最大只有1),但無論如何,一個類神經網路模型如果沒有激勵函數,儘管只有稍微複雜一點的資料,仍可能無法有很好的擬合(fit)。提到此,我們如果有下一篇「沒有實作所以只好講幹話系列」將提到「過擬合」(overfitting)和loss、accuracy之間的關係 (呵呵先打預防針