深度學習:前饋神經網絡

對深度學習(或稱神經網絡)的探索通常從它在計算機視覺中的應用入手。計算機視覺屬於人工智能領域,因深度學習技術而不斷革新,並且計算機視覺的基礎(光強度)是用實數來表示的,處理實數正是神經網絡所擅長的。

以如何識別0到9的手寫數字舉例。如果從頭解決這個問題,首先我們需要製作一個鏡頭來聚焦光線以成像,然後通過光傳感器將光線轉換成計算機可“感知”的電子脈衝,最後,由於使用的是數字計算機,需要將圖片離散化,也就是說,將顏色和光強度通過二維數組表示出來。幸運的是,我們的在線數據集Mnist(發音為“em-nist”)已經幫我們完成了圖片離散化工作。(這裡的“nist”是指美國國家標準技術研究所,此數據集由nist提供。)如圖1.1所示,每張圖片可用28×28的整數數組表示。為了適應頁面,已刪除左右邊界區域。

深度學習:前饋神經網絡

圖1.1 Mnist中離散化的圖片數據

圖1.1中,0表示白色,255表示黑色,介於兩者之間的數字表示灰色。這些數字被稱為像素值,其中像素是計算機可處理圖片的最小單位。像素所能展示的實際世界的“大小”取決於鏡頭,以及鏡頭與物體表面的距離等因素。但在這個例子裡,我們不用考慮這些因素。圖1.1中對應的黑白圖片如圖1.2所示。

深度學習:前饋神經網絡

圖1.2 圖1.1像素得出的黑白圖片

仔細觀察這張圖片,我們會發現可以用一些簡單的方法解決本例中的問題。例如,已知圖片是數字“7”,則(8,8)處的像素點是暗的。同理,數字“7”的中間部分為白色,比如,(13,13)處的像素值為0。數字“1”則不同,由於數字“1”的標準書寫不佔用左上角位置,而是在正中間部分,所以這兩處的像素值與數字“7”相反。稍加思考,我們就能想出許多啟發式規則(大部分情況下是有效的),並利用這些規則編寫分類程序。

然而,這不是我們要做的。本書的重點是機器學習,也就是通過給定的樣本和對應的正確答案讓計算機進行學習。在本例中,我們希望程序通過學習給出的樣本和正確答案(或稱標籤),學會識別28×28像素圖片中的數字。在機器學習中,這被稱為監督學習問題,準確地說,是全監督學習問題,即每個學習樣本都對應有正確答案。在後面的章節中,會出現沒有正確答案的情況,如第6章中的半監督學習問題,第7章的無監督學習問題。在這些章節中我們會具體講解它們的工作機制。

如果忽略處理光線和物體表面的細節問題,就只需解決分類問題,即給定一組輸入(通常稱為特徵),將產生這些輸入(或具有這些特徵)的實體,識別(或分類)為有限類。在本例中,輸入是像素,分為十類。定義有l個輸入(像素)的向量為

x = (x1, x2,…, xl),正確答案為a。通常輸入的是實數,正負均可,在本例中,為正整數。

1.1 感知機

我們從一個更簡單的問題入手,創建一個程序來判斷圖片中的數字是否為0。這是二分類問題,感知機是早期解決二分類問題的機器學習方法之一,如圖1.3所示。

深度學習:前饋神經網絡

圖1.3 感知機原理圖

感知機是神經元的簡單計算模型。單個神經元(見圖1.4)通常由許多輸入(樹突)、一個細胞體和一個輸出(軸突)組成。因此,感知機也有多個輸入和一個輸出。一個簡單的感知機,在判斷28×28像素圖片中的數字是否為0時,需要有784個輸入和1個輸出,每個輸入對應一個像素。為簡化作圖,圖1.3中的感知機只有5個輸入。

深度學習:前饋神經網絡

圖1.4 一個典型的神經元

一個感知機由一個權重向量w = (w1,…, wl )和一個偏置項b組成,其中權重向量的每個權值對應一個輸入。w和b稱為感知機的參數。通常,我們用Φ來表示參數集,Φi∈Φ,Φi是第i個參數。對於感知機,Φ

= {w U b}。

感知機利用這些參數計算下列函數。

深度學習:前饋神經網絡

(1.1)

即,將每個感知機輸入乘其對應權重值,並加上偏置項,若結果大於0,返回1,否則返回0。感知機是二分類器,所以1表示x屬於此類,0則表示不屬於。

將長度為l的兩個向量的點積定義為式(1.2)。

 

深度學習:前饋神經網絡

 (1.2)

因此,我們可以將感知機運算函數簡化如下:

 

深度學習:前饋神經網絡

(1.3)

b+ w·x被稱為線性單元,圖1.3中,使用∑來標識。當涉及調整參數時,可將偏置項視為w中的一個權重,這個權重的特徵值總是1。這樣,只需討論調整w的情況。

我們關注感知機,是因為感知機算法可以根據訓練樣本找到Φ,而且這種算法簡單又魯棒。我們用上標來區分樣本,第k個樣本的輸入是xk = [x1k,…,xlk],對應的答案是ak。在感知機這種二分類器中,答案是1或0,表示是否屬於該類。當分類有m類時,答案將是0到m−1的一個整數。

有時可以將機器學習描述為函數逼近問題。從這個角度來看,單個線性單元感知機定義了一類參數化的函數。而感知機權重的學習,就是挑選出該類中最逼近解的函數,作為“真”函數進行計算,當給定任何一組像素值時,就能正確地判斷圖片是否為數字0。

