1. 程式人生 > >深度學習---啟用函式

深度學習---啟用函式

  在說常用的啟用函式之前,先看一下生物神經元與人工神經元之間的啟用函式的區別。
  在生物神經元中,啟用函式的作用為:是否相應上一個神經元,如果響應比較大,則啟用下一個神經元,往下以此傳遞。而人工神經元中的啟用函式,又成為“非線性對映函式”,它並不是去啟用什麼東西,而是增加神經網路的非線性因素,提升神經網路的表達能力。下面介紹常見的幾種啟用函式:sigmoid、tanh、relu等。
啟用函式

sigmoid函式

sigmoid(x)=1/1+ex
  函式曲線為:
sigmoid函式
  sigmoid啟用函式:將輸出對映到[0,1],但是x指的範圍只有[-5,+5],當|x| >5時,sigmoid的梯度為0,在神經網路的方向傳播過程中,導數處於該區域的誤差很難甚至無法傳至前層,就會導致引數無法更新,引起梯度消失,進一步導致神經網路無法訓練。並且它的輸出也不是以0為中心,這與神經網路期望均值為0是不相符的。

tanh函式

tanh(x)=1e2x/1+e2x
  函式曲線為:
tanh函式
  tanh啟用函式將輸出結果對映到[-1,1];比sigmoid函式的收斂速度要快;結果是以0為中心對稱,但是它依然不能解決梯度消失的問題。

relu啟用函式

  relu函式,在深度學習中使用非常廣泛,函式的公式為:relu(x)=max(x,0),它對應的去曲線為:
relu
  相比simmoid與tanh啟用函式,它在SGD中可以加速模型的收斂;並且解決了梯度消失的問題;同時提高了神經網路稀疏的表達能力。
  但relu又一個設計設計缺陷,當x<0時,引數的梯度為0,這將導致這部分引數不能更新,而引起“死區”現象。
  最後附上啟用函式的實現程式碼,雖然比較Easy,但有程式碼,看起來還是比較方便的。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10,11)
def show_pic(x,y):
    plt.plot(x,y)
    plt.show()

def tanh(x):
    y = (1 - np.exp(-2*x))/(1 + np.exp(-2*x))
    show_pic(x,y)

def sigmoid(x):
    y = 1/(1 + np.exp(-x))
    show_pic(x,y)

def relu(x):
    y = []
    for data in
x: if data>0: y.append(data) else: y.append(0) show_pic(x,y) relu(x) tanh(x) sigmoid(x)