1. 程式人生 > >反向傳播演算法最全解讀,機器學習進階必看!

反向傳播演算法最全解讀,機器學習進階必看!

目前網路上關於反向傳播演算法的教程已經很多,那我們還有必要再寫一份教程嗎?答案是‘需要’。

為什麼這麼說呢?我們教員Sanjeev最近要給本科生上一門人工智慧的課,儘管網上有很多反向傳播演算法的教程,但他卻找不到一份令他滿意的教程,因此我們決定自己寫一份關於反向傳播演算法的教程,介紹一下反向傳播演算法的歷史背景、原理、以及一些最新研究成果。

PS:本文預設讀者具備一定的基礎知識(如瞭解梯度下降、神經網路等概念)。

一、什麼是反向傳播演算法?

反向傳播演算法是訓練神經網路的經典演算法。在20世紀70年代到80年代被多次重新定義。它的一些演算法思想來自於60年代的控制理論。

在輸入資料固定的情況下、反向傳播演算法利用神經網路的輸出敏感度來快速計算出神經網路中的各種超引數。

尤其重要的是,它計算輸出f對所有的引數w的偏微分,即如下所示:?f/?wi,f代表神經元的輸出,wi是函式f的第i個引數。引數wi代表網路的中邊的權重或者神經元的閾值,神經元的啟用函式具體細節並不重要,它可以是非線性函式Sigmoid或RELU。這樣就可以得到f相對於網路引數的梯度?f ,有了這個梯度,我們就可以使用梯度下降法對網路進行訓練,即每次沿著梯度的負方向(??f)移動一小步,不斷重複,直到網路輸出誤差最小。

在神經網路訓練過程中,我們需要注意的是,反向傳播演算法不僅需要準確計算梯度。還需要使用一些小技巧對我們的網路進行訓練。理解反向傳播演算法可以幫助我們理解那些在神經網路訓練過程中使用的小技巧。

反向傳播演算法之所以重要,是因為它的效率高。假設對一個節點求偏導需要的時間為單位時間,運算時間呈線性關係,那麼網路的時間複雜度如下式所示:O(Network Size)=O(V+E),V為節點數、E為連線邊數。這裡我們唯一需要用的計算方法就是鏈式法則,但應用鏈式法則會增加我們二次計算的時間,由於有成千上萬的引數需要二次計算,所以效率就不會很高。為了提高反向傳播演算法的效率,我們通過高度並行的向量,利用GPU進行計算。

注:業內人士可能已經注意到在標準的神經網路訓練中,我們實際上關心的是訓練損失函式的梯度,這是一個與網路輸出有關的簡單函式,但是上文所講的更具有普遍意義,因為神經網路是可以增加新的輸出節點的,此時我們要求的就是新的網路輸出與網路超引數的偏微分。

二、問題設定

反向傳播演算法適用於有向非迴圈網路,為了不失一般性,非迴圈神經網路可以看做是一個多層神經網路,第t+1層神經元的輸入來自於第t層及其下層。我們使用f表示網路輸出,在本文中我們認為神經網路是一個上下結構,底部為輸入,頂部為輸出。

規則1:為了先計算出引數梯度,先求出 ?f/?u ,即表示輸出f對節點u的偏微分。

我們使用規則1來簡化節點偏微分計算。下面我將具體說一下?f/?u的含義。我們做如下假設,先刪除節點u的所有輸入節點。然後保持網路中的引數不變。現在我們改變u的值,此時與u相連的高層神經元也會受到影響,在這些高層節點中,輸出f也會受到影響。那麼此時?f/?u就表示當節點u變化時,節點f的變化率。

規則1就是鏈式法則的直接應用,如下圖所示,u是節點 z1,…,zm的加權求和,即u=w1*z1+?+wn*zn,然後通過鏈式法則對w1求偏導數,具體如下:

由上式所示,只有先計算?f/?u,然後才能計算?f/?w1。

