友快網

導航選單

【首發推薦】啟用函式的選擇:選擇啟用函式在神經網路的一些小方法

啟用函式,又稱轉換函式,是設計神經網路的關鍵。啟用函式在某種意義上是重要的,因為它被用來確定神經網路的輸出。它將結果值對映為0到1或-1到1等(取決於函式)。啟用函式還有另一個名稱,稱為Squashing函式,當限制了啟用函式的範圍時使用這個名稱。啟用函式應用於神經網路的每個節點,並決定該神經元是否應該被“觸發”/“啟用”。

為什麼選擇啟用函式是非常重要的。

當在隱藏層和輸出層中實現時,啟用函式的選擇非常關鍵。模型的準確性和損失很大程度上依賴於啟用函式。此外,必須根據您對模型的期望來選擇它們。例如,在二值分類問題中,sigmoid函式是一種最優選擇。

啟用函式型別。大致可分為兩類:

線性啟用函式。

非線性啟用函式。

為了方便展示我們匯入如下庫:

import math as m

import matplotlib。pyplot as plt

import numpy as np

import tensorflow as tf

from tensorflow import keras

from tensorflow。keras import layers

Sigmoid

sigmoid啟用函式也稱為logistic函式。Sigmoid函式在迴歸分類問題中非常流行。sigmoid函式給出的值的範圍是0和1。

def sigmoid(x):

return 1 / (1 + m。exp(-x))values_of_sigmoid = []

values_of_x = []

for i in range(-500,500,1):

i = i*0。01

values_of_x。append(i)

values_of_sigmoid。append(sigmoid(i))plt。plot( values_of_x ,values_of_sigmoid)

plt。xlabel(“values of x”)

plt。ylabel(“value of sigmoid”)

tanH

這個函式非常類似於sigmoid啟用函式。這個函式在-1到1的範圍內接受任何實值作為輸入和輸出值。輸入越大(越正),輸出值越接近1。0,而輸入越小(越負),輸出越接近-1。0。Tanh啟用函式計算如下。

def tanh(x):

return (m。exp(x) - m。exp(-x)) / (m。exp(x) + m。exp(-x))values_of_tanh = []

values_of_x = []

for i in range(-500,500,1):

i = i*0。001

values_of_x。append(i)

values_of_tanh。append(tanh(i))plt。plot( values_of_x ,values_of_tanh)

plt。xlabel(“values of x”)

plt。ylabel(“value of tanh”)

Softmax

Softmax啟用函式輸出一個和為1。0的值向量,可以解釋為類隸屬度的機率。Softmax是argmax函式的“軟”版本,它允許一個“贏家通吃”函式的似然輸出。

def softmax(x):

e_x = np。exp(x - np。max(x))

return e_x / e_x。sum()values_of_x = [i*0。01 for i in range(-500,500)]

plt。plot(scores ,softmax(values_of_x))

plt。xlabel(“values of x”)

plt。ylabel(“value of softmax”)

RELU 線性整流單元

ReLU可能是用於隱藏層的最常見的函式。它還可以有效地克服其他以前流行的啟用函式(如Sigmoid和Tanh)的限制。具體來說,它不太容易受到阻止深度模型被訓練的梯度下降消失問題的影響,儘管它可能會遇到諸如飽和單元等其他問題。

def ReLU(x):

return max(0,x)values_of_relu = []

values_of_x = []

for i in range(-500,500,1):

i = i*0。01

values_of_x。append(i)

values_of_relu。append(ReLU(i))plt。plot(values_of_x,values_of_relu)

Leaky ReLU

ReLU的問題:當給ReLU一個負值時,它立即變成零,這降低了模型合適地擬合或從資料訓練的能力。這意味著ReLU啟用函式的任何負輸入都會在圖中立即將該值轉換為零,這反過來又會透過不適當地對映負值而影響結果圖。

為了克服這個問題,Leaky ReLU被引入。

def leaky_ReLU(x):

return max(0。1*x,x)values_of_L_relu = []

values_of_x = []

for i in range(-500,500,1):

i = i*0。01

values_of_x。append(i)

values_of_L_relu。append(leaky_ReLU(i))plt。plot(values_of_x,values_of_L_relu)

下面幾個函式都是RELU的變體基本上都是與Leaky 類似優化了啟用函式負值時的返回

ELU

activation_elu = layers。Activation(‘elu’)x = tf。linspace(-3。0, 3。0, 100)

y = activation_elu(x) # once created, a layer is callable just like a functionplt。figure(dpi=100)

plt。plot(x, y)

plt。xlim(-3, 3)

plt。xlabel(“Input”)

plt。ylabel(“Output”)

plt。show()

SELU

activation_selu = layers。Activation(‘selu’)x = tf。linspace(-3。0, 3。0, 100)

y = activation_selu(x) # once created, a layer is callable just like a functionplt。figure(dpi=100)

plt。plot(x, y)

plt。xlim(-3, 3)

plt。xlabel(“Input”)

plt。ylabel(“Output”)

plt。show()

Swish

activation_swish = layers。Activation(‘swish’)x = tf。linspace(-3。0, 3。0, 100)

y = activation_swish(x) # once created, a layer is callable just like a functionplt。figure(dpi=100)

plt。plot(x, y)

plt。xlim(-3, 3)

plt。xlabel(“Input”)

plt。ylabel(“Output”)

plt。show()

總結

常用於隱藏層啟用函式:

一般遞迴神經網路使用Tanh或sigmoid啟用函式,甚至兩者都使用。例如,LSTM通常對迴圈連線使用Sigmoid啟用,對輸出使用Tanh啟用。

1。多層感知器(MLP): ReLU啟用函式。

2。卷積神經網路(CNN): ReLU啟用函式。

3。遞迴神經網路:Tanh和/或Sigmoid啟用函式。

如果你不確定使用哪個啟用函式,你肯定可以嘗試不同的組合,並尋找最適合的,但是可以從RELU開始

輸出層啟用功能:

輸出層啟用函式必須根據你要解決的問題型別來選擇。例如,如果你有一個線性迴歸問題,那麼線性啟用函式將是有用的。下面是您可能面臨的一些常見問題和使用的啟用函式。

二進位制分類:一個節點,sigmoid啟用。

多類分類:每個類一個節點,softmax啟用。

多標籤分類:每個類一個節點,sigmoid啟用。

以下是一些常用啟用函式的公式和視覺化顯示,希望對你有幫助

作者:Rishabh sharma

deephub翻譯組

上一篇:鴻蒙系統遭遇生死考驗,華為主動冰釋前嫌,渴望友商伸出援手!!!
下一篇:redmi公佈了2條訊息,都說note系列銷量破2億,而且還有一部手機熱賣