《deep learning》讀書筆記6——深度前饋網絡

 

目錄

深度前饋網絡

實例:學習xor

基於梯度的學習

代價函數

用最大似然學習條件分佈

學習條件統計量

輸出單元

用於高斯輸出分佈的線性單元 

用於Bernoulli 輸出分佈的sigmoid 單元

用於Multinoulli 輸出分佈的softmax 單元

其他的輸出類型 

隱藏單元

整流線性單元及其擴展

logistic sigmoid與雙曲正切函數

其他隱藏單元

結構設計

BP和其他的微分算法


深度前饋網絡

深度前饋網絡(deep feedforward network),也叫作前饋神經網絡(feedforward neural network) 或者多層感知機(multilayer perceptron, MLP),是典型的深度學習模型。前饋網絡的目標是近似某個函數f*。例如,對於分類器,y=f\textup{\textup{}*}(x)將輸入x 映射到一個類別y。前饋網絡定義了一個映射y=f(x;\boldsymbol{\Theta }),並且學習參數\Theta的值,使它能夠得到最佳的函數近似。

這種模型被稱爲前向(feedforward) 的,是因爲信息流過x 的函數,流經用於定義f 的中間計算過程,最終到達輸出y。在模型的輸出和模型本身之間沒有反饋(feedback) 連接。當前饋神經網絡被擴展成包含反饋連接時,它們被稱爲循環神經網絡

前饋網絡對於機器學習的從業者是極其重要的。它們是許多重要商業應用的基礎。例如,用於對照片中的對象進行識別的卷積神經網絡就是一種專門的前饋網絡前饋網絡是向循環網絡前進中的概念莫基石,後者在自然語言的許多應用中發揮着巨大作用

前饋神經網絡被稱作網絡( network)是因爲它們通常用許多不同函數複合在一起來表示。該模型與ー個有向無環圖相關聯,而圖描述了函數是如何複合在一起的。例如,我們有三個函數f(1),f(2)和f(3)連接在一個鏈上以形成f(x)=f3(f2(f1(x)))。這些鏈式結構是神經網絡中最常用的結構。在這種情況下,f1被稱爲網絡的第一層( first layer),f2被稱爲第二層( second layer),以此類推。鏈的全長稱爲模型的深度( depth)。正是因爲這個術語オ出現了“深度學習”這個名字。前饋網絡的最後一層被稱爲輸出層( output layer)。在神經網絡訓練的過程中,我們讓f(x)去匹配f\textup{*}(x)的值。訓練數據爲我們提供了在不同訓練點上取值的、含有噪聲的f\textup{*}(x)的近似實例。每個樣例x都伴隨着一個標籤y\approx f\textup{*}(x)。訓練樣例直接指明瞭輸出層在每一點x上必須做什麼;它必須產生一個接近y的值。

但是訓練數據並沒有直接指明其他層應該怎麼做。學習算法必須決定如何使用這些層來產生想要的輸出,但是訓練數據並沒有說每個單獨的層應該做什麼。相反,學習算法必須決定如何使用這些層來最好地實現f\textup{*}的近似。因爲訓練數據並沒有給出這些層中的每一層所需的輸出,所以這些層被稱爲隱藏層(hidden layer)。

最後,這些網絡被稱爲神經網絡是因爲它們或多或少地受到神經科學的啓發。網絡中的每個隱藏層通常都是向量值的。這些隱藏層的維數決定了模型的寬度(width)。向量的每個元素都可以被視爲起到類似一個神經元的作用。除了將層想象成向量到向量的單個函數,我們也可以把層想象成由許多並行操作的單元(unit) 組成,每個單元表示一個向量到標量的函數。每個單元在某種意義上類似一個神經元,它接收的輸入來源於許多其他的單元,並且計算它自己的激活值。使用多層向量值表示的想法來源於神經科學。用於計算這些表示的函數f^{(i)}(x)的選擇,也或多或少地受到神經科學觀測的指引,這些觀測是關於生物神經元計算功能的。然而,現代的神經網絡研究受到更多的是來自許多數學和工程學科的指引,並且神經網絡的目標並不是完美地給大腦建模。我們最好將前饋神經網絡想成是爲了實現統計泛化而設計出的函數近似機器,它偶爾從我們瞭解的大腦中提取靈感但是並不是大腦功能的模型

一種理解前饋網絡的方式是從線性模型開始,並考慮如何克服它的侷限性。線性模型,例如邏輯迴歸和線性迴歸,是非常吸引人的,因爲無論是封閉形式還是使用凸優化,它們都能高效而可靠地擬合。線性模型也有明顯的缺陷,那就是該模型的能力被侷限在線性函數裏,所以它無法理解任何兩個輸入變量間的相互作用

爲了擴展線性模型來表示x的非線性函數,我們可以把線性模型不用在x本身,而是用在一個變換後的輸入ϕ(x) 上,這裏ϕ是一個非線性變換。等價地,我們可以使用5.7.2節中描述的核技巧,來得到一個基於隱含地使用ϕ映射的非線性學習算法。我們可以認爲ϕ提供了一組描述x的特徵,或者認爲它提供了x的一個新的表示。剩下的問題就是如何選擇映射ϕ。

  1. 其中一種選擇是使用一個通用的ϕ,例如無限維的ϕ,它隱含地用在基於RBF核的核機器上。如果ϕ(x)具有足夠高的維數,我們總是有足夠的能力來擬合訓練集,但是對於測試集的泛化往往不佳。非常通用的特徵映射通常只基於局部平滑的原則,並沒有將足夠的先驗信息進行編碼來解決高級問題。
  2. 另一種選擇是手動地設計ϕ。在深度學習出現以前,這都是主流的方法。這種方法對於每個單獨的任務都需要人們數十年的努力,其中包括不同領域的(如語音識別或計算機視覺)專家以及不同領域間微小的遷移(transfer)。
  3. 深度學習的策略是去學習ϕ。在這種方法中,我們有一個模型y=f(x;\Theta ,w)=\Phi (x;\Theta )^{}\top w。我們現在有兩種參數:用於從一大類函數中學習ϕ的參數\Theta,以及用於將ϕ(x)映射到所需的輸出的參數w。這是深度前饋網絡的一個例子,其中ϕ定義了一個隱藏層。這是三種方法中唯一一種放棄訓練問題的凸性的方法,但是利大於弊。在這種方法中,我們將表示參數化爲\Phi (x;\Theta ),並且使用優化算法來尋找\Theta,使它能夠得到一個好的表示。如果我們希望,這種方法也可以通過使它變得高度通用以獲得第一種方法的優點——我們只需使用一個非常廣泛的函數族\Phi (x;\Theta )。這種方法也可以獲得第二種方法的優點。人類專家可以將他們的知識編碼進網絡來幫助泛化,他們只需要設計那些他們期望能夠表現優異的函數族\Phi (x;\Theta )即可。這種方法的優點是人類設計者只需要尋找正確的函數族即可,而不需要去尋找精確的函數。

這種通過學習特徵來改善模型的一般化原則不止適用於本章描述的前饋神經網絡。它是深度學習中反覆出現的主題,適用於全書描述的所有種類的模型。前饋神經網絡是這個原則的應用,它學習從x到y的確定性映射並且沒有反饋連接。後面出現的其他模型會把這些原則應用到學習隨機映射、學習帶有反饋的函數以及學習單個向量的概率分佈。
       本章我們先從前饋網絡的一個簡單例子說起。接着,我們討論部署一個前饋網絡所需的每個設計決策。首先,訓練一個前饋網絡至少需要做和線性模型同樣多的設計決策:選擇一個優化模型,代價函數以及輸出單元的形式。我們先回顧這些基於梯度學習的基本知識,然後去面對那些只出現在前饋網絡中的設計決策。前饋網絡已經引入了隱藏層的概念,這需要我們去選擇用於計算隱藏層值的激活函數(activation function)。我們還必須設計網絡的結構,包括網絡應該包含多少層、這些層應該如何連接,以及每一層包含多少單元。在深度神經網絡的學習中需要計算複雜函數的梯度。我們給出反向傳播(back propagation) 算法和它的現代推廣,它們可以用來高效地計算這些梯度。最後,我們以某些歷史觀點來結束這一章。


實例:學習xor

爲了使前饋網絡的想法更加具體,我們首先從前饋網絡充分發揮作用的一個簡單例子說起:學習XOR 函數。

XOR函數(‘‘異或’’ 邏輯)是兩個二進制值x1 和x2 的運算。當這些二進制值中恰好有一個爲1 時,XOR 函數返回值爲1。其餘情況下返回值爲0。XOR函數提供了我們想要學習的目標函數y=f^{*}(x)我們的模型給出了一個函數y=f(x;\Theta )並且我們的學習算法會不斷調整參數\Theta來使得f儘可能接近f^{*}