在機器學習研究中,假設我們至少有兩組,當然最好是三組問題樣本。第一組是訓練集,它用於調整模型的參數。第二組是開發集(它也稱為留出集或驗證集),其在改進模型過程中用於測試模型。第三組是測試集,一旦模型固定了,(幸運的話)產生了良好的結果,我們就可以對測試集樣本進行評估。測試集是為了防止在驗證集上能夠運行的程序在沒見過的問題上不起作用。這些集合有時被稱為語料庫,比如“測試語料庫”。我們使用的Mnist數據可以在網上獲得,訓練數據包括60,000幅圖片及其對應的正確標籤,驗證集和測試集各有10,000幅圖片和標籤。

感知機算法的最大特點是,如果有一組參數值使感知機能夠正確分類所有訓練集,那麼該算法一定會找到這組值。可惜的是對於大多數現實樣本來說,並不存在這組參數值。但即使沒有這組參數值,仍然有參數值可以使得樣本識別正確率很高,就這一點來說,感知機的表現也極其出色。

該算法通過多次迭代訓練集來調整參數以增加正確識別的樣本數。如果訓練時我們遍歷了整個訓練集發現不需要改變任何參數,那這組參數就是正確的,我們可以停止訓練。然而,如果沒有這組正確的參數,那麼參數會一直改變。為了防止這種情況,我們在N次迭代後停止訓練,其中N是程序員設置的系統參數。通常,N隨著要學習的參數總數增加而增加。我們要謹慎區分參數

Φ和其他與程序關聯的參數,它們不屬於Φ,例如訓練集的迭代次數N,我們稱後者為超參數。圖1.5給出了該算法的偽代碼,注意Δx一般是指“x的變化”。

圖1.5中最關鍵的兩行是2(a)i和2(a)ii,其中ak等於1或0,ak=1表示圖片屬於這一類,等於0則表示不屬於。2(a)i行是指如果感知機的輸出是正確的標籤,就不用進行操作。2(a)ii行則指定了如何改變權重wi,如果我們在每一個參數wi上增加(ak−f (xk))xik,再次嘗試這個樣本,感知機誤差會減少,甚至得出正確答案。

深度學習:前饋神經網絡

圖1.5 感知機算法

我們需要嘗試所有可能性,才能瞭解2(a)ii行的算法是如何增加正確率的。假設訓練樣本xk屬於該類,這意味著它的標籤ak = 1。如果我們分類錯誤,那f (xk )(感知機對第k個訓練樣本的輸出)一定是0,所以( ak−f ( xk))= 1,且對於所有的i,Δwi = xik。因為所有像素值都≥0,所以算法會增加權重,下一次運算後f ( xk)會返回更大的值,這減少了誤差。(讀者練習:在樣本實際不在類別裡但感知機卻認為它屬於該類的情況下,使用這個公式達到減少誤差目的。)

我們將偏置項b視為一個虛擬特徵x0的權重,該特徵值恆等於1,上述討論仍能成立。

讓我們舉一個小例子。這裡我們只查看(並調整)四個像素的權重,分別是像素(7,7)(左上角中心位置)、像素(7,14)(上部中心位置)、像素(14,7)和像素(4,14)。通常方便的做法是對像素值進行歸一化,使其介於0和1之間。假設我們的圖片中的數字是0,那麼a = 1,而這四個位置的像素值分別是0.8、0.9、0.6和0。由於最初所有參數都為0,計算第一幅圖片的f(

x),運算w·x+b=0,得到f (x) = 0,所以我們的圖片被錯誤分類,a − f (x) = 1。因此,對權重w7,7進行運算,結果變為(0 + 0.8×1) = 0.8。同樣,接下來的兩個權重w7,14和w14,7變為0.9和0.6。而中心像素權重保持為0(因為那裡的圖像值為0),偏置項變為1.0。需要注意的是,如果我們第二次將同樣的圖片輸入感知機,並使用新的權重,它會被正確分類。

假設下一幅圖片不是數字0,而是數字1,且兩個中心列的像素的值為1,其他為0。那麼b+ w·x = 1 + 0.8×0+ 0.9×1 + 0.6×0 + 0×1 = 1.9,即f(x)>0,感知機會將樣本錯誤分類為0,因此ak−f(xk) = 0−1 = −1。我們根據2(a)ii行調整每個權重,因為像素值為0,所以w7,7和w14,7不變,而w7,14現在變成了0.9−0.9×1 = 0(前一個值減去權重乘以當前像素值)。b和w4,14的新值留給讀者計算。

我們多次在訓練集上進行迭代。將訓練集過一遍被稱為一輪。此外,請注意,如果訓練集數據以不同的順序呈現給程序,我們學習的權重會有所不同,良好的做法是讓訓練集數據在每輪中隨機呈現。在1.6節中我們會再談到這一點,不過為了剛入門的學生,我們省略了這些細節。

如果我們不是隻創建一個感知機,而是為我們想要識別的每個類別都創建一個感知機,這樣就將感知機擴展到多類別決策問題。比如,對於最初的0~9數字識別問題,我們可以創建10個感知機,每個數字一個,然後輸出感知機預測值最高的類別。在圖1.6中,我們展示了三個感知機如何識別三類物體之一的圖片。

