1. 程式人生 > 其它 >【學術】如何在神經網路中選擇正確的啟用函式

【學術】如何在神經網路中選擇正確的啟用函式

在神經網路中,啟用函式是必須選擇的眾多引數之一,以通過神經網路獲得最優的成果和效能。

在這篇文章中,我將假設你已經理解了神經網路工作的基本原理,並將詳細介紹涉及啟用的過程。在前饋過程中,每個神經元取上一層取神經元的總和(乘以它們的連線權值)。例如:

n5 = (n1 * w1) + (n2 * w2) + (n3 * w3) + (n4 * w4)

n6 = (n1 * w5) + (n2 * w6) + (n3 * w7) + (n4 * w8)

n7 = (n1 * w9) + (n2 * w10) + (n3 * w11) + (n4 * w12)

每個神經元的值都需要被最小化,因為原始的輸入資料可能是非常多樣化的,而且可能是不成比例的。在進一步前饋前,必須啟用n5,n6,n7。簡單地說,你可以使用一系列函式來作為到達神經元的值的線性或非線性閾值(比如n5、n6和n7)。

A()是啟用函式,通常用來將它的輸入壓縮為更符合的比例值(取決於你選擇的函式)。它通常是0到1之間的小數值。但是,如何才能做到壓縮輸入,並且應該使用什麼樣的函式來完成這個任務呢?

步驟函式是最簡單的。它指出靜態閾值通常為0.5(但也可能為0),並根據輸入值大於或小於閾值來決定輸出1或0。要記住,輸入值幾乎總是在0到1之間(或者可能是-1,1),因為權值總是像第一層的神經元一樣。

def step(input): return 1 if (input > 0.5) else 0

這本質上是一種二進位制的方法,當輸入資料為二進位制分類問題時,可以使用這種方法,在訓練模型或者函式的例子中:

0,1 = 11,0 = 10,0 = 01,1 = 0

該模型將有兩個輸入神經元,隱藏層層大約四個神經元,輸出層有一個神經元。在每一層上,由於問題是二進位制的,步驟函式都是啟用所需的全部。

最常用的啟用函式是sigmoid函式(藍色),與步驟函式(橙色)相比,它在圖上是這樣的:

無論輸入值高或低,它都將被壓縮成0到1之間的比例值。它被認為是一種將值轉化為概率的方法,它反映了神經元的權值或置信度。這就解釋了模型的非線性特徵,使它能夠更深入地學習觀察結果。預設情況下,你可以使用這個sigmoid函式來解決任何問題,並可以得到一些結果。

輸出永遠不可能是1,因為1是上水平漸近線。同樣地,對於0,輸出也總是趨向於它而不到達它。當然,在程式中,將會有一個點,輸出是四捨五入的。

這裡有一些示例的輸入和輸出,你可以準確地看到正在發生的事情:

顯然,S()是sigmoid函式。當反向傳播時,需要在單個權值中找到誤差範圍,並且需要通過它的推導來返回Sigmoid函式:

Tanh函式與sigmoid函式非常相似。然而,它的範圍更大。它不返回0和1之間的值,而是給出-1和1的範圍。這強調了觀察結果,更加具體。因此,它適用於分類不同且門檻較低的更復雜的問題。如果你的資料相對簡單,這會導致過度學習。正如你所看到的,TanH的方程與Sigmoid非常相似。

TanH函式的推導是:

ReLU啟用函式是深度學習中最常用且最成功的函式。乍一看,這似乎有些令人驚訝,因為迄今為止,非線性函式似乎更有效。ReLU的好處在反向傳播中得以體現。有一種常見的經驗法則是,神經網路上的層越多,就會更容易成功,然而這產生了一個著名的問題:消失梯度下降(vanishing gradient descent),許多非線性啟用技術,如Sigmoid和Tanh。它單獨地破壞了深度學習(有許多層)提供的巨大機會。

如果我們看一下一個小的神經網路的水平切片,也許只有一個隱藏層,消失梯度下降不會是太大的問題:

正如你所看到的,在每個神經元上,S()被再次呼叫。也就是S(S(x)),你一次又一次地壓縮這個值。請記住,為了簡單,我忽略了與其他神經元權值相乘的過程。層次越多,結果就越糟糕。現在,從0.68997到0.665961可能沒問題,但請想象一下:

S(S(S(S(S(S(S(S(S(S(S(x)))))))))))

…你會得到一個意義與完整性已經消失了的值,此時igmoid函式推導過程為:

ReLU的優點是它不會壓縮數值,因為它使用一種非常簡單的靜態方法:

R(x)= max(0,x)

它只是將任何負值對映為零,同時保留所有的正值。這就是為什麼ReLU被用於更復雜的神經網路,如深度卷積網路。ReLU沒有層限制。然而,ReLU失去了壓縮數值的優勢,但是避免了超限或放大問題。換句話說,它不能處理非常大的值,因為它不能壓縮它們。ReLU的另一個問題是,在一些更極端的情況下,它可以消滅一個神經元。想象一下,在多次反向傳播之後,一個特定的權值會隨著時間的推移而調整為一個非常大的負值。反過來,這個值會乘以之前的神經元,並不斷地產生一個負數作為下一個神經元的輸入。因此,R(x)每次都會輸出0,這是一個即將消失的神經元(注意,從技術上講,它還有恢復的機會,它不是一個消失的神經元)。因此,有更有見解的ReLU版本,如引數化和漏型的直線單元(Leaky Rectified Linear Unit),(或PReLU和LReLU),它們都不只是將任何負值對映到0,而是(綠色):