零基礎深度學習入門:由淺入深理解反向傳播演算法
自從機器學習被引入到遞迴的非線性函式中(例如人工神經網路)以來,對相關內容的應用得到了充足的發展。在這種情況下,訓練正確的神經網路是建立可靠模型最重要的方面。這種訓練通常與"反向傳播"一詞聯絡在一起,這個術語對大多數新手來說是非常模糊的。這也是本文所存在的意義。
反向傳播是神經網路訓練的本質。它實際上是基於在前一曆元(即迭代)中獲得的誤差率(即損失)對神經網路的權重進行微調的實踐。適當的調整權重可確保較低的錯誤率,增加模型的適用性使模型更可靠。
那麼這個過程如何運作的呢?讓我們透過例子學習!
為了使這個例子儘可能便於大家理解,我們只涉及相關概念(例如損失函式、最佳化函式等)而不解釋它們,因為這些主題值得我們另起一篇文章進行細說。
首先,讓我們設定模型元件
想象一下,我們需要訓練一個深層神經網路。訓練的目的是構建一個模型,該模型使用兩個輸入和三個隱藏單元執行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)連線的節點的損失,再乘以連線兩個節點的鏈路的權重。
這正是反向傳播的工作原理。我們在每個單元進行delta計算步驟,將損失反向傳播到神經網路中,並找出每個節點/單元的損失。
讓我們計算一下這些增量!
這裡有一些注意事項:
- 最終單位的損失(即D0)等於整個模型的損失。這是因為它是輸出單位,它的損失是所有單位的累計損失,就像我們之前說的那樣。
- 無論輸入(即z)等於什麼,函式f'(z)總是給出值1。這是因為如前所述,偏導數如下:f'(a)= 1
- 輸入節點/單位(X0,X1和X2)沒有delta值,因為這些節點在神經網路中無法控制。它們僅作為資料集和神經網路之間的一個連結。
更新權重
現在剩下的就是更新我們在神經網路中的所有權重。這遵循批次梯度下降公式:
其中W是手頭的權重,alpha是學習率(在我們的例子中是0.1),J'(W)是成本函式J(W)相對於W的偏導數。再次強調,我們不需要進行數學運算。因此,讓我們使用吳恩達先生的函式的偏導數:
其中Z是透過前向傳播獲得的Z值,delta是加權連結另一端的單位損失:
現在用我們在每一步獲得的偏導數值,和批次梯度下降權重更新所有權重。值得強調的是,輸入節點(X0,X1和X2)的Z值分別等於1,0,0。1是偏置單元的值,而0實際上是來自資料集的特徵輸入值。最後要注意的是,沒有特定的順序來更新權重。你可以按照你想要的任何順序更新它們,只要你不會在同一次迭代中錯誤地更新任何權重兩次。
為了計算新的權重,讓我們給出神經網路名稱中的連結:
新的權重計算方法如下:
需要注意的是,模型還沒有正確訓練,因為我們只透過訓練集中的一個樣本進行反向傳播。我們為樣本做了所有我們能做的一切,這可以產生一個具有更高精度的模型,試圖接近每一步的最小損失/成本。
如果沒有正確的方法,機器學習背後的理論真的很難掌握。其中一個例子就是反向傳播,其效果在大多數現實世界的深度學習應用程式中都是可以預見的。反向傳播只是將總損耗傳回神經網路的一種方式,以方便人們瞭解每個節點的損失量,並隨後透過為節點提供更高誤差,進而使用損失最小化的方式來更新權重,反之亦然。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2637702/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 前端如何理解正則-由淺入深的學習前端
- 由淺入深理解 IOC 和 DI
- 由淺入深學習JavaScript Debug技巧JavaScript
- promise由淺入深Promise
- MongoDB由淺入深MongoDB
- javascript由淺入深JavaScript
- 由淺入深學python(一)Python
- 由淺入深理解Dubbo的SPI機制
- 由淺入深完全理解Java動態代理Java
- JavaScript Promise由淺入深JavaScriptPromise
- MySQL索引由淺入深MySql索引
- 由淺入深學C# 視訊教程C#
- 反向傳播演算法的暴力理解反向傳播演算法
- 物件導向-由淺入深物件
- 零基礎入門深度學習工作原理?看本文就對了!深度學習
- 深度學習二:概率和反向傳播的變種深度學習反向傳播
- 深度學習還不如淺層網路?RL教父Sutton持續反向傳播演算法登Nature深度學習反向傳播演算法
- 零基礎學習Alfred(一):入門操作Alfred
- MVP架構由淺入深篇一(基礎版)MVP架構
- 【由淺入深_打牢基礎】HOST頭攻擊
- 零基礎輕鬆入門——JAVA基礎學習Java
- 純手寫Promise,由淺入深Promise
- Vue.js 2.0 由淺入深Vue.js
- iOS架構由淺入深 | MVVMiOS架構MVVM
- Git由淺入深之分支管理Git
- 《神經網路和深度學習》系列文章十五:反向傳播演算法神經網路深度學習反向傳播演算法
- Git由淺入深之操作與指令Git
- 大資料零基礎由入門到實戰大資料
- 前端零基礎入門學習!前端真簡單前端
- 零基礎入門web開發(4)——學習JavaScriptWebJavaScript
- 零基礎入門深度學習-dive in to pytorch 的程式碼報錯記錄深度學習PyTorch
- 神經網路入門篇之深層神經網路:詳解前向傳播和反向傳播(Forward and backward propagation)神經網路反向傳播Forward
- 【由淺入深學MySQL】- MySQL連線查詢詳解MySql
- 深度學習入門必須理解這25個概念深度學習
- 深度學習與CV教程(4) | 神經網路與反向傳播深度學習神經網路反向傳播
- [轉帖]由淺入深瞭解GC入門篇(一):什麼是垃圾回收?GC
- 由淺入深 docker 系列: (6) 映象分層Docker
- 由淺入深 docker 系列: (2) docker 構建Docker