雖然圖1.6中三個感知機看起來關聯緊密,但實際上它們是獨立的,只共享相同的輸入。多類別感知機輸出的答案是輸出最高值的線性單元的對應數字,所有感知機都是獨立於其他感知機接受訓練,使用的算法與圖1.5所示完全相同。因此,給定圖片和標籤,我們對10個感知機運行感知機算法步驟2(a)共10次。如果標籤是5,但是得出最高值的感知機對應數字6,那麼對應數字0到4的感知機不會改變它們的參數(因為它們正確地給出了不是這一類或者是這一類的判斷)。對應數字6到9的感知機也是如此。另一方面,由於感知機5和6報告了錯誤的判斷,它們要改變參數。

深度學習:前饋神經網絡

圖1.6 用於識別多個類別的多個感知機

1.2 神經網絡的交叉熵損失函數

在初期,對神經網絡的討論(以下簡稱為NN)伴隨著類似於圖1.6所示的圖表,這類圖表強調了各個計算元素(線性單元)。如今,我們預計這類元素的數量會很大,所以我們討論的是以層為單位的計算。層即為一組存儲或計算單元,各層並行工作並將值傳遞給另一層。圖1.7所示是圖1.6強調了層視圖的版本,它顯示了輸入層到計算層的傳遞過程。

深度學習:前饋神經網絡

圖1.7 神經網絡層

神經網絡可能有許多層,每個層的輸出都是下一層的輸入。層的堆疊結構便是“深度學習”中的“深度”由來。

然而,多層堆疊的感知機工作效果不佳,所以我們需要另一種方法學習如何改變權重。在本節中,我們探討如何使用最簡單的網絡——前饋神經網絡,和相對簡單的學習技術——梯度下降,以達到改變權重的目的。一些研究人員將用梯度下降訓練的前饋神經網絡稱為多層感知機。

在我們討論梯度下降之前,我們首先需要討論損失函數。損失函數是從模型輸出得到輸出結果有多“壞”的函數。在學習模型參數時,我們的目標是將損失最小化。如果對於訓練樣本我們得到了正確的結果,則感知機的損失函數值為零,如果不正確,則為1,這被稱為0-1損失。0-1損失的優點讓我們有足夠的理由使用它,但它也有缺點,它不適用於梯度下降學習,因為梯度下降學習的基本思想是根據以下式子修改參數。

 

深度學習:前饋神經網絡

 

(1.4)

這裡的

深度學習:前饋神經網絡

是學習率,它是實數,用來衡量我們改變參數的程度。損失L相對於參數的偏導數是非常重要的,換句話說,如果我們能發現參數是如何影響損失的,就可以改變參數來減少損失(所以

深度學習:前饋神經網絡

前有符號–)。在我們的感知機中,或者說在神經網絡中,輸出是由模型參數Φ所決定的,所以在此類模型中,損失是函數L(Φ)。

說得更形象一點,假設我們的感知機只有兩個參數,我們可以想象一個具有軸Φ1和Φ2的歐幾里德平面,平面中每個點的上方(或下方)都標有損失函數值。假設參數的當前值分別為1.0和2.2,觀察L在點(1,2.2)的行為。當Φ2=2.2時,圖1.8的切面顯示了作為Φ1函數的虛擬損失的運動軌跡。當Φ1=1時,切線的斜率約為–

深度學習:前饋神經網絡

。如果學習率

深度學習:前饋神經網絡

= 0.5,那麼根據式(1.4),加上(−0.5 ) ×(–

深度學習:前饋神經網絡

) =0.125,即,向右移動約0.125個單位,可以減少損失。

深度學習:前饋神經網絡

圖1.8 作為1函數的虛擬損失的運動軌跡

式(1.4)有效的前提是,損失必須是參數的可微函數,0-1損失卻不是。假設將我們犯錯誤的數量作為某個參數Φ的函數,開始我們只在一個樣本上評估我們的感知機,結果得到錯誤答案。如果我們繼續增加Φ(或者減少Φ),並且重複足夠多次,f(x

)最終會改變它的值,我們就可以得到正確的結果。所以當我們看函數圖像時,會看到一個階躍函數,但是階躍函數是不可微的。

當然,還有其他的損失函數。最常用的是交叉熵損失函數,它最接近“標準” 的損失函數。在本節中,我們將解釋交叉熵損失函數是什麼,以及我們的網絡將如何計算這個函數。下一節使用它進行參數學習。

圖1.6中的網絡輸出一個向量,向量中的每個元素值為一個線性單元的輸出,我們選擇最高輸出值對應的類別,接著改變該網絡,使得輸出的數字是各類的(估計的)概率分佈。在本例中,正確分類的概率是隨機變量C,C=c,其中c∈{0,1,2,…,9}。概率分佈是一組總和為1的非負數,目前該網絡可以輸出數字,但它們一般同時包括正數和負數。幸運的是,softmax函數可以簡單地將一組數字轉換成概率分佈,該函數公式如下:

 

深度學習:前饋神經網絡

 

(1.5)

softmax可以保證返回一個概率分佈,因為即使xi是負數,

深度學習:前饋神經網絡

也是正數,並且所有值加和為1,因為分母是所有可能值之和。例如,σ([−1,0,1])≈[0.09, 0.244,0.665 ]。要注意一個特殊情況是,神經網絡到softmax的輸入都為0。當e0= 1,如果有10個選項,所有選項的概率會是

深度學習:前饋神經網絡

。推而廣之,如果有n個選項,概率即為

深度學習:前饋神經網絡

