乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【吳恩達機器學習】第九章 神經(jīng)網(wǎng)絡參數(shù)的反向傳播算法

       LibraryPKU 2019-07-15
      • csdn:

        https://blog.csdn.net/qq_36645271

      • github:

        https://github.com/aimi-cn/AILearners

      9.1 代價函數(shù)

      9.1.1 神經(jīng)網(wǎng)絡在分類中的作用

      •  {(x^(1), y^(1)),...,(x^(m), y^(m))}:含有m組訓練樣本的訓練集。

      • L:神將網(wǎng)絡結(jié)構(gòu)的總層數(shù)。對于上圖來說,L=4.

      • s_l:第L層的神經(jīng)單元數(shù),這其中不包括第L層的偏置單元。例如上圖中。

      對于分類問題,我們會將其分成兩種情況考慮:即二元分類(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)絡的代價函數(shù)

      先讓我們回顧一下邏輯回歸的代價函數(shù):

      在邏輯回歸中,我們通常要使J(θ)小化,一般會在最后加上一個正則化項,是一個j從1到n的求和,因為我們并沒有把偏差項θ_0正則化。

      對于一個神經(jīng)網(wǎng)絡來說,我們的代價函數(shù)就會是這個式子的一般形式,這里不僅只有一個邏輯回歸輸出單元,而是K個。

      所以上圖中的式子就是神經(jīng)網(wǎng)絡中的代價函數(shù)。上式中的第一部分-1/m乘以一個類似于我們在邏輯回歸里的求和項,除了上式還加入了求k從1到的K的有和。這個求和項主要是K個輸出單元之和。依次把每一個邏輯回歸算法的代價函數(shù)按照四次輸出的順序加起來。這個求和符號應用于y_k和h_k因為我們主要是將第K個輸出單元的值和y_k的值的大小作比較,即最后得到的向量應該屬于哪個分類。

      最后,神經(jīng)網(wǎng)絡代價函數(shù)的正則化項也與邏輯回歸有些不同。這里的正則化項是對θ_ij^(l)項對所有i,j,k的值求和。就像在邏輯回歸中我們不加入偏置單元的值一樣,這里要去除那些對應的偏置單元的項。具體地說,我們不對θ_ij^(l)中i為0的項求和,因為我們在計算激活函數(shù)時,會得到類似于θ_i0^(2)a_0+θ_i1^(2)a_0+...樣的項,這些含有0的項對應了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)絡的代價函數(shù),現(xiàn)在,讓我們來看一下讓代價函數(shù)最小化的算法——反向傳播算法(back propagation algorithm)。

      上圖中我們給出了神經(jīng)網(wǎng)絡的代價函數(shù),現(xiàn)在我們要設法找到參數(shù)θ使J(θ)取到最小值。所以這里我們需要計算J(θ)以及一些列偏導項。

      讓我們從只有一個訓練樣本說起。

      這里我們先使用向前傳播,通過項量化的方法計算出神經(jīng)網(wǎng)絡結(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)絡的結(jié)構(gòu)為例。對于每一個輸出單元,我們將計算δ項。

      所以第四層第j個單元的δ值等于這個單元的激活值減去訓練樣本里的真實值。這里的y_i就是我們訓練集中向量y的第j個元素。接下來,我們把網(wǎng)絡中前面幾層的誤差項δ項算出來。

      上面公式中的.*是MATLAB中的點乘符號,g`(z^{(3)})是對激活函數(shù)在輸入值為z(3)的時候所求的導數(shù)。g`(z^{(3)})=a^{(3)} * (1-a^{(3)})。

      這里沒有δ^(1)項是因為第一次對應的是輸入層,那只表示我們在訓練集里觀察到的,所以不會存在誤差。

      我們有了所有的誤差的表達式后,便可以計算代價函數(shù)的偏導數(shù)了,假設,即我們不做任何正則化處理時有:

      在上述公式中:

      • l代表目前所計算的是第幾層。

      • j代表目前計算層中的激活單元的下標,也將是下一層的第個輸入變量的下標。

      • i代表下一層中誤差單元的下標,是受到權(quán)重矩陣中第行影響的下一層中的誤差單元的下標。

      9.2.3 整合到一起

      現(xiàn)在讓我們把上面的內(nèi)容整合到一起,來看看如何實現(xiàn)反向傳播算法。

      我們要做的第一件事就是固定這些帶下標,讓其值都為0,它們將會被用來計算偏導項。

      接下來我們將遍歷我們的訓練集。

      首先,對于第i個循環(huán)而言,我們將取出訓練樣本(x^{(i)},y^{(i)}),然后設定a^{(1)},也就是輸入層的激活函數(shù)為x^{(i)}。

      接下來我們運用正向傳播,計算每一層的激活值。

      用樣本的輸出值y^(i)計算這個輸出值所對應的誤差項δ(L)。

      用反向傳播分別計算δ值一直到δ^(2)。

      用△來累計偏導數(shù)項。

      最后,執(zhí)行完for循環(huán)之后,我們跳出循環(huán),然后計算下面的式子:

      一旦計算出來了這些項,它正好就是代價函數(shù)關(guān)于每個參數(shù)的偏導數(shù),之后就可以使用梯度下降或其他高級優(yōu)化算法了。

      9.3 反向傳播算法的直觀理解

      9.3.1 向前傳播

      為了更好地理解反向傳播,我們先進一步的研究向前傳播的過程。

      這就是向前傳播。我們會發(fā)現(xiàn)反向傳播算法與其大致相同,知識計算方向不一樣而已。

      9.3.2 神經(jīng)網(wǎng)絡的代價函數(shù)

      為了更好地理解反向傳播算法的過程,讓我們先看一下神經(jīng)網(wǎng)絡的代價函數(shù)。

      這個代價函數(shù)適用于只有一個輸出單元的情況?,F(xiàn)在讓我們只關(guān)注一個訓練樣本(x^{(i)},y^{(i)}),因為只有一個輸出單元,所以這里y^{(i)}是一個實數(shù),并且忽略正則化項。簡化的代價函數(shù)如下:

      將這一個訓練樣本帶入,我們會發(fā)現(xiàn)它的代價函數(shù)可以寫成如下形式:

      這個代價函數(shù)扮演了一個類似方差的角色,所以與其關(guān)注這個代價函數(shù),可以把cost(i)近似的看成神經(jīng)網(wǎng)絡的輸出值與實際值的方差:

      因此,它表示了神經(jīng)網(wǎng)絡預測樣本值的準確程度,也就是網(wǎng)絡的輸出值和實際觀測值y^(i)接近程度。

      9.3.3 反向傳播算法

      現(xiàn)在讓我們看看反向傳播的過程,一種直觀的理解是反向傳播算法就是在計算這些δ_j^(i),我們可以把它們看作是在第層中第j個單元得到的激活項的“誤差”。用數(shù)學的知識去解釋的話,δ_j^(i)是代價函數(shù)關(guān)于z_j^(i)的偏導數(shù)。它們衡量的是為了影響這些中間值,我們想要改變神經(jīng)網(wǎng)絡中的權(quán)重的程度進而影響整個神經(jīng)網(wǎng)絡的輸出h(x)。

      接下來讓我們對反向傳播算法有一個更直觀的了解:

      現(xiàn)在,讓我們關(guān)注一下第一個隱藏層中第三個神經(jīng)元的具體計算過程。與向前傳播類似,我么分別用紫色和紅色標注權(quán)值,用后一層中δ的加權(quán)和由對應邊的強度來進行加權(quán)。

      9.4 使用注意:展開參數(shù)

      9.4.1 為什么要展開參數(shù)

      在上節(jié)中,我們談到了怎樣使用反向傳播算法計算代價函數(shù)的導數(shù)。在這一節(jié),我們將介紹如何把你的參數(shù)從矩陣展開成向量,以便我們在高級最優(yōu)化步驟中的使用需要。

      具體來講,我們在執(zhí)行代價函數(shù)時,輸入?yún)?shù)是theta,函數(shù)返回代價值及導數(shù)值。然后我們可以將返回值傳遞給高級優(yōu)化算法。這些程序默認給定的theta都是參數(shù)向量(vectors),同時代價函數(shù)返回的梯度值也是一個向量。

      但是在神經(jīng)網(wǎng)絡中,我們的參數(shù)不再是向量了,而變成了矩陣(matrices)。同樣的,這些返回的梯度值D^(1),D^(2),D^(3)是矩陣。

      9.4.2 如何展開參數(shù)

      假設我們有一個輸入層有10個輸入單元,隱藏層有10個隱藏單元,最后的輸出層只有一個輸出單元的神經(jīng)網(wǎng)絡。再做這種情況下,θ和維度如上圖所示。在octave中,如果想實現(xiàn)將矩陣轉(zhuǎn)化為向量,就要使用下面的代碼:

      即將theta1,2,3中的所有元素取出,然后把它們?nèi)空归_成為一個很長的向量。

      如果想實現(xiàn)將向量還原回矩陣,就要適用下面的代碼:

      例如還原theta1,我們先取出前110個元素,然后用reshape命令來改變矩陣的大小,從而得到矩陣theta1。

      9.4.3 將展開的參數(shù)應用于學習算法

      假設我們有一些初始化參數(shù),我們要把它們展開成一個長向量,然后作為theta參數(shù)的初始值傳入優(yōu)化函數(shù)。另一件需要我們做的是就是實現(xiàn)代價函數(shù),如下圖:

      代價函數(shù)實現(xiàn)算法如下:

      使用矩陣表達的好處是在進行正向/反向傳播時會更方便;用向量表達式的有點是當你使用一些高級優(yōu)化算法時,這些算法會要求把所有參數(shù)展開成一個長向量的形式。

      9.5 梯度檢驗

      當我們對一個較為復雜的模型(例如神經(jīng)網(wǎng)絡)使用梯度下降算法時,可能會存在一些不容易察覺的錯誤,意味著,雖然代價看上去在不斷減小,但最終的結(jié)果可能并不是最優(yōu)解。為了避免這樣的問題,我們采取一種叫做梯度的數(shù)值檢驗(Numerical Gradient Checking)方法。這種方法的思想是通過估計梯度值來檢驗我們計算的導數(shù)值是否真的是我們要求的。

      9.5.1 梯度的數(shù)值估計

      通常來說,epsilon一個很小的值,例如10^(-4)當我們在octave中需要執(zhí)行這樣的計算時,需要執(zhí)行以下代碼:

      9.5.2 參數(shù)為向量時

      在上一節(jié)中,我們只考慮了θ實數(shù)的情況,現(xiàn)在我們要考慮更普遍的情況,即為參數(shù)向量的時候。

      我們可以用類似的思想來計算所有的偏導數(shù)項:

      具體來說,求θ_1偏導時,可以通過增加J中的θ_1得到,所以括號中是θ_1+epsilon其余項不變。在octave中的代碼實現(xiàn)如下:

      當我們在神經(jīng)網(wǎng)絡中使用這種方法時,我們需要驗證通過上述方法得到的偏導數(shù)與通過反向傳播算法得到的偏導數(shù)在數(shù)值上是否非常接近。如果二者十分接近,那么反向傳播的實現(xiàn)就是正確的。

      9.5.3 總結(jié)

      在進行梯度檢驗時時,我們需要注意:

      • 通過反向傳播來計算DVec(D^(1),D^(2),D^(3)的展開形式)。

      • 實現(xiàn)數(shù)值上的梯度檢驗,計算出gradApprox。

      • 確保DVec和gradApprox都能得出相似的近似值。

      • 在你使用代碼訓練網(wǎng)絡之前,要關(guān)掉梯度檢驗。因為梯度檢驗是一個計算量非常大的,運行速度非常慢的計算倒數(shù)的程序,相反的,反向傳播算法是一個高性能的導數(shù)計算方法。所以一旦確定反向傳播的實現(xiàn)是正確的,就應該關(guān)閉梯度檢驗。

      9.6 隨機初始化(random initialization)

      9.6.1 為什么要進行隨機初始化

      當你執(zhí)行一個例如梯度下降的算法時,我們需要為變量θ取一些初始值,那么應該如何對θ設置初始值呢?一般在邏輯回歸中,我們會將初始值設為0,但是在訓練神經(jīng)網(wǎng)絡時這樣起不到任何作用。

      我們以上圖中的神經(jīng)網(wǎng)絡為例。由于參數(shù)都是以0初始化的,所以隱藏層的權(quán)重相同,導致a_1^(2)=a_2^(2)同理δ_1^(2)=δ_2^(2)進一步去看,由于權(quán)重相同,那么它們的偏導數(shù)也就相同,這樣會導致雖然迭代多次后值不為0,但是從同一個輸入單元處罰的兩條權(quán)重每次更新完后都是相等的。

      所以每次更新之后,這兩個隱藏單元的每個參數(shù)輸入都是相等的。如果有不止兩個隱藏單元,而是有很多隱藏單元,那么它們在計算相同的特征。所有的隱藏單元都以相同的函數(shù)作為輸入,這是一種高度冗余的現(xiàn)象,因為這意味著最后的邏輯回歸單元只能得到一個特征。

      9.6.2 隨機初始化

      為了解決上節(jié)中的問題,我們要使用隨機初始化。對于每一個值,我們將其初始化為一個范圍在[-epsilon,epsilon]之間的隨機值。在octave中可以通過如下代碼實現(xiàn):

      其中,rand方法會產(chǎn)生一個所有元素介于0到1之間的隨機矩陣。注意,這里的與我們在梯度檢驗中的沒有任何關(guān)系。

      總而言之,為了訓練神經(jīng)網(wǎng)絡,應該首先要將權(quán)重隨機初始化為一個接近0的,范圍在[-epsilon,epsilon]之間的隨機值,然后進行反向傳播,在進行梯度檢驗,最后使用梯度下降或其他高級優(yōu)化算法來最小化代價函數(shù)。

      9.7 組合到一起

      9.7.1 選擇一個神經(jīng)網(wǎng)絡

      在訓練一個神經(jīng)網(wǎng)絡時,我們要做的第一件事就是選擇一種網(wǎng)絡架構(gòu)(network architecture),即神經(jīng)元之間的連接模式。

      我們將按以下原則進行選擇:

      • 輸入層的單元數(shù)量:特征x^(i)的維度。

      • 輸出層的單元數(shù)量:分類問題中分類的個數(shù)。

      • 隱藏層數(shù):一個合理的默認選項是只是用單個隱藏層,如果使用多余一層的隱藏單元,那每一個隱藏層通常都應有相同的單元數(shù)。雖然神經(jīng)元的數(shù)量越多,計算量越大,但是通常來說,隱藏單元還是越多越好。

      9.7.2 訓練一個神經(jīng)網(wǎng)絡

      接下來要說的是訓練一個神經(jīng)網(wǎng)絡需要實現(xiàn)的步驟:

      1. 使用梯度檢查,來比較已經(jīng)計算得到的偏導數(shù)項與用反向傳播算法得到的偏導數(shù)值,以確保兩種方法得到的值近似。之后要停用梯度檢查。

      2. 使用一個最優(yōu)化算法和反向傳播算法相結(jié)合,來最小化關(guān)于的代價函數(shù)J(θ)。

      對于神經(jīng)網(wǎng)絡來說,代價函數(shù)J(θ)是一個非凸函數(shù)(non-convex),理論上可能停留在局部最小值的位置。實際上,梯度下降算法和其他一些高級優(yōu)化方法理論上都能收斂于局部最小值,但是一般來講,在實際操作中,盡管我們不能保證這些優(yōu)化算法一定會得到局部最優(yōu)值,但項梯度下降這類算法,在最小化代價函數(shù)J(θ)的過程中表現(xiàn)得很不錯。

      9.8 無人駕駛

      本章視頻可在吳恩達及機器學習課時80中觀看。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多