反向傳播算法過程 什么事反向傳播算法


自從機器學習被引入到遞歸的非線性函數中(例如人工神經 *** )以來,對相關內容的應用得到了充足的發展 。在這種情況下,訓練正確的神經 *** 是建立可靠模型最重要的方面 。這種訓練通常與”反向傳播”一詞聯系在一起,這個術語對大多數新手來說是非常模糊的 。這也是本文所存在的意義 。
反向傳播是神經 *** 訓練的本質 。它實際上是基于在前一歷元(即迭代)中獲得的誤差率(即損失)對神經 *** 的權重進行微調的實踐 。適當的調整權重可確保較低的錯誤率,增加模型的適用性使模型更可靠 。
那么這個過程如何運作的呢?讓我們通過例子學習!
為了使這個例子盡可能便于大家理解,我們只涉及相關概念(例如損失函數、優化函數等)而不解釋它們,因為這些主題值得我們另起一篇文章進行細說 。
首先,讓我們設置模型組件
想象一下,我們需要訓練一個深層神經 ***。訓練的目的是構建一個模型,該模型使用兩個輸入和三個隱藏單元執行XOR(異或)函數,這樣訓練集看起來如下所示:
此外,我們需要一個激活函數來確定神經 *** 中每個節點的激活值 。為簡單起見,讓我們選擇一個激活函數:
我們還需要一個假設函數來確定激活函數的輸入是什么 。這個函數是:
讓我們選擇損失函數作為邏輯回歸的一般成本函數,看起來有點復雜,但實際上相當簡單:
此外,我們將使用批處理梯度下降優化函數,用于確定我們應該調整權重的方向,以獲得比我們現有的更低的損失 。最后,學習率為0.1,所有權重將初始化為1 。
我們的神經 ***
讓我們最后畫一張我們期待已久的神經 *** 圖 。它應該看起來像這樣:
最左邊的層是輸入層,它將X0作為值1的偏置項,將X1和X2作為輸入特征 。中間的層是之一個隱藏層,它的偏置項Z0也取值為1 。最后,輸出層只有一個輸出單元D0,其激活值是模型的實際輸出(即h(x))。
現在我們向前傳播
現在是將信息從一個層前饋到另一個層的時候了 。這需要經過兩個步驟,通過 *** 中的每個節點/單元:
1. 使用我們之前定義的h(x)函數獲取特定單位輸入的加權和 。
2.將我們從步驟1得到的值插入我們的激活函數(本例中為f(a)= a)并使用我們得到的激活值(即激活函數的輸出)作為連接輸入特征的下一層中的節點 。
【反向傳播算法過程什么事反向傳播算法】請注意,單位X0,X1,X2和Z0沒有任何連接到它們并任提供輸入的單位 。因此,上述步驟不會出現在這些節點中 。但是,對于其余的節點/單元,訓練集中之一個輸入樣本的整個神經 *** 都是這樣的:
其他單位也是如此:
如前所述,最終單位(D0)的激活值(z)是整個模型的激活值(z) 。因此,我們的模型預測輸入集{0,0}的輸出為1 。計算當前迭代的損失/成本如下:
actual_y值來自訓練集,而predict_y值是我們模型產生的值 。所以這次迭代的成本是-4 。
那么反向傳播在哪里呢?
根據我們的例子,我們現在有一個模型沒有給出準確的預測(它給我們的值是4而不是1),這歸因于它的權重尚未調整(它們都等于1) 。我們也有損失,即-4 。反向傳播就是以這樣一種方式向后傳遞這種損失,我們可以根據這種方式微調權重 。優化函數(在我們的例子中為梯度下降)將幫助我們找到權重 。那就讓我們開始吧!
使用以下功能進行前饋:
然后通過這些函數的偏導數發生反向反饋 。不需要經過經過推導這些函數的過程 。我們需要知道的是,上面的函數將遵循:
其中Z是我們從前饋步驟中的激活函數計算中獲得的z值,而delta是圖層中單位的損失 。
我知道有很多信息一次性就能吸收,但我建議你花點時間,真正了解每一步發生了什么,然后再繼續前進 。
計算增量
現在我們需要找到神經 *** 中每個單元/節點的損耗 。這是為什么呢?我們這樣想,深度學習模型到達的每一次損失實際上是由所有節點累積到一個數字引起的 。因此,我們需要找出哪個節點對每層中的大部分損失負責,這樣我們就可以通過賦予它更小的權重值來懲罰它,從而減少模型的總損失 。
計算每個單元的增量可能會有問題 。但是,感謝吳恩達先生,他給了我們整個事情的捷徑公式:
其中delta_0,w和f’(z)的值是相同單位的值,而delta_1是加權鏈接另一側的單位損失 。例如:
你可以這樣想,為了獲得節點的損失(例如Z0),我們將其對應的f’(z)的值乘以它在下一層(delta_1)連接的節點的損失,再乘以連接兩個節點的鏈路的權重 。

推薦閱讀