“softmax”之所以得名,是因為它是“max”函數的“軟”(soft)版本。max函數的輸出完全由最大輸入值決定,softmax的輸出主要但不完全由最大值決定。很多機器學習函數以“softX”的形式命名,意味著X的輸出“被軟化”。

圖1.9顯示了添加了softmax層的網絡。左邊輸入的數字是圖片像素值,添加softmax層之後,右邊輸出的數字是類別概率。離開線性單元進入softmax函數的數字通常稱為logit,這是術語,用來指即將使用softmax轉化為概率的、沒有標準化過的數字(“logit”有多種發音方式,最常用的發音是“LOW-git”)。我們用

l來表示多個logit的向量(每個類別對應一個logit),公式如下:

 

深度學習:前饋神經網絡

 

(1.6)

 

深度學習:前饋神經網絡

 

(1.7)

深度學習:前饋神經網絡

圖1.9 具有softmax層的簡單網絡

公式的第二行是指,由於softmax函數的分母是一個標準化常數,以確保這些數字總和為1,所以概率與softmax的分子成比例。

現在我們可以定義交叉熵損失函數X,

 

深度學習:前饋神經網絡

 (1.8)

樣本x的交叉熵損失是x對應標籤的概率的負對數。換句話說,我們用softmax計算所有類別的概率,然後找出正確答案,損失是這個數字的概率的負對數。

該公式的合理性如下所述:它朝著正確的方向前進。如果X是一個損失函數,模型越差,函數結果應該越大,模型越好,結果越小。而一個改進過的模型應該為正確答案得到更高的概率,所以我們在前面加上一個減號,這樣隨著概率的增加,這個數字會變得越來越小。數字的對數隨著數字的增加/減小而增加/減小。因此,相較於好參數,X(

Φ, x )輸入壞參數得到的結果會更大。

但是為什麼要使用對數?一般認為對數可以縮小數字之間的距離,比如,log(10,000)和log(1,000)之間的差異是1。有人認為這是損失函數的一個缺點:它會讓糟糕的情況看起來不那麼糟糕。對數的這種特徵是有誤導性的,隨著X越來越大,ln(X )卻不會以同樣的程度增加,但考慮圖1.10中的–ln(X),當X變為0時,對數的變化比X的變化大得多。由於我們處理的是概率,這才是我們要關心的區域。

深度學習:前饋神經網絡

圖1.10 –ln(x )圖像

為什麼這個函數被稱為交叉熵損失函數?在信息論中,當概率分佈在逼近某個真實分佈時,這兩個分佈的交叉熵用於測量它們之間的差異,交叉熵損失是交叉熵的負值的近似值。這只是比較淺顯的解釋,因為信息論不是本書重點,所以不再深入討論。

1.3 導數與隨機梯度下降

現在我們有了損失函數,可以用下面的公式來計算它。

深度學習:前饋神經網絡

 

(1.9)

 

深度學習:前饋神經網絡

 

(1.10)

 

深度學習:前饋神經網絡

 

(1.11)

我們首先根據式(1.11)計算logit l,然後根據式(1.10)將這些logit通過softmax層來計算概率,接著根據式(1.9)計算損失,即正確答案概率的負自然對數。請注意,之前線性單元的權重表示為w,但現在我們有許多這樣的單元,所以wj是第j個單元的權重,bj是該單元的偏置項。

這個從輸入到損失的計算過程被稱為學習算法的前向傳遞,它計算在權重調整過程即反向傳遞中將要使用的值。該值可以使用多種方法進行計算,這裡我們使用隨機梯度下降法。“梯度下降”這個術語源於損失函數的斜率(它的梯度),然後使系統跟隨梯度降低其損失(下降)。整個學習方法通常被稱為反向傳播。

我們先舉個最簡單的例子,對某個偏置項bj,如何進行梯度估計。從式 (1.9)~式(1.11)中可以看出,通過先後改變lj的值和概率,bj改變了損失。讓我們分步做這件事。在本例中,我們只考慮由單個訓練樣本引起的錯誤,所以我們將X(

Φ, x )寫為X(Φ)。首先,

 

深度學習:前饋神經網絡

(1.12)

該公式使用鏈式法則來表達前述內容——bj的變化會導致X的變化,這是因為bj的變化會引起lj的變化。

現在看式(1.12)右邊的一階偏導數。事實上,它的值恆等於1。

 

深度學習:前饋神經網絡

 

(1.13)

其中,wi,j是第j個線性單元的第i個權重。因為在

深度學習:前饋神經網絡

中,作為bj的函數變化的只有bj本身,所以導數是1。

接下來,我們考慮X作為lj的函數是如何變化的。

 

深度學習:前饋神經網絡

(1.14)

其中pi是網絡分配給i類的概率。這說明,因為X只取決於正確答案的概率,所以lj只通過改變這個概率來影響X。反過來,

 

深度學習:前饋神經網絡

(1.15)

(來自基礎微積分)。

還剩下一個項有待估值。

 

深度學習:前饋神經網絡

(1.16)

式(1.16)的第一個相等表示我們通過計算logit的softmax函數來獲得概率,第二個相等來自維基百科。公式推導需要仔細梳理各項,所以在這裡我們不做推導,但我們仍可以得出它的合理性。我們來看logit的向量值lj的變化如何影響softmax函數得出的概率,可以查看以下公式。

 

深度學習:前饋神經網絡

