作者:Adi Chris 機器之心編譯 參與:朱乾樹、劉曉坤
言歸正傳。在我正式介紹深度學習是什么東西之前,,我想先引入一個簡單的例子,,借以幫助我們理解為什么需要深度神經(jīng)網(wǎng)絡(luò)。 同時,,本文附有使用深度神經(jīng)網(wǎng)絡(luò)模型求解異或(XOR)問題的代碼,,發(fā)布在 GitHub 上。
異或問題何為異或問題,?對于給定的兩個二進制輸入,,我們通過異或邏輯門得到一個預測輸出,這一過程即為異或問題,。注意,,輸入不相等時輸出為 1,否則為 0,。表 1 展示了異或函數(shù)的所有可能的輸出結(jié)果: 那么現(xiàn)在我們就畫出數(shù)據(jù)分布圖來探究它的本質(zhì)。
看到上圖后,,我們或許會反思,,這真的是一個簡單問題么? 如你所見,,我們的數(shù)據(jù)并非線性可分的,,因此,一些常用的線性模型,,例如 logistic 回歸可能就不太適合分類我們的數(shù)據(jù)了,。為了給你一個更直觀的理解,我用一個簡單的線性模型畫出了如下圖的決策邊界,。 微調(diào) logistic 回歸模型構(gòu)造決策邊界 上面的圖清楚的告訴我們,,我們需要一個更好的分類器來分離非線性數(shù)據(jù)。SVM 結(jié)合它的核心技巧就是一個不錯的選擇,。但是,,在本文中,,我們打算重新構(gòu)建一個神經(jīng)網(wǎng)絡(luò)而非 SVM,并帶你領(lǐng)略下神經(jīng)網(wǎng)絡(luò)解決異或問題的風采,。 何為神經(jīng)網(wǎng)絡(luò),?神經(jīng)網(wǎng)絡(luò)就是就是找到一個可以模擬人腦工作行為的表現(xiàn)良好的近似函數(shù)。圖 1 對人類神經(jīng)元與人工智能網(wǎng)絡(luò)作了類比,。 圖 1:(a)人腦神經(jīng)元結(jié)構(gòu)(b)從生理神經(jīng)網(wǎng)絡(luò)類比得出的人工智能網(wǎng)絡(luò)—圖片摘自 cs231n.github.io 你不需要了解太多生物學知識,,我會從高度形象的角度來解釋人體神經(jīng)元如何處理信息。 人體的神經(jīng)元通過樹突接受信號,。這些信息或信號隨后被傳遞到腦細胞或細胞體,。在細胞體內(nèi)部,所有的信息將被加工生成一個輸出,。當該輸出結(jié)果達到某一閾值時,,神經(jīng)元就會興奮,并通過軸突傳遞信息,,然后通過突觸傳遞到其他相連的神經(jīng)元,。神經(jīng)元間傳輸?shù)男盘柫咳Q于連接的強度。 前面提到的整個流程某種程度上適用于人工智能網(wǎng)絡(luò),。你可以把樹突想象成人工智能網(wǎng)絡(luò)中基于突觸感知器的被賦予了權(quán)重的輸入,。然后,該輸入在人工智能網(wǎng)絡(luò)的『細胞體』中相加,。如果得出的輸出值大于閾值單元,,那么神經(jīng)元就會『興奮』,并將輸出傳遞到其它神經(jīng)元,。 這樣你就可以理解人工智能網(wǎng)絡(luò)就是借鑒基本的生物神經(jīng)元工作原理建模的吧,。 神經(jīng)網(wǎng)絡(luò)究竟如何工作?為了了解神經(jīng)網(wǎng)絡(luò)是如何工作的,,我們先來看看一個叫感知機的簡單的人工神經(jīng)網(wǎng)絡(luò),。 對我而言,感知機是我見過的機器學習中最優(yōu)雅的算法之一,。它于 1950 年代被提出,,盡管很簡單,但它可以說是很多重要的機器學習算法的起點了,,例如 logistic 回歸,、支持向量機甚至深度神經(jīng)網(wǎng)絡(luò)。 那么感知機怎么工作昵,?我們以圖 2 展開討論,。 圖 2:感知機 圖 2 展示了給定三個輸入 x_1、x_2 和 x_3 以及一個可以計算輸出值的神經(jīng)元的感知機算法。Rosenblatt 通過引入權(quán)重的概念介紹這一簡單的規(guī)則,,用于生成輸出值,。權(quán)重通常是表示輸入對應于輸出的重要性的實數(shù)。上圖中的神經(jīng)元將會得到兩個可能的結(jié)果,,0 或 1,,是由每個輸入的加權(quán)和 ∑wjxj 決定的大于或小于閾值的結(jié)果。因此,,感知機的主要思想就是去學到一些可以決定神經(jīng)元興奮還是抑制的與輸入特征相乘的權(quán)重 w,。我們可以寫出一個如下的數(shù)學表達式: 我們現(xiàn)在可以做兩件事來修改上述公式:第一,我們把權(quán)重相加操作轉(zhuǎn)變成兩個向量的點乘,。 w (權(quán)重) 和 x (輸入), 其中 w?x ≡ ∑wjxj,。接下來,我們可以把閾值移到不等式的另一端并取個新變量名為偏置 b,,b 恒等于閾值的負數(shù),。通過這些改動,感知機公式重寫如下: 現(xiàn)在我們把這些公式套進我們的感知機架構(gòu),,這樣就有了如下所示的完整的單層感知機架構(gòu): 圖 3:單層感知機架構(gòu) 通常情況下,,單層感知機模型都會使用階躍函數(shù)作為激活函數(shù)將結(jié)果轉(zhuǎn)化成 0 或 1,因此將輸入歸到 0 或 1 類,。如圖 4 所示,,負數(shù)的輸出為 0,正數(shù)的輸出為 1,。 圖 4:階躍函數(shù)的圖示 對于輸入數(shù)據(jù)線性可分的分類任務(wù),,階躍函數(shù)十分有用。但是,,由于我們的目的是找到一個用于分離非線性數(shù)據(jù)的分類器,,單層感知機與階躍函數(shù)就毫無意義了。稍后幾節(jié),,我們將會看到使用非線性激活函數(shù)的多層感知機網(wǎng)絡(luò)模型,。 關(guān)于我們?yōu)槭裁床挥檬褂秒A躍函數(shù),這里有兩個主要原因: 1. 目前,,結(jié)合反向傳播使用梯度下降算法是訓練一個多層神經(jīng)網(wǎng)絡(luò)的有效方法之一(我們稍后會簡短的介紹一下)。反向傳播的必要條件是使用的激活函數(shù)必須可微,。然而階躍函數(shù)在 x=0 處不可導,,且其它位置導數(shù)均為 0。如此一來就無法運用梯度下降法更新權(quán)重了,。 2. 回想下,,神經(jīng)網(wǎng)絡(luò)的主要目的就是學習到使預測盡可能接近真實值的權(quán)重和偏置。為了達到這一目的,,如同很多優(yōu)化問題,,我們希望對權(quán)重或偏置上作一個小的改變,,在網(wǎng)絡(luò)輸出中只產(chǎn)生一個相對小的變化。而這是一個僅能生成 0 或 1 的函數(shù)難以企及的,。 激活函數(shù)激活函數(shù)是神經(jīng)網(wǎng)絡(luò)的一個重要組成部分,。一般來說,我們最少有三個需要激活函數(shù)的理由:
我們已經(jīng)看到以階躍函數(shù)作激活函數(shù)的例子,,然而,,在這一節(jié),我們將要探討一些深度學習中常用的非線性激活函數(shù),。順便提一下,,若要深入了解激活函數(shù),包括每一個激活函數(shù)的利弊,,你可以參考 Avinash Sharma 和 Karpathy 寫的文章,。
Sigmoid 函數(shù)sigmoid 函數(shù),也即 logistic 函數(shù),,對于任意輸入,,它的輸出范圍都是 (0,1)。公式如下: sigmoid 的數(shù)學公式 圖 5:sigmoid 函數(shù)圖 圖 5 畫出了 sigmoid 函數(shù)的圖形,。如你所見,,它很像平滑版的階躍函數(shù)。但是,,sigmoid 有很多好處,,例如: 1. 它是非線性的 2. 不同于二值化輸出,sigmoid 可以輸入 0 到 1 之間的任意值,。對,,跟你猜的一樣,這可以用來表示概率值,。 3. 與 2 相關(guān),,sigmoid 的輸出值在一個范圍內(nèi),這意味著它不會輸出無窮大的數(shù),。 但是,,sigmoid 激活函數(shù)并不完美: 梯度消失。如前面的圖片所示,,當輸入值 z 趨近負無窮時,,sigmoid 函數(shù)的輸出幾乎為 0 . 相反,當輸入 z 趨近正無窮時,輸出值幾乎為 1 . 那么這意味著什么,? 在這兩個極端情況下,,對應的梯度很小,甚至消失了,。梯度消失在深度學習中是一個十分重要的問題,,我們在深度網(wǎng)絡(luò)中加了很多層這樣的非線性激活函數(shù),這樣的話,,即使第一層的參數(shù)有很大的變化,,也不會對輸出有太大的影響。換句話講,,就是網(wǎng)絡(luò)不再學習了,,通常訓練模型的過程會變得越來越慢,尤其是使用梯度下降算法時,。 sigmoid 的另一個弊端就是實際運用中指數(shù)運算開銷太大,。盡管有人說,與矩陣乘法或卷積相比,,激活函數(shù)在深度網(wǎng)絡(luò)的計算是非常小的一部分,,所以這可能不會成為一個大問題。不過,,我認為這值得一提,。 Tanh 函數(shù)Tanh 或雙曲正切是另一個深度神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)。類似于 sigmoid 函數(shù),,它也將輸入轉(zhuǎn)化到良好的輸出范圍內(nèi),。具體點說就是對于任意輸入,tanh 將會產(chǎn)生一個介于 -1 與 1 之間的值,。 Tanh 函數(shù)的數(shù)學公式 圖 6:tanh 函數(shù)圖 如前面提及的,,tanh 激活函數(shù)有點像 sigmoid 函數(shù)。非線性且輸出在某一范圍,,此處為 (-1, 1),。不必意外,它也有跟 sigmoid 一樣的缺點,。從數(shù)學表達式就可以看出來,,它也有梯度消失的問題,以及也需要進行開銷巨大的指數(shù)運算,。 ReLU(修正線性單元)終于講到了 Relu,,人們起初并不覺得它的效果會好過 sigmoid 和 tanh。但是,,實戰(zhàn)中它確實做到了,。事實上,cs231n 課程甚至指出,,應該默認使用 Relu 函數(shù),。 ReLU 從數(shù)學表達式來看,運算十分高效,。對于某一輸入,,當它小于 0 時,輸出為 0,,否則不變,。下面是 ReLU 的函數(shù)表達式。 圖 7:ReLU 函數(shù)圖 那么你可能會問,,「它是線性函數(shù)吧,?為何我們說它是非線性函數(shù)?」 在線代中,,線性函數(shù)就是兩個向量空間進行向量加和標量乘的映射,。 給定上面的定義,我們知道 max(0, x) 是一個分段線性函數(shù),。之所以說是分段線性,,是因為它在 (?∞, 0] 或 [0,+∞) 上符合線性函數(shù)的定義。但是在整個定義域上并不滿足線性函數(shù)的定義,。例如f(?1) + f(1) ≠f (0) 所以 Relu 就是一個非線性激活函數(shù)且有良好的數(shù)學性質(zhì),,并且比 sigmoid 和 tanh 都運算得快。除此以外,,Relu 還因避免了梯度消失問題而聞名,。然而,ReLU 有一個致命缺點,,叫「ReLU 壞死」,。ReLu 壞死是指網(wǎng)絡(luò)中的神經(jīng)元由于無法在正向傳播中起作用而永久死亡的現(xiàn)象。 更確切地說,,當神經(jīng)元在向前傳遞中激活函數(shù)輸出為零時,,就會出現(xiàn)這個問題,導致它的權(quán)值將得到零梯度,。因此,,當我們進行反向傳播時,神經(jīng)元的權(quán)重將永遠不會被更新,,而特定的神經(jīng)元將永遠不會被激活,。 還有件事值得一提。你可能注意到,,不像 sigmoid 和 tanh,,Relu 并未限定輸出范圍,。這通常會成為一個很大的問題,它可能在另一個深度學習模型如遞歸神經(jīng)網(wǎng)絡(luò)(RNN)中成為麻煩,。具體而言,,由 ReLU 生成的無界值可能使 RNN 內(nèi)的計算在沒有合理的權(quán)重的情況下發(fā)生數(shù)值爆炸。因此反向傳播期間權(quán)重在錯誤方向上的輕微變化都會在正向傳遞過程中顯著放大激活值,,如此一來學習過程可能就非常不穩(wěn)定,。我會嘗試在下一篇博客文章中詳細介紹這一點。 神經(jīng)網(wǎng)絡(luò)如何預測和學習,?圖 8:多層感知機 圖 8 所示架構(gòu)叫多層感知機(MLP),。從名字我們就可以推知,我們只是簡單地堆積多層感知機而已,。上圖是一個三層感知機模型:一個輸入層,、一個隱藏層,以及一個輸出層,。然而,,在深度學習或神經(jīng)網(wǎng)絡(luò)領(lǐng)域,人們并不叫它三層神經(jīng)網(wǎng)絡(luò),。通常,,我們只統(tǒng)計隱藏層或其加上輸出層的層數(shù),因此,,上圖的網(wǎng)絡(luò)也叫兩層神經(jīng)網(wǎng)絡(luò),。隱藏層并不單單指輸入層或輸出層。現(xiàn)在,,如你所猜,,所謂的深度學習,就意味著有更多的隱藏層,。 那么神經(jīng)網(wǎng)絡(luò)如何進行預測昵,? 當所有的輸入通過所有隱藏層到輸出層后,神經(jīng)網(wǎng)絡(luò)就會產(chǎn)生一個預測,。這一過程叫前饋,。如圖 8 所示,網(wǎng)絡(luò)接受輸入 X,,然后計算激活函數(shù)并逐層傳遞,,直到輸出。在監(jiān)督任務(wù)中,,對于此類分類任務(wù),,我們通常在輸出層使用一個 sigmoid 函數(shù),以便將預測值轉(zhuǎn)化為概率值,。在圖 8 中,,我們可以看到輸出值為 0.24,,由于它小于 0.5,我們可以說預測值 y_hat 為 0 . 跟一般的分類任務(wù)一樣,,我們有一個代價函數(shù),,用于評估我們的模型擬合真實標簽的程度。事實上,,訓練神經(jīng)網(wǎng)絡(luò)可以簡單地看作盡可能最小化代價函數(shù)的過程。我們可以定義如下的代價函數(shù): 均方誤差 所以我們的目的就是找到最佳 w 和 b,,使代價函數(shù) J 盡可能的小,。為了達到這一目的,我們得靠兩大重要的算法,,梯度下降和反向傳播,。 梯度下降對那些已經(jīng)接觸過機器學習的人來說,你們已經(jīng)很熟悉梯度下降法了,。訓練神經(jīng)網(wǎng)絡(luò)與訓練任何其它使用梯度下降法的機器學習模型沒有多大區(qū)別,。唯一明顯的區(qū)別是網(wǎng)絡(luò)中的非線性效應使得我們的代價函數(shù)非凸。 為了幫助你理解,,我們假設(shè)有一個如下圖 9 所示的凸代價函數(shù): 圖 9:梯度下降法圖解 上表中,,水平坐標表示參數(shù)空間,權(quán)重和偏置,,代價函數(shù) J(w, b) 就是水平軸上面的拋物面,。圖中的紅色圓圈代表初始權(quán)重 w 和 b 對應的代價。為了最小化這一代價,,我們需要走到這個拋物面底,。那么問題來了,我們怎么知道沿哪個方向走昵,?是參數(shù)變大的方向還是變小的方向,?我們可以做一個隨機搜索,但這顯然耗時且開銷過大,。 通過處理可學習的權(quán)重和偏置可以找到最佳方向,。微積分告訴我們,在給定的點上,,梯度方向就會指向函數(shù)值改變最快的方向,。因此,我們將使用代價函數(shù)對權(quán)重和偏置的梯度,。 現(xiàn)在,,我們簡單地看看圖 10 所示的代價-權(quán)重變化。 圖 10:梯度的形象化表示 圖 10 描繪了代價函數(shù)對應權(quán)重的函數(shù)值,。你可以把圖上的黑色圓看作初始代價,??紤]到函數(shù)或變量的梯度可負可正可 0。負梯度意味著該線反向傾斜,,反之亦然?,F(xiàn)在,我們的目的是最小化代價函數(shù),,我們就必須沿著梯度的反方向更新權(quán)重,。這一更新過程可以用以下公式表示: 圖 11:梯度下降法的參數(shù)更新 其中α是步長或?qū)W習率,我們將它與可學習參數(shù) w 的偏微分相乘,。所以α有啥用昵,? 梯度告訴我們哪個方向函數(shù)值改變的最快,但是它并未告訴我們應該沿這一方向跨多大步,。我們需要一個超參數(shù)去控制步長的大小,,例如,我們沿某一方向該移動多遠,,這就是 α 存在的意義,。選取正確的學習率十分重要,因為它對兩方面有很大的影響:算法的學習速度和我們是否收斂到局部極小值,。實際運用中,,你可能會運用一個自適應學習率算法,例如動量算法,、RMSProp,、Adam 等等。AYLIEN 的一個大佬寫了一篇關(guān)于學習率算法的很棒的文章(如下參考第一篇),。 反向傳播我們在前一節(jié)講述了梯度下降算法,,它是深度學習的學習問題的一個優(yōu)化算法??紤]到我們需要計算關(guān)于可學習參數(shù) w 和 b 的偏微分才能使用梯度下降法,。換句話說,我們需要計算 w 和 b 的偏微分,。 但是,,如果我們仔細看看代價函數(shù) J,下圖 12 所示,,就會發(fā)現(xiàn) J 和 w ,、 b 并沒有直接關(guān)系。 圖 12:均方誤差 只有從得到 y_hat 的輸出層追溯到輸入層,,我們才會發(fā)現(xiàn) J 與 w ,、b 的間接關(guān)系,如下圖 13 所示: 圖 13:反向傳播圖解 你現(xiàn)在應該明白,,為了得到代價函數(shù)的參數(shù)關(guān)于 w 和 b 的梯度,,我們需要計算所有參數(shù)的偏微分,,例如前面層的*a* (激活函數(shù)) 和 *z* (線性運算: wx + b),這就是反向傳播存在的意義,。反向傳播其實就是反復運用微積分的鏈式法則,,這可能是神經(jīng)網(wǎng)絡(luò)中最有效的計算可學習參數(shù)梯度的方法了。 接下來,,我手把手帶你算一下代價函數(shù)對第二層神經(jīng)網(wǎng)絡(luò)權(quán)重 w2 的梯度,,簡單起見,我們使用圖 8 的結(jié)構(gòu),,一個包含三個神經(jīng)元的隱藏層,。 為了得到 y_hat 對 z2 的變化率,我們需要對 sigmoid 激活函數(shù)的 z 求微分,。 一旦我們得到 J 對 W2 的偏導值,就可以使用圖 11 中的公式更新 W2 的值,。 我們通常對所有可學習參數(shù)重復這一過程,,直到得到盡可能小的代價函數(shù)值。 可解決異或問題的神經(jīng)網(wǎng)絡(luò)不錯,!我想我們已經(jīng)了解了如何構(gòu)建一個神經(jīng)網(wǎng)絡(luò)模型甚至深度學習模型的所有知識,,這些知識將幫助我們解決異或問題。 寫這篇博客時,,我順便搭了一個簡單的單隱藏層神經(jīng)網(wǎng)絡(luò)模型,。圖 14 是我使用的樣例網(wǎng)絡(luò)。我畫出了一些由我的模型生成的不同數(shù)量的神經(jīng)元的決策邊界,。如你后面將看到的,,包含更多的神經(jīng)元會使網(wǎng)絡(luò)模型變得更加復雜,從而創(chuàng)造一個更復雜的決策邊界,。 圖 14:3 隱藏神經(jīng)元的兩層神經(jīng)網(wǎng)絡(luò) 圖 15:由一個包含多個神經(jīng)元(2 個,、3 個、4 個)的隱藏層生成的決策邊界 但是,,到底怎樣才是最佳選擇,?包含更多的神經(jīng)元還是更多的隱藏層? 理論上講,,網(wǎng)絡(luò)深的主要好處就是可以表示更復雜的函數(shù),。具體而言,通過使用更深層次的網(wǎng)絡(luò)結(jié)構(gòu),,我們可以學習許多不同抽象層次的特征,,例如,從邊緣(較底層)到非常復雜的特征(較深層),。 然而,,實際中使用深度網(wǎng)絡(luò)并非總是有用,。我們訓練深度網(wǎng)絡(luò)時最常遇到的就是梯度消失問題:一個非常深的網(wǎng)絡(luò)通常會發(fā)生某個梯度迅速變?yōu)榱愕臓顩r,因此使得梯度下降非常緩慢,。 再具體點說,,使用梯度下降時,因為反向傳播是從輸出層傳播到輸入層,,而從輸入到輸出的每一步都是權(quán)重矩陣的相乘,,因此梯度可能呈指數(shù)衰減到 0,某些情況下甚至會發(fā)生梯度爆炸,。 為了結(jié)束這篇冗長的博文,,簡要總結(jié)的要點如下:
原文鏈接:https:///from-perceptron-to-deep-neural-nets-504b8ff616e |
|
來自: 快讀書館 > 《信息技術(shù)》