什麼是激活函數?


title: 什麼是激活函數
date: 2019-11-08 12:55:45
mathjax: true
categories:

  • nlp-自然語言處理
    tags:
  • nlp-自然語言處理

先拋開什麼神經,深度之類的不好理解的東西

回想一下,我們是要用這個東西幹什麼?
答案很簡單,有兩種問題————對應兩種模型
迴歸模型和分類模型
迴歸模型:預測連續值,是多少的問題。北京房價是多少?食堂阿姨給我盛飯是多少?
分類模型:預測離散值,是不是的問題。這個背影是不是帥哥?這個人是不是喜歡我?

爲什麼需要激活函數?激活函數的作用是什麼?
在談到激活函數時,也經常會看到“非線性函數”和“線性函數”等術語。函數本來是輸入某個值後會返回一個值的轉換器。向這個轉換器輸入某個值後,輸出值是輸入值的常數倍的函數稱爲線性函數(用數學式表示爲h(x) = cx。c 爲常數)。因此,線性函數是一條筆直的直線。而非線性函數,顧名思義,指的是不像線性函數那樣呈現出一條直線的函數。
神經網絡的激活函數必須使用非線性函數。換句話說,激活函數不能使用線性函數。爲什麼不能使用線性函數呢?因爲使用線性函數的話,加深神經網絡的層數就沒有意義了。線性函數的問題在於,不管如何加深層數,總是存在與之等效的“無隱藏層的神經網絡”。
如果不考慮激活函數,考慮一個三層神經網絡的輸出公式:

a1=xw1+b1a^1 = xw^1 +b^1 a1a^1傳遞到第二層

a2=a1w2+b2a^2 = a^1w^2+b^2 a2a^2傳遞到第三層

a3=a2w3+b3a^3 = a^2w^3 + b^3

注意,1,2,3代表層數
可以看到這種神經網絡層之間信號傳遞全是我們中學學過的平面解析幾何裏線性(y = kx + b)形式的傳遞方式,是沒有意義的,無論疊加多少層。
正因爲上面的原因,神經網絡引入非線性函數的激活函數,纔可以充分發揮層疊加所帶來的優勢,這樣幾乎可以逼近任意函數

激活函數在深度學習中是用來幹什麼的?

先說下卷積層,學深度學習的應該都是知道卷積層的,那捲積層具體指什麼呢?其實卷積層就是我們所做的一大堆特定的濾波器,該濾波器會對某些特定的特徵進行強烈的響應,一般情況下是結果值非常大。而對一些無關特性,其響應很小,大部分是結果相對較小,或者幾乎爲0。這樣就可以看做爲激活,當特定卷積核發現特定特徵時,就會做出響應,輸出大的數值,而響應函數的存在把輸出歸爲0~1,那麼大的數值就接近1,小的數值就接近0。因此在最後計算每種可能所佔比重時,自然大的數值比重大。

我們說下分類問題

我們想要把一個二維圖分成幾類,我們之前是怎麼做的?

image

畫一條直線,這個問題還是比較簡單,一條直線解決不了兩條就可以了

image

這就是我們的一個沒有激活函數的網絡,可以看出該網絡是x1和x2的線性組合

image

image

你可能會說了,那再加一層呢??
再加一層變爲y=w11(w1x1+w2x2+b)+w22(w1x1+w2x2+b)+b
請拆開看一下——————是不是還是線性的?這樣就嚴重影響了我們分類的效果,我們根本無法解決非線性問題。

那麼加上激活函數(activation function)就不一樣

激活函數其實是對應到生物學上的定義,激活狀態爲有信號,非激活狀態爲無信號。然而對應到這裏的激活函數,其實就有些變質了,如果還在想着激活爲1,非激活爲0,那麼是無法理解神經網絡中的激活函數的。
神經網絡的激活函數其實是將線性轉化爲非線性的一個函數,並非只是簡單地給予0,或者給予1。

image

image

image

1.對於分類問題,當然0,1就可以解決問題了,而且可以看出我們的結果也只有0~1,那想讓y輸出是其他呢?答案肯定是有的,先看下邊激活函數

image

image

Sigmoid 非線性映射實數到[0,1]區間,右:tanh非線性映射實數到[-1,1]區間
這兩種方法都有梯度消失的缺點
網上也會有很多人說——在靠近最大值和最小值時,梯度近似爲0

要想解決這個問題我們需要一個問題一個問題來入手
梯度是什麼?
梯度是損失函數對w的求導
爲什麼是這個?
因爲我們需要讓我們的預測結果接近真實的結果,而我們的損失函數是什麼?
損失函數是(實際值-預測值)的均方差。
那麼調整什麼會對預測結果造成影響?
調整y=f(wx+b)的w,b,一般情況下會有這種寫法:

