天天看點

從0到1 激活函數(一)sigmod函數

文章目錄

    • 引言
    • sigmod的函數
      • 簡介
      • 定義
      • 導數
      • 圖像
    • 激活函數
      • 激活函數的定義
      • 簡介
      • sigmod作為激活函數的時候存在的問題
    • 其他資料

引言

本節主要是介紹神經網絡中常見的激活函數-----sigmod函數。

sigmod的函數

簡介

sigmod的函數是一個在生物學中常見的S型函數,也稱為S型生長曲線。在資訊科學中,由于其單增以及反函數單增等性質,常被用作神經網絡的激活函數,将變量映射到0,1之間。-------------摘自《百度百科》

sigmod函數也叫作Logistic函數,用于隐層神經單元輸出,取值範圍為(0,1),它可以将一個實數映射到(0,1)的區間,可以用來做二分類。在特征相差比較複雜或者相差不是特别大的時候效果比較好。

優點: 平滑、易于求導。

缺點: 激活函數計算量大,反向傳播求誤差的時候,求導涉及到除法,很容易出現梯度消失的情況,進而無法完成深層網絡的訓練。

定義

f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1​

導數

對其求導可以得到:

f ( x ) = e − x ( 1 + e − x ) 2 = f ( x ) ( 1 − f ( x ) ) f(x)=\frac{e^{-x}}{(1+e^{-x})^{2}}=f(x)(1-f(x)) f(x)=(1+e−x)2e−x​=f(x)(1−f(x))

導數圖像為:

從0到1 激活函數(一)sigmod函數

其生成代碼為:

def plot_sigmoid_dao():
    x=np.arange(-8,8,0.1)
    y=sigmoid(x)*(1-sigmoid(x))
    plt.plot(x,y)
    plt.show()
           

圖像

它的圖像為(形如S曲線):

從0到1 激活函數(一)sigmod函數

圖像生成的python代碼為:

import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
    return 1.0/(1+np.exp(-x))

def plot_sigmoid():
    x=np.arange(-8,8,0.1)
    y=sigmoid(x)
    plt.plot(x,y)
    plt.show()

if __name__ == '__main__':
    plot_sigmoid()
           

激活函數

激活函數的定義

激活函數是神經網絡中極為重要的一個概念,它決定了某個神經元是否被激活,這個神經元接受到的資訊是否有用,是該留下還是該抛棄掉。在神經網絡中我們需要一個機制來區分有用資訊和無用資訊,類似于大腦中的神經元,有的神經對于某些信号是敏感的而有些神經元對這些信号是抑制的,在神經網絡中能起到這個作用的就是激活函數。

激活函數的形式為: y = f ( ∑ i = 1 n w i x i − θ ) y=f(\displaystyle\sum_{i=1}^{n} w_ix_i-\theta) y=f(i=1∑n​wi​xi​−θ) 公 式 ( 1 ) 公式(1) 公式(1)

其中 f f f即為激活函數。 θ \theta θ為我們之前提到的神經元的激活門檻值。

簡介

從0到1 激活函數(一)sigmod函數

在神經網絡中,上層神經元的輸出和下層神經元的輸入之間存在一個關系:例如:輸入層神經元節點會将神經網絡的初始輸入值直接傳遞給下一層(隐藏層或者輸出層)(直接傳遞或者線性變換);隐藏層神經元節點會将輸出值作為下一層(隐藏層或者輸出層)神經元節點的輸入值,而且往往不是簡單地一個直接傳遞或者簡單的映射,而是具有一個函數關系(如公式(1)所示),這個函數就是激活函數(又稱激勵函數)。

實際上,激活函數可以看作是變量間的一個非線性變換,通過引入激活函數來增加神經網絡模型的非線性,以便增加對樣本非線性關系的拟合能力(在現實生活中,大部分的資料都是線性不可分的)。隻有加入了激活函數之後,深度神經網絡才具備了分層的非線性映射學習能力。

如果不用激勵函數,在這種情況下,你每一層節點的輸入都是上層輸出的線性函數,很容易驗證,無論神經網絡有多少層,輸出都是輸入的線性組合,與沒有隐藏層的效果相當,這種情況下就是最原始的多層感覺機了(MLP),那麼網絡的逼近能力就相當有限。而現實生活中大部分的資料都不是線性可分的,正是因為這樣,才引入了非線性的函數作為激活函數,這樣深層神經網絡表達能力就更加強大了。(不再是輸入的線性組合,而是幾乎可以逼近的任意函數。)

首先,我們将原函數及其導數畫在同一個圖像中

從0到1 激活函數(一)sigmod函數

sigmod作為激活函數的時候存在的問題

  1. 當很多個使用sigmoid激活函數的Layers 加到神經網絡中時,損失函數的梯度會接近0,這會導緻 network難以訓練。因為通過上圖可以看出,當輸入值很小或者很大的時候,sigmod的梯度都會趨向于0,而我們經常使用梯度乘以學習率來更新權值函數的,是以會導緻權值改變非常小,難以訓練。
  2. 通過問題1 可以知道你需要尤其注意參數的初始值來盡量避免saturation(飽和,即梯度趨于0)的情況。也就是說對初始值是有所限制的。(其實,縱使是限制了,對于層數較多的神經網絡來說,效果也不是特别好。)
  3. 會導緻梯度消失或者梯度爆炸。如果是隻有幾個sigmoid層的淺層神經網絡,這并不會引起很大的問題。然而,當非常多的sigmoid層時,就會産生問題。通常我們會初始化參數的值在(0,1)之間,通過sigmod的導數圖像來看,當輸入在(0,1)之間的時候,梯度值大約在(0.2-0.25)之間(可以将圖像放大來看,如下圖)。由反向傳播算法的數學推導可知,梯度從後向前傳播時,每傳遞一層梯度值都會減小為原來的0.25倍,如果神經網絡隐層特别多,那麼梯度在穿過多層後将變得非常小接近于0,即出現梯度消失現象;當網絡權值初始化為 (1,+∞) 區間内的值,則會出現梯度爆炸情況,梯度爆炸的情況還是比較少見的。推導如下,或者參見這裡。
    從0到1 激活函數(一)sigmod函數

神經網絡的梯度通過反向傳播來得到,簡單的說,反向傳播通過從最終層到初始層,誤差逐層傳播來得到梯度,通過鍊式求導法則,每一層的導數會乘到一起來計算初始層的導數。

  1. Sigmoid 的 output 不是0均值. 這是不可取的,因為這會導緻後一層的神經元将得到上一層輸出的非0均值的信号作為輸入。 産生的一個結果就是:如果資料進入神經元的時候是正的(e.g. elementwise in ),那麼 計算出的梯度也會始終都是正的。

為了解決sigmod這種問題,後面出現了Thah、Relu等激活函數。具體的見後面的章節。

其他資料

1、幾種激活函數

這裡面包含了幾種常見的激活函數公式及其圖像代碼。

【本章完】