1. 程式人生 > >一文搞懂反向傳播演算法

一文搞懂反向傳播演算法

一、前言

這是一場以誤差(Error)為主導的反向傳播(Back Propagation)運動,旨在得到最優的全域性引數矩陣,進而將多層神經網路應用到分類或者回歸任務中去。

前向傳遞輸入訊號直至輸出產生誤差,反向傳播誤差資訊更新權重矩陣。這兩句話很好的形容了資訊的流動方向,權重得以在資訊雙向流動中得到優化,這讓我想到了北京城的夜景,車輛川流不息,車水馬龍,你來我往(* ॑꒳ ॑* )⋆*。

至於為什麼會提出反向傳播演算法,我直接應用梯度下降(Gradient Descent)不行嗎?想必大家肯定有過這樣的疑問。答案肯定是不行的,縱然梯度下降神通廣大,但卻不是萬能的。梯度下降可以應對帶有明確求導函式的情況,或者說可以應對那些可以求出誤差的情況,比如邏輯迴歸(Logistic Regression),我們可以把它看做沒有隱層的網路;但對於多隱層的神經網路,輸出層可以直接求出誤差來更新引數,但其中隱層的誤差是不存在的,因此不能對它直接應用梯度下降,而是先將誤差反向傳播至隱層,然後再應用梯度下降,其中將誤差從末層往前傳遞的過程需要鏈式法則(Chain Rule)的幫助,因此反向傳播演算法可以說是梯度下降在鏈式法則中的應用。

二、舉個栗子

為了幫助較好的理解反向傳播概念,對它有一個直觀的理解,接下來就拿猜數字遊戲舉個栗子。

2.1 兩人猜數字

這一過程類比沒有隱層的神經網路,比如邏輯迴歸,其中小黃帽代表輸出層節點,左側接受輸入訊號,右側產生輸出結果,小藍貓則代表了誤差,指導引數往更優的方向調整。由於小藍貓可以直接將誤差反饋給小黃帽,同時只有一個引數矩陣和小黃帽直接相連,所以可以直接通過誤差進行引數優化(實縱線),迭代幾輪,誤差會降低到最小。

2.2 三人猜數字

這一過程類比帶有一個隱層的三層神經網路,其中小女孩代表隱藏層節點,小黃帽依然代表輸出層節點,小女孩左側接受輸入訊號,經過隱層節點產生輸出結果,小藍貓代表了誤差,指導引數往更優的方向調整。由於小藍貓可以直接將誤差反饋給小黃帽,所以與小黃帽直接相連的左側引數矩陣可以直接通過誤差進行引數優化(實縱線);而與小女孩直接相連的左側引數矩陣由於不能得到小藍貓的直接反饋而不能直接被優化(虛棕線)。但由於反向傳播演算法使得小藍貓的反饋可以被傳遞到小女孩那進而產生間接誤差,所以與小女孩直接相連的左側權重矩陣可以通過間接誤差得到權重更新,迭代幾輪,誤差會降低到最小。

三、完整流程

上邊的栗子從直觀角度瞭解了反向傳播,接下來就詳細的介紹其中兩個流程前向傳播與反向傳播,在介紹之前先統一一下標記。

3.1 數學標記

3.2 前向傳播

如何將輸入層的訊號傳輸至隱藏層呢,以隱藏層節點c為例,站在節點c上往後看(輸入層的方向),可以看到有兩個箭頭指向節點c,因此a,b節點的資訊將傳遞給c,同時每個箭頭有一定的權重,因此對於c節點來說,輸入訊號為:

同理,節點d的輸入訊號為:

由於計算機善於做帶有迴圈的任務,因此我們可以用矩陣相乘來表示:

所以,隱藏層節點經過非線性變換後的輸出表示如下:

同理,輸出層的輸入訊號表示為權重矩陣乘以上一層的輸出:

同樣,輸出層節點經過非線性對映後的最終輸出表示為:

輸入訊號在權重矩陣們的幫助下,得到每一層的輸出,最終到達輸出層。可見,權重矩陣在前向傳播訊號的過程中扮演著運輸兵的作用,起到承上啟下的功能。

3.3 反向傳播

既然梯度下降需要每一層都有明確的誤差才能更新引數,所以接下來的重點是如何將輸出層的誤差反向傳播給隱藏層。

