9.1 代價函數(shù)9.1.1 神經(jīng)網(wǎng)絡(luò)在分類中的作用
對于分類問題,,我們會將其分成兩種情況考慮:即二元分類(binary classification)與多元分類(multi-class classification),。 對于二元分類,,由于y只能等于0或1,,所以我們只有一個輸出單元,其輸出h_θ(x)一個實數(shù),。在這種情況下,,s_L=1。 在多元分類中,,會有K個不同的類,,就會有K個輸出單元,,其輸出h_θ(x)為一個K維向量。在這種情況下,,s_L=K,。 9.1.2 神經(jīng)網(wǎng)絡(luò)的代價函數(shù)先讓我們回顧一下邏輯回歸的代價函數(shù): 在邏輯回歸中,我們通常要使J(θ)小化,,一般會在最后加上一個正則化項,,是一個j從1到n的求和,因為我們并沒有把偏差項θ_0正則化,。 對于一個神經(jīng)網(wǎng)絡(luò)來說,,我們的代價函數(shù)就會是這個式子的一般形式,這里不僅只有一個邏輯回歸輸出單元,,而是K個,。 所以上圖中的式子就是神經(jīng)網(wǎng)絡(luò)中的代價函數(shù)。上式中的第一部分-1/m乘以一個類似于我們在邏輯回歸里的求和項,,除了上式還加入了求k從1到的K的有和,。這個求和項主要是K個輸出單元之和。依次把每一個邏輯回歸算法的代價函數(shù)按照四次輸出的順序加起來,。這個求和符號應(yīng)用于y_k和h_k因為我們主要是將第K個輸出單元的值和y_k的值的大小作比較,,即最后得到的向量應(yīng)該屬于哪個分類。 最后,,神經(jīng)網(wǎng)絡(luò)代價函數(shù)的正則化項也與邏輯回歸有些不同,。這里的正則化項是對θ_ij^(l)項對所有i,j,k的值求和。就像在邏輯回歸中我們不加入偏置單元的值一樣,,這里要去除那些對應(yīng)的偏置單元的項,。具體地說,我們不對θ_ij^(l)中i為0的項求和,,因為我們在計算激活函數(shù)時,,會得到類似于θ_i0^(2)a_0+θ_i1^(2)a_0+...樣的項,這些含有0的項對應(yīng)了a_0的項,,這是一個類似于偏置單元的項,。 正則化的那一項只是排除了每一層θ_0后,每一層的θ_i0矩陣的和,。最里層的循環(huán)循環(huán)所有的行(由 s_l+1 層的激活單元數(shù)決定),,循環(huán)i則循環(huán)所有的列,由該層(s_l層)的激活單元數(shù)所決定,。 9.2 反向傳播算法9.2.1 梯度計算在上一節(jié)中我們介紹了神經(jīng)網(wǎng)絡(luò)的代價函數(shù),,現(xiàn)在,讓我們來看一下讓代價函數(shù)最小化的算法——反向傳播算法(back propagation algorithm)。 上圖中我們給出了神經(jīng)網(wǎng)絡(luò)的代價函數(shù),,現(xiàn)在我們要設(shè)法找到參數(shù)θ使J(θ)取到最小值,。所以這里我們需要計算J(θ)以及一些列偏導(dǎo)項。 讓我們從只有一個訓(xùn)練樣本說起,。 這里我們先使用向前傳播,,通過項量化的方法計算出神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)里的每一個神經(jīng)單元的激活值。 9.2.2 反向傳播算法反向傳播算法從直觀上說,,就是對于每一個節(jié)點,,我們計算δ_j^(l),它代表了第l層第j個節(jié)點的誤差,。這個δ項在某種程度上就捕捉到了我們在這個節(jié)點的激活值得誤差,。在這里,我們還要回顧一下之前的一個定義——a_j^(l),,它代表了第層第個節(jié)點的激活值,。 我們用上面這個四層(L=4)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)為例。對于每一個輸出單元,,我們將計算δ項,。 所以第四層第j個單元的δ值等于這個單元的激活值減去訓(xùn)練樣本里的真實值。這里的y_i就是我們訓(xùn)練集中向量y的第j個元素,。接下來,,我們把網(wǎng)絡(luò)中前面幾層的誤差項δ項算出來。 上面公式中的.*是MATLAB中的點乘符號,,g`(z^{(3)})是對激活函數(shù)在輸入值為z(3)的時候所求的導(dǎo)數(shù),。g`(z^{(3)})=a^{(3)} * (1-a^{(3)})。 這里沒有δ^(1)項是因為第一次對應(yīng)的是輸入層,,那只表示我們在訓(xùn)練集里觀察到的,,所以不會存在誤差。 我們有了所有的誤差的表達式后,,便可以計算代價函數(shù)的偏導(dǎo)數(shù)了,,假設(shè),即我們不做任何正則化處理時有: 在上述公式中:
9.2.3 整合到一起現(xiàn)在讓我們把上面的內(nèi)容整合到一起,來看看如何實現(xiàn)反向傳播算法,。 我們要做的第一件事就是固定這些帶下標(biāo)的,,讓其值都為0,,它們將會被用來計算偏導(dǎo)項,。 接下來我們將遍歷我們的訓(xùn)練集,。 首先,對于第i個循環(huán)而言,,我們將取出訓(xùn)練樣本(x^{(i)},y^{(i)}),,然后設(shè)定a^{(1)},也就是輸入層的激活函數(shù)為x^{(i)},。 接下來我們運用正向傳播,,計算每一層的激活值。 用樣本的輸出值y^(i)計算這個輸出值所對應(yīng)的誤差項δ(L),。 用反向傳播分別計算δ值一直到δ^(2),。 用△來累計偏導(dǎo)數(shù)項。 最后,,執(zhí)行完for循環(huán)之后,,我們跳出循環(huán),然后計算下面的式子: 一旦計算出來了這些項,,它正好就是代價函數(shù)關(guān)于每個參數(shù)的偏導(dǎo)數(shù),,之后就可以使用梯度下降或其他高級優(yōu)化算法了。 9.3 反向傳播算法的直觀理解9.3.1 向前傳播為了更好地理解反向傳播,,我們先進一步的研究向前傳播的過程,。 這就是向前傳播。我們會發(fā)現(xiàn)反向傳播算法與其大致相同,,知識計算方向不一樣而已,。 9.3.2 神經(jīng)網(wǎng)絡(luò)的代價函數(shù)為了更好地理解反向傳播算法的過程,讓我們先看一下神經(jīng)網(wǎng)絡(luò)的代價函數(shù),。 這個代價函數(shù)適用于只有一個輸出單元的情況?,F(xiàn)在讓我們只關(guān)注一個訓(xùn)練樣本(x^{(i)},y^{(i)}),因為只有一個輸出單元,,所以這里y^{(i)}是一個實數(shù),,并且忽略正則化項。簡化的代價函數(shù)如下: 將這一個訓(xùn)練樣本帶入,,我們會發(fā)現(xiàn)它的代價函數(shù)可以寫成如下形式: 這個代價函數(shù)扮演了一個類似方差的角色,,所以與其關(guān)注這個代價函數(shù),可以把cost(i)近似的看成神經(jīng)網(wǎng)絡(luò)的輸出值與實際值的方差: 因此,,它表示了神經(jīng)網(wǎng)絡(luò)預(yù)測樣本值的準(zhǔn)確程度,,也就是網(wǎng)絡(luò)的輸出值和實際觀測值y^(i)接近程度。 9.3.3 反向傳播算法現(xiàn)在讓我們看看反向傳播的過程,,一種直觀的理解是反向傳播算法就是在計算這些δ_j^(i),,我們可以把它們看作是在第層中第j個單元得到的激活項的“誤差”,。用數(shù)學(xué)的知識去解釋的話,δ_j^(i)是代價函數(shù)關(guān)于z_j^(i)的偏導(dǎo)數(shù),。它們衡量的是為了影響這些中間值,,我們想要改變神經(jīng)網(wǎng)絡(luò)中的權(quán)重的程度進而影響整個神經(jīng)網(wǎng)絡(luò)的輸出h(x)。 接下來讓我們對反向傳播算法有一個更直觀的了解: 現(xiàn)在,,讓我們關(guān)注一下第一個隱藏層中第三個神經(jīng)元的具體計算過程,。與向前傳播類似,我么分別用紫色和紅色標(biāo)注權(quán)值,,用后一層中δ的加權(quán)和由對應(yīng)邊的強度來進行加權(quán),。 9.4 使用注意:展開參數(shù)9.4.1 為什么要展開參數(shù)在上節(jié)中,我們談到了怎樣使用反向傳播算法計算代價函數(shù)的導(dǎo)數(shù),。在這一節(jié),,我們將介紹如何把你的參數(shù)從矩陣展開成向量,以便我們在高級最優(yōu)化步驟中的使用需要,。 具體來講,,我們在執(zhí)行代價函數(shù)時,輸入?yún)?shù)是theta,,函數(shù)返回代價值及導(dǎo)數(shù)值,。然后我們可以將返回值傳遞給高級優(yōu)化算法。這些程序默認(rèn)給定的theta都是參數(shù)向量(vectors),,同時代價函數(shù)返回的梯度值也是一個向量,。 但是在神經(jīng)網(wǎng)絡(luò)中,我們的參數(shù)不再是向量了,,而變成了矩陣(matrices),。同樣的,這些返回的梯度值D^(1),D^(2),D^(3)是矩陣,。 9.4.2 如何展開參數(shù) 假設(shè)我們有一個輸入層有10個輸入單元,,隱藏層有10個隱藏單元,最后的輸出層只有一個輸出單元的神經(jīng)網(wǎng)絡(luò),。再做這種情況下,,θ和維度如上圖所示。在octave中,,如果想實現(xiàn)將矩陣轉(zhuǎn)化為向量,,就要使用下面的代碼: 即將theta1,2,3中的所有元素取出,然后把它們?nèi)空归_成為一個很長的向量,。 如果想實現(xiàn)將向量還原回矩陣,,就要適用下面的代碼: 例如還原theta1,我們先取出前110個元素,,然后用reshape命令來改變矩陣的大小,,從而得到矩陣theta1,。 9.4.3 將展開的參數(shù)應(yīng)用于學(xué)習(xí)算法假設(shè)我們有一些初始化參數(shù),我們要把它們展開成一個長向量,,然后作為theta參數(shù)的初始值傳入優(yōu)化函數(shù),。另一件需要我們做的是就是實現(xiàn)代價函數(shù),如下圖: 代價函數(shù)實現(xiàn)算法如下: 使用矩陣表達的好處是在進行正向/反向傳播時會更方便,;用向量表達式的有點是當(dāng)你使用一些高級優(yōu)化算法時,,這些算法會要求把所有參數(shù)展開成一個長向量的形式,。 9.5 梯度檢驗當(dāng)我們對一個較為復(fù)雜的模型(例如神經(jīng)網(wǎng)絡(luò))使用梯度下降算法時,,可能會存在一些不容易察覺的錯誤,意味著,,雖然代價看上去在不斷減小,,但最終的結(jié)果可能并不是最優(yōu)解。為了避免這樣的問題,,我們采取一種叫做梯度的數(shù)值檢驗(Numerical Gradient Checking)方法,。這種方法的思想是通過估計梯度值來檢驗我們計算的導(dǎo)數(shù)值是否真的是我們要求的。 9.5.1 梯度的數(shù)值估計通常來說,,epsilon一個很小的值,,例如10^(-4)當(dāng)我們在octave中需要執(zhí)行這樣的計算時,需要執(zhí)行以下代碼: 9.5.2 參數(shù)為向量時在上一節(jié)中,,我們只考慮了θ實數(shù)的情況,,現(xiàn)在我們要考慮更普遍的情況,即為參數(shù)向量的時候,。 我們可以用類似的思想來計算所有的偏導(dǎo)數(shù)項: 具體來說,,求θ_1偏導(dǎo)時,可以通過增加J中的θ_1得到,,所以括號中是θ_1+epsilon其余項不變,。在octave中的代碼實現(xiàn)如下: 當(dāng)我們在神經(jīng)網(wǎng)絡(luò)中使用這種方法時,我們需要驗證通過上述方法得到的偏導(dǎo)數(shù)與通過反向傳播算法得到的偏導(dǎo)數(shù)在數(shù)值上是否非常接近,。如果二者十分接近,,那么反向傳播的實現(xiàn)就是正確的。 9.5.3 總結(jié)在進行梯度檢驗時時,,我們需要注意:
9.6 隨機初始化(random initialization)9.6.1 為什么要進行隨機初始化當(dāng)你執(zhí)行一個例如梯度下降的算法時,,我們需要為變量θ取一些初始值,,那么應(yīng)該如何對θ設(shè)置初始值呢?一般在邏輯回歸中,,我們會將初始值設(shè)為0,,但是在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時這樣起不到任何作用。 我們以上圖中的神經(jīng)網(wǎng)絡(luò)為例,。由于參數(shù)都是以0初始化的,,所以隱藏層的權(quán)重相同,導(dǎo)致a_1^(2)=a_2^(2)同理δ_1^(2)=δ_2^(2)進一步去看,,由于權(quán)重相同,,那么它們的偏導(dǎo)數(shù)也就相同,這樣會導(dǎo)致雖然迭代多次后值不為0,,但是從同一個輸入單元處罰的兩條權(quán)重每次更新完后都是相等的,。 所以每次更新之后,這兩個隱藏單元的每個參數(shù)輸入都是相等的,。如果有不止兩個隱藏單元,,而是有很多隱藏單元,那么它們在計算相同的特征,。所有的隱藏單元都以相同的函數(shù)作為輸入,,這是一種高度冗余的現(xiàn)象,因為這意味著最后的邏輯回歸單元只能得到一個特征,。 9.6.2 隨機初始化為了解決上節(jié)中的問題,,我們要使用隨機初始化。對于每一個值,,我們將其初始化為一個范圍在[-epsilon,epsilon]之間的隨機值,。在octave中可以通過如下代碼實現(xiàn): 其中,rand方法會產(chǎn)生一個所有元素介于0到1之間的隨機矩陣,。注意,,這里的與我們在梯度檢驗中的沒有任何關(guān)系。 總而言之,,為了訓(xùn)練神經(jīng)網(wǎng)絡(luò),,應(yīng)該首先要將權(quán)重隨機初始化為一個接近0的,范圍在[-epsilon,epsilon]之間的隨機值,,然后進行反向傳播,,在進行梯度檢驗,,最后使用梯度下降或其他高級優(yōu)化算法來最小化代價函數(shù)。 9.7 組合到一起9.7.1 選擇一個神經(jīng)網(wǎng)絡(luò)在訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)時,,我們要做的第一件事就是選擇一種網(wǎng)絡(luò)架構(gòu)(network architecture),,即神經(jīng)元之間的連接模式。 我們將按以下原則進行選擇:
9.7.2 訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)接下來要說的是訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)需要實現(xiàn)的步驟:
對于神經(jīng)網(wǎng)絡(luò)來說,,代價函數(shù)J(θ)是一個非凸函數(shù)(non-convex),理論上可能停留在局部最小值的位置,。實際上,,梯度下降算法和其他一些高級優(yōu)化方法理論上都能收斂于局部最小值,但是一般來講,,在實際操作中,,盡管我們不能保證這些優(yōu)化算法一定會得到局部最優(yōu)值,但項梯度下降這類算法,,在最小化代價函數(shù)J(θ)的過程中表現(xiàn)得很不錯,。 9.8 無人駕駛本章視頻可在吳恩達及機器學(xué)習(xí)課時80中觀看。 |
|