這是一種說法,另一種更爲具體的是需要誰,就對誰求導

這裏也可以看出來加了一個1/2,目的是在求導時候與導數的2相抵消。而前面的α是學習速率,只是一個係數,這裏不着重強調了,有專門關於這個的講解的文章。
這裏提一下,爲什麼學習速率太大就會導致不收斂呢,梯度一直在減小的,那麼梯度學習速率不是也減小了嗎?
聽我說吧,不是這樣的,梯度確實應該隨着迭代減小,可是……學習速率過大,梯度下降都困難

image

從上邊也可以看出,我們求導主要還是針對了激活函數,當我們的結果越來越趨向於最終結果時,很有可能進入函數的飽和區,也就是s型函數近似爲平行線的區域,這時我們的求解即使沒有達到最優,我們的迭代也不再變化了。
這裏在深度學習中還有兩個概念梯度消失和梯度爆炸

sigmoid,梯度消失就會很明顯了,梯度不大於0.25

image

tanh比sigmoid要好一些,但是它的倒數仍然是小於1的

iamge

ReLU

image

f(x)=max(0,x)
把小於0的x全部移動到0
ReLU 得到的SGD的收斂速度會比 sigmoid/tanh 快很多,不過假如你的learning rate 很大,那麼很有可能你網絡中的40%的神經元都”dead”了。
ReLU梯度爲1,只有一邊又飽和的問題,因此其梯度能在深度網絡中傳遞。這很好地解決了上面曲線激活函數的梯度消失和梯度爆炸的問題,因此被廣泛應用在深度學習中。
ReLU同時引入了稀疏的特性(人類在判斷問題時,往往會直接去掉一大部分的無用信息),ReLU完全把小於0的項全部取0

幾個函數解釋

  • sigmoid優缺點:
    優點: 它能夠把輸入的連續實值變換爲0和1之間的輸出,特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1.
    缺點:

    1. sigmoid函數曾經被使用的很多,它也有其固有缺點。

    2. 飽和的神經元會"殺死"梯度,指離中心點較遠的x處的導數接近於0,停止反向傳播的學習過程

    3. sigmoid的輸出不是以0爲中心,而是0.5,這樣在求權重w的梯度時,梯度總是正或負的.

    4. 指數計算耗時

  • tanh優缺點:
    優點:

    1. 梯度消失問題程度 tanh(x)的梯度消失問題比sigmoid要輕
    2. tanh解決了Sigmoid函數的不是zero-centered輸出問題
      缺點:
    3. 梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。
    4. 也正是因爲有缺點,纔有其它激活函數的產生和發展。

ReLU及其衍生函數

ReLU函數其實就是一個取最大值函數,注意這並不是全區間可導的,但是我們可以取sub-gradient,如上圖所示。ReLU雖然簡單,但卻是近幾年的重要成果,有以下幾大優點:

1. 解決了gradient vanishing問題 (在正區間)

2. 計算速度非常快,只需要判斷輸入是否大於0

3. 收斂速度遠快於sigmoid和tanh
  • ReLU也有幾個需要特別注意的問題:

    1. ReLU的輸出不是zero-centered
    2. 壞死: ReLU強制的稀疏處理會減少模型的有效容量(即特徵屏蔽太多,導致模型無法學習到有效特徵)。由於ReLU在x <0時梯度爲0,這樣就導致負的梯度在這個ReLU被置零,而且這個神經元有可能再也不會被任何數據激活,稱爲神經元“壞死”。
    3. 無負值: ReLU和sigmoid的一個相同點是結果是正值,沒有負值.
      儘管如此,ReLU目前仍是最常用的activation function.
  • ReLU變種

    1. 爲了在輸入小於0時能夠輸出負值,人們提出了Leaky ReLU,PReLU和RReLU等激活函數。這些函數的負數端斜率和整數端不同。
      當x<0時,f(x)=axf(x)=axf(x)=ax,其中a非常小,可以避免在x<0時,不能夠學習的情況,公式爲:f(x)=max(ax,x)f(x) = max(ax,x)f(x)=max(ax,x),稱爲Parametric Rectifier(PReLU),將 α作爲可學習的參數
    2. 當 α 從高斯分佈中隨機產生時稱爲Random Rectifier(RReLU)PReLU中,aaa是在根據誤差反向傳播算法進行訓練時確定的,從一個均勻分佈的隨機抽取的數值。測試時,可以取均勻分佈的中值。
      當aaa通常是訓練前確定的, 比如α=0.01,是Leaky ReLU

發佈了157 篇原創文章 · 獲贊 23 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章