回覆列表
  • 1 # 八方智造

    現在,我相信我們大家都很熟悉什麼是A-NN了,但接下來請允許我按照自己的理解給A-NN下個定義——它是一個強健有力的,同時也非常複雜的機器學習技術,它可以模仿人類的大腦,繼而模仿大腦的運作。

    正如我們的人腦一樣,在一個層次上和神經元網路中有數百萬個神經元,這些神經元透過一種稱之為synapses(突觸)的結構彼此緊緊相連。它可以透過 Axons(軸突),將電訊號從一個層傳遞到另一個層。這就是我們人類學習事物的方式。 每當我們看到、聽到、感覺和思考時,一個突觸(電脈衝)從層次結構中的一個神經元被髮射到另一個神經元,這使我們能夠從我們出生的那一天起,就開始學習、記住和回憶我們日常生活中的東西。

    好的,接下來我保證大家看到的不再是生物學領域的知識了。

    什麼是啟用函式,它在神經網路模型中是如何使用的?

    啟用函式(Activation functions)對於人工神經網路模型去學習、理解非常複雜和非線性的函式來說具有十分重要的作用。它們將非線性特性引入到我們的網路中。其主要目的是將A-NN模型中一個節點的輸入訊號轉換成一個輸出訊號。該輸出訊號現在被用作堆疊中下一個層的輸入。

    而在A-NN中的具體操作是這樣的,我們做輸入(X)和它們對應的權重(W)的乘積之和,並將啟用函式f(x)應用於其獲取該層的輸出並將其作為輸入饋送到下一個層。

    問題是,為什麼我們不能在不啟用輸入訊號的情況下完成此操作呢?

    如果我們不運用啟用函式的話,則輸出訊號將僅僅是一個簡單的線性函式。線性函式一個一級多項式。現如今,線性方程是很容易解決的,但是它們的複雜性有限,並且從資料中學習複雜函式對映的能力更小。一個沒有啟用函式的神經網路將只不過是一個線性迴歸模型(Linear regression Model)罷了,它功率有限,並且大多數情況下執行得並不好。我們希望我們的神經網路不僅僅可以學習和計算線性函式,而且還要比這複雜得多。同樣是因為沒有啟用函式,我們的神經網路將無法學習和模擬其他複雜型別的資料,例如影象、影片、音訊、語音等。這就是為什麼我們要使用人工神經網路技術,諸如深度學習(Deep learning),來理解一些複雜的事情,一些相互之間具有很多隱藏層的非線性問題,而這也可以幫助我們瞭解複雜的資料。

    那麼為什麼我們需要非線性函式?

    非線性函式是那些一級以上的函式,而且當繪製非線性函式時它們具有曲率。現在我們需要一個可以學習和表示幾乎任何東西的神經網路模型,以及可以將輸入對映到輸出的任意複雜函式。神經網路被認為是通用函式近似器(Universal Function Approximators)。這意味著他們可以計算和學習任何函式。幾乎我們可以想到的任何過程都可以表示為神經網路中的函式計算。

    而這一切都歸結於這一點,我們需要應用啟用函式f(x),以便使網路更加強大,增加它的能力,使它可以學習複雜的事物,複雜的表單資料,以及表示輸入輸出之間非線性的複雜的任意函式對映。因此,使用非線性啟用函式,我們便能夠從輸入輸出之間生成非線性對映。

    啟用函式的另一個重要特徵是:它應該是可以區分的。我們需要這樣做,以便在網路中向後推進以計算相對於權重的誤差(丟失)梯度時執行反向最佳化策略,然後相應地使用梯度下降或任何其他最佳化技術最佳化權重以減少誤差。

    只要永遠記住要做:

    “輸入時間權重,新增偏差和啟用函式”

    最流行的啟用函式型別

    1.Sigmoid函式或者Logistic函式

    2.Tanh — Hyperbolic tangent(雙曲正切函式)

    3.ReLu -Rectified linear units(線性修正單元)

    ·梯度消失問題

    ·其次,它的輸出不是以0為中心。它的梯度更新在不同的方向上且走得太遠。 0 <output <1,使最佳化更加困難。

    ·Sigmoids函式飽和且kill掉梯度。

    ·Sigmoids函式收斂緩慢。

    現在我們該如何解決上述問題?

    雙曲正切函式——Tanh:其數學公式是f(x)= 1 - exp(-2x)/ 1 + exp(-2x)。現在它的輸出是以0中心的,因為它的值區間在-1到1之間,即-1 <output <1。 因此,在該方法中最佳化更容易一些,從而其在實踐應用中總是優於Sigmoid函式。 但它依然存在著梯度消失問題。

    那麼我們該如何處理和糾正梯度消失問題呢?

    ReLu -Rectified linear units(線性修正單元):其實在過去幾年中它就已經非常受歡迎了。最近證明,相較於Tanh函式,它的收斂性提高了6倍。只要R(x)= max(0,x),即如果x <0,R(x)= 0,如果x> = 0,則R(x)= x。因此,只看這個函式的數學形式,我們就可以看到它非常簡單、有效。其實很多時候我們都會注意到,在機器學習和計算機科學領域,最簡單、相容的技術和方法才是首選,才是表現最好的。因此,它可以避免和糾正梯度消失問題。現如今,幾乎所有深度學習模型現在都使用ReLu函式。

    但它的侷限性在於它只能在神經網路模型的隱藏層中使用。

    因此,對於輸出層,我們應該使用Softmax函式來處理分類問題從而計算類的機率。而對於迴歸問題,它只要簡單地使用線性函式就可以了。

    ReLu函式的另一個問題是,一些梯度在訓練過程中可能很脆弱,甚至可能會死亡。它可以導致權重更新,這將使其永遠不會在任何資料點上啟用。簡單地說ReLu可能會導致死亡神經元。

    為了解決這個問題,我們引進了另一個被稱為Leaky ReLu的修改函式,讓它來解決死亡神經元的問題。它引入了一個小斜坡從而保持更新值具有活力。

    然後,我們還有另一個變體,它形成於ReLu函式和Leaky ReLu函式的結合,我們稱之為Maxout函式。

    結論

    問題是哪一個更好用呢?

    這個問題的答案就是,現在我們應該使用只應用於隱藏層的ReLu函式。當然,如果我們的模型在訓練過程中遇到死亡神經元,我們就應該使用leaky ReLu函式或Maxout函式。

    而考慮到現實的情況,Sigmoid函式和Tanh函式是不適用的,因為梯度消失問題(vanishing Gradient Problem)是一個很嚴重的問題,會在訓練一個神經網路模型中導致更多問題。

  • 2 # 機器之心Pro

    本文從啟用函式的背景知識開始介紹,重點講解了不同型別的非線性啟用函式:Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish,並詳細介紹了這些函式的優缺點。

    1. 什麼是啟用函式?

    生物神經網路啟發了人工神經網路的發展。但是,ANN 並非大腦運作的近似表示。不過在我們瞭解為什麼在人工神經網路中使用啟用函式之前,先了解生物神經網路與啟用函式的相關性是很有用處的。

    典型神經元的物理結構包括細胞體(cell body)、向其他神經元傳送訊號的軸突(axon)和接收其他神經元傳送的訊號或資訊的樹突(dendrites)。

    生物神經網路

    上圖中,紅色圓圈代表兩個神經元交流的區域。神經元透過樹突接收來自其他神經元的訊號。樹突的權重叫作突觸權值(synaptic weight),將和接收的訊號相乘。來自樹突的訊號在細胞體內不斷累積,如果訊號強度超過特定閾值,則神經元向軸突傳遞資訊。如未超過,則訊號被該神經元「殺死」,無法進一步傳播。

    啟用函式決定是否傳遞訊號。在這種情況下,只需要帶有一個引數(閾值)的簡單階梯函式。現在,當我們學習了一些新的東西(或未學習到什麼)時,一些神經元的閾值和突觸權值會發生改變。這使得神經元之間產生新的連線,大腦學會新的東西。

    讓我們再次理解這一概念,不過這次要使用人工神經元。

    上圖中(x_1, ..., x_n)是訊號向量,它和權重(w_1, ..., w_n)相乘。然後再累加(即求和 + 偏置項 b)。最後,啟用函式 f 應用於累加的總和。

    注意:權重(w_1, ..., w_n)和偏置項 b 對輸入訊號進行線性變換。而啟用函式對該訊號進行非線性變換,這使得我們可以任意學習輸入和輸出之間的複雜變換。

    過去已經出現了很多種函式,但是尋找使神經網路更好更快學習的啟用函式仍然是活躍的研究方向。

    2. 神經網路如何學習?

    我們有必要對神經網路如何學習有一個基本瞭解。假設網路的期望輸出是 y(標註值),但網路實際輸出的是 y"(預測值)。預測輸出和期望輸出之間的差距(y - y")可以轉化成一種度量,即損失函式(J)。神經網路犯大量錯誤時,損失很高;神經網路犯錯較少時,損失較低。訓練目標就是找到使訓練集上的損失函式最小化的權重矩陣和偏置向量。

    在下圖中,損失函式的形狀像一個碗。在訓練過程的任一點上,損失函式關於梯度的偏導數是那個位置的梯度。沿偏導數預測的方向移動,就可以到達谷底,使損失函式最小化。使用函式的偏導數迭代地尋找區域性極小值的方法叫作梯度下降。

    人工神經網路中的權重使用反向傳播的方法進行更新。損失函式關於梯度的偏導數也用於更新權重。從某種意義上來說,神經網路中的誤差根據求導的鏈式法則執行反向傳播。這透過迭代的方式來實施,經過多次迭代後,損失函式達到極小值,其導數變為 0。

    我們計劃在其他文章中介紹反向傳播。這裡主要指出的就是訓練過程中出現的求導步驟。

    3. 啟用函式的型別

    線性啟用函式:這是一種簡單的線性函式,公式為:f(x) = x。基本上,輸入到輸出過程中不經過修改。

    線性啟用函式

    非線性啟用函式:用於分離非線性可分的資料,是最常用的啟用函式。非線性方程控制輸入到輸出的對映。非線性啟用函式有 Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish 等。下文中將詳細介紹這些啟用函式。

    非線性啟用函式

    4. 為什麼人工神經網路需要非線性啟用函式?

    神經網路用於實現複雜的函式,非線性啟用函式可以使神經網路隨意逼近複雜函式。沒有啟用函式帶來的非線性,多層神經網路和單層無異。

    現在我們來看一個簡單的例子,幫助我們瞭解為什麼沒有非線性,神經網路甚至無法逼近異或門(XOR gate)、同或門(XNOR gate)等簡單函式。下圖是一個異或門函式。叉和圈代表了資料集的兩個類別。當 x_1、x_2 兩個特徵一樣時,類別標籤是紅叉;不一樣,就是藍圈。兩個紅叉對於輸入值 (0,0) 和 (1,1) 都有輸出值 0,兩個藍圈對於輸入值 (0,1) 和 (1,0) 都有輸出值 1。

    異或門函式的圖示

    從上圖中,我們可以看到資料點非線性可分。也就是說,我們無法畫出一條直線使藍圈和紅叉分開來。因此,我們需要一個非線性決策邊界(non-linear decision boundary)來分離它們。

    啟用函式對於將神經網路的輸出壓縮排特定邊界內也非常關鍵。神經元的輸出值可以非常大。該輸出在未經修改的情況下饋送至下一層神經元時,可以被轉換成更大的值,這樣過程就需要極大算力。啟用函式的一個任務就是將神經元的輸出對映到有界的區域(如,0 到 1 之間)。

    瞭解這些背景知識之後,我們就可以瞭解不同型別的啟用函數了。

    5. 不同型別的非線性啟用函式

    5.1 Sigmoid

    Sigmoid又叫作 Logistic 啟用函式,它將實數值壓縮排 0 到 1 的區間內,還可以在預測機率的輸出層中使用。該函式將大的負數轉換成 0,將大的正數轉換成 1。數學公式為:

    下圖展示了 Sigmoid 函式及其導數:

    Sigmoid 啟用函式

    Sigmoid 導數

    Sigmoid 函式的三個主要缺陷:

    1. 梯度消失:注意:Sigmoid 函式趨近 0 和 1 的時候變化率會變得平坦,也就是說,Sigmoid 的梯度趨近於 0。神經網路使用 Sigmoid 啟用函式進行反向傳播時,輸出接近 0 或 1 的神經元其梯度趨近於 0。這些神經元叫作飽和神經元。因此,這些神經元的權重不會更新。此外,與此類神經元相連的神經元的權重也更新得很慢。該問題叫作梯度消失。因此,想象一下,如果一個大型神經網路包含 Sigmoid 神經元,而其中很多個都處於飽和狀態,那麼該網路無法執行反向傳播。

    2. 不以零為中心:Sigmoid 輸出不以零為中心的。

    3. 計算成本高昂:exp() 函式與其他非線性啟用函式相比,計算成本高昂。

    5.2 Tanh

    Tanh 啟用函式

    Tanh 導數

    Tanh 啟用函式又叫作雙曲正切啟用函式(hyperbolic tangent activation function)。與 Sigmoid 函式類似,Tanh 函式也使用真值,但 Tanh 函式將其壓縮至-1 到 1 的區間內。與 Sigmoid 不同,Tanh 函式的輸出以零為中心,因為區間在-1 到 1 之間。你可以將 Tanh 函式想象成兩個 Sigmoid 函式放在一起。在實踐中,Tanh 函式的使用優先性高於 Sigmoid 函式。負數輸入被當作負值,零輸入值的對映接近零,正數輸入被當作正值。唯一的缺點是:

    1. Tanh 函式也會有梯度消失的問題,因此在飽和時也會「殺死」梯度。

    5.3 修正線性單元(ReLU)

    ReLU 啟用函式

    ReLU 導數

    從上圖可以看到,ReLU 是從底部開始半修正的一種函式。數學公式為:

    當輸入 x<0 時,輸出為 0,當 x> 0 時,輸出為 x。該啟用函式使網路更快速地收斂。它不會飽和,即它可以對抗梯度消失問題,至少在正區域(x> 0 時)可以這樣,因此神經元至少在一半區域中不會把所有零進行反向傳播。由於使用了簡單的閾值化(thresholding),ReLU 計算效率很高。但是 ReLU 神經元也存在一些缺點:

    1. 不以零為中心:和 Sigmoid 啟用函式類似,ReLU 函式的輸出不以零為中心。

    2. 前向傳導(forward pass)過程中,如果 x < 0,則神經元保持非啟用狀態,且在後向傳導(backward pass)中「殺死」梯度。這樣權重無法得到更新,網路無法學習。當 x = 0 時,該點的梯度未定義,但是這個問題在實現中得到了解決,透過採用左側或右側的梯度的方式。

    為了解決 ReLU 啟用函式中的梯度消失問題,當 x < 0 時,我們使用 Leaky ReLU——該函式試圖修復 dead ReLU 問題。下面我們就來詳細瞭解 Leaky ReLU。

    5.4 Leaky ReLU

    Leaky ReLU 啟用函式

    該函式試圖緩解 dead ReLU 問題。數學公式為:

    Leaky ReLU 的概念是:當 x < 0 時,它得到 0.1 的正梯度。該函式一定程度上緩解了 dead ReLU 問題,但是使用該函式的結果並不連貫。儘管它具備 ReLU 啟用函式的所有特徵,如計算高效、快速收斂、在正區域內不會飽和。

    Leaky ReLU 可以得到更多擴充套件。不讓 x 乘常數項,而是讓 x 乘超引數,這看起來比 Leaky ReLU 效果要好。該擴充套件就是 Parametric ReLU。

    5.5 Parametric ReLU

    PReLU 函式的數學公式為:

    其中是超引數。這裡引入了一個隨機的超引數,它可以被學習,因為你可以對它進行反向傳播。這使神經元能夠選擇負區域最好的梯度,有了這種能力,它們可以變成 ReLU 或 Leaky ReLU。

    總之,最好使用 ReLU,但是你可以使用 Leaky ReLU 或 Parametric ReLU 實驗一下,看看它們是否更適合你的問題。

    5.6 Swish

    Swish 啟用函式

    該函式又叫作自門控啟用函式,它近期由谷歌的研究者釋出,數學公式為:

    根據論文(https://arxiv.org/abs/1710.05941v1),Swish 啟用函式的效能優於 ReLU 函式。

    根據上圖,我們可以觀察到在 x 軸的負區域曲線的形狀與 ReLU 啟用函式不同,因此,Swish 啟用函式的輸出可能下降,即使在輸入值增大的情況下。大多數啟用函式是單調的,即輸入值增大的情況下,輸出值不可能下降。而 Swish 函式為 0 時具備單側有界(one-sided boundedness)的特性,它是平滑、非單調的。更改一行程式碼再來檢視它的效能,似乎也挺有意思。

  • 中秋節和大豐收的關聯?
  • 什麼是遺傳性黑眼圈,有什麼好辦法嗎?