其中輸出層、隱藏層節點的誤差如圖所示,輸出層誤差已知,接下來對隱藏層第一個節點c作誤差分析。還是站在節點c上,不同的是這次是往前看(輸出層的方向),可以看到指向c節點的兩個藍色粗箭頭是從節點e和節點f開始的,因此對於節點c的誤差肯定是和輸出層的節點e和f有關。

不難發現,輸出層的節點e有箭頭分別指向了隱藏層的節點c和d,因此對於隱藏節點e的誤差不能被隱藏節點c霸為己有,而是要服從按勞分配的原則(按權重分配),同理節點f的誤差也需服從這樣的原則,因此對於隱藏層節點c的誤差為:

同理,對於隱藏層節點d的誤差為:

為了減少工作量,我們還是樂意寫成矩陣相乘的形式:

你會發現這個矩陣比較繁瑣,如果能夠簡化到前向傳播那樣的形式就更好了。實際上我們可以這麼來做,只要不破壞它們的比例就好,因此我們可以忽略掉分母部分,所以重新成矩陣形式為:

仔細觀察,你會發現這個權重矩陣,其實是前向傳播時權重矩陣w的轉置,因此簡寫形式如下:

不難發現,輸出層誤差在轉置權重矩陣的幫助下,傳遞到了隱藏層,這樣我們就可以利用間接誤差來更新與隱藏層相連的權重矩陣。可見,權重矩陣在反向傳播的過程中同樣扮演著運輸兵的作用,只不過這次是搬運的輸出誤差,而不是輸入訊號(我們不生產誤差,只是誤差的搬運工(っ̯ -。))。

四、鏈式求導

第三部分大致介紹了輸入資訊的前向傳播與輸出誤差的後向傳播,接下來就根據求得的誤差來更新引數。

首先對隱藏層的w11進行引數更新,更新之前讓我們從後往前推導,直到預見w11為止:

因此誤差對w11求偏導如下:

求導得如下公式(所有值已知):

同理,誤差對於w12的偏導如下:

同樣,求導得w12的求值公式:

同理,誤差對於偏置求偏導如下:

帶入上述公式為:

接著對輸入層的w11進行引數更新,更新之前我們依然從後往前推導,直到預見第一層的w11為止(只不過這次需要往前推的更久一些):

因此誤差對輸入層的w11求偏導如下:

求導得如下公式(有點長(ฅ́˘ฅ̀)):

同理,輸入層的其他三個引數按照同樣的方法即可求出各自的偏導,在這不再贅述。

在每個引數偏導數明確的情況下,帶入梯度下降公式即可(不在重點介紹):

至此,利用鏈式法則來對每層引數進行更新的任務已經完成。

五、引入delta

利用鏈式法則來更新權重你會發現其實這個方法簡單,但過於冗長。由於更新的過程可以看做是從網路的輸入層到輸出層從前往後更新,每次更新的時候都需要重新計算節點的誤差,因此會存在一些不必要的重複計算。其實對於已經計算完畢的節點我們完全可以直接拿來用,因此我們可以重新看待這個問題,從後往前更新。先更新後邊的權重,之後再在此基礎上利用更新後邊的權重產生的中間值來更新較靠前的引數。這個中間變數就是下文要介紹的delta變數,一來簡化公式,二來減少計算量,有點動態規劃的趕腳。

接下來用事實說話,大家仔細觀察一下在第四部分鏈式求導部分誤差對於輸出層的w11以及隱藏層的w11求偏導以及偏置的求偏導的過程,你會發現,三個公式存在相同的部分,同時隱藏層引數求偏導的過程會用到輸出層引數求偏導的部分公式,這正是引入了中間變數delta的原因(其實紅框的公式就是delta的定義)。

大家看一下經典書籍《神經網路與深度學習》中對於delta的描述為在第l層第j個神經元上的誤差,定義為誤差對於當前帶權輸入求偏導,數學公式如下:

因此輸出層的誤差可以表示為(上圖紅色框公式):

隱藏層的誤差可以表示為(上圖藍色框公式):

同時對於權重更新的表示為(上圖綠色框公式):

其實對於偏置的更新表示為(上圖紅色框):

上述4個公式其實就是《神經網路與深度學習》書中傳說的反向傳播4大公式(詳細推導證明可移步此書):

仔細觀察,你會發現BP1與BP2相結合就能發揮出最大功效,可以計算出任意層的誤差,只要首先利用BP1公式計算出輸出層誤差,然後利用BP2層層傳遞,就無敵了,這也正是誤差反向傳播演算法的緣由吧。同時對於權重w以及偏置b我們就可以通過BP3和BP4公式來計算了。

