讓女朋友都能聽懂的激活函數(激活函數)

激活函數原理詳解

向女朋友介紹系列之激活函數。通過激活一詞的解釋,循循引入神經網絡爲什麼要激活函數。分析了幾種常見的激活函數並且激活函數的特點。  

目錄

激活函數原理詳解

激活函數是什麼

感知機中的激活函數

神經網絡中的激活函數

下面咱們來具體看幾個激活函數

sigmod激活函數

Tanh(雙曲正切函數)激活函數

ReLU激活函數(最近最常使用的激活函數)

Leaky ReLU激活函數

輸出層的激活函數

激活函數的特點



激活函數是什麼

大管今天準備和大家來聊一聊激活函數,爲了讓女朋友也能夠聽的懂,我們還是從最簡單的事情說起。

    上文的末尾說到了激活函數的作用在於決定如何來激活輸入信號的總和。那究竟什麼是激活呢?憑着我們最直觀的感受就是從一種狀態轉變爲另一種狀態(突然想起以前有一種功能飲料——激活,你可以想想它的廣告,一個人開始是疲憊不堪慢悠悠的狀態,喝了激活之後,瞬間變成了精神抖擻的精神小夥,很好的詮釋了激活一詞的含義)。迴歸正題,神經網絡畢竟是在模擬人腦的神經元,從生物學上來說,是因爲人腦的細胞接受刺激從而產生活動,首先需要一定的閾值,沒有達到閾值,幾乎沒用。而不同的刺激產生的輸出也是不同的,達到一定值後就飽和了,再加大也沒用。作爲模擬人腦的人工神經網絡,自然是需要某種機制來模擬這一種活動,這便是激活函數根本性的由來。

感知機中的激活函數

     在上文中大管一直提到了一個詞"閾值",比如說,當x大於0,我們就把它輸出爲1,當其小於0,我們就把它輸出爲0,這樣的函數我們稱之爲“階躍函數”,如下圖所示:

上圖中,藍色的線就是階躍函數的線。它的實現非常簡單:

def step_function(x):
    if x>0:
        return 1
    else:
        return 0

實際上,如果將階躍函數換成其他的函數就進入了神經網絡世界了(實現了階躍的功能)。

神經網絡中的激活函數

大管在這裏和各位大佬聊幾個常用的神經網絡中的激活函數。

      在說之前,我們應該注意神經網絡中的激活函數必須使用非線性函數。爲什麼不能使用線性函數作爲激活函數呢,因爲使用線性函數的話,加深神經網絡的層數就沒有意義了。那怎麼就沒有意義了呢?當我們使用線性函數作爲神經網絡的激活函數時,會發現總是存在與之等效的無隱藏層的神經網絡。比如,我們將h(x)=cx作爲神經網絡的激活函數(c爲常數),那麼三層神經網絡之後的激活函數可以寫成y(x)=h(h(h(x))),將激活函數帶入,得到y(x)=c*c*c*x,我們令c*c*c=a(都爲常數),則y(x)=ax,這是我們發現它相當於沒有了隱藏層。所以爲了發揮隱藏層(深度學習中的深度)的優勢(隱藏層即疊加層,它的優勢在疊加感知機中體現了),激活函數必須使用非線性函數。

下面咱們來具體看幾個激活函數

sigmod激活函數

其公式爲:

看着公式我們將sigmod激活函數的代碼實現如下:

def sigmod(x):
    y = 1/(1+np.exp(-x))
    return y

我們將其圖像畫出來:

      從sigmod的函數圖像中看到它和階躍函數的圖像很像,當輸入很小的時候,輸出都接近於0,隨着輸入的增大,輸出更加向1靠攏,不過輸入信號有多少,輸出信號總是在0-1之間。只不過它比階躍函數更加平滑了許多(平滑性對神經網絡的學習具有重要的意義),它的特點也顯而易見,求導簡單,是單調函數,在定義域內處處可導(先不考慮爲什要求導),在x接近無窮時,導數接近於0,梯度接近消失(飽和性)。

Tanh(雙曲正切函數)激活函數

其公式爲:

看着公式我們將tanh激活函數的代碼實現如下:

