天天看點

神經網絡中激活函數的真正意義?

神經網絡中激活函數的真正意義?一個激活函數需要具有哪些必要的屬性?還有哪些屬性是好的屬性但不必要的?

(1)非線性:即導數不是常數。這個條件是多層神經網絡的基礎,保證多層網絡不退化成單層線性網絡。這也是激活函數的意義所在。

(2)幾乎處處可微:可微性保證了在優化中梯度的可計算性。傳統的激活函數如sigmoid等滿足處處可微。對于分段線性函數比如ReLU,隻滿足幾乎處處可微(即僅在有限個點處不可微)。對于SGD算法來說,由于幾乎不可能收斂到梯度接近零的位置,有限的不可微點對于優化結果不會有很大影響[1]。

(3)計算簡單:非線性函數有很多。極端的說,一個多層神經網絡也可以作為一個非線性函數,類似于Network In Network[2]中把它當做卷積操作的做法。但激活函數在神經網絡前向的計算次數與神經元的個數成正比,是以簡單的非線性函數自然更适合用作激活函數。這也是ReLU之流比其它使用Exp等操作的激活函數更受歡迎的其中一個原因。

(4)非飽和性(saturation):飽和指的是在某些區間梯度接近于零(即梯度消失),使得參數無法繼續更新的問題。最經典的例子是Sigmoid,它的導數在x為比較大的正值和比較小的負值時都會接近于0。更極端的例子是階躍函數,由于它在幾乎所有位置的梯度都為0,是以處處飽和,無法作為激活函數。ReLU在x>0時導數恒為1,是以對于再大的正值也不會飽和。但同時對于x<0,其梯度恒為0,這時候它也會出現飽和的現象(在這種情況下通常稱為dying ReLU)。Leaky ReLU[3]和PReLU[4]的提出正是為了解決這一問題。

(5)單調性(monotonic):即導數符号不變。這個性質大部分激活函數都有,除了諸如sin、cos等。個人了解,單調性使得在激活函數處的梯度方向不會經常改變,進而讓訓練更容易收斂。

(6)輸出範圍有限:有限的輸出範圍使得網絡對于一些比較大的輸入也會比較穩定,這也是為什麼早期的激活函數都以此類函數為主,如Sigmoid、TanH。但這導緻了前面提到的梯度消失問題,而且強行讓每一層的輸出限制到固定範圍會限制其表達能力。是以現在這類函數僅用于某些需要特定輸出範圍的場合,比如機率輸出(此時loss函數中的log操作能夠抵消其梯度消失的影響[1])、LSTM裡的gate函數。

(7)接近恒等變換(identity):即約等于x。這樣的好處是使得輸出的幅值不會随着深度的增加而發生顯著的增加,進而使網絡更為穩定,同時梯度也能夠更容易地回傳。這個與非線性是有點沖突的,是以激活函數基本隻是部分滿足這個條件,比如TanH隻在原點附近有線性區(在原點為0且在原點的導數為1),而ReLU隻在x>0時為線性。這個性質也讓初始化參數範圍的推導更為簡單。額外提一句,這種恒等變換的性質也被其他一些網絡結構設計所借鑒,比如CNN中的ResNet[6]和RNN中的LSTM。

繼續閱讀