至此,我們介紹了反向傳播的相關知識,一開始看反向傳播資料的時候總覺得相對獨立,這個教材這麼講,另一篇部落格又換一個講法,始終不能很好的理解其中的含義,到目前為止,思路相對清晰。我們先從大致流程上介紹了反向傳播的來龍去脈,接著用鏈式求導法則來計算權重以及偏置的偏導,進而我們推出了跟經典著作一樣樣兒的結論,因此本人覺得較為詳細,應該對初學者有一定的借鑑意義,希望對大家有所幫助。

更多文章見我的知乎 張小磊 我的GitHub 張小磊

========這是一條求讚的分割線======

碼字作圖插公式不易,收藏表忘點贊 ೖ(⑅σ̑ᴗσ̑)ೖ

Nielsen M A. Neural networks and deep learning[M]. 2015.

Rashid T. Make your own neural network[M]. CreateSpace IndependentPublishing Platform, 2016.

作者:張小磊啊 連結:https://www.jianshu.com/p/964345dddb70 來源:簡書 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關推薦

反向傳播演算法

一、前言 這是一場以誤差(Error)為主導的反向傳播(Back Propagation)運動,旨在得到最優的全域性引數矩陣,進而將多層神經網路應用到分類或者回歸任務中去。前向傳遞輸入訊號直至輸出產生誤差,反向傳播誤差資訊更新權重矩陣。這兩句話很好的形容了資訊的流動方向,權重得以在資訊雙向流動中得到優化,這讓

深度學習與計算機視覺: 反向傳播演算法的四個基本方程

BP演算法,在深度神經網路的發展中有著舉足輕重的地位,對於反向傳播演算法的推導過程,各種資料介紹可謂是多不勝數。但,由於深度神經網路的複雜性,要比較深刻的理解反向傳播演算法還是需要自己手動的推導一遍。 本文以前篇深度學習與計算機視覺: 深度學習必知基本概念以及鏈式求導介紹了神經網路的反向傳播中的鏈式求導法則

K近鄰演算法(KNN),附帶多個實現案例

簡介:本文作者為 CSDN 部落格作者董安勇,江蘇泰州人,現就讀於昆明理工大學電子與通訊工程專業碩士,目前主要學習機器學習,深度學習以及大資料,主要使用python、Java程式語言。平時喜歡看書,打籃球,程式設計。學習為了進步,進步為了更好的學習! 一、KNN回顧

資料結構與演算法隨筆之------二叉樹的遍歷(二叉樹的四種遍歷)

二叉樹的遍歷 二叉樹的遍歷(traversing binary tree)是指從根結點出發,按照某種次序依次訪問二叉樹中所有的結點,使得每個結點被訪問依次且僅被訪問一次。 遍歷分為四種,前序遍歷,中序遍歷,後序遍歷及層序遍歷 前序 中

k近鄰(k-NN)演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Raft演算法

  raft是工程上使用較為廣泛的強一致性、去中心化、高可用的分散式協議。在這裡強調了是在工程上,因為在學術理論界,最耀眼的還是大名鼎鼎的Paxos。但Paxos是:少數真正理解的人覺得簡單,尚未理解的人覺得很難,大多數人都是一知半解。本人也花了很多時間、看了很多材料也沒有真正理解。直到看到raft的論文,兩

:Adaboost及手推演算法案例

boosting Boosting 演算法的特點在於:將表現一般的弱分類器通過組合變成更好的模型。代表自然就是我們的隨即森林了。 GBDT和Adaboost是boost演算法中比較常見的兩種,這裡主要講解Adaboost。 Adaboost Adaboost演算法的核心就是兩個權重。對於資料有一個權重

高頻面試題之限流演算法,從演算法原理到實現,再到對比分析