分為兩種情況。假設logit正在變化的j不等於a,也就是說,假設這是一張數字6的圖片,但是我們計算的是logit 8對應的偏置。在這種情況下,式中lj只出現在分母中,導數應該是負的(或0),因為lj越大,pa越小。這就對應式(1.16)中的第二種情況,當然,式(1.16)中會產生一個小於或等於0的數字,因為兩個概率相乘不會為負。

另一方面,如果j = a,則式中lj同時出現在分子和分母中。它在分母中的出現會導致結果變小,但是在這種情況下,分子的增加會抵消掉結果的變小。因此,在這種情況下,我們期望一個正導數(或0),這是式(1.16)的第一種情況。

有了這個結果,我們現在可以推導出修正偏置參數bj的公式。將式(1.15)和式(1.16)代入式(1.14),我們可以得到

 

深度學習:前饋神經網絡

(1.17)

 

深度學習:前饋神經網絡

(1.18)

剩下的很簡單。我們在式(1.12)中指出

深度學習:前饋神經網絡

右邊第一個導數值為1。因此,損失相對於bj的導數可由式(1.14)算出。最後,使用改變權重的規則式(1.12),我們得到了更新神經網絡偏置參數的規則。

 

深度學習:前饋神經網絡

(1.19)

改變權重參數的公式是式(1.19)的變體。與式(1.12)對應的權重公式為

 

深度學習:前饋神經網絡

(1.20)

首先,請注意最右邊的導數與式(1.12)中的導數相同。這意味著,在權重調整階段,當我們更改偏置時,應當保存結果以複用。右邊兩個導數的第一個導數估值為

 

深度學習:前饋神經網絡

 

(1.21)

如果我們牢記偏置僅僅是一個權重,其對應的特徵值恆等於1,我們就可以推導出這個公式,運用這個新的“偽權重”就可以立即從式(1.21)推導出式(1.13)。

使用這個結果可以更新權重公式。

 

深度學習:前饋神經網絡

 

(1.22)

我們現在已經推導出如何根據一個訓練樣本調整我們模型的參數。梯度下降算法會讓我們遍歷所有的訓練樣本,記錄每個樣本對參數值修正的建議,但在我們完成遍歷所有樣本之前,不會實際改變參數。我們通過各個樣本得到的修正量加和來修改每個參數。

這個算法的缺點是非常慢,尤其是當訓練集特別大的時候。我們通常需要經常調整參數,因為根據特定樣本的結果,每個參數有增有減時,它們會以不同的方式相互作用。因此,在實踐中,我們幾乎不使用梯度下降,而是使用隨機梯度下降。隨機梯度下降中,每m個樣本更新一次參數,然而m個樣本比訓練集小得多。一個典型的m值是20。這被稱為批大小。

通常,批越小,學習率

深度學習:前饋神經網絡

應該設置得越小。因為任何一個樣本都會以犧牲其他樣本為代價,將權重推向其正確的分類。如果學習率低,不會有太大影響,因為對參數所做的改變相對較小。相反,對於較大批量樣本,我們會在m個不同的樣本上取平均值,所以參數不會向單個樣本的特性過於傾斜,對參數的改變可以更大。

深度學習:前饋神經網絡

圖1.11 使用簡單的前饋網絡進行數字識別的偽代碼

1.4 編寫程序

我們已經全面瞭解了神經網絡程序的內容。圖1.11所示是偽代碼,其中第一行內容是我們的首要操作——初始化模型參數。有些情況下我們可以將初始值設為0,就像我們在感知機算法中所做的那樣。雖然我們在本例中可以這麼設置,但可能不適用於其他情況。一般的做法是隨機設置權重接近於0。還可以通過給Python隨機數生成器一個種子,這樣在調試時,參數可以設置為相同的初始值,就可以得到完全相同的輸出。如果沒有給種子,Python會使用環境中的數字作為種子,比如時間的最後幾位數字。

請注意,在訓練的每一次迭代中,我們首先修改參數,然後在驗證集上運行模型來查看當前這組參數的表現。當在驗證樣本運行時,我們不會執行反向訓練。如果打算將我們的程序用於某個實際用途(例如,讀取郵件上的郵政編碼),我們看到的樣本並不是我們訓練的樣本,因此我們想知道程序的實際效果。我們的驗證數據就是實際情況的近似。

一些經驗可以派上用場。首先,像素值不要太偏離−1到1這個區間。在本例中,因為原始像素值是0到255,我們只需將它們除以255,這個過程叫作數據規範化。雖然不是硬性規定,但是將輸入保持在−1到1或者0到1是有意義的,在式(1.22)中,我們可以看到這一點。觀察式(1.22)可以發現,調整同一個輸入對應的偏置項和權重的公式之間的區別在於後者有乘法項xi,即輸入項的值。在上一節我們說過,如果我們假設偏置項只是一個權重項,其輸入值總是1,那麼用於更新偏置參數的方程就會從式(1.22)中消失。因此,如果我們不修改輸入值,並且其中一個像素的值為255,那麼我們修改權重值會是修改偏置參數的255倍。這種情況比較古怪,因為我們沒有先驗理由認定權重值比偏置參數需要更多的修正。

接下來要設定學習率

深度學習:前饋神經網絡

,這是比較複雜的。這裡,我們把學習率設定為0.0001。要注意,比起設置過小,

深度學習:前饋神經網絡