def tanh(x):
    y = (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
    return y

我們將其函數圖像畫出來:

      從圖像上看它和sigmod激活函數圖像也很相似,只是相當於將sigmod向下平移。但是仔細觀察圖像,它和sigmod函數的圖像又有區別,它解決了sigmod函數的輸出不關於零點對稱問題,雖然它的最大值最小值有所調整,但是也不能解決梯度消失的問題,同時它的計算量也很大,包含冪運算。

ReLU激活函數(最近最常使用的激活函數)

其公式爲:

我們將ReLU激活函數的代碼實現如下:

def ReLU(x):
    y = np.maximum(0,x)
    return y

我們將其圖像畫出來:

      從圖像上看,它和前兩種激活函數有很大的區別。右側爲單調函數,雖然ReLU在數學上的定義x=0處是不可導的,但是實際中爲了解決這個問題直接將處的導數設置爲1 ,當x>0時,Relu’(x) = 1,   當x<=0時,Relu’(x) = 0。它計算量小,相對於之前使用sigmoid和Tanh激活函數需要進行指數運算,緩解了在深層網絡中使用sigmoid和Tanh激活函數造成了梯度消失的現象,同時也緩解了過擬合的問題,由於函數會使小於零的值變成零,使得一部分神經元的輸出爲0,造成特徵的稀疏性,如果特徵是稀疏的,那就有更大的線性可分的可能性,高維的稀疏特徵空間上會被映射到一個更加簡單的低維流形面上,減少參數相互依賴的關係緩解過擬合的問題(劃重點)。但是Relu激活函數在小於0的部分都會爲0,使得小於0的部分的信息完全丟棄(死亡)。爲了解決這一問題,有專家又對其進行了改進,我們來看其中的一種激活函數。

Leaky ReLU激活函數

其公式爲:

我們將Leaky ReLU激活函數的代碼實現如下:

def ReLU(x,a):
    y = np.maximum(ax,x)
    return y

我們將其圖像畫出來:

      從圖像中看它對Relu函數進行了優化,思路就是讓函數小於0的部分不直接爲0,而是等於一個很小的數,使得負軸的信息不至於完全丟棄。

輸出層的激活函數

      神經網絡可以用在分類問題和迴歸問題上,不過需要依據現實情況改變輸出層的激活函數。大體上說,迴歸問題使用恆等函數,分類爲問題使用softmax函數。

恆等函數會將輸入按照原樣進行輸出,對輸入信息不加以任何的改動。

softmax函數可以使用下面的公式表示:

      輸出層有n個神經元,計算第k個神經元的輸出yk。通過公式可以看到,其輸出時0—1之間的實數,並且其輸出值的和總是1,因此我們可以將softmax函數的輸出看做“概率”。需要注意的是,即使輸出層使用了softmax函數,各個神經元之間的大小關係也不會改變,輸出值最大的神經元的位置也不會改變,神經網絡只是把輸出值最大的神經元對應的類別作爲識別的結果。所以神經網絡進行分類時,輸出層的softmax函數可以省略。

如果要使用softmax函數時,因爲公式裏有指數運算,需要格外當心溢出的問題。經常使用如下方法對softmax函數進行改進:

原則上上述的C'可以使用任何值,但是爲了防止溢出的發生,一般使用輸入信號中的最大值。

我們將softmax函數實現如下:


def softmax(a):
    c = np.max(a)
    e_a = np.exp(a - c)
    sum_e_a = np.sum(e_a)
    y = e_a/sum_e_a
    return y

激活函數的特點

     上文比較了幾個常見的激活函數,那具體什麼樣子的函數適合做激活函數呢(激活函數有什麼共同的特點呢)?

首先是非線性,前面有過解釋,如果是線性的激活函數就會失去深度學習的意義;

其次是幾乎處處可微,可微的條件使得激活函數的梯度優化具有可能性,對於分段線性函數比如ReLU,只滿足幾乎處處可微,但是對於SGD算法來說,有限的不可微點對於優化結果不會有很大的影響;

還有計算簡單,這也是Relu激活函數受歡迎的原因之一;

保證某些區間導數不爲0(非飽和性),某些區間梯度的消失會使得參數無法進行更新,比如說Leaky ReLU的出現正式改進了Relu在小於0的區間梯度消失;

單調性,激活函數的單調性使得梯度的方向不經常發生改變,從而更容易收斂;

多內容下載機器學習資料請掃描下方二維碼關注小編公衆號:程序員大管

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章