HOME 首頁
SERVICE 服務產品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    反向傳播算法(反向傳播算法原理)

    發(fā)布時間:2023-04-19 04:16:56     稿源: 創(chuàng)意嶺    閱讀: 135        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于反向傳播算法的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網頁版、PC客戶端

    官網:https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    反向傳播算法(反向傳播算法原理)

    一、因為反向傳播算法人工智能進入第二個高潮具體是在哪一年

    人工智能的第二次高潮始于上世紀80年代。

    人工智能是在1956年達特茅斯會議上首先提出的。該會議確定了人工智能的目標是“實現(xiàn)能夠像人類一樣利用知識去解決問題的機器”。雖然,這個夢想很快被一系列未果的嘗試所擊碎,但卻開啟了人工智能漫長而曲折的研究歷程。

    人工智能的第一次高潮始于上世紀50年代。在算法方面,感知器數(shù)學模型被提出用于模擬人的神經元反應過程,并能夠使用梯度下降法從訓練樣本中自動學習,完成分類任務。另外,由于計算機應用的發(fā)展,利用計算機實現(xiàn)邏輯推理的一些嘗試取得成功。

    理論與實踐效果帶來第一次神經網絡的浪潮。然而,感知器模型的缺陷之后被發(fā)現(xiàn),即它本質上只能處理線性分類問題,就連最簡單的異或題都無法正確分類。許多應用難題并沒有隨著時間推移而被解決,神經網絡的研究也陷入停滯。

    反向傳播算法(反向傳播算法原理)

    人工智能的第二次高潮始于上世紀80年代。BP(Back Propagation)算法被提出,用于多層神經網絡的參數(shù)計算,以解決非線性分類和學習的問題。另外,針對特定領域的專家系統(tǒng)也在商業(yè)上獲得成功應用,人工智能迎來了又一輪高潮。

    然而,人工神經網絡的設計一直缺少相應的嚴格的數(shù)學理論支持,之后BP算法更被指出存在梯度消失問題,因此無法對前層進行有效的學習。專家系統(tǒng)也暴露出應用領域狹窄、知識獲取困難等問題。人工智能的研究進入第二次低谷。

    人工智能的第三次高潮始于2010年代。深度學習的出現(xiàn)引起了廣泛的關注,多層神經網絡學習過程中的梯度消失問題被有效地抑制,網絡的深層結構也能夠自動提取并表征復雜的特征。

    避免傳統(tǒng)方法中通過人工提取特征的問題。深度學習被應用到語音識別以及圖像識別中,取得了非常好的效果。人工智能在大數(shù)據(jù)時代進入了第三次發(fā)展高潮。

    二、神經網絡——BP算法

    對于初學者來說,了解了一個算法的重要意義,往往會引起他對算法本身的重視。BP(Back Propagation,后向傳播)算法,具有非凡的歷史意義和重大的現(xiàn)實意義。

    1969年,作為人工神經網絡創(chuàng)始人的明斯基(Marrin M insky)和佩珀特(Seymour Papert)合作出版了《感知器》一書,論證了簡單的線性感知器功能有限,不能解決如“異或”(XOR )這樣的基本問題,而且對多層網絡也持悲觀態(tài)度。這些論點給神經網絡研究以沉重的打擊,很多科學家紛紛離開這一領域,神經網絡的研究走向長達10年的低潮時期。[1]

    1974年哈佛大學的Paul Werbos發(fā)明BP算法時,正值神經外網絡低潮期,并未受到應有的重視。[2]

    1983年,加州理工學院的物理學家John Hopfield利用神經網絡,在旅行商這個NP完全問題的求解上獲得當時最好成績,引起了轟動[2]。然而,Hopfield的研究成果仍未能指出明斯基等人論點的錯誤所在,要推動神經網絡研究的全面開展必須直接解除對感知器——多層網絡算法的疑慮。[1]

    真正打破明斯基冰封魔咒的是,David Rumelhart等學者出版的《平行分布處理:認知的微觀結構探索》一書。書中完整地提出了BP算法,系統(tǒng)地解決了多層網絡中隱單元連接權的學習問題,并在數(shù)學上給出了完整的推導。這是神經網絡發(fā)展史上的里程碑,BP算法迅速走紅,掀起了神經網絡的第二次高潮。[1,2]

    因此,BP算法的歷史意義:明確地否定了明斯基等人的錯誤觀點,對神經網絡第二次高潮具有決定性意義。

    這一點是說BP算法在神經網絡領域中的地位和意義。

    BP算法是迄今最成功的神經網絡學習算法,現(xiàn)實任務中使用神經網絡時,大多是在使用BP算法進行訓練[2],包括最近炙手可熱的深度學習概念下的卷積神經網絡(CNNs)。

    BP神經網絡是這樣一種神經網絡模型,它是由一個輸入層、一個輸出層和一個或多個隱層構成,它的激活函數(shù)采用sigmoid函數(shù),采用BP算法訓練的多層前饋神經網絡。

    BP算法全稱叫作誤差反向傳播(error Back Propagation,或者也叫作誤差逆?zhèn)鞑?算法。其算法基本思想為:在2.1所述的前饋網絡中,輸入信號經輸入層輸入,通過隱層計算由輸出層輸出,輸出值與標記值比較,若有誤差,將誤差反向由輸出層向輸入層傳播,在這個過程中,利用梯度下降算法對神經元權值進行調整。

    BP算法中核心的數(shù)學工具就是微積分的 鏈式求導法則 。

    BP算法的缺點,首當其沖就是局部極小值問題。

    BP算法本質上是梯度下降,而它所要優(yōu)化的目標函數(shù)又非常復雜,這使得BP算法效率低下。

    [1]、《BP算法的哲學思考》,成素梅、郝中華著

    [2]、《機器學習》,周志華著

    [3]、 Deep Learning論文筆記之(四)CNN卷積神經網絡推導和實現(xiàn)

    2016-05-13 第一次發(fā)布

    2016-06-04 較大幅度修改,完善推導過程,修改文章名

    2016-07-23 修改了公式推導中的一個錯誤,修改了一個表述錯誤

    三、一文搞懂梯度下降&反向傳播

    如果把神經網絡模型比作一個黑箱,把模型參數(shù)比作黑箱上面一個個小旋鈕,那么根據(jù)通用近似理論(universal approximation theorem),只要黑箱上的旋鈕數(shù)量足夠多,而且每個旋鈕都被調節(jié)到合適的位置,那這個模型就可以實現(xiàn)近乎任意功能(可以逼近任意的數(shù)學模型)。

    顯然,這些旋鈕(參數(shù))不是由人工調節(jié)的,所謂的機器學習,就是通過程序來自動調節(jié)這些參數(shù)。神經網絡不僅參數(shù)眾多(少則十幾萬,多則上億),而且網絡是由線性層和非線性層交替疊加而成,上層參數(shù)的變化會對下層的輸出產生非線性的影響,因此,早期的神經網絡流派一度無法往多層方向發(fā)展,因為他們找不到能用于任意多層網絡的、簡潔的自動調節(jié)參數(shù)的方法。

    直到上世紀80年代,祖師爺辛頓發(fā)明了反向傳播算法,用輸出誤差的均方差(就是loss值)一層一層遞進地反饋到各層神經網絡,用梯度下降法來調節(jié)每層網絡的參數(shù)。至此,神經網絡才得以開始它的深度之旅。

    本文用python自己動手實現(xiàn)梯度下降和反向傳播算法。 請點擊這里 到Github上查看源碼。

    梯度下降法是一種將輸出誤差反饋到神經網絡并自動調節(jié)參數(shù)的方法,它通過計算輸出誤差的loss值( J )對參數(shù) W 的導數(shù),并沿著導數(shù)的反方向來調節(jié) W ,經過多次這樣的操作,就能將輸出誤差減小到最小值,即曲線的最低點。

    雖然Tensorflow、Pytorch這些框架都實現(xiàn)了自動求導的功能,但為了徹底理解參數(shù)調節(jié)的過程,還是有必要自己動手實現(xiàn)梯度下降和反向傳播算法。我相信你和我一樣,已經忘了之前學的微積分知識,因此,到可汗學院復習下 Calculus

    和 Multivariable Calculus 是個不錯的方法,或是拜讀 這篇關于神經網絡矩陣微積分的文章 。

    Figure2是求導的基本公式,其中最重要的是 Chain Rule ,它通過引入中間變量,將“ y x 求導”的過程轉換為“ y 對中間變量 u 求導,再乘以 u x 求導”,這樣就將一個復雜的函數(shù)鏈求導簡化為多個簡單函數(shù)求導。

    如果你不想涉及這些求導的細節(jié),可以跳過具體的計算,領會其思想就好。

    對于神經網絡模型: Linear -> ReLu -> Linear -> MSE(Loss function) 來說,反向傳播就是根據(jù)鏈式法則對 求導,用輸出誤差的均方差(MSE)對模型的輸出求導,并將導數(shù)傳回上一層神經網絡,用于它們來對 w b x (上上層的輸出)求導,再將 x 的導數(shù)傳回到它的上一層神經網絡,由此將輸出誤差的均方差通過遞進的方式反饋到各神經網絡層。

    對于 求導的第一步是為這個函數(shù)鏈引入中間變量:

    接著第二步是對各中間變量求導,最后才是將這些導數(shù)乘起來。

    首先,反向傳播的起點是對loss function求導,即 。 :

    mse_grad()之所以用unsqueeze(-1)給導數(shù)增加一個維度,是為了讓導數(shù)的shape和tensor shape保持一致。

    linear層的反向傳播是對 求導,它也是一個函數(shù)鏈,也要先對中間變量求導再將所有導數(shù)相乘:

    這些中間變量的導數(shù)分別是:

    對向量 求導,指的是對向量所有的標量求偏導( ),即: ,這個橫向量也稱為y的梯度。

    這里 ,是一個向量,因此, 求導,指的是y的所有標量(y_1, y_2, ..., y_n)對向量x求偏導,即:

    。

    這個矩陣稱為雅克比矩陣,它是個對角矩陣,因為 ,因此 。

    同理, 。

    因此,所有中間導數(shù)相乘的結果:

    lin_grad() 中的inp.g、w.g和b.g分別是求 的導數(shù),以inp.g為例,它等于 ,且需要乘以前面各層的導數(shù),即 outp.g @ w.t() ,之所以要用點積運算符(@)而不是標量相乘,是為了讓它的導數(shù)shape和tensor shape保持一致。同理,w.g和b.g也是根據(jù)相同邏輯來計算的。

    ReLu層的求導相對來說就簡單多了,當輸入 <= 0時,導數(shù)為0,當輸入 > 0時,導數(shù)為1。

    求導運算終于結束了,接下來就是驗證我們的反向傳播是否正確。驗證方法是將forward_backward()計算的導數(shù)和Pytorch自動微分得到的導數(shù)相比較,如果它們相近,就認為我們的反向傳播算法是正確的。

    首先,將計算好的參數(shù)導數(shù)保存到w1g、b1g、w2g和b2g中,再用Pytorch的自動微分來求w11、b11、w22和b22的導數(shù)。

    最后,用np.allclose()來比較導數(shù)間的差異,如果有任何一個導數(shù)不相近,assert就會報錯。結果證明,我們自己動手實現(xiàn)的算法是正確的。

    反向傳播是遵循鏈式法則的,它將前向傳播的輸出作為輸入,輸入作為輸出,通過遞進的方式將求導這個動作從后向前傳遞回各層。神經網絡參數(shù)的求導需要進行矩陣微積分計算,根據(jù)這些導數(shù)的反方向來調節(jié)參數(shù),就可以讓模型的輸出誤差的優(yōu)化到最小值。

    歡迎關注和點贊,你的鼓勵將是我創(chuàng)作的動力

    四、理解梯度下降和反向傳播

    梯度下降就是一個求極值的方法,在深度學習里面用于最小化損失來訓練權重和偏差。

    先舉個簡單的例子,

    比如,我們要求如上曲線函數(shù)的極小值,我們只要對其求導然后找導數(shù)為0的點就可以了。

    但是在實際情況會比這個要復雜的多,因為我們會有更多的變量,特別是對于神經網絡而言,它可能以復雜的方式依賴于幾十億的權重和偏差,因此依靠微分來求極值顯然是行不通的。

    但是你想呀,我們有計算機呀,計算機最擅長什么?當然是硬算呀...

    想必玩過猜數(shù)字游戲吧,你先隨便猜一個,然后告知你大了還是小了,如果大了你就往小了猜,小了就往大了猜,如此循環(huán)往復就猜到對應的數(shù)字了。

    梯度下降的過程也是有點類似的,就是你先隨便選一個點,然后往減小的方向一點點移動,移動著移動著,你就到了那塊最小的值的區(qū)域了。

    那么,這個方向應該怎么確定呢?暫時先不去想它,假設我們就給我們的變量 隨意移動了很小的一段 ,那么函數(shù)值 會發(fā)生多少變化呢?微積分告訴我們會這么改變:

    要讓 的值減小,就意味著我們要讓 為負。

    在此之前,我們先把上面的偏導擴展到多元變量,即不止有一個變量 ,而是有 ,我們將所有變量的偏導數(shù)組合在一起構成一個向量,將其稱為梯度向量,即

    把所有發(fā)生的變化 也寫到一個向量里:

    我們可以把 的表達式寫成:

    觀察上面的公式,容易想到的是,我們只要選擇

    就可以保證 小于等于0了,其中 是一個小的正數(shù)(我們稱之為學習速率或者是步長)。然后,我們就知道該如何移動這個點了:

    然后讓計算機使用這個規(guī)則,一遍一遍的迭代,就能讓損失函數(shù)的值 達到我們希望的極小值。

    總而言之,梯度下降算法的工作方式是反復計算梯度 ,然后向相反方向移動。

    那么,我們如何把它應用到神經網絡的學習中?顯而易見的,就是利用梯度下降來找到相應的權重 和偏差 ,讓損失函數(shù)的值盡可能的小。套用上面的公式,我們只要隨機取一個 和 ,利用更新的規(guī)則,就有了:

    在來想一下我們網絡損失函數(shù)的定義,當使用二次損失時, ,也就是說,神經網絡中的損失,是所有訓練樣本損失的平均。但是,當數(shù)據(jù)集很大的時候,這會花費很長很長的時間,因此網絡的學習速度會非常非常慢。于是就有了一種叫做隨機梯度下降的思想來加速學習。

    這個想法其實很簡單,就是隨機選取一個小的批次,然后只計算這個批次的平均損失,這樣只要每個批次的平均損失都最小的話,那整體也就最小了。特別的,當這個批次只去一個樣本的時候,神經網絡一次只能從一個訓練輸入中學習,這種行為被稱為在線學習。

    okay,現(xiàn)在我們已經知道用梯度下降來讓網絡學習權重和偏差了,但是還有一個問題困擾著我們,就是你這個方法說起來簡單,可是...可是這個梯度要怎么算呀?

    然后一種快速計算梯度的算法,叫做 反向傳播算法 就來了。

    反向傳播算法的核心在于如何通過最終的損失 計算網絡中任意位置的權值 (或者偏差 )的偏導 。

    很明顯,其實最后一層的偏導是很好計算的,因為損失只要把樣本 對應的標簽 和輸出激活 ,帶到損失函數(shù)里就得到了,問題在于怎么計算前面層的損失。顧名思義,反向傳播算法的精髓就是搞出了一種方法,可以把誤差從后往前反向傳播,這樣就可以輕松的計算前面層權值的偏導了。

    在開始正式講解之前,我們先來定義幾個符號:

    根據(jù)上面的符號表達,我們可以很輕松的寫出正向傳播的遞推公式,就上一層的的輸出激活作為下一層的輸入,然后經過線性運算再輸出 激活,這里使用向量化的形式:

    為了計算 和 ,我們引入一個中間變量 ,稱其為第 層的第 個神經元的誤差:

    按照慣例,我們用 來代表第 層的誤差向量。

    根據(jù)微積分中求導的鏈式法則,有

    并且可以得到一個遞推公式

    寫成矩陣的形式,就是

    這樣我們就可以將誤差從后往前傳遞了。

    那么這個誤差和我們的偏導 又有什么聯(lián)系呢?還是根據(jù)鏈式法則:

    到此,整個反向傳播的過程就連起來了。求偏差的偏導使用同樣的方法即可。

    以上就是關于反向傳播算法相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。


    推薦閱讀:

    神經網絡誤差反向傳播(神經網絡誤差反向傳播算法)

    nginx反向代理內網訪問(nginx反向代理內網訪問是什么)

    反向推銷(反向營銷是什么意思)

    上虞景點排行榜(上虞景點排行榜前十名)

    杭州大衣批發(fā)市場(杭州大衣批發(fā)市場有哪些)