設置得過大會產生更加糟糕的結果。如果設置值過大,softmax函數會得出一個數學溢出錯誤。再看式(1.5),首先應該想到的是分子和分母的指數。如果學習率過大,那麼某個logit可能會變大,而e(≈2.7)的指數過高的時候一定會溢出。即使沒有錯誤警告,過高的學習率也會導致程序在學習曲線的無意義區域徘徊。

因此,標準做法是在進行計算時,觀察個別樣本的損失。首先從第一張訓練圖片開始。這些數字通過神經網絡輸出到logit層。所有的權重和偏置都是接近0的數字(比如0.1)。這意味著所有的logit值都非常接近於0,所以所有的概率都非常接近

深度學習:前饋神經網絡

(見式(1.5)的討論)。損失是正確答案概率的負自然對數,即−ln (

深度學習:前饋神經網絡

) ≈2.3。我們預計總體趨勢是,隨著訓練的樣本增多,單個損失會下降。但是,也有一些圖片並不是那麼規範,神經網絡分類的確定性更低。因此,單個損失既有上升的情況也有下降的情況,這種趨勢可能難以辨別。所以我們不是一次打印一個損失,而是將所有損失相加,然後比如每100批打印一次平均值。應該能夠觀察到平均值明顯降低,雖然可能會有抖動。

回到關於學習率和其設置過高的風險討論,太低的學習率也會降低程序收斂到一組好參數的速度。所以開始時用較低的學習率,而後嘗試更大的值通常是最好的做法。

由於很多參數都在同時變化,神經網絡算法很難調試。想要完成調試,需要在程序錯誤出現之前儘可能少地改變一些元素。首先,當我們修改權重時,如果立即再次運行相同的訓練樣本,損失會更少。如果損失沒有減少,可能是有以下兩個原因:第一,程序出現錯誤或學習率設置得太高;第二,不需要改變所有的權重來減少損失,可以只改變其中一個,或者一組。例如,當你第一次運行算法時,只需改變偏置。然而,單層網絡中的偏置很大程度上會捕捉到不同的類別以不同的頻率出現。這在Mnist數據中並不多見,所以在這種情況下,我們僅通過學習偏置並不會有太大改善。

如果程序運行正常,可以獲得約91%或92%的驗證數據精度(accuracy)。這個結果並不是很好,但這是一個開始。在後面的章節中,我們將學習如何達到約99%的精度。

簡單神經網絡有一個好處,那就是有時我們可以直接解釋各個參數的值,並判斷它們是否合理。在我們討論圖1.1時,像素點(8,8)是暗的,它的像素值為254,這在某種程度上可以判斷圖片是數字7,而不是數字1,因為數字1通常不佔據左上角的空間。我們可以將這一觀察轉化為對權重矩陣wi,j中值的預測,其中i是像素數,j是答案數。如果像素值是從0到784,那麼位置(8,8)的像素值是8×28 + 8 = 232,並且連接像素值和數字7(正確答案)的權重將是w232,7,而連接像素值和數字1的權重是w232,1。也就是說,w232,7應該比w232,1大。我們用低方差隨機初始化權重的方法分別運行了幾次訓練程序,每一次都得到前者為正數(比如0.25),而後者為負數(比如−0.17)。

1.5 神經網絡的矩陣表示

線性代數提供了另一種表示神經網絡中運算的方法:使用矩陣。矩陣是元素的二維數組。在我們的例子中,這些元素是實數。矩陣的維度分別是行數和列數,所以l行m列矩陣如下所示:

深度學習:前饋神經網絡

(1.23)

矩陣的主要運算是加法和乘法。兩個矩陣(必須具有相同維度)的相加是每個矩陣元素相加。也就是說,如果

YZ兩個矩陣相加,即X = Y + Z,那麼xi,j = yi,j + zi,j。

兩個矩陣相乘X = YZ表示維度為l ×m的矩陣Y和維度為m × n的矩陣Z相乘,結果是維度為l×n的矩陣X,其中,

 

深度學習:前饋神經網絡

 

(1.24)

舉一個例子,

 

深度學習:前饋神經網絡

我們可以使用矩陣乘法和加法的組合來定義線性單元的運算,特別是輸入特徵是一個1×l的矩陣X。在前述的數字識別問題中,l = 784,像素單元對應的權重是W

,即wi, j是單元j的第i個權重。所以W的維度是像素數乘數字個數,即784×10。B是長度為10的偏置向量,並且

 

深度學習:前饋神經網絡

 

(1.25)

其中L是長度為10的logit向量。確保維度對應是使用該公式的前提。

現在,前饋Mnist模型的損失( L )可以用如下公式表示。

 

深度學習:前饋神經網絡

 

(1.26)

 

深度學習:前饋神經網絡

 

(1.27)

其中,第一個公式給出了可能類別A(x)上的概率分佈,第二個公式確定了交叉熵損失。

我們也可以更簡潔地表示反向傳遞。首先,我們引入梯度運算符。

 

深度學習:前饋神經網絡

(1.28)

倒三角形▽xf (x )表示通過對x中的所有值取f的偏導數而得到的向量。之前我們討論了單個lj的偏導數,這裡,我們將所有l的導數定義為單個導數的向量。此外,矩陣的轉置是指矩陣行和列間的轉換。

 

深度學習:前饋神經網絡

(1.29)

有了這些,我們可以將式(1.22)改寫為

 

深度學習:前饋神經網絡

 

(1.30)