在這個簡單的例子中,我們不會關心統計泛化。我們希望網絡在這四個點\mathbb{Z}=\left \{ [0,0] ^{\top },[0,1]^{\top },[1,0]^{\top },[1,1]^{\top }\right \}上表現正確。我們會用全部這四個點來訓練我們的網絡,唯一的挑戰是擬合訓練集我們可以把這個問題當作是迴歸問題,並使用均方誤差損失函數。我們選擇這個損失函數是爲了儘可能簡化本例中用到的數學。在應用領域,對於二進制數據建模時,MSE通常並不是一個合適的損失函數。更加合適的方法將在6.2.2.2節中討論。

爲了對在整個訓練集上的表現進行評估,MSE損失函數爲

我們現在必須要選擇我們模型f(x;\Theta )的形式。假設我們選擇一個線性模型,\Theta包含w和b,那麼我們的模型被定義成

我們可以用正規方程對w和b最小化J(\Theta ),來得到一個封閉形式的解。

解正規方程以後,我們得到w=0以及b=1/2。線性模型僅僅是在任意一點都輸出0.5。爲什麼會發生這種事?圖6.1演示了線性模型爲什麼不能用來表示XOR函數。解決這個問題的其中一種方法是使用一個模型來學習ー個不同的特徵空間,在這個空間上線性模型能夠表示這個解。

具體來說,我們這裏引入一個非常簡單的前饋神經網絡,它有一層隱藏層並且隱藏層中包含兩個單元。參見圖6.2中對該模型的解釋。

這個前饋網絡有一個通過函數f^{(1)}(x;W,c)計算得到的隱藏單元的向量h。這些隱藏單元的值隨後被用作第二層的輸入。第二層就是這個網絡的輸出層。輸出層仍然只是一個線性迴歸模型,只不過現在它作用於h而不是x。網絡現在包含鏈接在一起的兩個函數h=f^{(1)}(x;W,c)y=f^{(2)}(h;w,b),完整的模型是f(x;W,c,w,b)=f^{(2)}(f^{(1)}(x))

f^{(1)}應該是哪種函數?線性模型到目前爲止都表現不錯,讓f^{(1)}也是線性的似乎很有誘惑力。不幸的是,如果f^{(1)}是線性的,那麼前饋網絡作爲一個整體對於輸入仍然是線性的。暫時忽略截距項,假設f^{(1)}(x)=W^{\top }x並且f^{(2)}(h)=h^{\top }w,那麼f(x)=w^{\top }W^{\top }x。我們可以將這個函數重新表示成f(x)=x^{\top }w^{'}其中w^{'}=Ww

顯然,我們必須用非線性函數來描述這些特徵。大多數神經網絡通過仿射變換之後緊跟着一個被稱爲激活函數的固定非線性函數來實現這個目標,其中仿射變換由學得的參數控制。我們這裏使用這種策略,定義h=g(W^{\top }x+c),其中W是線性變換的權重矩陣,c是偏置。先前,爲了描述線性迴歸模型,我們使用權重向量和一個標量的偏置參數來描述從輸入向量到輸出標量的仿射變換。現在,因爲我們描述的是向量x到向量h的仿射變換,所以我們需要一整個向量的偏置參數激活函數g通常選擇對每個元素分別起作用的函數,有h_{i}=g(x^{\top }W_{:,i}+c_{i})在現代神經網絡中,默認的推薦是使用由激活函數{\color{Orchid} g(z)=max\left \{ 0,z \right \}}定義的整流線性單元( rectified inear unit)或者稱爲ReLU( Jarrett et al,2009b; Inair and Hinton2010a; Glorot et al.,2011a),如圖6.3所示。

我們現在可以指明我們的整個網絡是

我們現在可以給出XOR 問題的一個解。令

以及b = 0。

我們現在可以瞭解這個模型如何處理一批輸入。令X表示設計矩陣,它包含二進制輸入空間中全部的四個點,每個樣例佔一行,那麼矩陣表示爲: 

神經網絡的第一層是將輸入矩陣乘以第一層的權重矩陣:

然後,加上偏置向量c,得到

在這個空間中,所有的樣例都處在一條斜率爲1 的直線上。當我們沿着這條直線移動時,輸出需要從0 升到1,然後再降回0。線性模型不能實現這樣一種函數。爲了用h對每個樣例求值,我們使用整流線性變換:

這個變換改變了樣例間的關係。它們不再處於同一條直線上了。如圖6.3所示,它們現在處在一個可以用線性模型解決的空間上。

我們最後乘以一個權重向量w:

神經網絡對這一批次中的每個樣例都給出了正確的結果。 

 在這個例子中,我們簡單地指明瞭答案,然後說明它得到的誤差爲零。在實際情況中,可能會有數十億的模型參數以及數十億的訓練樣本,所以不能像我們這裏做的那樣進行簡單地猜解。與之相對的,基於梯度的優化算法可以找到一些參數使得產生的誤差非常小。我們這裏給出的XOR問題的解處在損失函數的全局最小點,所以梯度下降算法可以收斂到這一點。梯度下降算法還可以找到XOR問題一些其
他的等價解。梯度下降算法的收斂點取決於參數的初始值在實踐中,梯度下降通常不會找到像我們這裏給出的那種乾淨的、容易理解的、整數值的解。


 

基於梯度的學習

設計和訓練神經網絡與使用梯度下降訓練其他任何機器學習模型並沒有太大不同。在5.10節中,我們描述瞭如何通過指明一個優化過程、代價函數和一個模型族來構建一個機器學習算法

我們到目前爲止看到的線性模型和神經網絡的最大區別,在於神經網絡的非線性導致大多數我們感興趣的損失函數都成爲了非凸的。這意味着神經網絡的訓練通常使用的迭代的、基於梯度的優化,僅僅使得代價函數達到一個非常小的值;而不是像用於訓練線性迴歸模型的線性方程求解器,或者用於訓練邏輯迴歸或SVM的凸優化算法那樣具有全局的收斂保證。凸優化從任何一種初始參數出發都會收斂(理論上如此——在實踐中也很魯棒但可能會遇到數值問題)。用於非凸損失函數的隨機梯度下降沒有這種收斂性保證,並且對參數的初始值很敏感對於前饋神經網絡,將所有的權重值初始化爲小隨機數是很重要的。偏置可以初始化爲零或者小的正值。這種用於訓練前饋神經網絡以及幾乎所有深度模型的迭代的基於梯度的優化算法會在第八章詳細介紹,參數初始化會在8.4節中具體說明。就目前而言,只需要懂得,訓練算法幾乎總是基於使用梯度來使得代價函數下降的各種方法即可。一些特別的算法是對梯度下降思想的改進和提純,在4.3節中介紹,還有一些更特別的,大多數是對隨機梯度下降算法的改進,在5.9節中介紹。

我們當然也可以用梯度下降來訓練諸如線性迴歸和支持向量機之類的模型,並且事實上當訓練集相當大時這是很常用的。從這點來看,訓練神經網絡和訓練其他任何模型並沒有太大區別。計算梯度對於神經網絡會略微複雜一些,但仍然可以很高效而精確地實現。6.5節將會介紹如何用反向傳播算法以及它的現代擴展算法來求得梯度。

和其他的機器學習模型一樣,爲了使用基於梯度的學習方法我們必須選擇一個代價函數,並且我們必須選擇如何表示模型的輸出。現在,我們重溫這些設計上的考慮,並且特別強調神經網絡的情景。

代價函數

深度神經網絡設計中的一個重要方面是代價函數的選擇。幸運的是,神經網絡的代價函數或多或少是和其他的參數模型例如線性模型的代價函數相同的。

在大多數情況下,我們的參數模型定義了一個分佈p(y|x;\Theta )並且我們簡單地使用最大似然原理。這意味着我們使用訓練數據和模型預測間的交叉熵作爲代價函數。

有時我們使用一個更簡單的方法,不是預測y的完整概率分佈,而是僅僅預測在給定x的條件下y的某種統計量。某些專門的損失函數允許我們來訓練這些估計量的預測器。

用於訓練神經網絡的完整的代價函數,通常在我們這裏描述的基本代價函數的基礎上結合一個正則項。我們已經在5.2.2節中看到正則化應用到線性模型中的一些簡單的例子。用於線性模型的權值衰減方法也直接適用於深度神經網絡,而且是最流行的正則化策略之一。用於神經網絡的更高級的正則化策略會在第七章中討論。

用最大似然學習條件分佈

大多數現代的神經網絡使用最大似然來訓練。這意味着代價函數就是負的對數似然,它與訓練數據和模型分佈間的交叉熵等價。這個代價函數表示爲

代價函數的具體形式隨着模型而改變,取決於logp_{model}的具體形式。上述方程的展開形式通常會有一些項不依賴於模型的參數,我們可以捨去。例如,正如我們在5.1.1節中看到的,如果p_{model}(y|x)=N(y;f(x;\Theta ),I),那麼我們恢復均方誤
差代價, 

至少係數1/2和常數項不依賴於\Theta。捨棄的常數是基於高斯分佈的方差,在這種情況下我們選擇不把它參數化。先前,我們看到了對輸出分佈的最大似然估計和對線性模型均方誤差的最小化之間的等價性,但事實上,這種等價性並不要求f(x;\Theta )用於預測高斯分佈的均值。