多元鏈式法則

為了計算節點的偏微分,我們先回憶一下多元鏈式法則,多元鏈式法則常用來描述偏微分之間的關係。 即假設f是關於變數u1,…,un的函式,而u1,…,un又都是關於變數z的函式,那麼f關於z的偏導數如下:

這是鏈式法則2的一般式,是鏈式法則的1的子式。這個鏈式法則很適合我們的反向傳播演算法。下圖就是一個符合多元鏈式法則的神經網路示意圖。

如上圖所示,先計算f相對於u1,…,un的偏導數,然後將這些偏導數按權重線性相加,得到f對z的偏導數。這個權重就是u1,…,un對z的偏導,即?uj/?z。此時問題來了,我麼怎麼衡量計算時間呢?為了與教課書中保持一致,我們做如下假設:u節點位於t+1層的,z節點位於t層或t層以下的子節點,此時我們記?u/?z的運算時間為單位時間。

樸素前饋演算法(低效演算法)

我們首先要指出鏈式法則是包含二次計算的時間。許多作者都不屑於講這種演算法,直接跳過的。這就好比我們在上演算法排序課時,老師都是直接講快速排序的,像那些低效排序演算法都是直接跳過不講的。

樸素演算法就是計算節點對ui與uj之間偏導數,在這裡節點ui的層級要比uj高。在V*V個節點對的偏導值中包含?f/?ui的值,因為f本身就是一個節點,只不過這個節點比較特殊,它是一個輸出節點。

我們以前饋的形式進行計算。我們計算了位於t層及t層以下的所有節點對之間的偏導數,那麼位於t+1層的ul對uj的偏導數就等於將所有ui與uj的偏導數進行線性加權相加。固定節點j,其時間複雜度與邊的數量成正比,而j是有V個值,此時時間複雜度為O(VE)。

三、反向傳播演算法(線性時間)

反向傳播演算法如其名所示,就是反向計算偏微分,資訊逆向傳播,即從神經網路的高層向底層反向傳播。

資訊協議:節點u通過高層節點獲取資訊,節點u獲取的資訊之和記做S。u的低階節點z獲取的資訊為S??u/?z

很明顯,每個節點的計算量與其連線的神經元個數成正比,整個網路的計算量等於所有節點運算時間之和,所有節點被計算兩次,故其時間複雜度為O(Network Size)。

我們做如下證明:S等於?f/?z。

證明如下:當z為輸出層時,此時?f/?z=?f/?f=1

假如對於t+1層及其高層假設成立,節點u位於t層,它的輸出邊與t+1層的u1,u2,…,um節點相連,此時節點從某個節點j收到的資訊為(?f/?uj)×(?uj/?z),根據鏈式法則,節點z收到的總資訊為S=

四、自動微分

在上文中,關於神經網路、節點計算,我們並沒有細講。下面我們將具體講一下,我們將節點與節點之間的計算看做是一個無環圖模型,許多自動計算微分的工具包(如:autograd,tensorflow)均採用這一模型。這些工具就是通過這個無向圖模型來計算輸出與網路引數的偏導數的。

我們首先注意到法則1就是對這個的一般性描述,這個之所以不失一般性是因為我們可以將邊的權值也看做節點(即葉節點)。這個很容易轉換,如下圖所示,左側是原始網路,即一個單節點和其輸入節點、輸入節點的權重。右側是將邊的權重轉換為葉節點。網路中的其它節點也做類似轉換。

只要區域性偏導數計算的效率足夠高,那麼我們就可以利用上文所說的資訊協議來計算各個節點的偏微分。即對節點u來講,我們應該先找出它的的輸入節點有哪些,即z1,…,zn。然後計算在u的偏微分的基礎上計算zj的偏微分,由於輸出f對u的偏微分記做S,所以計算輸出f對zj的偏微分就是S??u?zj