根據公式右半部,我們將784×1矩陣乘以1×10矩陣,得到一個784×10的矩陣,這就是784×10權重矩陣W的變化量。

矩陣表示法可以清楚地描述輸入層進入線性單元層生成logit,以及損失導數傳回參數變化量的運算過程。除此之外,使用矩陣符號還有一個更為實用的原因。當進行大量線性單元運算時,一般線性代數運算,特別是深度學習訓練可能非常耗時。而很多問題可以用矩陣符號法表示,許多編程語言都有特殊的包,允許你使用線性代數結構進行編程,並且經過優化的包也比手動編碼更有效率。特別是在Python中編程,使用NumPy包及其矩陣運算操作,可以得到一個數量級的加速。

此外,線性代數還可以應用於計算機圖形學和遊戲程序,這就產生了稱為圖形處理單元即GPU的專用硬件。GPU相對於CPU較慢,但GPU有大量處理器,以及用於並行線性代數計算的軟件。神經網絡的一些專用語言(例如Tensorflow)有內置軟件,可以感知GPU的可用性,並在不改變代碼的情況下使用GPU。這通常又會使速度提升一個數量級。

在本例中,採用矩陣符號還有第三個原因。如果我們並行處理若干訓練樣本,專用軟件包(如NumPy)和硬件(GPU)效率會更高。此外,矩陣符號法符合我們之前提出的思想:在更新模型參數之前處理m個訓練樣本(批大小)。通常做法是將m個訓練樣本全都輸入矩陣中,一起運行。在式(1.25)中,我們將圖片x想象成大小為1×784的矩陣,這是一個訓練樣本,有784個像素點。現在我們將矩陣維度變為m×784,即使不改變處理方法(必要的更改已經內置到例如NumPy和Tensorflow等軟件包和語言中),矩陣仍舊能夠工作。讓我們來看看為什麼。

首先,矩陣乘法XW中的X現在已經從1行變為m行。1行是1×784,那麼m行即為m×784。根據線性代數中矩陣乘法的定義,可以看作我們對每一行進行乘法,然後將它們疊在一起,得到m×784矩陣。

在公式中加上偏置項就不像這樣可以直接計算。我們說過矩陣加法要求兩個矩陣具有相同的維度,但式(1.25)中的兩矩陣維度不相等了,XW現在的維度大小是m ×10,而偏置項B的維度大小為1 ×10,需要進行改變。

NumPy和Tensorflow都有廣播機制。當一些矩陣的大小不符合算術運算要求的大小時,可以對矩陣大小進行調整。比如某個矩陣維度為1×n,而我們需要的是m×n維度的矩陣,矩陣會獲得由其單行或單列組成的m−1份(虛擬)副本,使維度符合要求。這使得B的維度大小變為m ×10,這樣我們就可以將偏置項加到乘法輸出m×10中的所有項上。在數字識別問題中,回憶一下當維度是1×10的時候我們如何加偏置項。每一個數字都可能是正確答案,我們對每個數字的決策增加了偏置項。現在我們也要增加偏置項,但這次是針對所有的決策和m個樣本,並行增加偏置項。

1.6 數據獨立性

如果獨立同分布(iid)假設成立,即我們的數據是獨立同分布的,那麼神經網絡模型會收斂到正確的解。宇宙射線的測量是一個典型的例子,射入的光線和所涉及的過程是隨機和不變的。

而我們的數據很少(幾乎沒有)是獨立同分布的——除非國家標準協會提供源源不斷的新樣本。訓練時第一輪的數據是獨立同分布的,但從第二輪開始的數據就與第一輪完全相同,獨立同分布假設不成立。有時我們的數據從第二個訓練樣本開始就無法做到獨立同分布,這在深度強化學習(第6章)中很常見,因此,在深度強化學習中,網絡經常出現不穩定,導致無法收斂到正確的解,有時甚至無法收斂到任何解。我們認為,如果一個較小的數據集以非隨機順序輸入數據,就可能產生災難性的結果。

假設對於每個Mnist圖片,我們都添加了第二個形狀相同但黑白相反的圖片,即,如果原始圖片的像素值為v,則反圖片的像素值為−v。我們現在在這個新的語料庫上訓練Mnist感知機,但是使用了不同的輸入順序(我們假設批大小是某個偶數)。在第一個順序中,每個原始Mnist數字圖片後面緊跟著它的相反版本。我們認為(我們通過實驗驗證了這一點),簡單Mnist神經網絡不會比隨機猜測的結果更好。這似乎是合理的。首先,反向傳遞修改了原始圖片權重,然後處理第二個反圖片。由於反圖片的輸入是原始圖片的負數,且其他元素完全相同,所以對反圖片權重的修改完全抵消了原始圖片權重的修改。因此在訓練結束時,所有權重都沒有改變。這也意味著沒有學習,參數和隨機初始化的一樣。

另一方面,學習獨立處理每個數據集(原始數據集和相反數據集)真的不應該有太多的困難,而且即使是學習合起來的數據集的權重,難度也不應該太大。實際上,簡單地隨機化輸入順序就可以使性能恢復到接近原始問題的水平。如果有10,000個樣本,在這10,000個樣本之後,權重已經發生了很大的變化,所以相反的圖片並不能完全抵消原來的學習。但如果我們有一個無窮無盡的圖片來源,並且拋硬幣來隨機決定原始圖片或反圖片輸入神經網絡的順序,那麼這些抵消就會完全消失。

1.7 參考文獻和補充閱讀