使用最大似然來導出代價函數的方法的一個優勢是,它減輕了爲每個模型設計代價函數的負擔。明確一個模型p(y|x)則自動地確定了一個代價函數\log p(y|x)

貫穿神經網絡設計的一個反覆出現的主題是代價函數的梯度必須足夠的大和具有足夠的預測性,來爲學習算法提供一個好的指引。飽和(變得非常平)的函數破壞了這一目標,因爲它們把梯度變得非常小。這在很多情況下都會發生,因爲用於產生隱藏單元或者輸出單元的輸出的激活函數會飽和。負的對數似然幫助我們在很多模型中避免這個問題。很多輸出單元都會包含一個指數函數,這在它的變量取絕
對值非常大的負值時會造成飽和。負對數似然代價函數中的對數函數消除了某些輸出單元中的指數效果。我們將會在6.2.2節中討論代價函數和輸出單元的選擇間的交互關係。

用於實現最大似然估計的交叉熵代價函數有一個不同尋常的特性,那就是當它被應用於實踐中經常遇到的模型時,它通常沒有最小值。對於離散型輸出變量,大多數模型以一種特殊的形式來參數化,即它們不能表示概率零和一,但是可以無限接近。邏輯迴歸是其中一個例子。對於實值的輸出變量,如果模型可以控制輸出分佈的密度(例如,通過學習高斯輸出分佈的方差參數),那麼它可能對正確的訓練集輸出賦予極其高的密度,這將導致交叉熵趨向負無窮。第七章中描述的正則化技術提供了一些不同的方法來修正學習問題,所以模型不會通過這種方式來獲得無限制的收益。

學習條件統計量

有時我們並不是想學習一個完整的概率分佈p(y|x;\Theta ),而僅僅是想學習在給定x時y的某個條件統計量。

例如,我們可能有一個預測器f(x;\Theta ),我們想用它來預測y的均值。如果我們使用一個足夠強大的神經網絡,我們可以認爲這個神經網絡能夠表示一大類函數中的任何一個函數f,這個類僅僅被一些特徵所限制,例如連續性和有界,而不是具有特殊的參數形式。從這個角度來看,我們可以把代價函數看作是一個泛函(functional) 而不僅僅是一個函數。泛函是函數到實數的映射。我們因此可以將學習看作是選擇一個函數而不僅僅是選擇一組參數。我們可以設計代價泛函在我們想要的某些特殊函數處取得最小值。例如,我們可以設計一個代價泛函,使它的最小值處於一個特殊的函數上,這個函數將x映射到給定x時y的期望值。對函數求解優化問題需要用到變分法(calculus of variations) 這個數學工具,我們將在19.4.2節中討論。理解變分法對於理解本章的內容不是必要的。目前,只需要知道變分法可以被用來導出下面的兩個結果。

我們使用變分法導出的第一個結果是解優化問題

得到

要求這個函數處在我們要優化的類裏。換句話說,如果我們能夠用無窮多的、來源於真實的數據生成分佈的樣例進行訓練,最小化均方誤差代價函數將得到一個函數,它可以用來對每個x的值預測出y的均值。

不同的代價函數給出不同的統計量。第二個使用變分法得到的結果是

將得到一個函數可以對每個x預測y取值的中位數,只要這個函數在我們要優化的函數族裏。這個代價函數通常被稱爲平均絕對誤差( mean absolute error )

不幸的是,均方誤差和平均絕對誤差在使用基於梯度的優化方法時往往會導致糟糕的結果。一些飽和的輸出單元當結合這些代價函數時會產生非常小的梯度。這就是爲什麼交叉熵代價函數比均方誤差或者平均絕對誤差更受歡迎的原因之一了,即使是在沒必要估計整個p(y|x)分佈時。

輸出單元

代價函數的選擇與輸出單元的選擇緊密相關。大多數時候,我們簡單地使用數據分佈和模型分佈間的交叉熵。選擇怎樣表示輸出決定了交叉熵函數的形式。

任何種類的可以被用作輸出的神經網絡單元,也可以被用作隱藏單元。這裏,我們關注把這些單元用作模型的輸出,但是原則上它們也可以在內部使用。我們將在6.3節中重溫這些單元並且給出當它們被用作隱藏單元時一些額外的細節。

在本節中,我們假設前饋網絡提供了一組定義爲h=f(x;\Theta )的隱藏特徵。輸出層的作用是隨後對這些特徵進行一些額外的變換來完成整個網絡必須完成的任務。

用於高斯輸出分佈的線性單元 

一種簡單的輸出單元是基於仿射變換的輸出單元,仿射變換不帶有非線性。這些單元往往被直接稱爲線性單元。

給定特徵h,線性輸出單元層產生一個向量\widehat{y}=W^{\top }h+b

線性輸出層經常被用來產生條件高斯分佈的均值:

最大化對數似然此時等價於最小化均方誤差。

最大化似然的框架使它也可以很直觀的來學習高斯分佈的協方差矩陣,或者使得高斯分佈的協方差是輸入的函數。然而,對於所有輸入,協方差矩陣都必須被限制成一個正定的矩陣。用線性輸出層來滿足這種限制是困難的,所以通常使用其他的輸出單元來對協方差參數化。對協方差建模的方法在6.2.2.4節中簡要介紹。

因爲線性模型不會飽和,所以它們對基於梯度的優化算法沒有任何困難並且可以被用在相當廣泛的優化算法中

用於Bernoulli 輸出分佈的sigmoid 單元

許多任務需要預測二值型變量y的值。具有兩個類的分類問題可以歸結爲這種形式。

此時最大似然的方法是定義y在x條件下的Bernoulli 分佈。

Bernoulli 分佈僅需單個參數來定義。神經網絡只需要預測P(y=1|x)即可。爲了使這個數是有效的概率,它必須處在區間[0,1] 中。

滿足這個限制需要一些細緻的設計工作。假設我們打算使用線性單元,並且通過閾值來限制它成爲一個有效的概率:

這的確定義了一個有效的條件概率分佈,但我們並不能使用梯度下降來高效地訓練它。任何時候當W^{\top }h+b處於單位區間外時,模型的輸出對它的參數的梯度都將爲0。梯度爲0 通常是有問題的,因爲學習算法對於如何提高相應的參數沒有了指導。

與之相對的,最好是使用一種不同的方法來保證無論何時模型給出了錯誤的答案時總能有一個很強的梯度。這種方法是基於用sigmoid輸出單元結合最大似然來實現的。

sigmoid輸出單元定義爲

這裏\sigma是第3.10節中介紹的logistic sigmoid函數。

我們可以認爲 sigmoid輸出單元具有兩個部分。首先,它使用一個線性層來計算z=w^{\top }h+b。接着,它使用 sigmoid激活函數將z轉化成概率。

我們暫時忽略對於x的依賴性,只討論如何用z的值來定義y的概率分佈。sigmoid可以通過構造一個非歸一化(和不爲1)的概率分佈\widetilde{P}(y)來得到。我們可以隨後除以一個合適的常數來得到有效的概率分佈。如果我們假定非歸一化的對數概率對y和z是線性的,可以對它取指數來得到非歸一化的概率。我們然後對它歸一化,可以發現這服從Bernoulli 分佈,它受z 的sigmoid變換控制:

