激活函数(ReLU, Swish, Maxout)
神經網絡中使用激活函數來加入非線性因素,提高模型的表達能力。
ReLU(Rectified Linear Unit,修正線性單元)
形式如下:
[egin{equation}
f(x)=
egin{cases}
0, & {xleq 0} \\
x, & {xgt 0}
end{cases}
end{equation}
]
ReLU公式近似推導::
[egin{align}
f(x) &=sum_{i=1}^{inf}sigma(x-i+0.5) & ext{(stepped sigmoid)} \\
&approxlog(1+e^x) & ext{(softplus function)} \\
&approxmax(0,x+N(0,1)) & ext{(ReL function)} \\
其中sigma(z) &={1over 1+e^{-z}} & ext{(sigmoid)}
end{align}
]
下面解釋上述公式中的softplus,Noisy ReLU.
softplus函數與ReLU函數接近,但比較平滑, 同ReLU一樣是單邊抑制,有寬廣的接受域(0,+inf), 但是由于指數運算,對數運算計算量大的原因,而不太被人使用.并且從一些人的使用經驗來看(Glorot et al.(2011a)),效果也并不比ReLU好.
softplus的導數恰好是sigmoid函數.softplus 函數圖像:
Noisy ReLU[1]
ReLU可以被擴展以包括高斯噪聲(Gaussian noise):
(f(x)=max(0,x+Y), Ysim N(0,sigma(x)))
Noisy ReLU 在受限玻爾茲曼機解決計算機視覺任務中得到應用.
ReLU上界設置: ReLU相比sigmoid和tanh的一個缺點是沒有對上界設限.在實際使用中,可以設置一個上限,如ReLU6經驗函數: (f(x)=min(6,max(0,x))). 參考這個上限的來源論文: Convolutional Deep Belief Networks on CIFAR-10. A. Krizhevsky
ReLU的稀疏性(摘自這里):
當前,深度學習一個明確的目標是從數據變量中解離出關鍵因子。原始數據(以自然數據為主)中通常纏繞著高度密集的特征。然而,如果能夠解開特征間纏繞的復雜關系,轉換為稀疏特征,那么特征就有了魯棒性(去掉了無關的噪聲)。稀疏特征并不需要網絡具有很強的處理線性不可分機制。那么在深度網絡中,對非線性的依賴程度就可以縮一縮。一旦神經元與神經元之間改為線性激活,網絡的非線性部分僅僅來自于神經元部分選擇性激活。
對比大腦工作的95%稀疏性來看,現有的計算神經網絡和生物神經網絡還是有很大差距的。慶幸的是,ReLu只有負值才會被稀疏掉,即引入的稀疏性是可以訓練調節的,是動態變化的。只要進行梯度訓練,網絡可以向誤差減少的方向,自動調控稀疏比率,保證激活鏈上存在著合理數量的非零值。
ReLU 缺點
壞死: ReLU 強制的稀疏處理會減少模型的有效容量(即特征屏蔽太多,導致模型無法學習到有效特征)。由于ReLU在x < 0時梯度為0,這樣就導致負的梯度在這個ReLU被置零,而且這個神經元有可能再也不會被任何數據激活,稱為神經元“壞死”。
無負值: ReLU和sigmoid的一個相同點是結果是正值,沒有負值.
ReLU變種
Leaky ReLU
當(x<0)時,(f(x)=alpha x),其中(alpha)非常小,這樣可以避免在(x<0)時,不能夠學習的情況:
[f(x)=max(alpha x,x)
]
稱為Parametric Rectifier(PReLU),將 (alpha) 作為可學習的參數.
當 (alpha) 從高斯分布中隨機產生時稱為Random Rectifier(RReLU)。
當固定為(alpha=0.01)時,是Leaky ReLU。
優點:
不會過擬合(saturate)
計算簡單有效
比sigmoid/tanh收斂快
指數線性單元ELU
[egin{equation}
f(x)=
egin{cases}
alpha(e^x-1), & ext{$xleq 0$} \
x, & ext{$xgt 0$}
end{cases}
end{equation}
]
[egin{equation}
f'(x)=
egin{cases}
f(x)+alpha, & ext{$xleq 0$} \
1, & ext{$xgt 0$}
end{cases}
end{equation}
]
exponential linear unit, 該激活函數由Djork等人提出,被證實有較高的噪聲魯棒性,同時能夠使得使得神經元
的平均激活均值趨近為 0,同時對噪聲更具有魯棒性。由于需要計算指數,計算量較大。
ReLU family:
Leaky ReLU (alpha)是固定的;PReLU的(alpha)不是固定的,通過訓練得到;RReLU的(alpha)是從一個高斯分布中隨機產生,并且在測試時為固定值,與Noisy ReLU類似(但是區間正好相反)。
ReLU系列對比:
SELU
論文: 自歸一化神經網絡(Self-Normalizing Neural Networks)中提出只需要把激活函數換成SELU就能使得輸入在經過一定層數之后變成固定的分布. 參考對這篇論文的討論.
SELU是給ELU乘上系數 (lambda), 即 (m{SELU}(x)=lambdacdot m{ELU}(x))
[f(x)=lambda
egin{cases}
alpha(e^x-1) & x le 0 \
x & x>0
end{cases}
]
Swish
paper Searching for Activation functions(Prajit Ramachandran,Google Brain 2017)
[f(x) = x · ext{sigmoid}(βx)
]
β是個常數或可訓練的參數.Swish 具備無上界有下界、平滑、非單調的特性。
Swish 在深層模型上的效果優于 ReLU。例如,僅僅使用 Swish 單元替換 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分類準確率提高 0.9%,Inception-ResNet-v 的分類準確率提高 0.6%。
導數:
當β = 0時,Swish變為線性函數(f(x) ={xover 2}).
β → ∞, $ σ(x) = (1 + exp(?x))^{?1} $為0或1. Swish變為ReLU: f(x)=2max(0,x)
所以Swish函數可以看做是介于線性函數與ReLU函數之間的平滑函數.
工程實現:
在TensorFlow框架中只需一行代碼: x * tf.sigmoid(beta * x)或tf.nn.swish(x).
在Caffe中使用Scale+Sigmoid+EltWise(PROD)來實現或者合并成一個層. 代碼參考.
GELU
GELU(高斯誤差線性單元)是一個非初等函數形式的激活函數,是RELU的變種。由16年論文 Gaussian Error Linear Units (GELUs) 提出,隨后被GPT-2、BERT、RoBERTa、ALBERT 等NLP模型所采用。論文中不僅提出了GELU的精確形式,還給出了兩個初等函數的近似形式。函數曲線如下:
RELU及其變種與Dropout從兩個獨立的方面來決定網絡的輸出,有沒有什么比較中庸溫和的方法把兩者合二為一呢?在網絡正則化方面,Dropout將神經單元輸出隨機置0(乘0),Zoneout將RNN的單元隨機跳過(乘1)。兩者均是將輸出乘上了服從伯努利分布(二項分布)的變量m ~ Bernoulli(p),其中p是指定的確定的參數,表示取1的概率。論文中希望p能夠隨著輸入x的不同而不同,在x較小時以較大概率將其置0。 由于神經元的輸入通常服從正態分布,尤其是在加入了Batch Normalization的網絡中,因此令p等于正態分布的累積分布函數即可滿足。正態分布的概率密度函數:(f(x)={frac {1}{sigma {sqrt {2pi }}}};e^{-{frac {left(x-mu ight)^{2}}{2sigma ^{2}}}}),累積分布函數:(F(x) = frac{1}{sigmasqrt{2pi}} int_{-infty}^x exp left( -frac{(t - mu)^2}{2sigma^2} ight)\, dt). 正態分布的累積分布函數曲線與sigmoid曲線相似。
假設輸入服從標準正態分布:(Xsim mathcal N(0,1)),標準正態分布的累積分布函數習慣上記為(Phi),(Phi(x)=P(Xle x)).
然而激活函數由于在訓練和測試時使用方式完全相同,所以是需要有確定性的輸出,這點與Dropout不同(Dropout在測試時并不隨機置0)。由于概率分布的數學期望是確定值,因此改為求輸出的期望:(E[mx]=xE[m]=xPhi(x)),即對輸入乘上伯努利分布的期望值(p=Phi(x))
[egin{align}
Phi(x) =& frac{1}{sqrt{2pi}} int_{-infty}^x expleft(-frac{t^2}{2}ight) \, dt \
=& {1over 2} + frac{1}{sqrt{2pi}} int_0^x expleft(-frac{t^2}{2}ight) \, dt ag{正態分布曲線下面積為1,一半則為0.5} \
=& {1over 2}left(1 + frac{2}{sqrt{pi}} int_0^x expleft(-({tover sqrt 2})^2ight) \, {dtover sqrt 2}ight) \
=& {1over 2}left(1 + frac{2}{sqrt{pi}} int_0^{xoversqrt 2} expleft(-z^2ight) \, dzight) \
=& {1over 2}left(1+m{erf}left({xover sqrt 2}ight)ight)
end{align}
]
其中的變換包含這個等式: ({1over n}int_0^x f(t/n)dt=int_0^{x/n}f(t)dt),將x看作一個固定值,則不難理解。
在數學中,誤差函數(也稱之為高斯誤差函數)定義如下:
[{operatorname {erf} (x)={frac {1}{sqrt {pi }}}int _{-x}^{x}e^{-t^{2}}\,mathrm ze8trgl8bvbq t={frac {2}{sqrt {pi }}}int _{0}^{x}e^{-t^{2}}\,mathrm ze8trgl8bvbq t}
]
erf(x) 與 tanh(x) 比較接近,與 (2left(sigma(x)-frac{1}{2}ight)) 也有相似的曲線,但是相對差別較大一些。在代碼實現中可以用近似函數來擬合erf(x)。論文給出的兩個近似如下:
[egin{align}
xPhi(x) &approx xsigma(1.702 x) \
xPhi(x) &approx frac{1}{2} x left[1 + anhleft(sqrt{frac{2}{pi}}left(x + 0.044715 x^3ight)ight)ight]
end{align}
]
不過很多框架已經有精確的erf計算函數了,可以直接使用,參考代碼如下:
# GPT-2 的 GELU 實現
def gelu(x):
return 0.5*x*(1+tf.tanh(np.sqrt(2/np.pi)*(x+0.044715*tf.pow(x, 3))))
# BERT 的 GELU 實現
def gelu(input_tensor):
cdf = 0.5 * (1.0 + tf.erf(input_tensor / tf.sqrt(2.0)))
return input_tesnsor*cdf
GELU vs Swish
GELU 與 Swish 激活函數(x · σ(βx))的函數形式和性質非常相像,一個是固定系數 1.702,另一個是可變系數 β(可以是可訓練的參數,也可以是通過搜索來確定的常數),兩者的實際應用表現也相差不大。
參考:
GELU的兩個初等函數近似是怎么來的
GELU activation
What is GELU activation?
Maxout
論文Maxout Networks(Goodfellow,ICML2013)
Maxout可以看做是在深度學習網絡中加入一層激活函數層,包含一個參數k.這一層相比ReLU,sigmoid等,其特殊之處在于增加了k個神經元,然后輸出激活值最大的值.
我們常見的隱含層節點輸出:
[h_i(x)= ext{sigmoid}(x^TW_{…i}+b_i)
]
而在Maxout網絡中,其隱含層節點的輸出表達式為:
[h_i(x)=max_{jin[1,k]}z_{ij}
]
其中(z_{ij}=x^TW_{…ij}+b_{ij}, Win R^{d imes m imes k})
以如下最簡單的多層感知器(MLP)為例:
圖片來源:slides
假設網絡第i層有2個神經元x1、x2,第i+1層的神經元個數為1個.原本只有一層參數,將ReLU或sigmoid等激活函數替換掉,引入Maxout,將變成兩層參數,參數個數增為k倍.
優點:
Maxout的擬合能力非常強,可以擬合任意的凸函數。
Maxout具有ReLU的所有優點,線性、不飽和性。
同時沒有ReLU的一些缺點。如:神經元的死亡。
缺點:
從上面的激活函數公式中可以看出,每個神經元中有兩組(w,b)參數,那么參數量就增加了一倍,這就導致了整體參數的數量激增。
Maxout激活函數
與常規激活函數不同的是,它是一個可學習的分段線性函數.
然而任何一個凸函數,都可以由線性分段函數進行逼近近似。其實我們可以把以前所學到的激活函數:ReLU、abs激活函數,看成是分成兩段的線性函數,如下示意圖所示:
實驗結果表明Maxout與Dropout組合使用可以發揮比較好的效果。
那么,前邊的兩種ReLU便是兩種Maxout,函數圖像為兩條直線的拼接,(f(x)=max(w_1^Tx+b_1,w_2^Tx+b_2)).
sigmoid & tanh
sigmoid/logistic 激活函數:
[sigma(x) ={1over 1+e^{-x}}
]
tanh 函數是sigmoid函數的一種變體,以0點為中心。取值范圍為 [-1,1] ,而不是sigmoid函數的 [0,1] 。
[ anh(x) ={e^x-e^{-x}over e^x+e^{-x}}
]
tanh 是對 sigmoid 的平移和收縮: ( anh left( x ight) = 2 cdot sigma left( 2 x ight) - 1).
你可能會想平移使得曲線以0點為中心,那么為什么還要收縮呢? 如果不拉伸或收縮得到 (f(x)={e^x-1over e^x+1}) 不行嗎? 我猜想是因為 tanh 更加著名吧。
那么 tanh 這個雙曲正切函數與三角函數 tan 之間是什么關系呢?
在數學中,雙曲函數是一類與常見的三角函數(也叫圓函數)類似的函數。最基本的雙曲函數是雙曲正弦函數 sinh 和雙曲余弦函數 cosh ,從它們可以導出雙曲正切函數 tanh 等,其推導也類似于三角函數的推導。[2]
根據歐拉公式: (e^{ix} = cos x + icdotsin x) (其中i是虛數(sqrt{-1})) 有[3],
[e^{-ix} = cos x - icdotsin x \
sin x=(e^{ix} - e^{-ix})/(2i) \
cos x=(e^{ix} + e^{-ix})/2 \
an x= anh(ix)/i \
anh(ix)=i an x
]
hard tanh 限界: g(z) = max(-1, min(1,z))
sigmoid & tanh 函數圖像如下:
sigmoid作激活函數的優缺點
歷史上很流行(Historically popular since they have nice interpretation as a saturating “firing rate” of a neuron),梯度計算較為方便:
[
ablasigma =
{e^{-x}over(1+e^{-x})^2}=({1+e^{-x}-1over 1+e^{-x}})({1over 1+e^{-x}})=
sigma(x)(1-sigma(x))
]
優勢是能夠控制數值的幅度,在深層網絡中可以保持數據幅度不會出現大的變化;而ReLU不會對數據的幅度做約束.
存在三個問題:
飽和的神經元會"殺死"梯度,指離中心點較遠的x處的導數接近于0,停止反向傳播的學習過程.
sigmoid的輸出不是以0為中心,而是0.5,這樣在求權重w的梯度時,梯度總是正或負的.
指數計算耗時
為什么tanh相比sigmoid收斂更快:
梯度消失問題程度
( anh'( x ) = 1- anh( x )^2 in (0,1))
( ext{sigmoid: } s'(x)=s(x) imes(1-s(x))in(0,1/4))
可以看出tanh(x)的梯度消失問題比sigmoid要輕.梯度如果過早消失,收斂速度較慢.
以零為中心的影響
如果當前參數(w0,w1)的最佳優化方向是(+d0, -d1),則根據反向傳播計算公式,我們希望 x0 和 x1 符號相反。但是如果上一級神經元采用 Sigmoid 函數作為激活函數,sigmoid不以0為中心,輸出值恒為正,那么我們無法進行最快的參數更新,而是走 Z 字形逼近最優解。[4]
激活函數的作用
加入非線性因素
充分組合特征
下面說明一下為什么有組合特征的作用.
一般函數都可以通過泰勒展開式來近似計算, 如sigmoid激活函數中的指數項可以通過如下的泰勒展開來近似計算:
[e^z=1+{1over 1!}z+{1over 2!}z^2+{1over 3!}z^3+o(z^3)
]
其中有平方項,立方項及更更高項, 而 (z=wx+b), 因此可以看作是輸入特征 x 的組合. 以前需要由領域專家知識進行特征組合,現在激活函數能起到一種類似特征組合的作用. (思想來源: 微博@算法組)
為什么ReLU,Maxout等能夠提供網絡的非線性建模能力?它們看起來是分段線性函數,然而并不滿足完整的線性要求:加法f(x+y)=f(x)+f(y)和乘法f(ax)=a×f(x)或者寫作(f(alpha x_1+eta x_2)=alpha f(x_1)+eta f(x_2))。非線性意味著得到的輸出不可能由輸入的線性組合重新得到(重現)。假如網絡中不使用非線性激活函數,那么這個網絡可以被一個單層感知器代替得到相同的輸出,因為線性層加起來后還是線性的,可以被另一個線性函數替代。
梯度消失與梯度爆炸
梯度消失/爆炸原因及解決辦法
原因,淺層的梯度計算需要后面各層的權重及激活函數導數的乘積,因此可能出現前層比后層的學習率小(vanishing gradient)或大(exploding)的問題,所以具有不穩定性.那么如何解決呢?
需要考慮幾個方面:
權重初始化
使用合適的方式初始化權重, 如ReLU使用MSRA的初始化方式, tanh使用xavier初始化方式.
激活函數選擇
激活函數要選擇ReLU等梯度累乘穩定的.
學習率
一種訓練優化方式是對輸入做白化操作(包括正規化和去相關), 目的是可以選擇更大的學習率. 現代深度學習網絡中常使用Batch Normalization(包括正規化步驟,但不含去相關). (All you need is a good init. If you can't find the good init, use Batch Normalization.)
由于梯度的公式包含每層激勵的導數以及權重的乘積,因此讓中間層的乘積約等于1即可.但是sigmoid這種函數的導數值又與權重有關系(最大值1/4,兩邊對稱下降),所以含有sigmoid的神經網絡不容易解決,輸出層的activation大部分飽和,因此不建議使用sigmoid.
ReLU在自變量大于0時導數為1,小于0時導數為0,因此可以解決上述問題.
梯度爆炸
由于sigmoid,ReLU等函數的梯度都在[0,1]以內,所以不會引發梯度爆炸問題。 而梯度爆炸需要采用梯度裁剪、BN、設置較小學習率等方式解決。
激活函數選擇
首先嘗試ReLU,速度快,但要注意訓練的狀態.
如果ReLU效果欠佳,嘗試Leaky ReLU或Maxout等變種。
嘗試tanh正切函數(以零點為中心,零點處梯度為1)
sigmoid/tanh在RNN(LSTM、注意力機制等)結構中有所應用,作為門控或者概率值.
在淺層神經網絡中,如不超過4層的,可選擇使用多種激勵函數,沒有太大的影響。
https://en.wikipedia.org/wiki/Rectifier_(neural_networks) ↩?
https://zh.wikipedia.org/wiki/雙曲函數 ↩?
http://mathforum.org/library/drmath/view/54179.html ↩?
談談激活函數以零為中心的問題 https://liam0205.me/2018/04/17/zero-centered-active-function/ ↩?
總結
以上是生活随笔為你收集整理的激活函数(ReLU, Swish, Maxout)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统变量与环境变量
- 下一篇: 人多的地方怎么拍?试试这几个实用慢门技巧