限流是指在系統面臨高併發、大流量請求的情況下,限制新的流量對系統的訪問,從而保證系統服務的安全性。常用的限流演算法有計數器固定視窗演算法、滑動視窗演算法、漏斗演算法和令牌桶演算法,下面將對這幾種演算法進行分別介紹,並給出具體的實現。本文目錄如下,略長,讀者可以全文閱讀,同樣也可以只看感興趣的部分。 [TOC

五大常用演算法分治演算法

>原創公眾號:bigsai >文章收錄在 [bigsai-algorithm](https://github.com/javasmall/bigsai-algorithm) ## 前言 分治演算法(divide and conquer)是五大常用演算法(分治演算法、動態規劃演算法、貪心演算法

各種 Docker 網絡 - 每天5分鐘玩轉 Docker 容器技術(72)

docker 教程 容器 前面各小節我們先後學習了 Docker Overaly,Macvaln,Flannel,Weave 和 Calico 跨主機網絡方案。目前這個領域是百家爭鳴,而且還有新的方案不斷湧現。本節將從不同維度比較各種網絡方案,大家在選擇的時候可以參考。CloudMan 的建議是:

Java 線程中斷

回復 代碼 信號 過程 執行 except 實例 二維 微信公眾 在之前的一文《如何"優雅"地終止一個線程》中詳細說明了 stop 終止線程的壞處及如何優雅地終止線程,那麽還有別的可以終止線程的方法嗎?答案是肯定的,它就是我們今天要分享的——線程中斷。 下面的這斷代碼大家應

:詞法作用域、動態作用域、回撥函式、閉包

不管什麼語言,我們總要學習作用域(或生命週期)的概念,比如常見的稱呼:全域性變數、包變數、模組變數、本地變數、區域性變數等等。不管如何稱呼這些作用域的範圍,實現它們的目的都一樣: (1)為了避免名稱衝突; (2)為了限定變數的生命週期(本文以變數名說事,其它的名稱在規則上是一樣的)

Python裝飾器是款神奇的神器!你知道怎麼用嗎?它!

    進群:548377875  即可獲取小編精心準備的教程以及大量的PDF呢! 1.引子 #功能函式 def add(x,y): return x+y #裝飾函式 def logger(fn): print('frist') x =

PID控制演算法(拋棄公式,從原理上真正理解PID控制)

PID控制演算法的C語言實現一 PID演算法原理    最近兩天在考慮一般控制演算法的C語言實現問題,發現網路上尚沒有一套完整的比較體系的講解。於是總結了幾天,整理一套思路分享給大家。    在工業應用中PID及其衍生演算法是應用最廣泛的演算法之一,是當之無愧的萬能演算法

交叉熵在機器學習中的使用,透徹理解交叉熵背後的直覺

關於交叉熵在loss函式中使用的理解 交叉熵(cross entropy)是深度學習中常用的一個概念,一般用來求目標與預測值之間的差距。以前做一些分類問題

db2 的鎖(表鎖、行鎖、共享鎖、排他鎖)

鎖,很好理解,每個人都在自己的房屋上安裝有鎖,你擁有了鎖,房屋只有你能獨佔,別人不能訪問。資料庫中的鎖也一樣,只不過更加細分。 db2 中基本的鎖有兩類: 排他鎖(X鎖),也叫寫鎖,當某行資料正在被修改時,其他程序不能再讀取或修改 共享鎖(S鎖),也叫讀鎖,當某行資料正

Java 執行緒中斷

在之前的一文《如何"優雅"地終止一個執行緒》中詳細說明了 stop 終止執行緒的壞處及如何優雅地終止執行緒,那麼還有別的可以終止執行緒的方法嗎?答案是肯定的,它就是我們今天要分享的——執行緒中斷。 下面的這斷程式碼大家應該再熟悉不過了,執行緒休眠需要捕獲或者丟擲

目標檢測演算法圖解:RCNN系列演算法

在生活中,經常會遇到這樣的一種情況,上班要出門的時候,突然找不到一件東西了,比如鑰匙、手機或者手錶等。這個時候一般在房間翻一遍各個角落來尋找不見的物品,最後突然一拍大腦,想到在某一個地方,在整個過程中有時候是很著急的,並且越著急越找不到,真是令人沮喪。但是,如果一個簡單的計算機演算法可以在幾毫秒

如何用Python爬取上市公司資訊

1. 概念準備 Python基本概念 tb.to_csv(r'1.csv', mode='a', encoding='utf_8_sig', header=1, index=0) r意思是強制不轉義字串 TableTableTable型表格

裝飾者模式

常見設計模式: 工廠模式,單例模式,裝飾器模式,代理模式,介面卡模式等 Java中IO使用的是裝飾設計模式: 抽象構件:抽象被裝飾者,一般是介面 具體構件:具體被裝飾者,實現抽向構件 抽象角色:抽象裝飾者, 抽象角色也去實現抽向構件:多型使用抽象構件做成員變數