(沒看懂

 

基於指數和歸一化的概率分佈在統計建模的文獻中很常見。用於定義這種二值型變量分佈的變量z被稱爲分對數(logit)。 

這種在對數空間裏預測概率的方法可以很自然地使用最大似然學習。因爲用於最大似然的代價函數是-logP(y|x),代價函數中的log 抵消了sigmoid中的exp。如果沒有這個效果,sigmoid的飽和性會阻止基於梯度的學習做出好的改進。我們使用最大似然來學習一個由sigmoid參數化的Bernoulli分佈,它的損失函數爲

這個推導使用了3.10節中的一些性質。通過將損失函數寫成softplus函數的形式我們可以看到它僅僅在(1-2y)2取絕對值非常大的負值時纔會飽和。因此飽和只會出現在模型已經得到正確答案時——當y=1且z取非常大的正值時,或者y=0且z取非常小的負值時。當z的符號錯誤時, softplus函數的變量(1-2y)z可以簡化爲\left | z \right |。當\left | z \right |變得很大並且z的符號錯誤時, softplus函數漸進地趨向於它的變量\left | z \right |。對z求導則漸進地趨向於sign(z),所以,對於極限情況下極度不正確的z,softplus函數完全不會收縮梯度。這個性質很有用,因爲它意味着基於梯度的學習可以很快地改正錯誤的z

當我們使用其他的損失函數,例如均方誤差之類的,損失函數會在任何\sigma (z)飽和時飽和。sigmoid激活函數在z取非常小的負值時會飽和到0,當z取非常大的正值時會飽和到1。這種情況一旦發生,梯度會変得非常小以至於不能用來學習,無論此時模型給出的是正確還是錯誤的答案。因爲這個原因,最大似然幾乎總是訓練 sigmoid輸出單元的優選方法。

理論上, sigmoid的對數總是確定和有限的,因爲 sigmoid的返回值總是被限制在開區間(0,1)上,而不是使用整個閉區間[0,1]的有效概率。在軟件實現時,爲了 避免數值問題,最好將負的對數似然寫作z的函數,而不是\widehat{y}=\sigma (z)的函數。如果sigmoid函數下溢到零,那麼之後對\widehat{y}取對數會得到負無窮。

用於Multinoulli 輸出分佈的softmax 單元

任何時候當我們想要表示一個具有n個可能取值的離散型隨機變量的分佈時,我們都可以使用softmax函數。它可以看作是sigmoid函數的擴展,sigmoid函數用來表示二值型變量的分佈。

softmax函數最常用作分類器的輸出,來表示n 個不同類上的概率分佈。比較少見的是,softmax函數可以在模型內部使用,例如如果我們想要在某個內部變量的n個不同選項中進行選擇。

在二值型變量的情況下,我們希望計算一個單獨的數

因爲這個數需要處在0 和1 之間,並且我們想要讓這個數的對數可以很好地用於對數似然的基於梯度的優化,我們選擇去預測另外一個數z=log\widehat{P}(y=1|x)。對其指數化和歸一化,我們就得到了一個由sigmoid函數控制的Bernoulli 分佈。

爲了推廣到具有n 個值的離散型變量的情況,我們現在需要創造一個向量\widehat{y},它的每個元素是\widehat{y}_{i}=P(y=i|x)。我們不僅要求每個\widehat{y}_{i}元素介於0 和1 之間,還要使得整個向量的和爲1 使得它表示一個有效的概率分佈。用於Bernoulli 分佈的方法同樣可以推廣到Multinoulli 分佈。首先,線性層預測了非標準化的對數概率: 

其中z_{i}=log\widehat{P}(y=i|x)。 softmax函數然後可以對z指數化和歸一化來獲得需要的\widehat{y}。最終, softmax函數的形式爲 

和 logistic sigmoid一樣,當使用最大化對數似然訓練 softmax來輸出目標值y時,使用指數函數工作地非常好。這種情況下,我們想要最大化logP(y=i;z)=logsoftmax(z)_{i}。將 soft max定義成指數的形式是很自然的因爲對數似然中的log可以抵消 softmax中的exp 

公式6.30中的第一項表示輸入z_{i}總是對代價函數有直接的貢獻。因爲這一項不會飽和,所以即使z_{i} 對公式6.30的第二項的貢獻很小,學習依然可以進行。當最大化對數似然時,第一項鼓勵z_{i}被推高,而第二項則鼓勵所有的z 被壓低。爲了對第二項log\sum_{j}exp(z_{j})有一個直觀的理解,注意到這一項可以大致近似爲\max _{j}z_{j}。這種近似是基於對任何明顯小於\max _{j}z_{j} 的z_{k}exp(z_{k}) 都是不重要的。我們能從這種近似中得到的直覺是,負對數似然代價函數總是強烈地懲罰最活躍的不正確預測。如果正確答案已經具有了softmax 的最大輸入,那麼-z_{i} 項和log\sum_{j}exp(z_{j})\approx max_{j}z_{j}項將大致抵消。這個樣本對於整體訓練代價貢獻很小,將由其他未被正確分類的樣本支配。

到目前爲止我們只討論了一個例子。總體來說,未正則化的最大似然會驅動模型去學習一些參數,而這些參數會驅動softmax 函數來預測在訓練集中觀察到的每個結果的比率

因爲最大似然是一致的估計量,所以只要模型族能夠表示訓練的分佈,這就能保證發生。在實踐中,有限的模型能力和不完美的優化將意味着模型只能近似這些比率。

除了對數似然之外的許多目標函數對softmax 函數不起作用。具體來說,那些不使用對數來抵消softmax 中的指數的目標函數,當指數函數的變量取非常小的負值時會造成梯度消失,從而無法學習。特別是,平方誤差對於softmax 單元來說是一個很差的損失函數,即使模型做出高度可信的不正確預測,也不能訓練模型改變其輸出(Bridle, 1990)。要理解爲什麼這些損失函數可能失敗,我們需要檢查softmax
函數本身。

像sigmoid一樣,softmax 激活函數可能會飽和。sigmoid函數具有單個輸出,當它的輸入極端負或者極端正時會飽和。對於softmax 的情況,它有多個輸出值。當輸入值之間的差異變得極端時,這些輸出值可能飽和。當softmax 飽和時,基於softmax 的許多代價函數也飽和,除非它們能夠轉化飽和的激活函數。 

爲了說明softmax函數對於輸入之間差異的響應,觀察到當對所有的輸入都加上一個相同常數時softmax 的輸出不變:

使用這個性質,我們可以導出一個數值方法穩定的softmax 函數的變體:

變換後的形式允許我們在對softmax 函數求值時只有很小的數值誤差,即使是當z包含極正或者極負的數時。觀察softmax 數值穩定的變體,可以看到softmax 函數由它的變量偏離\max _{i}z_{i}的量來驅動。

當其中一個輸入是最大z_{i}=\max _{i}z_{i}並且z_{i} 遠大於其他的輸入時,相應的輸出softmax(z)_{i} 會飽和到1。當z_{i}不是最大值並且最大值非常大時,相應的輸出softmax(z)_{i} 也會飽和到0。這是sigmoid單元飽和方式的一般化,並且如果損失函數不被設計成對其進行補償,那麼也會造成類似的學習困難。

softmax 函數的變量z 可以用兩種方式產生。最常見的是簡單地使神經網絡較早的層輸出z 的每個元素,就像先前描述的使用線性層z=w^{\top }h+b。雖然很直觀,但這種方法是對分佈的過度參數化。n 個輸出總和必須爲1 的約束意味着只有n-1 個參數是必要的;第n 個概率值可以通過1 減去前面n-1 個概率來獲得。因此,我們可以強制要求z 的一個元素是固定的。例如,我們可以要求z_{n}=0。事實上,這正是sigmoid單元所做的。定義P(y=1|x)=\sigma (z)等價於用二維的z 以及z1 = 0 來定義P(y=1|x)=softmax(z)_{1}。無論是n-1 個變量還是n個變量的方法,都描述了相同的概率分佈,但會產生不同的學習機制。在實踐中,無論是過度參數化的版本還是限制的版本都很少有差別,並且實現過度參數化的版本更爲簡單。

從神經科學的角度看,有趣的是認爲softmax 是一種在參與其中的單元之間形成競爭的方式:softmax 輸出總是和爲1,所以一個單元的值增加必然對應着其他單元值的減少。這與被認爲存在於皮質中相鄰神經元間的側抑制類似。在極端情況下(當最大的a_{i} 和其他的在幅度上差異很大時),它變成了贏者通喫(winner-take-all)的形式(其中一個輸出接近1,其他的接近0)。

“softmax’’ 的名稱可能會讓人產生困惑。這個函數更接近於argmax 函數而不是max 函數。“soft’’ 這個術語來源於softmax 函數是連續可微的。“argmax’’ 函數的結果表示爲一個one-hot向量(只有一個元素爲1,其餘元素都爲0 的向量),不是連續和可微的。softmax 函數因此提供了argmax 的‘‘軟化’’ 版本。max 函數相應的軟化版本是softmax(z)^{\top }z。可能最好是把softmax 函數稱爲“softargmax’’,但當前名稱是一個根深蒂固的習慣了。

其他的輸出類型 

先前描述的線性、sigmoid和softmax 輸出單元是最常見的。神經網絡可以推廣到我們希望的幾乎任何種類的輸出層。最大似然原則爲如何爲幾乎任何種類的輸出層設計一個好的代價函數提供了指導。

一般的,如果我們定義了一個條件分佈p(y|x;\Theta ),最大似然原則建議我們使用-logp(y|x;\Theta ) 作爲代價函數。

一般來說,我們可以認爲神經網絡表示函數f(x;\Theta )。這個函數的輸出不是對y值的直接預測。相反,f(x;\Theta )=\omega 提供了y分佈的參數。我們的損失函數就可以表示成-logp(y;\omega (x) )

例如,我們想要學習在給定x 時y 的條件高斯分佈的方差。簡單情況下,方差\sigma ^{2}是一個常數,此時有一個閉合的表達式,這是因爲方差的最大似然估計量僅僅是觀測值y 與它們的期望值的差值的平方平均。一種計算上更加昂貴但是不需要寫特殊情況代碼的方法是簡單地將方差作爲分佈p(y|x)的其中一個屬性,這個分佈受\omega=f(x;\Theta )控制。負對數似然 -logp(y;\omega (x) )將爲代價函數提供一個必要的合適項來使我們的優化過程可以逐漸地學到方差。在標準差不依賴於輸入的簡單情況下,我們可以在網絡中創建一個直接複製到\omega中的新參數。這個新參數可以是\sigma本身,或者可以是表示\sigma ^{2}的參數v,或者可以是表示\frac{1}{\sigma ^{2}}的參數\beta,取決於我們怎樣對分佈參數化。我們可能希望模型對不同的x 值預測出y 不同的方差。這被稱爲異方差(heteroscedastic) 模型。在異方差情況下,我們簡單地把方差指定爲f(x;\Theta )其中一個輸出值。實現它的典型方法是使用精度而不是方差來表示高斯分佈,就像公式3.22所描述的。在多維變量的情況下,最常見的是使用一個對角精度矩陣

這個公式適用於梯度下降,因爲由\beta參數化的高斯分佈的對數似然的公式僅涉及\beta _{i}的乘法和log\beta _{i}的加法。乘法、加法和對數運算的梯度表現良好。相比之下,如果我們用方差來參數化輸出、我們需要用到除法。除法函數在零附近會變得任意陡峭。雖然大梯度可以幫助學習,但任意大的梯度通常導致不穩定如果我們用標準差來參數化輸出,對數似然仍然會涉及除法,並且還將涉及平方通過平方運算的梯度可能在零附近消失,這使得學習被平方的參數變得困難。無論我們使用的是標準差方差還是精度,我們必須確保高斯分佈的協方差矩陣是正定的。因爲精度矩陣的特徵值是協方差矩陣特徵值的倒數,所以這等價於確保精度矩陣是正定的。如果我們使用對角矩陣,或者是一個常數乘以單位矩陣,那麼我們需要對模型輸出強加的唯一條件是它的元素都爲正。如果我們假設a是用於確定對角精度的模型的原始激活, 那麼可以用softplus 函數來獲得正的精度向量:\beta =\zeta (a)。這種相同的策略對於方差或標準差同樣適用,也適用於常數乘以單位陣的情況。

學習一個比對角矩陣具有更豐富結構的協方差或者精度矩陣是很少見的。如果協方差矩陣是滿的和有條件的,那麼參數化的選擇就必須要保證預測的協方差矩陣是正定的。這可以通過寫成\sum (x)=B(x)B^{\top }(x)來實現,這裏B是一個無約束的方陣。如果矩陣是滿秩的,那麼一個實際問題是計算似然是很昂貴的,計算一個d\times d的矩陣的行列式或者\sum (x)的逆(或者等價地並且更常用地,對它特徵值分解或者B(x) 的特徵值分解)需要O(d^{3})的計算量。

我們經常想要執行多峯迴歸(multimodal regression),即預測條件分佈p(y|x)的實值,該條件分佈對於相同的x 值在y 空間中有多個不同的峯值。在這種情況下,Gaussian 混合是輸出的自然表示(Jacobs et al., 1991; Bishop, 1994)。帶有將Gaussian 混合作爲其輸出的神經網絡通常被稱爲混合密度網絡(mixture densitynetwork)。具有n 個分量的Gaussian 混合輸出由下面的條件分佈定義

神經網絡必須有三個輸出:定義p(c=i|x)的向量,對所有的i 給出\mu ^{(i)}(x)的矩陣,以及對所有的i 給出\sum {_{}}^{(i)}(x)的張量。這些輸出必須滿足不同的約束 :

  1. 混合組件p(c=i|x)它們由潛變量c(我們之所以認爲c 是潛在的,是因爲我們不能直接在數據中觀測到它:給定輸入x 和目標y,不可能確切地知道是哪個Gaussian 組件產生y,但我們可以想象y 是通過選擇其中一個來產生的,並且將那個未被觀測到的選擇作爲隨機變量)關聯着,在n個不同組件上形成 Multinoulli分佈。這個分佈通常可以由n維向量的 softmax來獲得,以確保這些輸出是正的並且和爲1。
  2. 均值\mu ^{(i)}(x):它們指明瞭與第i個 Gaussian組件相關聯的中心或者均值,並且是無約束的(通常對於這些輸出單元完全沒有非線性)。如果y是個d維向量,那麼網絡必須輸出一個由n個這種d維向量組成的n×d的矩陣。用最大似然來學習這些均值要比學習只有一個輸出模式的分佈的均值稍稍複雜一些。我們只想更新那個真正產生觀測數據的組件的均值。在實踐中,我們並不知道是哪個組件產生了觀測數據。負對數似然的表達式對每個樣例對於損失函數的貢獻關於每個組件賦予相應的權重,權重值的大小由相應的組件產生這個樣例的概率來決定。
  3. 協方差\sum {_{}}^{(i)}(x):它們指明瞭每個組件i 的協方差矩陣。當學習單個的Gaussian組件時,我們通常使用對角矩陣來避免計算行列式。當學習混合均值時,最大似然是很複雜的,它需要將每個點的部分責任分配給每個混合組件。如果給定了混合模型的正確的負對數似然,梯度下降將自動地遵循正確的過程。

有報道說基於梯度的優化方法對於混合條件Gaussian(作爲神經網絡的輸出)可能是不可靠的,部分是因爲涉及到除法(除以方差)可能是數值不穩定的(當某個方差對於特定的實例變得非常小時,會導致非常大的梯度)。一種解決方法是梯度截斷(clip gradient)(見10.11.1節),另外一種是啓發式梯度放縮(Murray and Larochelle, 2014)。

Gaussian 混合輸出在語音生成模型(Schuster, 1999) 和物理運動(Graves, 2013)中特別有效。混合密度策略爲網絡提供了一種方法來表示多種輸出模式,並且控制輸出的方差,這對於在這些實數域中獲得高質量的結果是至關重要的。混合密度網絡的一個實例如圖6.4所示。

一般的,我們可能希望繼續對包含更多變量的更大的向量y 來建模,並在這些輸出變量上施加更多更豐富的結構。例如,我們可能希望神經網絡輸出字符序列形成一個句子。在這些情況下,我們可以繼續使用最大似然原理應用到我們的模型p(y;\omega (x))上,但我們用來描述y 的模型會變得非常複雜,超出了本章的範疇。第十章描述瞭如何用循環神經網絡來定義這種序列上的模型,第三部分描述了對任意概率分佈進行建模的高級技術。

隱藏單元

到目前爲止我們集中討論了神經網絡的設計選擇,這對於使用基於梯度的優化方法來訓練的大多數參數化機器學習模型都是通用的。現在我們轉向一個前饋神經網絡獨有的問題:該如何選擇隱藏單元的類型,這些隱藏單元用在模型的隱藏層中

隱藏單元的設計是一個非常活躍的研究領域,並且還沒有許多明確的指導性理論原則。

整流線性單元是隱藏單元極好的默認選擇。許多其他類型的隱藏單元也是可用的。決定何時使用哪種類型的隱藏單元是困難的事(儘管整流線性單元通常是一個可接受的選擇)。我們這裏描述對於每種隱藏單元的一些基本直覺。這些直覺可以用來建議我們何時來嘗試一些單元。通常不可能預先預測出哪種隱藏單元工作得最好。設計過程充滿了試驗和錯誤,先直覺認爲某種隱藏單元可能表現良好,然後用它組成神經網絡進行訓練,最後用校驗集來評估它的性能。

這裏列出的一些隱藏單元可能並不是在所有的輸入點上都是可微的。例如,整流線性單元g(z)=max\left \{ 0,z \right \}在z = 0 處不可微。這似乎使得g 對於基於梯度的學習算法無效。在實踐中,梯度下降對這些機器學習模型仍然表現得足夠好。部分原因是神經網絡訓練算法通常不會達到代價函數的局部最小值,而是僅僅顯著地減小它的值,如圖4.3所示。這些想法會在第八章中進一步描述。因爲我們不再期望訓練能夠實際到達梯度爲0 的點,所以代價函數的最小值對應於梯度未定義的點是可以接受的。不可微的隱藏單元通常只在少數點上不可微。一般來說,函數g(z) 具有左導數和右導數,左導數定義爲緊鄰在z 左邊的函數的斜率,右導數定義爲緊鄰在z 右邊的函數的斜率。只有當函數在z 處的左導數和右導數都有定義並且相等時,函數在z 點處纔是可微的。神經網絡中用到的函數通常對左導數和右導數都有定義。在
g(z)=max\left \{ 0,z \right \}的情況下,在z = 0 處的左導數是0,右導數是1。神經網絡訓練的軟件實現通常返回左導數或右導數的其中一個,而不是報告導數未定義或產生一個錯誤。這可以通過觀察到在數字計算機上基於梯度的優化總是會受到數值誤差的影響來啓發式地給出理由。當一個函數被要求計算g(0) 時,底層值真正爲0 是不太可能的。相對的,它可能是被舍入爲0 的一個小量ϵ。在某些情況下,理論上更好的
理由可以使用,但這些通常對神經網絡訓練並不適用。重要的是,在實踐中,我們可以放心地忽略下面描述的隱藏單元激活函數的不可微性。

除非另有說明,大多數的隱藏單元都可以描述爲接受輸入向量x,計算仿射變換z=W^{\top }x+b,然後使用一個作用於每個元素的非線性函數g(z)。大多數隱藏單元的區別僅僅在於激活函數g(z) 的形式。

整流線性單元及其擴展

整流線性單元使用激活函數g(z)=max\left \{ 0,z \right \}

整流線性單元易於優化,因爲它們和線性單元非常類似。線性單元和整流線性單元的唯一區別在於整流線性單元在其一半的定義域上輸出爲零。這使得只要整流線性單元處於激活狀態它的導數都能保持較大。它的梯度不僅大而且一致。整流操作的二階導數幾乎處處爲0,並且在整流線性單元處於激活狀態時它的一階導數處處爲1。這意味着它的梯度方向對於學習來說更加有用,相比於引入二階效應的激活
函數。

整流線性單元通常用於仿射變換上: 

當初始化仿射變換的參數時,可以將b的所有元素設置成一個小的正值,例如0.1。這使得整流線性單元很可能初始時就對訓練集中的大多數輸入呈現激活狀態,並且允許導數通過。

有很多整流線性單元的擴展存在。大多數這些擴展的表現比得上整流線性單元,並且偶爾表現得更好。

整流線性單元的一個缺陷是它們不能通過基於梯度的方法學習那些使它們激活爲零的樣例。整流線性單元的各種擴展保證了它們能在各個位置都接收到梯度。

整流線性單元的三個擴展基於當z_{i}<0時使用一個非零的斜率\alpha _{i} : h_{i}=g(z,\alpha )_{i}=max\left \{ 0,z_{i} \right \}+\alpha _{i}min(0,z_{i})絕對值整流( absolute value rectification)固定\alpha _{i}=1來得到g(z)=\left | z \right |。它用於圖像中的對象識別( J arnett et al,2009a),其中尋找在輸入照明極性反轉下不變的特徵是有意義的。整流線性單元的其他擴展更廣泛地適用。滲漏整流線性單元( Leaky Relu)( Maas et a,2013)將\alpha _{i}固定成一個類似0.01 的小值,參數化整流線性單元(parametric ReLU) 或者PReLU將\alpha _{i}作爲學習的參數(He et al., 2015)。

maxout 單元(maxout unit)(Goodfellow et al., 2013a) 進一步擴展了整流線性單元。並不是使用作用於每個元素的函數g(z),maxout 單元將z 劃分爲具有k 個值的組。每個maxout 單元然後輸出其中一組的最大元素:

這裏\mathbb{G}^{(i)}是組i 的輸入指標集{(i-1)k +1;... ; ik}。這提供了一種方法來學習對輸入x 空間中多個方向響應的分段線性函數。

maxout 單元可以學習具有多達k 段的分段線性的凸函數。maxout 單元因此可以視爲學習激活函數本身而不僅僅是單元之間的關係。使用足夠大的k,maxout 單元可以以任意的逼真度來近似任何凸函數。特別地,具有每組兩塊的maxout 層可以學習實現和傳統層相同的輸入x 的函數,包括整流線性激活函數、絕對值整流、滲漏整流線性單元或參數化整流線性單元、或者可以學習實現與這些都不同的函數。
maxout 層的參數化當然也將與這些層不同,所以即使是maxout 學習去實現和其他種類的層相同的x 的函數這種情況下,學習的機理也是不一樣的。

每個maxout 單元現在由k 個權重向量來參數化,而不僅僅是一個,所以maxout單元通常比整流線性單元需要更多的正則化。如果訓練集很大並且每個單元分得的塊數保持很低的話,它們可以在沒有正則化的情況下正常工作(Cai et al., 2013)。maxout 單元還有一些其他的優點。在某些情況下,需要更少的參數可以獲得一些統計和計算上的優點。具體來說,如果由n 個不同的線性過濾器描述的特徵可以在不損失信息的情況下,用每一組k 個特徵的最大值來概括的話,那麼下一層可以獲得k 倍更少的權重數。

因爲每個單元由多個過濾器驅動,maxout 單元具有一些冗餘來幫助它們抵抗一種被稱爲災難遺忘(catastrophic forgetting) 的現象,這個現象是說神經網絡忘記了如何執行它們過去訓練的任務(Goodfellow et al., 2014a)。 

整流線性單元和它們的這些擴展都是基於一個原則,那就是如果它們的行爲更接近線性,那麼模型更容易優化。使用線性行爲更容易優化的一般性原則同樣也適用在除了深度線性網絡以外的內容。循環網絡可以從序列中學習併產生狀態和輸出的序列。當訓練它們時,需要通過一些時間步長來傳播信息,當其中包含一些線性計算(具有大小接近1 的某些方向導數)時,這會更容易。作爲性能最好的循環網絡結構之一,LSTM 通過求和來在時間上傳播信息,這是一種特別直觀的線性激活。它將在10.10節中進一步討論。

logistic sigmoid與雙曲正切函數

在引入整流線性單元之前,大多數神經網絡使用logistic sigmoid激活函數

或者是雙曲正切激活函數

這些激活函數緊密相關,因爲tanh(z)=2\sigma (2z)-1。 

我們已經看過sigmoid單元作爲輸出單元用來預測二值型變量取值爲1 的概率。與分段線性單元不同,sigmoid單元在其大部分定義域內都飽和——當z 取絕對值很大的正值時,它們飽和到一個高值,當z 取絕對值很大的負值時,它們飽和到一個低值,並且僅僅當z 接近0 時它們纔對輸入強烈敏感。sigmoid單元的廣泛飽和性會使得基於梯度的學習變得非常困難。因爲這個原因,現在不鼓勵將它們用作前饋網絡中的隱藏單元它們作爲輸出單元可以與基於梯度的學習相兼容,如果使用了一個合適的代價函數來抵消sigmoid的飽和性的話

當必須要使用sigmoid激活函數時,雙曲正切激活函數通常要比logistic sigmoid函數表現更好。在tanh(0)=0\sigma (0)=\frac{1}{2}的意義上,它更像是單位函數。因爲tanh在0 附近與單位函數類似,訓練深層神經網絡\widehat{y}=w^{\top }tanh(U^{\top }tanh(V^{\top }x))類似於訓練一個線性模型\widehat{y}=w^{\top }U^{\top }V^{\top }x,只要網絡的激活能夠被保持地很小。這使得訓練tanh 網絡更加容易。

sigmoid激活函數在除了前饋網絡以外的配置中更爲常見。循環網絡、許多概率模型以及一些自編碼器有一些額外的要求使得它們不能使用分段線性激活函數,並且使得sigmoid單元更具有吸引力,儘管它存在飽和性的問題。

其他隱藏單元

也存在許多其他種類的隱藏單元,但它們並不常用。

一般來說,很多種類的可微函數都表現得很好。許多未發佈的激活函數與流行的激活函數表現得一樣好。爲了提供一個具體的例子,作者在MNIST 數據集上使用h=\cos (Wx+b)測試了一個前饋網絡,並獲得了小於1% 的誤差率,這可以與更爲傳統的激活函數獲得的結果相媲美。在新技術的研究和開發期間,通常會測試許多不同的激活函數,並且會發現許多標準方法的變體表現非常好。這意味着,通
常新的隱藏單元類型只有在被明確證明能夠提供顯著改進時纔會被髮布。新的隱藏單元類型如果與已有的隱藏單元表現大致相當的話,那麼它們是非常常見的,不會引起別人的興趣。

想要列出文獻中出現的所有隱藏單元類型是不切實際的。我們只對一些特別有用和獨特的類型進行強調。

其中一種是完全沒有激活函數g(z)。也可以認爲這是使用單位函數作爲激活函數。我們已經看過線性單元可以用作神經網絡的輸出。它也可以用作隱藏單元。如果神經網絡的每一層都僅由線性變換組成,那麼網絡作爲一個整體也將是線性的。然而,神經網絡的一些層是純線性也是可以接受的。考慮具有n 個輸入和p 個輸出的神經網絡層h=g(W^{\top }x+b)。我們可以用兩層來代替它,一層使用權重矩陣U,另一層使用權重矩陣V 。如果第一層沒有激活函數,那麼我們對基於W 的原始層的權重矩陣進行因式分解。分解方法是計算h=g(V^{\top }U^{\top }x+b)。如果U 產生了q 個輸出,那麼U 和V 一起僅包含(n+p)q 個參數,而W 包含np 個參數。如果q 很小,這可以在很大程度上節省參數。這是以將線性變換約束爲低秩的代價來實現的,但這些低秩關係往往是足夠的。線性隱藏單元因此提供了一種減少網絡中參數數量的有效方法

softmax 單元是另外一種經常用作輸出的單元(如第6.2.2.3節中所描述的),但有時也可以用作隱藏單元。softmax 單元很自然地表示具有k 個可能值的離散型隨機變量的概率分佈,所以它們可以用作一種開關。這些類型的隱藏單元通常僅用於明確地學習操作內存的高級結構中,將在10.12節中描述。

其他一些常見的隱藏單元類型包括:

  • 徑向基函數( radial basis function,RBF):h_{i}=exp\left ( -\frac{1}{ {\sigma_{i}}^{2}}\left \| W_{:,i}-x \right \|^{2} \right )。這個函數在x 接近模板W_{:,i}時更加活躍。因爲它對大部分x都飽和到0,因此很難優化。
  • softplus函數:g(a)=\zeta (a)=\log (1+e^{a})。這是整流線性單元的平滑版本,由 Dugas et a.(2001b)引入用於函數近似,由 Nair and Hinton(2010a)引入用於無向概率模型的條件分佈。 Glorot et al..(201la)比較了 softplus和整流線性單元,發現後者的結果更好。通常不鼓勵使用 softplus函數。 softplus表明隱藏單元類型的性能可能是非常反直覺的——因爲它處處可導或者因爲它不完全飽和,人們可能希望它具有優於整流線性單元的點,但根據經驗來看,它並沒有。
  • 硬雙曲正切函數(hard tanh):它的形狀和tanh 以及整流線性單元類似,但是不同於後者,它是有界的,g(a)=\max (-1,\min (1,a))。它由Collobert (2004)引入。

隱藏單元的設計仍是一個很活躍的研究領域,許多有用的隱藏單元類型仍有待發現。 

 

結構設計

神經網絡設計的另一個關鍵點是確定它的結構。結構( architecture)一詞是指網絡的整體結構:它應該具有多少單元,以及這些單元應該如何連接

大多數神經網絡被組織成稱爲的單元組。大多數神經網絡結構將這些層佈置成鏈式結構,其中每一層都是前一層的函數。在這種結構中,第一層由下式給出:

第二層由

給出,以此類推。

在這些鏈式結構中,主要的結構考慮是選擇網絡的深度和每一層的寬度。我們將會看到,即使只有一個隱藏層的網絡也足夠適應訓練集。更深層的網絡通常能夠對每一層使用更少的單元數和更少的參數,並且經常推廣到測試集,但是通常也更難以優化。對於一個具體的任務,理想的網絡結構必須通過實驗,觀測在驗證集上的錯誤來找到。 

通用近似性質和深度

線性模型,通過矩陣乘法將特徵映射到輸出,顧名思義,僅能表示線性函數。它具有易於訓練的優點,因爲當使用線性模型時,許多損失函數會導出凸優化問題。不幸的是,我們經常想要學習非線性函數。

乍一看,我們可能認爲學習非線性函數需要爲我們想要學習的那種非線性專門設計一類模型族。幸運的是,具有隱藏層的前饋網絡提供了一種通用近似框架。具體來說,通用近似定理(universal approximation theorem)(Hornik et al., 1989;Cybenko, 1989) 表明,一個前饋神經網絡如果具有線性輸出層和至少一層具有任何一種‘‘擠壓’’ 性質的激活函數(例如logistic sigmoid激活函數)的隱藏層只要給予網絡足夠數量的隱藏單元,它可以以任意的精度來近似任何從一個有限維空間到另一個有限維空間的Borel 可測函數。前饋網絡的導數也可以任意好地來近似函數的導數(Hornik et al., 1990)。Borel 可測的概念超出了本書的範疇;對於我們想要實現的目標,只需要知道定義在\mathbb{R}^{n}的有界閉集上的任意連續函數是Borel 可測的,因此可以用神經網絡來近似。神經網絡也可以近似從任何有限維離散空間映射到另一個的任意函數。雖然原始定理最初以具有特殊激活函數的單元的形式來描述,這個激活函數當變量取絕對值非常大的正值和負值時都會飽和,通用近似定理也已經被證明對於更廣泛類別的激活函數也是適用的,其中就包括現在常用的整流線性單元(Leshno et al., 1993)。

通用近似定理意味着無論我們試圖學習什麼函數,我們知道一個大的MLP 一定能夠表示這個函數。然而,我們不能保證訓練算法能夠學得這個函數。即使MLP能夠表示該函數,學習也可能因兩個不同的原因而失敗。首先,用於訓練的優化算法可能找不到用於期望函數的參數值。其次,訓練算法可能由於過擬合選擇了錯誤的函數。回憶5.2.1節中的‘‘沒有免費的午餐’’ 定理說明了沒有普遍優越的機器學習算法。前饋網絡提供了表示函數的通用系統,在這種意義上,給定一個函數,存在一個前饋網絡能夠近似該函數。不存在通用的過程既能夠驗證訓練集上的特殊樣例,又能夠選擇一個函數來擴展到訓練集上沒有的點。

通用近似定理說明了存在一個足夠大的網絡能夠達到我們所希望的任意精度,但是定理並沒有說這個網絡有多大。Barron (1993) 提供了單層網絡近似一大類函數所需大小的一些界。不幸的是,在最壞情況下,可能需要指數數量的隱藏單元(可能一個隱藏單元對應着一個需要區分的輸入配置)。這在二進制情況下很容易看到:向量v\in \left \{ 0,1 \right \}^{n}上的可能的二進制函數的數量是2^{2^{n}} 並且選擇一個這樣的函數需要2^{n}位,這通常需要O(2^{n})的自由度。

總之,具有單層的前饋網絡足以表示任何函數,但是網絡層可能不可實現得大並且可能無法正確地學習和泛化。在很多情況下,使用更深的模型能夠減少表示期望函數所需的單元的數量,並且可以減少泛化誤差。存在一些函數族能夠在網絡的深度大於某個值d 時被高效地近似,而當深度被限制到小於或等於d 時需要一個遠遠大於之前的模型。在很多情況下,淺層模型所需的隱藏單元的數量是n 的指數級。這個結果最初被證明是在那些不與連續可微的神經網絡類似的機器學習模型中出現,但現在已經擴展到了這些模型。第一個結果是關於邏輯門電路的(Håstad, 1986)。後來的工作將這些結果擴展到了具有非負權重的線性閾值單元(Håstad and Goldmann, 1991; Hajnal et al., 1993),然後擴展到了具有連續值激活的網絡(Maass, 1992; Maass et al., 1994)。許多現代神經網絡使用整流線性單元。Leshno et al. (1993) 證明帶有一大類非多項式激活函數族的淺層網絡,包括整流線性單元,具有通用的近似性質,但是這些結果並沒有強調深度或效率的問題——它們僅指出足夠寬的整流網絡能夠表示任意函數。Montufar et al.(2014) 指出一些用深度整流網絡表示的函數可能需要淺層網絡(一個隱藏層)指數級的隱藏單元才能表示。更確切的說,他們說明分段線性網絡(可以通過整流非線性或maxout 單元獲得)可以表示區域的數量是網絡深度的指數級的函數。圖6.5解釋了帶有絕對值整流的網絡是如何創建函數的鏡像圖像的,這些函數在某些隱藏單元的頂部計算,作用於隱藏單元的輸入。

每個隱藏單元指定在哪裏摺疊輸入空間,來創造鏡像響應(在絕對值非線性的兩側)。通過組合這些摺疊操作,我們獲得指數級
的分段線性區域,他們可以概括所有種類的規則模式(例如,重複)。

更確切的說,Montufar et al. (2014) 的主要定理指出,具有d 個輸入,深度爲l,每個隱藏層有n 個單元的深度整流網絡可以描述的線性區域的數量是

這意味着,是深度l 的指數級。在每個單元具有k 個過濾器的maxout 網絡中,線性區域的數量是

當然,我們不能保證在機器學習(特別是AI)的應用中我們想要學得的函數類型享有這樣的屬性。

我們還可能出於統計原因來選擇深度模型。任何時候,當我們選擇一個特定的機器學習算法時,我們隱含地陳述了一些先驗,這些先驗是關於算法應該學得什麼樣的函數的。選擇深度模型默許了一個非常普遍的信念,那就是我們想要學得的函數應該涉及幾個更加簡單的函數的組合。這可以從表示學習的觀點來解釋,我們相信學習的問題包含發現一組潛在的變化因素,它們可以根據其他更簡單的潛在的變化因素來描述。或者,我們可以將深度結構的使用解釋爲另一種信念,那就是我們想要學得的函數是包含多個步驟的計算機程序,其中每個步驟使用前一步驟的輸出。這些中間輸出不一定是變化的因素,而是可以類似於網絡用來組織其內部處理的計數器或指針。根據經驗,更深的模型似乎確實會更適用於廣泛的任務(Bengio et al., 2007b;Erhan et al., 2009; Bengio, 2009; Mesnil et al., 2011; Ciresan et al., 2012; Krizhevsky et al., 2012a; Sermanet et al., 2013; Farabet et al., 2013; Couprie et al., 2013; Kahou et al., 2013; Goodfellow et al., 2014d; Szegedy et al., 2014a)。圖6.6和圖6.7展示了一些實驗結果的例子。這表明使用深層結構確實在模型學習的函數空間上表示了一個有用的先驗。

 

其他結構上的考慮

到目前爲止,我們都將神經網絡描述成簡單的層的鏈式結構,主要的考慮因素是網絡的深度和每層的寬度。在實踐中,神經網絡顯示出相當的多樣性。許多神經網絡結構已經被開發用於特定的任務。用於計算機視覺的卷積神經網絡的特殊結構將在第九章中介紹。前饋網絡也可以推廣到用於序列處理的循環神經網絡,但有它們自己的結構考慮,將在第十章中介紹。

一般的,層不需要連接在鏈中,儘管這是最常見的做法。許多結構構建了一個主鏈,但隨後又添加了額外的結構屬性,例如從層i 到層i + 2 或者更高層的跳動連接。這些跳動連接使得梯度更容易從輸出層流向更接近輸入的層。結構設計考慮的另外一個關鍵點是如何將層與層之間連接起來。默認的神經網絡層採用矩陣W 描述的線性變換,每個輸入單元連接到每個輸出單元。在之後章節中的許多專用網絡具有較少的連接,使得輸入層中的每個單元僅連接到輸出層單元的一個小子集。這些用於減少連接數量的策略減少了參數的數量以及用於評估網絡的計算量,但通常高度依賴於問題。例如,第九章描述的卷積神經網絡使用對於計算機視覺問題非常有效的稀疏連接的專用模式。在這一章中,很難對通用神經網絡的結構給出更多具體的建議。隨後的章節研發了一些特殊的結構策略,可以在不同的領域工作良好。

BP和其他的微分算法

當我們使用前饋神經網絡接收輸入x 併產生輸出\widehat{y}時,信息通過網絡向前流動。輸入x 提供初始信息,然後傳播到每一層的隱藏單元,最終產生輸出\widehat{y}。這稱之爲前向傳播(forward propagation)。在訓練過程中,前向傳播可以持續向前直到它產生一個標量代價函數J(\Theta )反向傳播(back propagation) 算法(Rumelhart et al.,1986c),經常簡稱爲backprop,允許來自代價函數的信息通過網絡向後流動,以便計算梯度

計算梯度的解析表達式是很直觀的,但是數值化地求解這樣的表達式在計算上可能是昂貴的。反向傳播算法使用簡單和廉價的程序來實現這個目標。

反向傳播這個術語經常被誤解爲用於多層神經網絡的整個學習算法。實際上,反向傳播僅指用於計算梯度的方法,而另一種算法,例如隨機梯度下降,使用該梯度來進行學習。此外,反向傳播經常被誤解爲僅適用於多層神經網絡,但是原則上它可以計算任何函數的導數(對於一些函數,正確的響應是報告函數的導數是未定義的)。特別地,我們會描述如何計算一個任意函數f 的梯度\bigtriangledown _{x}f(x,y),其中x 是一組變量,我們需要它們的導數,而y 是另外一組函數的輸入變量,但我們並不需要它們的導數。在學習算法中,我們最常需要的梯度是成本函數關於參數的梯度,即\bigtriangledown _{\Theta J(\Theta )}。許多機器學習任務涉及計算其他導數,作爲學習過程的一部分,或者用來分析學習的模型。反向傳播算法也適用於這些任務,並且不限於計算成本函數關於參數的梯度。通過網絡傳播信息來計算導數的想法是非常通用的,並且可以用於計算諸如具有多個輸出的函數f 的Jacobi 矩陣的值。我們這裏描述的是最常用的情況,f 只有單個輸出。

計算圖

到目前爲止我們已經用相對非正式的圖形語言討論了神經網絡。爲了更精確地描述反向傳播算法,使用更精確的計算圖(computational graph) 語言是很有幫助的。

將計算形式化爲圖形的方法有很多。

這裏,我們使用圖中的每一個節點來表示一個變量。變量可以是標量、向量、矩陣、張量、或者甚至是另一類型的變量。爲了形式化我們的圖形,我們還需要引入操作(operation)。操作是一個或多個變量的簡單函數。我們的圖形語言伴隨着一組被允許的操作。可以通過將多個操作組合在一起來描述比該組中的操作更復雜的函數。

不失一般性,我們定義一個操作僅返回單個輸出變量。這並沒有失去一般性,因爲輸出變量可以有多個條目,例如向量。反向傳播的軟件實現通常支持具有多個輸出的操作,但是我們在描述中避免這種情況,因爲它引入了對概念理解不重要的許多額外細節。

如果變量y 是變量x 通過一個操作計算得到的,那麼我們畫一條從x 到y 的有向邊。我們有時用操作的名稱來註釋輸出的節點,當上下文很明確時有時也會省略這個標註。計算圖的實例可以參見圖6.8。

 

微積分中的鏈式法則

使用鏈式規則、可以直接寫出某個標量對於計算圖中任何產生該標量的節點的梯度的代數表達式。然而,實際在計算機中計算該表達式時會引入一些額外的考慮體來說,

許多子表達式可能在梯度的整個表達式中重複若干次。任何計算梯度的程序都需要選擇是存儲這些子表達式還是重新計算它們幾次。圖6.9給出了一個例子來說明這些重複的子表達式是如何出現的。

在某些情況下,計算兩次相同的子表達式純粹是浪費。在複雜圖中,可能存在指數多的這種計算上的浪費.使得簡單的鏈式法則不可實現。在其他情況下,計算兩次相同的子表達式可能是以較高的運行時間爲代價來減少內存開銷的有效手段。我們首先給出一個版本的反向傳播算法,它指明瞭梯度的直接計算方式(算法62以及相關的正向計算的算法6.1),按照它實際完成的順序並且遞歸地使用鏈式法則。可以直接執行這些計算或者將算法的描述視爲用於計算反向傳播的計算圖的符號表示。然而,這些公式並沒有明確地操作和構造用於計算梯度的符號圖。這些公式在後面的6.5.6節和算法6.5中給出,其中我們還推廣到了包含任意張量的節點。

首先考慮描述如何計算單個標量u^{(n)}(例如訓練樣例上的損失函數)的計算圖。我們想要計算這個標量對n_{i}個輸入節點u^{(1)}u^{(n_{i})} 的梯度。換句話說,我們希望對所有的i\in \left \{ 1,2,3...n_{i} \right \}計算\frac{\partial u^{(n)}}{\partial u^{(i)}}。在用反向傳播計算梯度來實現參數的梯度下降時,u^{(n)}將對應單個或者小批量實例的代價函數,而u^{(1)}u^{(n_{i})}則對應於模型的參數。

我們將假設圖的節點已經以一種特殊的方式被排序,使得我們可以一個接一個地計算他們的輸出,從u^{(n_{i+1})} 開始,一直上升到u^{(n)}。如算法6.1中所定義的,每個節點u^{(i)} 與操作f^{(i)} 相關聯,並且通過對該函數求值來得到

其中\mathbb{A}^{(i)}u^{(i)}所有雙親節點的集合。 

該算法詳細說明了前向傳播的計算,我們可以將其放入圖\varrho中。爲了執行反向傳播,我們可以構造一個依賴於\varrho並添加額外一組節點的計算圖。這形成了一個子圖\ss,它的每個節點都是\varrho的節點。\ss中的計算和\varrho中的計算順序完全相反,而且\ss中的每個節點計算導數\frac{\partial u^{(n)}}{\partial u^{(i)}}與前向圖中的節點u^{(i)}相關聯。這通過對標量輸出u^{(n)}使用鏈式法則來完成

在算法6.2中詳細說明。子圖\ss 恰好包含每一條對應着\varrho 中從節點u^{(j)} 到節點u^{(i)}的邊。從u^{(j)}u^{(i)} 的邊對應着計算\frac{\partial u^{(j)}}{\partial u^{(i)}}。另外,對於每個節點都要執行一個內積,內積的一個因子是對於u^{j} 孩子節點u^{(i)} 的已經計算的梯度,另一個因子是對於相同
孩子節點u^{(i)} 的偏導數\frac{\partial u^{(i)}}{\partial u^{(j)}}組成的向量。總而言之,執行反向傳播所需的計算量與\varrho 中的邊的數量成比例,其中每條邊的計算包括計算偏導數(節點關於它的一個雙親節點的偏導數)以及執行一次乘法和一次加法。下面,我們將此分析推廣到張量值節點,這只是在同一節點中對多個標量值進行分組並能夠更有效的實現。

反向傳播算法被設計爲減少公共子表達式的數量而不考慮存儲的開銷。具體來說,它執行了圖中每個節點一個Jacobi 乘積的數量的計算。這可以從算法6.2中看出,反向傳播算法訪問了圖中的節點u^{(j)} 到節點u^{(i)} 的每條邊一次,以獲得相關的偏導數\frac{\partial u^{(i)}}{\partial u^{(j)}} 。反向傳播因此避免了重複子表達式的指數爆炸。然而,其他算法可能通過對計算圖進行簡化來避免更多的子表達式,或者也可能通過重新計算而不是存儲這些子表達式來節省內存。 

遞歸地使用鏈式法則來實現BP

 

全連接MLP中BP的計算

符號到符號的導數

一般化的BP

實例:用於MLP訓練的BP

負責化

深度學習界以外的微分

高階微分

歷史小記

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章