神经网络中的反向传播
介紹
我們在 Python 神經網絡教程的前幾章中已經寫過。我們運行神經網絡一章中的網絡缺乏學習能力。它們只能以隨機設置的權重值運行。所以我們不能用它們解決任何分類問題。然而,在簡單神經網絡一章中的網絡是能夠學習的,但我們只將線性網絡用于線性可分的類。
當然,我們想寫通用的人工神經網絡,能夠學習。為此,我們必須了解反向傳播。反向傳播是訓練人工神經網絡,尤其是深度神經網絡的常用方法。需要反向傳播來計算梯度,我們需要調整權重矩陣的權重。我們網絡的神經元(節點)的權重是通過計算損失函數的梯度來調整的。為此,使用梯度下降優化算法。它也稱為錯誤的反向傳播。
人們經常被其中使用的數學嚇倒。我們試圖用簡單的術語來解釋它。
許多關于山的文章或教程開始解釋梯度下降。想象一下,您在夜間或大霧中被直升機帶到一座山上,不一定是山頂。讓我們進一步想象這座山在一個島上,你想要到達海平面。你必須下去,但你幾乎看不到任何東西,也許只有幾米。你的任務是找到下山的路,但你看不到路。您可以使用梯度下降的方法。這意味著您正在檢查當前位置的陡度。您將朝下坡最陡的方向前進。你只走了幾步,然后又停下來重新調整自己的方向。這意味著您正在再次應用之前描述的程序,即您正在尋找最陡峭的下降。
下圖在二維空間中描述了此過程。
如此下去,您將到達一個位置,在那里不再下降。
每個方向都向上。你可能已經達到了最深的層次——全球最低點——,但你還不如被困在一個盆地中。如果您從圖像右側的位置開始,一切正常,但從左側開始,您將陷入局部最小值。
反向傳播詳解
現在,我們必須深入細節,即數學。
我們將從更簡單的情況開始。我們看一個線性網絡。線性神經網絡是通過將所有加權輸入信號相加來創建輸出信號的網絡。沒有激活函數將應用于這個總和,這是線性的原因。
將使用以下簡單網絡。
當我們訓練網絡時,我們有樣本和相應的標簽。對于每個輸出值○一世?我們有一個標簽?噸一世,這是目標值或所需值。如果標簽等于輸出,則結果是正確的,神經網絡沒有出錯。原則上,誤差是目標和實際輸出之間的差異:
電子一世=噸一世-○一世
我們稍后將使用平方誤差函數,因為它對于算法具有更好的特性:
電子一世=12(噸一世-○一世)2
我們想通過以下帶有值的示例來闡明錯誤的反向傳播方式:
我們來看看輸出值?○1,這取決于值?瓦11,?瓦12,?瓦13?和?瓦14.?讓我們假設計算值(○1) 是 0.92 和所需的值 (噸1) 是 1。在這種情況下,錯誤是
電子1=噸1-○1=1-0.92=0.08
錯誤?電子2?可以這樣計算:
電子2=噸2-○2=1-0.18=0.82
根據此錯誤,我們必須相應地更改傳入值的權重。我們有四個權重,所以我們可以平均分布誤差。然而,根據權重值按比例進行更有意義。權重相對于其他權重越大,它對錯誤的責任就越大。這意味著我們可以計算誤差的分數電子1?在?瓦11?作為:
電子1?瓦11∑一世=14瓦1一世
這意味著在我們的示例中:
0.08?0.60.6+0.1+0.15+0.25=0.0343
隱藏層和輸出層之間權重矩陣的總誤差——我們在上一章中稱之為“誰”——看起來像這樣
電子瓦H○=[瓦11∑一世=14瓦1一世瓦21∑一世=14瓦2一世瓦31∑一世=14瓦3一世瓦12∑一世=14瓦1一世瓦22∑一世=14瓦2一世瓦32∑一世=14瓦3一世瓦13∑一世=14瓦1一世瓦23∑一世=14瓦2一世瓦33∑一世=14瓦3一世瓦14∑一世=14瓦1一世瓦24∑一世=14瓦2一世瓦34∑一世=14瓦3一世]?[電子1電子2電子3]
可以看到左邊矩陣的分母總是一樣的。它的作用類似于縮放因子。我們可以去掉它,這樣計算就簡單多了:
電子瓦H○=[瓦11瓦21瓦31瓦12瓦22瓦32瓦13瓦23瓦33瓦14瓦24瓦34]?[電子1電子2電子3]
如果將右側的矩陣與我們使用 Python 和 Numpy 的神經元網絡一章中的“who”矩陣進行比較,您會注意到它是“who”的轉置。
電子瓦H○=瓦H○.噸?電子
所以,這對于線性神經網絡來說是最容易的部分。直到現在我們還沒有考慮激活函數。
激活功能
我們想用激活函數計算網絡中的誤差,即非線性網絡。誤差函數的推導描述了斜率。正如我們在本章開頭提到的,我們要下降。推導描述了錯誤如何乙?隨著重量的變化?瓦克j?變化:
?乙?瓦克j
所有輸出節點上的誤差函數 E?○一世?(一世=1,...n) 在哪里?n?是輸出節點的總數:
乙=∑一世=1n12(噸一世-○一世)2
現在,我們可以將其插入到我們的推導中:
?乙?瓦克j=??瓦克j12∑一世=1n(噸一世-○一世)2
如果您查看我們的示例網絡,您將看到一個輸出節點?○克?僅取決于使用權重創建的輸入信號?瓦克一世?和?一世=1,…米?和?米?隱藏節點的數量。
下圖進一步說明了這一點:
這意味著我們可以相互獨立地計算每個輸出節點的誤差。這意味著我們可以刪除所有表達式噸一世-○一世?和?一世≠克從我們的總結來看。因此,節點 k 的誤差計算現在看起來要簡單得多:
?乙?瓦克j=??瓦克j12(噸克-○克)2
目標值?噸克是一個常數,因為它不依賴于任何輸入信號或權重。我們可以應用鏈式法則來區分上一項來簡化事情:
?乙?瓦克j=?乙?○克??○克?瓦克j
在我們教程的前一章中,我們使用了 sigmoid 函數作為激活函數:
σ(X)=11+電子-X
輸出節點?○克通過將 sigmoid 函數應用于加權輸入信號的總和來計算。這意味著我們可以通過替換來進一步轉換我們的導數項○克?通過這個功能:
?乙?瓦克j=(噸克-○克)???瓦克jσ(∑一世=1米瓦克一世H一世)
在哪里?米?是隱藏節點的數量。
sigmoid 函數很容易區分:
?σ(X)?X=σ(X)?(1-σ(X))
完整的差異現在看起來像這樣:
?乙?瓦克j=(噸克-○克)?σ(∑一世=1米瓦克一世H一世)?(1-σ(∑一世=1米瓦克一世H一世))??瓦克j∑一世=1米瓦克一世H一世
最后一部分必須區別對待?瓦克j.?這意味著除項外所有乘積的導數將為 0瓦克jHj)?其中有導數?Hj?關于?瓦克j:
?乙?瓦克j=(噸克-○克)?σ(∑一世=1米瓦克一世H一世)?(1-σ(∑一世=1米瓦克一世H一世))?Hj
這就是我們在下一章中實現 NeuralNetwork 類的方法“train”所需要的。
總結
以上是生活随笔為你收集整理的神经网络中的反向传播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务计算 -- 搭建私有云
- 下一篇: [转]常用电平标准(TTL、CMOS、L