在本節和後續章節的“參考文獻和補充閱讀”部分,我會完成以下幾點:(a)給學生指定該章節主題的後續閱讀材料;(b)闡述該領域的一些重要貢獻;(c)引用參考資料。我不能保證所有內容的完整性或客觀性,特別針對(b)條目。在準備寫這一部分時,我開始閱讀神經網絡的歷史文章,特別是Andrey Kurenkov [Kur15][1]的一篇博客文章,以檢查我的記憶是否準確(並豐富其內容)。

早期研究神經網絡的一篇重要論文由McCulloch和Pitts [MP43]於1943年撰寫,他們提出了本書所說的線性單元作為單個神經元的正式模型。然而,他們沒有提出一個可以訓練單個或多個神經元完成任務的學習算法,這類學習算法最早由Rosenblatt在其1958年的感知機論文[Ros58]中提出。然而,正如我們在文中指出的,他的算法只適用於單層神經網絡。

下一個重大貢獻是反向傳播的發明,它適用於多層神經網絡。當時,許多研究人員都在幾年間獨立得出了這個方法(只有當最初的論文沒有引起足夠的注意,其他人尚未發現問題已經解決時,這種情況才會發生)。Rumelhart、Hinton和Williams的論文結束了這一時期,他們明確指出三人的論文是對該發明的重新發現[RHW86]。三人的這篇論文來源於聖地亞哥大學的一個小組,該小組撰寫了大量論文,推動了並行分佈式處理(PDP)下神經網絡的第二次研究熱潮。這些論文組成了兩卷合集,在神經網絡領域頗有影響力[RMG+87]。

至於我是如何學習神經網絡的,我在後面的章節中給出了更多的細節。在本章中,我要介紹一篇博客和兩本書。Steven Miller [Mil15]的一篇博客用一個很棒的數字例子詳細介紹了反向傳播的前向傳遞和反向傳遞。還有兩本我查閱過的神經網絡教科書,一本是Ian Goodfellow、Yoshua Bengio和Aaron Courville的《深度學習》[GBC16],第二本是由Aurélien Géron [Gér17]編寫的《機器學習實戰:基於Scikit-Learn和Tensorflow》。

1.8 習題

練習1.1 思考批大小為1的前饋Mnist程序。假設我們在第一個樣本訓練前後觀察偏置變量。如果它們設置正確(即我們的程序中沒有錯誤),請描述你在偏置值中看到的變化。

練習1.2 假設圖片有兩個像素,且為二值(像素值為0或1),沒有偏置參數,討論一個二分類問題。(a)當像素值為( 0,1 )且權重為

0.2 -0.3

-0.1 0.4

時,計算前向傳遞的logit和概率。這裡w[i,j]是第i個像素和第j個單元之間連接的權重,例如,w[0,1]在這裡等於−0.3。(b)假設正確答案是1(而不是0),學習率為0.1,損失是多少?並計算反向傳遞時的Δw0,0。

練習1.3 當圖片像素值是( 0,0 )時,回答練習1.2的問題。

練習1.4 一個同學問你:“在初等微積分中,我們通過對一個函數求微分,將結果表達式設置為0,並求解方程,找到它的最小值。既然我們的損失函數是可微的,為什麼我們不用同樣的方法,而使用梯度下降呢?”解釋為什麼不行。

練習1.5 計算以下內容。

 

深度學習:前饋神經網絡

 

(1.31)

你可以假設有廣播機制,這樣計算時維度就相符了。

練習1.6 在本章中,我們只討論了分類問題,對於這類問題,交叉熵是通常會選擇的損失函數。在某些問題中我們希望可以用神經網絡預測特定的值。例如,許多人想要這樣一個程序,給定今天某隻股票的價格和世界上其他影響因素,輸出明天股票的價格。如果我們訓練一個單層神經網絡來達到這個目的,通常會使用平方誤差損失。

 

深度學習:前饋神經網絡

 

(1.32)

其中t是當天的實際價格,l(X,Φ)是單層神經網絡Φ = {b,W}的輸出。這也被稱為二次損失。推導出損失對bi求導的公式。

[1] 說明:本書中的參考文獻在正文中出現時,採用作者姓名首字母縮寫加年份縮寫的形式,如[Kur15]是指Kurenkov 於2015 年發表的文獻,[MP43]是指McCulloch 和Pitts 於1943 年發表的文獻,[BCP+88]是指Brown、Cocke 和Pietra 等人於1988 年發表的文獻,其餘類推。

本文摘自剛剛上架的《深度學習導論》

深度學習:前饋神經網絡

  • 人工智能深度學習經典入門書
  • 美國常青藤名校經典教材,理論與實戰結合的良好典範
  • 基於TensorFlow和Python,附帶習題和答案

《深度學習導論精裝版》講述了Tensorflow、前饋神經網絡、卷積神經網絡、詞嵌入、循環神經網絡、序列到序列學習、深度強化學習、無監督模型等深度學習領域的基本概念和技術,通過一系列的編程任務,向讀者介紹了熱門的人工智能應用,包括計算機視覺和自然語言處理等。

本書編寫簡明扼要,理論聯繫實踐,每一章都包括一個編程項目、練習以及進一步閱讀的參考資料。本書既可作為高校人工智能教學用書,也可供從業者入門參考。

本書要求讀者熟悉線性代數、多元微積分、概率和統計知識,另外需要讀者瞭解Python 編程。


分享到:


相關文章: