激活函数 activation function
文章目錄
- 激活函數 activation function
- Sigmoid
- Sigmoid 反向傳播
- Tanh
- ReLU
- Dead ReLU Problem 產生的原因
激活函數 activation function
激活函數的角色是引入非線性(non-linearity),否則不管網絡有多深,整個網絡都可以直接替換為一個相應的仿射變換(affine transformation),即線性變換(linear transformation),比如旋轉、伸縮、偏斜、平移(translation)。
例如,在二維特征空間上,藍線表示負面情形 y=0y=0y=0,綠線表示正面情形 y=1y=1y=1:
如果不使用激活函數,神經網絡最好的分類效果如下:
在仿射變換的結果上應用激活函數,可以對特征空間進行扭曲翻轉,最后得到一條線性可分的邊界。運轉中的sigmoid激活函數:
在同一個網絡中混合使用不同類型的神經元是非常少見的,雖然沒有什么根本性問題來禁止這樣做。
Sigmoid
Sigmoid 激活函數:
f(w,x)=11+e?(w0x0+w1x1+w2)\displaystyle f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}}f(w,x)=1+e?(w0?x0?+w1?x1?+w2?)1?
-
函數圖像如上圖所示,它將輸入的值“擠壓”到 [0,1][0,1][0,1] 范圍內,很大的負數變成0,很大的正數變成1。
-
在歷史上,Sigmoid 函數非常常用,這是因為它對于神經元的激活頻率有良好的解釋:從完全不激活(0)到在求和后的最大頻率處的完全飽和(saturated)的激活(1)。
現在 Sigmoid 函數已經很少使用了,這是因為它有兩個主要缺點:
-
Sigmoid函數飽和使梯度消失:
Sigmoid 神經元有一個不好的特性,就是當神經元的激活在接近 0 或1 處時會飽和:在這些區域,梯度幾乎為0。在深層網絡的鏈式求導過程中,如果局部梯度非常小,那么相乘的結果也會接近零,導致梯度消失。
-
Sigmoid 函數的輸出不是零中心的:
這會導致后面層中的神經元得到的數據也不是零中心的,這一情況將影響梯度下降的速度,因為如果輸入神經元的數據總是正數(比如在 f=wTx+bf=w^Tx+bf=wTx+b 中每個元素都 x>0x>0x>0),那么權重的梯度在反向傳播的過程中,將會要么全部是正數,要么全部是負數。這將會導致梯度下降權重更新時出現 ZZZ 字型的下降。
然而,由于整個批量的數據的梯度被加起來后,對于權重的最終更新將會有不同的正負,這樣就從一定程度上減輕了這個問題。因此,該問題相對于上面的神經元飽和問題來說只是個小麻煩,沒有那么嚴重。
激活變換效果:
Sigmoid 反向傳播
Sigmoid 激活函數:
f(w,x)=11+e?(w0x0+w1x1+w2)\displaystyle f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}}f(w,x)=1+e?(w0?x0?+w1?x1?+w2?)1?
鏈式求導:
f(x)=1x→dfdx=?1/x2\displaystyle f(x)=\frac{1}{x} \to \frac{df}{dx}=-1/x^2f(x)=x1?→dxdf?=?1/x2
fc(x)=c+x→dfdx=1f(x)=ex→dfdx=ex\displaystyle f_c(x)=c+x \to \frac{df}{dx}=1\displaystyle f(x)=e^x \to \frac{df}{dx}=e^xfc?(x)=c+x→dxdf?=1f(x)=ex→dxdf?=ex
fa(x)=ax→dfdx=a\displaystyle f_a(x)=ax \to \frac{df}{dx}=afa?(x)=ax→dxdf?=a
即:
σ(x)=11+e?x\displaystyle\sigma(x)=\frac{1}{1+e^{-x}}σ(x)=1+e?x1?
→dσ(x)dx=e?x(1+e?x)2\displaystyle\to\frac{d\sigma(x)}{dx}=\frac{e^{-x}}{(1+e^{-x})^2}→dxdσ(x)?=(1+e?x)2e?x?
=(1+e?x?11+e?x)(11+e?x)=(\frac{1+e^{-x}-1}{1+e^{-x}})(\frac{1}{1+e^{-x}})=(1+e?x1+e?x?1?)(1+e?x1?)
=((1+e?x1+e?x)?(11+e?x))(11+e?x)=((\frac{1+e^{-x}}{1+e^{-x}})-(\frac{1}{1+e^{-x}}))(\frac{1}{1+e^{-x}})=((1+e?x1+e?x?)?(1+e?x1?))(1+e?x1?)
=(1?σ(x))σ(x)=(1-\sigma(x))\sigma(x)=(1?σ(x))σ(x)
在分子上先加 1 后減 1 來簡化求導過程:
計算線路:
根據上面的公式,局部梯度為 (1?0.73)?0.73=0.2(1-0.73)*0.73~=0.2(1?0.73)?0.73?=0.2
w = [2,-3,-3] # 假設一些隨機數據和權重 x = [-1, -2]# 前向傳播 dot = w[0]*x[0] + w[1]*x[1] + w[2] f = 1.0 / (1 + math.exp(-dot)) # sigmoid函數# 對神經元反向傳播 ddot = (1 - f) * f # 點積變量的梯度, 使用sigmoid函數求導 dx = [w[0] * ddot, w[1] * ddot] # 回傳到x dw = [x[0] * ddot, x[1] * ddot, 1.0 * ddot] # 回傳到w # 完成!得到輸入的梯度Tanh
-
tanh 神經元是一個簡單放大平移后的 Sigmoid 神經元。
-
tanh 公式:
tanh(x)=2sigmoid(2x)?1tanh(x)=2sigmoid(2x)-1tanh(x)=2sigmoid(2x)?1
tanh(x)=ex?e?xex+e?xtanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}tanh(x)=ex+e?xex?e?x?
-
圖像如上圖所示。它將實數值壓縮到 [?1,1][-1,1][?1,1] 之間。和 Sigmoid 神經元一樣,它也存在飽和問題,但是和 Sigmoid 神經元不同的是,它的輸出是零中心的。因此,在實際操作中,tanh 非線性函數比 Sigmoid 非線性函數更受歡迎。
激活變換效果:
ReLU
ReLU(校正線性單元:Rectified Linear Unit)激活函數,當 x=0x=0x=0 時函數值為0。當 x>0x>0x>0 函數的斜率為 1。使用 ReLU 可以加快收斂速度。
- 在近些年 ReLU變得非常流行,它的函數公式是:
f(x)=max(0,x)f(x)=max(0,x)f(x)=max(0,x)
- ReLU 函數其實就是一個取最大值函數,它并不是全區間可導的,但是可以取 sub-gradient,如上圖所示。
ReLU的優點:
-
sigmoid 和 tanh 神經元含有指數運算等耗費計算資源的操作,而 ReLU 可以簡單地通過對一個矩陣進行閾值計算得到。
-
相較于 sigmoid 和 tanh 函數,ReLU 對于隨機梯度下降的收斂有巨大的加速作用。
ReLU的缺點:
-
ReLU 的輸出不是零中心的。
-
Dead ReLU Problem:ReLU 不適合大梯度傳播,因為在前層參數更新以后,ReLU 的神經元有可能再也不能被激活,導致梯度永遠都是零。通過合理設置學習速率,這種情況的發生概率會降低。
激活變換效果:
Dead ReLU Problem 產生的原因
假設有一個神經網絡的輸入 WWW 遵循某種分布,對于一組固定的樣本, WWW 的分布也就是 ReLU 的輸入的分布,假設 ReLU 輸入是一個低方差中心在 +0.1+0.1+0.1 的高斯分布。
在這個場景下:
-
大多數 ReLU 的輸入是正數
-
大多數輸入經過 ReLU 函數能得到一個正值(ReLU is open)
-
大多數輸入能夠反向傳播通過 ReLU 得到一個梯度
-
ReLU 的輸入WWW 一般都能通過反向傳播得到更新
現在,假設在隨機反向傳播的過程中,有一個巨大的梯度經過 ReLU,由于 ReLU是打開的,將會有一個巨大的梯度通過反向傳播傳給輸入 WWW 。這會引起輸入 WWW 巨大的變化,也就是說輸入 WWW 的分布會發生變化,假設輸入 WWW 的分布現在變成了一個低方差的,中心在 ?0.1-0.1?0.1 高斯分布。
在這個場景下:
-
大多數 ReLU 的輸入是負數
-
大多數輸入經過 ReLU 函數會得到 0 值(ReLU is close)
-
大多數輸入通過 ReLU 反向傳播,得到一個梯度也是 0
-
ReLU 的輸入 WWW 大多數都無法通過反向傳播得到更新了
發生了什么?只是ReLU函數的輸入的分布函數發生了很小的改變(?0.2-0.2?0.2 的改變),導致了ReLU函數行為質的改變。越過了 0 這個邊界,ReLU 函數幾乎永久的關閉了。更重要的是ReLU函數一旦關閉,參數 WWW 就得不到更新,這就是所謂的 dying ReLU,過高的學習速率可能是這里的罪魁禍首。
總結
以上是生活随笔為你收集整理的激活函数 activation function的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 池化层 pool
- 下一篇: GoogLeNet Inception