神經網絡的原理和BP算法
神經網絡,中間我們假設有一個合适的 θ 矩陣,來完成我們的前向傳播,
那麼我們如何來選擇 θ 呢?
開始我們的讨論内容,構造一個神經網絡,使用反向傳播求解 θ 。
神經網絡模型:
說明:
L :神經網絡層數
Sl:第 l 層神經元個數
K :輸出的多分類情況中的分類數
這時候,要求一個好的神經網絡就要對所有的邊權 θ 進行優化,這時候我們想到的是損失函數和梯度 下降。
代價函數:
圖中,我們看出神經網絡的代價函數是邏輯回歸代價函數的一種普遍化表達,我們可以理解為有多個 邏輯回歸單元。所以,如果是二分類問題代價函數是邏輯回歸的代價函數形式,如果是多分類,就需 要把每個分類的代價都算進總代價。同樣,式子二中的正則化項是把每一層的所有神經元所有邊權?θ 都加起來(除了偏置項)。
代價函數也可以用 SVM / hinge loss 和 Softmax / Cross-entropy loss 。
所以神經網絡的代價函數中同樣是前一個式子表示模型拟合能力,後一項表達神經網絡複雜度。
有了代價函數,下一步就是求最合适的邊權?θ 使得代價函數最小化。如何做呢?
BP算法(反向傳播)
我們的目标:
整體思路,用反向傳播求每一個邊權 θ 的梯度,也就是導數,用梯度下降法求邊權 θ 最優解。
上圖一中,通過前向傳播我們可以計算得到輸出結果和中間結果對應的向量。
這時候,我們用 δ 下标 j上标l,表示第1層的第 j 個節點的誤差。也就是激活值和真實值的誤差。
講一下反向傳播:
前面的博客中,我們把 a 上标l,下标 j 表示的是第l層第 j 個單元的激活值,也就是神經元的輸出值。所以,δ 項在 某種程度上就捕捉到了我們在這個神經節點的激活值的誤差。
具體地說,我們上圖中這個有四層的神經網絡結構為例,那麼大寫 L 等于 4,對于每一個輸出單元,準備計算損失的 δ項。第四層的第 j 個單元的 δ 就等于這個單元的激活值減去訓練樣本裡的真實值,就是假設輸出和訓練集y值之間的 差。
下一步,計算網絡中前面幾層的誤差項 δ。
δ(4):輸出層的輸出結果減去樣本值。
δ(3)的公式: δ(3)等于θ(3)的轉置乘以δ(4),然後點乘g’(z(3))。
g’(z(3)):激活函數 g 在輸入值為 z(3) 的時候所求的導數。g’ 這個導數項,其實是 a(3) 點乘 (1-a(3)),這裡a(3)是第三 層的激活向量。
同樣的公式計算δ(2)。
沒有δ(1),因為它對應輸入層,是訓練集數據,沒有誤差,所以這個例子中,我們的δ項就隻有第2層和第3層。
反向傳播就是類似于我們把輸出層的誤差,反向傳播給了第三層,然後再傳到第二層,這就是反向傳播的意思。
下一步,介紹了BP算法的思路後就是用這個方法計算參數 θ 的偏導數。
當我們有一個非常大的訓練樣本集時,如上圖,假設我們有m個樣本的訓練集。
第一件事就是固定這些帶下标 ij 的 Δ(就是 δ 的合集),這其實是大寫的希臘字母 δ 。我們将他們統一設置成 0。實際 上,這些大寫Δij會被用來計算偏導數項,也就是 jΘ 上标,下标 ij的偏導數。
所以,如上圖中,這些 Δ 會被作為累加項(初始值 0),慢慢地增加以計算出這些偏導數。
我們遍曆我們的訓練集,寫成 for i = 1 to m,對于第 i 個循環而言,我們将取訓練樣本 (xi, yi) 。
首先,我們設定 a(1) 也就是輸入層的激活值。設定它等于 xi,xi 是我們第 i 個訓練樣本的特征向量,接下來我們運用正 向傳播來計算第二層的激活值,然後是第三層、第四層。一直到最後一層L層。
接下來,我們将用我們這個樣本的輸出值 yi?來計算這個輸出值所對應的誤差項δL,所以δL就是假設輸出減去目标輸出。
接下來,我們用反向傳播算法來計算δ(L-1), δ(L-2),一直這樣直到δ(2) 。
最後,我們用大寫的 Δ 來累計我們在前面寫好的偏導數項。具體地說,如果我們把 Δ 看作一個矩陣,ij 代表矩陣中的 位置。那麼如果 Δ(L) 是一個矩陣,我們就可以寫成 Δ(l) 等于 Δ(l) 加上小寫的 δ(l 1) 乘以 a(l) 的轉置,用向量化的形式 實現了對所有 i 和 j 的自動更新值。最後,執行這個for循環體之後,我們跳出這個for循環,然後計算上圖三中左下角這些 式子,計算 D 。我們對于 j=0 和 j≠0 分兩種情況讨論。
在 j=0 的情況下,對應偏差項,所以當 j=0 的時候,這就是為什麼我們沒有寫額外的标準化項。
最後,計算出來了這些,這就正好是代價函數對每一個參數的偏導數(梯度),所以我們可以把它們用在梯度下降法或者 其他一些更高級的優化算法上以尋求适當的參數或者邊權來最小化整體代價。
這時候,有點雲裡霧裡,到底怎麼計算 Δij?
首先來回顧一下神經網絡的代價函數。假設隻有一個輸出單元時候的代價函數。
我們關注單個樣本的前向後向傳播,比如我們這裡考慮樣本 (xi, yi) 。同時我們現在不考慮正則化,所以λ=0 。所以最後一 項去掉。現在再來看這個求和公式,你會發現,這個代價項和我們的訓練數據xi, yi相關。所以,單個樣本的代價僅僅就是上 圖左下角藍色框的 cost 。簡單來說,我們的目标是平均意義上使得這個值最小,它的值衡量了模型對真實數據的拟合能力, 那麼我們要做的就是盡可能地降低這個cost 。
反向傳播細節和Δij 計算:
我們将 δ(l) j 看成第l層第 j 個單元激活值的代價。更加正式地說,δ 項實際上是關于z(l) j的偏微分。
記得δ(3)的公式:
δ(3)等于θ(3)的轉置乘以δ(4),然後點乘g’(z(3))。嗎?
所以,代價函數是關于标注 y 以及整個網絡表達的假設函數 hΘ(x) 之間的一個函數。那麼如果我們在神經網絡内部,對z(l)j 的值做了一點點修改,那麼它會對整個網絡的輸出造成一些影響,而這會進一步影響代價函數。所以,這些δ項其實就是代 價函數關于這些内部中間項的偏導數而已。
它們能夠度量我們修改神經網絡内部權重的時候對整個代價函數會産生怎樣的影響。
現在我們來仔細看看,反向傳播究竟是怎麼做的。
對于輸出層,我們的 δ(4)1,它等于y(i)-a(4)1。 所以這是真實的誤差。它是真實值和神經網絡預測出來的值之間的差。
下一步,我們将把這個值反向傳播,然後不斷向前傳播以計算每一個隐層節點的δ。
其實整個反向傳播做的事情就是在做求導的鍊式法則而已。
鍊式法則我們非常簡單地提一下:
實際上,我們的神經網絡定義了一個非常複雜的假設函數 hΘ(x),我們上圖裡面的 z 和 a 實際上也都是函數,而且它們都 是嵌套在 hΘ(x) 中的。因此,對于這個大的嵌套函數,在需要對某個參數 Θ(l)ij 求偏導的話,其實就是在不斷地在整個反 向鍊路上求所有的嵌套它的函數的偏導。最終,它就是我們這裡寫出來的這樣的規則 δ(2)2 和 δ(3)2 公式。
梯度檢驗
驗證我們反向傳播的正确與否。
随機初始化
首先思考一個問題,如果我們把所有邊權初始化為 0 會怎麼樣? 我們計算的激活值很可能相同,類似于我們隻有一個特征做邏輯回歸,效果很差。 這時候我們需要随機初始化參數來解決這個問題。
具體來說,上面我們讨論的問題叫做對稱現象,所以随機初始化這種技術有時候也被稱為打破對稱。
随機初始化,我們可以指定初始化在一定的範圍内,比如 [-ε,ε],這樣我們的所有參數都随機的被初始化,且在一定 的範圍内。
那麼我們就可以編寫上面的代碼來進行初始化。我們的 rand 函數會返回所被要求的維度,但重要的是,它能夠返回0~1 之間的一個随機數,然後我們将它乘以2倍的ε,這樣,我們就得到了0~2ε之間的一個數值,我們再減掉一個ε,這樣我們 就得到[-ε,ε]之間的數值了。
我們這裡面說的 ε 和梯度檢驗裡面的 ε,以及之前提到的判斷是否收斂時用的 ε 都不是一回事。它們在各自的場景用其實 均扮演了一種極小值的角色,因為在數學中極小值一般都是用 ε 這個字符,所以在這些不同的場景中均稱它們是 ε 。這裡 我們為了避免混淆,我們可以在代碼中将它的變量名稱為init_epsilon。
總結
我們在訓練一個神經網絡的時候,第一件事,就是搭建網絡的大體框架。
網絡框架的含義是,神經元之間的連接模式,如上圖一。所以,網絡框架的含義就是:有多少層,以及每層有多少個 節點,對于更複雜的可能層與層之間都不是全連接的。
具體怎麼選擇呢?
首先,我們知道,我們已經定義了輸入單元的數量,一旦我們确定了特征集x,對應的輸入單元數目也就确定了,也就 是等于特征xi的維度,如果正在進行多類别的分類問題,那麼輸出層的單元數量将會由分類問題中所需要區分的類别個 數決定,比如二分類我們隻需要一個輸出單元即可,但是對于一個數字識别應用而言,我們可能就有10個目标分類,而 且我們還需要把這些分類重寫成向量的形式。
隐層是對初始特征的高級加工,所以隐層其實神經元數量越多越好,隐層層數也是越多越好,這樣可以更好地抽象高級 特征。但是越多的隐層或者隐藏神經元,也意味着更大的計算量和更加複雜的優化算法。所以,對于一般的簡單應用, 我們使用一兩個隐層幾乎也就夠了,如果需要更多,那麼很可能就已經進入深度神經網絡,也就是現在很熱的深度學習 的範疇了。
訓練一個神經網絡:
六個步驟:
1、構建一個神經網絡,然後随機初始化權值,通常我們把權值初始化為很小的值,接近于0,但不是0 。
2、執行前向傳播算法,也就是對于該神經網絡的任意一個輸入xi,計算出對應的hx值,也就是一個輸出值y的向量。
3、通過代碼計算出代價函數 jΘ 。
4、執行反向傳播算法,來計算出這些偏導數,或者叫偏微分項,也就是 jΘ 關于參數 Θ 的偏微分。這樣我們就能得到該 神經網絡中每一層中每一個單元對應的所有這些激活值a(l)以及δ項。
5、梯度檢驗,比較使用反向傳播算法計算出來的偏導數值和使用數值方法得到的估計值,以此來确保兩種方法得到基本 接近的兩個值。通過梯度校驗,我們能夠确保我們的反向傳播算法,得到的結構是正确的。
6、使用一個最優化算法,比如梯度下降算法來與反向傳播算法相結合,這樣我們就可以盡量降低代價函數,求得合理可 用得參數Θ矩陣了。
對于神經網絡代價函數 jΘ,它是一個非凸函數,因此理論上是能夠停留在局部最小值得位置上的,實際上梯度下降算法和 其他一些高級優化方法理論上也都收斂于局部最小值。
最後,說一下梯度下降算法和神經網絡的聯系。上圖四。
我們有某個代價函數,并且在我們的神經網絡中,有一系列參數值,這裡我們隻寫下了兩個參數值,當然實際上,在神經 網絡裡,我們可以有很多的參數值 Θ(1), Θ(2) 等很多邊權。所有的這些都是矩陣,因此我們參數的維度就會很高了,由于 繪圖的限制,我們不能畫出更高維度情況的圖像,所以這裡我們假設,這個神經網絡中隻有兩個參數值。
那麼,代價函數jΘ度量的就是這個神經網絡對訓練數據的拟合情況。
因此,梯度下降算法的原理是,我們從某個随機的初始點開始,不斷沿着某一方向走到最小值。
那麼反向傳播算法的目的就是算出,梯度下降的方向,而梯度下降的過程就是沿着這個方向一點點的下降。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!