看過西瓜書和李航的《統(tǒng)計學習方法》,對機器學習的基本算法算是有了初步的理解。機器學習的算法和思想固然重要,在實際中也有很多應(yīng)用場景,但在超大數(shù)據(jù)集的表現(xiàn)上,深度學習才是當下效果最好的工具。可惜的是,花書這樣一本經(jīng)典著作的中文版翻譯和機翻差不多水平,因此看的時候只能放慢速度。閑言少敘,下面是第六章的學習記錄。
1、深度前饋網(wǎng)絡(luò)概念
深度前饋網(wǎng)絡(luò)(deep feedforward network),也叫作前饋神經(jīng)網(wǎng)絡(luò)(feedforward neural network)或者多層感知機(multilayer perceptron, MLP),是典型的深度學習模型。前饋網(wǎng)絡(luò)的目標是近似某個函數(shù) 。例如,對于分類器,
將輸入
映射到一個類別
。前饋網(wǎng)絡(luò)定義了一個映射
,并且學習參數(shù)
的值使它能夠得到最佳的函數(shù)近似。
下面我們把“深度前饋網(wǎng)絡(luò)”這個詞拆開來看:
這種模型被稱為前向(feedforward)的,是因為信息流過
的函數(shù),流經(jīng)用于定義
的中間計算過程,最終到達輸出
。在模型的輸出和模型本身之間沒有反饋(feedback)連接。
前饋神經(jīng)網(wǎng)絡(luò)被稱作網(wǎng)絡(luò)(network)是因為它們通常用許多不同函數(shù)復(fù)合在一起來表示。該模型與一個有向無環(huán)圖相關(guān)聯(lián),而圖描述了函數(shù)是如何復(fù)合在一起的。例如
、
、
連接在一個鏈上以形成
。這些鏈式結(jié)構(gòu)是神經(jīng)網(wǎng)絡(luò)中最常用的結(jié)構(gòu)。
被稱為網(wǎng)絡(luò)的第一層,
被稱為第二層,以此類推。鏈的全長稱為模型的深度。
那么深度前饋網(wǎng)絡(luò)的各層之間有什么區(qū)別呢?從功能來講,訓練樣本直接指明了輸出層在每一點x上必須做什么,它必須產(chǎn)生一個接近 y 的值。但訓練數(shù)據(jù)并沒有給出其它層中的所需的輸出,所以這些層被稱為隱藏層(hidden layer)。
一種理解前饋網(wǎng)絡(luò)的方式是從線性模型開始,并考慮如何克服它的局限性。如果各層的函數(shù)都是線性函數(shù),那么復(fù)合后的函數(shù)依然是線性的,此時我們的網(wǎng)絡(luò)模型等價于線性模型。為了提高模型的表示能力,我們需要將各層的
設(shè)置為非線性的,從而得到一個非線性映射
。我們可以認為
提供了一組描述
的特征,或者認為它提供了
的一個新的表示。
2、基于梯度的學習
設(shè)計和訓練神經(jīng)網(wǎng)絡(luò)與使用梯度下降訓練其他任何機器學習模型并沒有太大不同。神經(jīng)網(wǎng)絡(luò)和線性模型等算法的最大區(qū)別,在于神經(jīng)網(wǎng)絡(luò)的非線性導(dǎo)致大多數(shù)我們感興趣的代價函數(shù)都變得非凸。這意味著神經(jīng)網(wǎng)絡(luò)的訓練通常使用迭代的、基于梯度的優(yōu)化,僅僅使得代價函數(shù)達到一個非常小的值;而不是像用于訓練線性回歸模型的線性方程求解器或者用于訓練邏輯回歸或 SVM 的凸優(yōu)化算法那樣保證全局收斂。
用于非凸損失函數(shù)的隨機梯度下降沒有這種收斂性保證,并且對參數(shù)的初始值很敏感。對于前饋神經(jīng)網(wǎng)絡(luò),將所有的權(quán)重值初始化為小隨機數(shù)是很重要的。偏置可以初始化為零或者小的正值。
2.1、代價函數(shù)
大多數(shù)現(xiàn)代的神經(jīng)網(wǎng)絡(luò)使用最大似然來訓練。這意味著代價函數(shù)就是負的對數(shù)似然,它與訓練數(shù)據(jù)和模型分布間的交叉熵等價。這個代價函數(shù)表示為
使用最大似然來導(dǎo)出代價函數(shù)的方法的一個優(yōu)勢是,它減輕了為每個模型設(shè)計代價函數(shù)的負擔。明確一個模型則自動地確定了一個代價函數(shù)
。
用于實現(xiàn)最大似然估計的交叉熵代價函數(shù)有一個不同尋常的特性,那就是當它被應(yīng)用于實踐中經(jīng)常遇到的模型時,它通常沒有最小值。如果模型可以控制輸出分布的密度(例如,通過學習高斯輸出分布的方差參數(shù)),那么它可能對正確的訓練集輸出賦予極其高的密度,這將導(dǎo)致交叉熵趨向負無窮。正則化技術(shù)提供了一些不同的方法來修正學習問題,使得模型不會通過這種方式來獲得無限制的收益。
2.2、輸出單元
一種簡單的輸出單元是基于仿射變換的輸出單元,仿射變換不具有非線性。這些單元往往被直接稱為線性單元。給定特征,線性輸出層產(chǎn)生一個向量
,線性輸出層經(jīng)常被用來產(chǎn)生條件高斯分布的均值:
最大化其對數(shù)似然此時等價于最小化均方誤差。
許多任務(wù)需要預(yù)測二值型變量的值。具有兩個類的分類問題可以歸結(jié)為這種形式。此時最大似然的方法是定義
在
條件下的 Bernoulli 分布。為保證模型給出了錯誤答案時,總能有一個較大的梯度。可以使用sigmoid輸出單元結(jié)合最大似然來實現(xiàn)。sigmoid 輸出單元定義為:
這種在對數(shù)空間里預(yù)測概率的方法可以很自然地使用最大似然學習。因為用于最大似然的代價函數(shù)是,代價函數(shù)中的
抵消了
中的
。如果沒有這個效果,sigmoid 的飽和性會阻止基于梯度的學習做出好的改進。因此,最大似然幾乎總是訓練
輸出單元的優(yōu)選方法。
當我們想要表示一個具有 n 個可能取值的離散型隨機變量的分布時,我們可以使用函數(shù)。它可以看作是
函數(shù)的擴展。
函數(shù)最常用作分類器的輸出,來表示
個不同類上的概率分布。比較少見的是,
函數(shù)可以在模型內(nèi)部使用,例如如果我們想要在某個內(nèi)部變量的
個不同選項中進行選擇。
函數(shù)的形式為:
和一樣,當使用最大化對數(shù)似然訓練
來輸出目標值
時,使用指數(shù)函數(shù)工作地非常好。
3、隱藏單元
隱藏單元的設(shè)計是一個非常活躍的研究領(lǐng)域,并且還沒有許多明確的指導(dǎo)性理論原則。
整流線性單元(Rectified Linear Unit, ReLU)是隱藏單元極好的默認選擇。許多其他類型的隱藏單元也是可用的。決定何時使用哪種類型的隱藏單元是困難的事(盡管整流線性單元通常是一個可接受的選擇)。我們這里描述對于每種隱藏單元的一些基本直覺。這些直覺可以用來建議我們何時來嘗試一些單元。通常不可能預(yù)先預(yù)測出哪種隱藏單元工作得最好。設(shè)計過程充滿了試驗和錯誤,先直覺認為某種隱藏單元可能表現(xiàn)良好,然后用它組成神經(jīng)網(wǎng)絡(luò)進行訓練,最后用驗證集來評估它的性能。
大多數(shù)的隱藏單元都接受輸入向量 x,計算仿射變換,然后使用一個逐元素的非線性函數(shù)
。大多數(shù)隱藏單元的區(qū)別僅僅在于激活函數(shù)
的形式。
3.1、整流線性單元及其擴展
整流線性單元使用激活函數(shù):
整流線性單元通常作用于仿射變換之上:
當初始化仿射變換的參數(shù)時,可以將 b 的所有元素設(shè)置成一個小的正值,例如 0.1。這使得整流線性單元很可能初始時就對訓練集中的大多數(shù)輸入呈現(xiàn)激活狀態(tài),并且允許導(dǎo)數(shù)通過。
整流線性單元的一個缺陷是它們不能通過基于梯度的方法學習那些使它們激活為零的樣本。整流線性單元的各種擴展保證了它們能在各個位置都接收到梯度。
整流線性單元的三個擴展基于當時使用一個非零的斜率
:
絕對值整流(absolute value rectification)固定來得到:
,它用于圖像中的對象識別 (Jarrett et al., 2009a);滲漏整流線性單元(Leaky ReLU)(Maas et al., 2013) 將
固定成一個類似 0.01 的小值;參數(shù)化整流線性單元(parametric ReLU)將
作為學習的參數(shù) (He et al., 2015)。
maxout 單元(maxout unit)(Goodfellow et al., 2013a) 進一步擴展了整流線性單元。maxout單元將劃分為每組有
個值的組,而不是使用作用于每個元素的函數(shù)
。每個maxout單元則輸出每組中的最大元素:
這里是組
的輸入索引集
。因為激活函數(shù)中有了max操作,所以整個maxout網(wǎng)絡(luò)也是一種非線性的變換。
maxout的擬合能力是非常強的,它可以擬合任意的的凸函數(shù)。最直觀的解釋就是任意的凸函數(shù)都可以由分段線性函數(shù)以任意精度擬合,而maxout又是取k個隱隱含層節(jié)點的最大值,這些”隱隱含層"節(jié)點也是線性的,所以在不同的取值范圍下,最大值也可以看做是分段線性的(分段的個數(shù)與k值有關(guān))。
整流線性單元和它們的這些擴展都是基于一個原則,那就是如果它們的行為更接近線性,那么模型更容易優(yōu)化。
3.2、logistic sigmoid與雙曲正切函數(shù)
在引入整流線性單元之前,大多數(shù)神經(jīng)網(wǎng)絡(luò)使用 logistic sigmoid 激活函數(shù):
或者是雙曲正切激活函數(shù):
這些激活函數(shù)緊密相關(guān),因為:
我們已經(jīng)看過 sigmoid 單元作為輸出單元用來預(yù)測二值型變量取值為 1 的概率。與分段線性單元不同,sigmoid 單元在其大部分定義域內(nèi)都飽和——當 z 取絕對值很大的正值時,它們飽和到一個高值,當 z 取絕對值很大的負值時,它們飽和到一個低值,并且僅僅當 z 接近 0 時它們才對輸入強烈敏感。sigmoid 單元的廣泛飽和性會使得基于梯度的學習變得非常困難。因為這個原因,現(xiàn)在不鼓勵將它們用作前饋網(wǎng)絡(luò)中的隱藏單元。當使用一個合適的代價函數(shù)來抵消 sigmoid 的飽和性時,它們作為輸出單元可以與基于梯度的學習相兼容。
當必須要使用 sigmoid 激活函數(shù)時,雙曲正切激活函數(shù)通常要比 logistic sigmoid 函數(shù)表現(xiàn)更好。在而
的意義上,它更像是單位函數(shù)。因為 tanh 在 0 附近與單位函數(shù)類似。
4、架構(gòu)設(shè)計
架構(gòu)(architecture)一詞是指網(wǎng)絡(luò)的整體結(jié)構(gòu):它應(yīng)該具有多少單元,以及這些單元應(yīng)該如何連接。
在鏈式架構(gòu)中,主要的架構(gòu)考慮是選擇網(wǎng)絡(luò)的深度和每一層的寬度。我將會看到,即使只有一個隱藏層的網(wǎng)絡(luò)也足夠適應(yīng)訓練集。更深層的網(wǎng)絡(luò)通常能夠?qū)γ恳粚邮褂酶俚膯卧獢?shù)和更少的參數(shù),并且經(jīng)常容易泛化到測試集,但是通常也更難以優(yōu)化。對于一個具體的任務(wù),理想的網(wǎng)絡(luò)架構(gòu)必須通過實驗,觀測在驗證集上的誤差來找到。
4.1、萬能近似性質(zhì)和深度
萬能近似定理(universal approximation theorem)
一個前饋神經(jīng)網(wǎng)絡(luò)如果具有線性輸出層和至少一層具有任何一種 ‘‘擠壓’’ 性質(zhì)的激活函數(shù)(例如logistic sigmoid激活函數(shù))的隱藏層,只要給予網(wǎng)絡(luò)足夠數(shù)量的隱藏單元,它可以以任意的精度來近似任何從一個有限維空間到另一個有限維空間的 Borel 可測函數(shù)。前饋網(wǎng)絡(luò)的導(dǎo)數(shù)也可以任意好地來近似函數(shù)的導(dǎo)數(shù) (Hornik et al., 1990)。
萬能近似定理意味著無論我們試圖學習什么函數(shù),我們知道一個大的MLP一定能夠表示這個函數(shù)。
然而,我們不能保證訓練算法能夠?qū)W得這個函數(shù)。即使 MLP能夠表示該函數(shù),學習也可能因兩個不同的原因而失敗。首先,用于訓練的優(yōu)化算法可能找不到用于期望函數(shù)的參數(shù)值。其次,訓練算法可能由于過擬合而選擇了錯誤的函數(shù)。
總之,具有單層的前饋網(wǎng)絡(luò)足以表示任何函數(shù),但是網(wǎng)絡(luò)層可能大得不可實現(xiàn),并且可能無法正確地學習和泛化。在很多情況下,使用更深的模型能夠減少表示期望函數(shù)所需的單元的數(shù)量,并且可以減少泛化誤差。
存在一些函數(shù)族能夠在網(wǎng)絡(luò)的深度大于某個值d時被高效地近似,而當深度被限制到小于或等于d時需要一個遠遠大于之前的模型。在很多情況下,淺層模型所需的隱藏單元的數(shù)量是n的指數(shù)級。
Montufar et al. (2014) 的主要定理指出,具有個輸入深度為
每個隱藏層具有
個單元的深度整流網(wǎng)絡(luò)可以描述的線性區(qū)域的數(shù)量是:
根據(jù)經(jīng)驗,更深的模型似乎確實在廣泛的任務(wù)中泛化得更好。
4.2、其他架構(gòu)上的考慮
目前為止,我們都將神經(jīng)網(wǎng)絡(luò)描述成層的簡單鏈式結(jié)構(gòu),主要的考慮因素是網(wǎng)絡(luò)的深度和每層的寬度。在實踐中,神經(jīng)網(wǎng)絡(luò)顯示出相當?shù)亩鄻有浴?/p>
一般的,層不需要連接在鏈中,盡管這是最常見的做法。許多架構(gòu)構(gòu)建了一個主鏈,但隨后又添加了額外的架構(gòu)特性,例如從層 i 到層 i + 2 或者更高層的跳躍連接。這些跳躍連接使得梯度更容易從輸出層流向更接近輸入的層。
架構(gòu)設(shè)計考慮的另外一個關(guān)鍵點是如何將層與層之間連接起來。默認的神經(jīng)網(wǎng)絡(luò)層采用矩陣 W 描述的線性變換,每個輸入單元連接到每個輸出單元。許多專用網(wǎng)絡(luò)具有較少的連接,使得輸入層中的每個單元僅連接到輸出層單元的一個小子集。這些用于減少連接數(shù)量的策略減少了參數(shù)的數(shù)量以及用于評估網(wǎng)絡(luò)的計算量,但通常高度依賴于問題。
5、反向傳播和其他的微分算法
當我們使用前饋神經(jīng)網(wǎng)絡(luò)接收輸入并產(chǎn)生輸出
時,信息通過網(wǎng)絡(luò)向前流動。輸入
提供初始信息,然后傳播到每一層的隱藏單元,最終產(chǎn)生輸出
。這稱之為前向傳播(forward propagation)。在訓練過程中,前向傳播可以持續(xù)向前直到它產(chǎn)生一個標量代價函數(shù)
。反向傳播(back propagation)算法 (Rumelhart et al., 1986c),經(jīng)常簡稱為backprop,允許來自代價函數(shù)的信息通過網(wǎng)絡(luò)向后流動,以便計算梯度。
5.1、計算圖
將計算形式化為圖形的方法有很多。這里,我們使用圖中的每一個節(jié)點來表示一個變量。變量可以是標量、向量、矩陣、張量、或者甚至是另一類型的變量。為了形式化我們的圖形,我們還需引入操作(operation)這一概念。操作是指一個或多個變量的簡單函數(shù)。我們的圖形語言伴隨著一組被允許的操作。我們可以通過將多個操作復(fù)合在一起來描述更為復(fù)雜的函數(shù)。
如果變量 y 是變量 x 通過一個操作計算得到的,那么我們畫一條從 x 到 y 的有向邊。我們有時用操作的名稱來注釋輸出的節(jié)點,當上下文很明確時,有時也會省略這個標注。計算圖的實例如下:
5.2、遞歸地使用鏈式法則來實現(xiàn)反向傳播
使用符號到符號的方法計算導(dǎo)數(shù)的示例如下。在這種方法中,反向傳播算法不需要訪問任何實際的特定數(shù)值。相反,它將節(jié)點添加到計算圖中來描述如何計算這些導(dǎo)數(shù)。通用圖形求值引擎可以在隨后計算任何特定數(shù)值的導(dǎo)數(shù)。 本例從表示的圖開始,運行反向傳播算法,指導(dǎo)它構(gòu)造表達式
對應(yīng)的圖。
這部分花書上講了很多內(nèi)容……我看得有些失去耐心……可能是講得太細致了吧……我對反向傳播算法的認識很簡單,就是一個鏈式法則,一層一層計算梯度然后向后傳播。這里根據(jù)之前上課時候的課件內(nèi)容做下簡單回顧:
總之反向傳播算法的要點就是以恰當?shù)捻樞蛴嬎闾荻龋瑥亩浞掷面準椒▌t來提高計算效率。我個人認為理解BP的最佳方式就是自己畫個圖手推一遍。