這個演算法可以按照如下規則分塊計算,首先明確節點u與輸入節點z1,…,zn 的關係,然後就是怎麼計算偏導數的倍數(權重)S。即S??u/?zj。

擴充套件到向量空間:為了提高偏微分權重的計算效率,我們可以將節點的輸出也變為一個向量(矩陣或張量)。此時我們將?u/?zj?S改寫為?u/?zj[S], 這個與我們的反向傳播演算法思想是一致的,在反向傳播演算法中,y是一個p維向量,x是一個q維向量,y是關於x的函式,我們用?y/?x來表示由 ?yj/?xi所組成的q*p矩陣。聰明的讀者很快就會發現,這就是我們數學中的雅克比矩陣。此外我們還可以證明S與u的維度相同、?u?zj[S] 與zj的維度也相同。

如下圖所示,W是一個d2*d3的矩陣,Z是一個d1*d2的矩陣,U=WZ故U是一個d1*d3維的矩陣,此時我們計算?U/?Z,最終得到一個d2d3×d1d3維的矩陣。但我們在反向傳播演算法中,這個會算的很快,因為?U/?Z[S]=W?S,在計算機中我們可以使用GPU來進行類似向量計算。

五、重要知識擴充套件

1、權重共享

在許多神經網路框架中,設計者想要是一些神經元的引數能夠共享,這些引數包括邊的權重或者節點的閾值引數。例如,在卷積神經網路中,同一個卷集核使用的引數都是一樣的。簡而言之,就是a、b是兩個不同的引數,但我們強制要求a與b的值相同,即引數共享。這就好比我們給神經網路新增一個節點u,並且節點u與a和b相連,並且a=u,b=u.,此時根據鏈式法則,?f/?u=(?f/?a)?(?a/?u)+(?f/?b)?(?b/?u)=?f/?a+?f/?b. 因此,對一個共享引數而言,其梯度就是輸出與引數節點之間的中間節點的偏導數之和。

2、反向傳播演算法在迴圈神經網路的應用

上面我們講的是非迴圈神經網路,許多前沿應用(機器翻譯、語言理解)往往使用有向迴圈神經網路。在這種結構的神經網路中會存在記憶單元或注意力機制,在這些單元或機制中往往存在複雜的求導計算。一開始我們使用梯度下降法訓練網路,即在時間序列上對神經網路使用反向傳播演算法,即對這個有向環狀結構進行無限迴圈,每一次迴圈的網路結構、網路引數都是一樣的,但是網路的輸入與輸出是不一樣的。在實際應用中我們會遇到梯度爆炸或梯度消失等問題,這些都會對結果收斂產生影響。為了解決這些問題,我們使用梯度剪下或者長短記憶模型(LSTM)等技術解決上述問題。

環狀神經網路可以高效計算梯度的事實促進了有記憶網路甚至資料結構的發展。使用梯度下降法,我們可可以對環狀結構神經網路進行優化,尋找最佳引數,使得這個網路可以解決特定計算問題。梯度下降法的極限目前仍在探索中。

3、海森向量乘積計算耗時

在近似線性時間中,我們不僅可以使用梯度下降法,或許我們也可以使用2階導數對目標函式進行優化。在優化過程中,最關鍵的一步是計算海森矩陣與一個向量的積,下面我將向大家介紹如何在規模是O(Network size)的神經網路應用上述思想,這個例子與前面所講稍有不同,我們的初始神經網路應該是一個用反向傳播演算法進行簡單優化過的神經網路。

法則:假設在無環神經網路中,有V個節點,E條邊,網路輸出為f,葉節點為z1,…,zm,那麼必存在一個大小為O(V+E)的網路,這個網路的的輸入節點為z1,…,zm,輸出節點為?f/?z1,…,?f/?zm。

