神經網路啟用函式

2021-08-21 17:03:19 字數 3296 閱讀 3476

2018, jul 23

學了深度學習也快近一年了,在學deep learning的時候什麼教程都去看,起初學起來也特別的雜亂,前面的基礎沒弄懂還一直往下學,自然導致我學到後面的時候有點崩潰什麼都看不懂,並且因為自己還是一名在校生,平常課程也非常多,沒有乙個連續的學習時間也導致我的學習是斷斷續續,在學習的路上走過許多坑,什麼都去學,也導致自己浪費了許多的時間去做了一些無用功,因此也有許多自己的理解與學習過程中的一些心得,今天決定開始寫博文,一方面能鞏固自己的基礎,另一方面也能讓我對deep learning不一樣的見解,畢竟"溫故而知新"所以我將從一些神經網路中比較基礎的部分來談談自己的認識。

首先,從神經網路的啟用函式來看,神經網路最常見的並且常用的啟用函式莫過於一下幾種:sigmoid,tanh,relu,leaky relu,本文主要從前三種進行分析。 然後在進行神經網路單元啟用的同時常常會有這麼一行表示式:

想必大家都不陌生.

import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline

x = np.arange(-10, 10,1)

w = 1

b = 1

y = w * x + b

print (y)

plt.plot(x,y)

plt.show()

這段程式的輸出是這樣的:

定義函式並且列印座標與影象(ps:定義求導函式是為了理解為什麼relu是用的比較多的啟用函式,下同)

def  sigmoid(x):

'''#定義sigmoid

'''return 1. / (1. + np.exp(-x))

def derivation_sigmoid(y_sigmoid):

'''#sigmoid求導

'''return y_sigmoid * (1 - y_sigmoid)

y_sigmoid = sigmoid(x)

y_der_sig = derivation_sigmoid(y_sigmoid)

print('y_sigmoid:' + str(y_sigmoid))

print('y_der_sig:' + str(y_der_sig))

plt.plot(x, y_sigmoid, color = "blue")

plt.plot(x, y_der_sig, color = "red")

plt.show()

函式的原圖與求導後的輸出結果與影象如下:

可以看出sigmoid函式在求導後兩側導數無限趨近於0,導致了神經元向更深層的網路傳遞的梯度變得非常小。網路引數很難得到有效訓練。這種現象被稱為梯度消失或者梯度瀰散。

def tanh(x):

'''#定義tanh

'''return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))

def derivation_tanh(y_tanh):

'''#tanh求導

'''return 1 - y_tanh ** 2

y_tanh = tanh(y)

y_der_tanh = derivation_tanh(y_tanh)

print ('y_tanh:' + str(y_tanh))

print ('y_der_tanh:' + str(y_der_tanh))

plt.plot(y, y_tanh, color = 'blue')

plt.plot(y, y_der_tanh, color = 'red')

plt.show()

函式的原函式與求導後的輸出結果與影象如下:

同上可以看出tanh函式在求導後兩側導數無限趨近於0,也同樣梯度消失或者梯度瀰散的問題。

def relu(x):

'''#修正線性單元(rectified linear unit)

# max(0, x)

'''return np.array([0 * item if item <= 0 else item for item in x ])

def derivation_relu(x):

'''#relu導數(分段):

#x <= 0時,導數為0

#x > 0時,導數為1

'''return np.array([0 * item if item <= 0 else 1 for item in x ])

y_relu = relu(x)

print('y_relu:' + str(y_relu))

plt.plot(x, y_relu,color = "blue")

plt.show()

y_der_relu = derivation_relu(y_relu)

print('y_der_relu:' + str(y_der_relu))

plt.plot(x, y_der_relu,color = "red")

plt.show()

函式的輸出結果與影象如下:

而relu在

因此relu能夠在x>0部分保持梯度不會衰減,但是也存在乙個問題,會出現神經元壞死的情況,因為有的神經元可能永遠不會被啟用

那麼談了這麼多,數啟用函式到底是拿來幹嘛用的呢?用一句話概括就是:啟用函式可以引入非線性因素,解決線性模型所不能解決的問題

啟用函式 神經網路

andrew的 neural networks and deep learning 課程學習筆記 如圖所示,是乙個簡單的三層神經網路,如果只使用線性啟用函式或者恒等啟用函式 不使用啟用函式 那麼神經網路的輸出就只是輸入函式的線性變化,因為線性啟用函式的組合依然是線性啟用函式。這種情況下,不管使用多少...

神經網路啟用函式

1.sigmoid sigmoid散活函式是將 乙個實數輸入轉化至 0 1 之間的輸出,具體來說也就是將越大的負數轉化到越靠近 0 越大的正數轉化到越靠近1。多用於二分類。缺點 1 sigmoid 函式會造成梯度消失。乙個非常不好的特點就是 sigmoid 函式在靠近 1和0 的兩端時,梯度會幾乎變...

神經網路 啟用函式對比

本部落格僅為作者記錄筆記之用,不免有很多細節不對之處。還望各位看官能夠見諒,歡迎批評指正。日常 coding 中,我們會很自然的使用一些啟用函式,比如 sigmoid relu等等。不過好像忘了問自己一 n 件事 為什麼需要啟用函式?啟用函式都有哪些?都長什麼樣?有哪些優缺點?怎麼選用啟用函式?此圖...