上面的定理可以通過在無環神經網路中實現訊息直接傳遞來證明,緊接著我們將解釋一下如何計算?2f(z)?v。設g(z)=??f(z),v? ,有定理可知, g(z)可以由大小是O(V+E)神經網路計算得到,同理我們再次應用法則,在這個大小是O(V+E)的網路計算g(z)的梯度,此時?g(z)=?2f(z)?v,此時我們就算出了海森矩陣與向量積的積,此時耗費的時間複雜度就是網路規模的大小。

以上便是BP學習過程中需要了解的一些內容,雷鋒網希望能讓你在學習過程中得到一個比較清晰的思路。當然,也歡迎你關注雷鋒網旗下公眾號“AI科技評論”與我們交流哦。

via Back-propagation, an introduction

相關推薦

反向傳播演算法解讀機器學習

目前網路上關於反向傳播演算法的教程已經很多,那我們還有必要再寫一份教程嗎?答案是‘需要’。 為什麼這麼說呢?我們教員Sanjeev最近要給本科生上一門人工智慧的課,儘管網上有很多反向傳播演算法的教程,但他卻找不到一份令他滿意的教程,因此我們決定自己寫一份關於反向傳播演

大資料推薦系統演算法程式碼接觸(機器學習演算法+Spark實現)

大資料推薦系統演算法程式碼全接觸(機器學習演算法+Spark實現)課程出自學途無憂網 課程分享地址:https://pan.baidu.com/s/1piCNIxC2Sv0zMY0yWxY9Ug  提取碼:b10v     一、課程簡介: 推薦系統是利用電子商務網站向

的國外機器學習資源(上)

一、C++ 計算機視覺 CCV—基於C語言/提供快取/核心的機器視覺庫,新穎的機器視覺庫 OpenCV—它提供C++、C、Python、Java以及MATLAB介面,並支援Windows、Linux、Android和Mac OS作業系統 OPENCV網址 通用機器學習 MLPack    MLPCACK網

史上人工智慧和機器學習會議大盤點

機器學習和人工智慧是今天最熱門的科技研究方向。隨著行業的不斷升溫,越來越多的 AI 主題會議也層出不窮,在這些會議中,我們可以討論近期技術的發展趨勢,並與其他資料科學家、開發者與工業界人士交流意見。不管你是想時刻緊跟潮流,還是僅僅希望稍微瞭解一下人工智慧,全世界每時每刻總有一個大會在等著你(

的國外機器學習資源(下)

集齊上下兩篇,可召喚神龍哦~ 為看官奉上機器學習資源——下篇。 最牛B的框架、庫和軟體,至此終於收齊啦! _________________________________________________________________ 一、Matlab 計

2019妙堂Vue.JS深造高階課程

視訊課程介紹 本套課程共計 4 個階段,共計 38 節課,分別從 “vue-cli 腳手架、vue-router、vuex、axios 伺服器通訊” 這四大塊為大家詳細講解 vue 的相關知識體系。 視訊教程從 vue 的入門開始,即 “響應式資料繫結、可組合的檢視元件”,學習 MVVM 思想

android matrix 方法詳解與

1 概述 這裡我們會詳細講解matrix的各個方法,以及它的用法。matrix叫做矩陣,在前面講解 ColorFilter 的文章中,我們講解了ColorMatrix,他是一個4*5的矩陣。而這裡,我們講解的Matrix不是用於處理顏色的,而是處理圖形的。他是一個3*3的

阿裏資深技術專家:在各階段中3年經驗的程序員應該具備哪些技術能力(

Java 後端 進階 3年工作經驗的Java程序員應該具備哪些技術能力,這可能是Java程序員們比較關心的內容。我這裏要說明一下,以下列舉的內容不是都要會的東西,但是你掌握得越多,最終能得到的評價、拿到的薪水勢必也越高。1、基本語法這包括static、final、transient等關鍵字的作用,

想學python這5本書你

python是一種美麗的語言 ,應用範圍也很廣,有很多的人開始學習python開發,對於初學者,這裡有5本經典的書籍,如果你打算用看書來學習python,這5本書無疑是很好的選擇。   1.python基礎教程 很適合初學者,簡單明瞭,對字串,列表,字典等講解詳細,

從入門到51本Python精品書籍免費送

Python是一種多功能語言。它經常用作Web應用程式的指令碼語言,嵌入到軟體產品中,以及人工智慧和系統任務管理。它既簡單又強大,非常適合初學者和專業程式設計師。 小編精選了51本高質量的Python書籍。裡面涵蓋各種各樣的書籍,其中包含適用於初學者,中級和高階程式設計師的,也有針對特別領域的,

你和阿里資深架構師之間差的不僅僅是年齡(

導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步瞭解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關注一下。 目錄: 一、基礎篇 二、進階篇 三、高階篇 四、架構篇 五、

Udacity機器學習—監督學習之神經網路迷你專案

1.建立感知 def activate(self,inputs): """ Takes in @param inputs, a list of numbers equal to length of weights.

Javaer 的 RocketMQ 就這篇了

> 每個時代,都不會虧待會學習的人。 大家好,我是 yes。 繼上一篇 [頭條終面:寫個訊息中介軟體](https://mp.weixin.qq.com/s/rsy1Tl-E2Jl8l8hwqW62zQ) ,我提到實現訊息中介軟體的一些關鍵點,今天就和大家一起深入生產級別訊息中介軟體 - RocketMQ

神經網路中反向傳播演算法(backpropagation)的pytorch實現pytorch教程中的程式碼解讀以及其他一些疑問與解答

pytorch的官網上有一段教程,是使用python的numpy工具實現一個簡單的神經網路的bp演算法。下面先貼上自己的程式碼: import numpy as np N,D_in,H,D_out = 4,10,8,5 x = np.random.randn(N,D_i

的汽車儀表指示燈解讀別再說你不認識了

ref 認識 jpeg 駕駛 class 技術 車主 pan 方便 最全的汽車儀表指示燈解讀,別再說你不認識了! 你汽車上的汽車故障警報燈可能有上百種之多,越是高端的車型故障燈的種類更多。車主在平常駕駛,有時會發現車內有些燈突然亮了,頓時不知所措。尤其對於新手司

吳恩達機器學習(第十章)---神經網路的反向傳播演算法

一、簡介 我們在執行梯度下降的時候,需要求得J(θ)的導數,反向傳播演算法就是求該導數的方法。正向傳播,是從輸入層從左向右傳播至輸出層;反向傳播就是從輸出層,算出誤差從右向左逐層計算誤差,注意:第一層不計算,因為第一層是輸入層,沒有誤差。 二、如何計算 設為第l層,第j個的誤差。

吳恩達機器學習 - 神經網路的反向傳播演算法 吳恩達機器學習 - 神經網路的反向傳播演算法

原 吳恩達機器學習 - 神經網路的反向傳播演算法 2018年06月21日 20:59:35 離殤灬孤狼 閱讀數:373

連線神經網路的反向傳播演算法(BP)

一、預熱篇 參考連結:http://colah.github.io/posts/2015-08-Backprop/ 要理解的主要點:路徑上所有邊相乘,所有路徑相加 反向傳播演算法(Backpropagation)已經是神經網路模型進行學習的標配。但是有很多問題值得思考一下: 反向傳播

吳恩達機器學習筆記-神經網路的代價函式和反向傳播演算法

代價函式 在神經網路中,我們需要定義一些新的引數來表示代價函式。 L = total number of layers in the network $s_l$ = number of units (not counting bias unit) in layer

機器學習反向傳播演算法的數學推導

周志華的西瓜書機器學習被譽為是機器學習的入門寶典,但是這本書對於深度學習的知識介紹非常少,僅僅只是在第五章《神經網路》中對其進行簡單的概括。 這一章對於深度學習的介紹非常淺顯,沒有很深入的對其中的知識進行挖掘,也沒有很複雜的數學推導。 博主在這裡對反向傳播演算法進行數學推導,這裡我使