-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
反向傳播算法(反向傳播算法原理)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于反向傳播算法的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、因?yàn)榉聪騻鞑ニ惴ㄈ斯ぶ悄苓M(jìn)入第二個(gè)高潮具體是在哪一年
人工智能的第二次高潮始于上世紀(jì)80年代。
人工智能是在1956年達(dá)特茅斯會(huì)議上首先提出的。該會(huì)議確定了人工智能的目標(biāo)是“實(shí)現(xiàn)能夠像人類一樣利用知識(shí)去解決問題的機(jī)器”。雖然,這個(gè)夢(mèng)想很快被一系列未果的嘗試所擊碎,但卻開啟了人工智能漫長而曲折的研究歷程。
人工智能的第一次高潮始于上世紀(jì)50年代。在算法方面,感知器數(shù)學(xué)模型被提出用于模擬人的神經(jīng)元反應(yīng)過程,并能夠使用梯度下降法從訓(xùn)練樣本中自動(dòng)學(xué)習(xí),完成分類任務(wù)。另外,由于計(jì)算機(jī)應(yīng)用的發(fā)展,利用計(jì)算機(jī)實(shí)現(xiàn)邏輯推理的一些嘗試取得成功。
理論與實(shí)踐效果帶來第一次神經(jīng)網(wǎng)絡(luò)的浪潮。然而,感知器模型的缺陷之后被發(fā)現(xiàn),即它本質(zhì)上只能處理線性分類問題,就連最簡單的異或題都無法正確分類。許多應(yīng)用難題并沒有隨著時(shí)間推移而被解決,神經(jīng)網(wǎng)絡(luò)的研究也陷入停滯。
人工智能的第二次高潮始于上世紀(jì)80年代。BP(Back Propagation)算法被提出,用于多層神經(jīng)網(wǎng)絡(luò)的參數(shù)計(jì)算,以解決非線性分類和學(xué)習(xí)的問題。另外,針對(duì)特定領(lǐng)域的專家系統(tǒng)也在商業(yè)上獲得成功應(yīng)用,人工智能迎來了又一輪高潮。
然而,人工神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)一直缺少相應(yīng)的嚴(yán)格的數(shù)學(xué)理論支持,之后BP算法更被指出存在梯度消失問題,因此無法對(duì)前層進(jìn)行有效的學(xué)習(xí)。專家系統(tǒng)也暴露出應(yīng)用領(lǐng)域狹窄、知識(shí)獲取困難等問題。人工智能的研究進(jìn)入第二次低谷。
人工智能的第三次高潮始于2010年代。深度學(xué)習(xí)的出現(xiàn)引起了廣泛的關(guān)注,多層神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過程中的梯度消失問題被有效地抑制,網(wǎng)絡(luò)的深層結(jié)構(gòu)也能夠自動(dòng)提取并表征復(fù)雜的特征。
避免傳統(tǒng)方法中通過人工提取特征的問題。深度學(xué)習(xí)被應(yīng)用到語音識(shí)別以及圖像識(shí)別中,取得了非常好的效果。人工智能在大數(shù)據(jù)時(shí)代進(jìn)入了第三次發(fā)展高潮。
二、神經(jīng)網(wǎng)絡(luò)——BP算法
對(duì)于初學(xué)者來說,了解了一個(gè)算法的重要意義,往往會(huì)引起他對(duì)算法本身的重視。BP(Back Propagation,后向傳播)算法,具有非凡的歷史意義和重大的現(xiàn)實(shí)意義。
1969年,作為人工神經(jīng)網(wǎng)絡(luò)創(chuàng)始人的明斯基(Marrin M insky)和佩珀特(Seymour Papert)合作出版了《感知器》一書,論證了簡單的線性感知器功能有限,不能解決如“異或”(XOR )這樣的基本問題,而且對(duì)多層網(wǎng)絡(luò)也持悲觀態(tài)度。這些論點(diǎn)給神經(jīng)網(wǎng)絡(luò)研究以沉重的打擊,很多科學(xué)家紛紛離開這一領(lǐng)域,神經(jīng)網(wǎng)絡(luò)的研究走向長達(dá)10年的低潮時(shí)期。[1]
1974年哈佛大學(xué)的Paul Werbos發(fā)明BP算法時(shí),正值神經(jīng)外網(wǎng)絡(luò)低潮期,并未受到應(yīng)有的重視。[2]
1983年,加州理工學(xué)院的物理學(xué)家John Hopfield利用神經(jīng)網(wǎng)絡(luò),在旅行商這個(gè)NP完全問題的求解上獲得當(dāng)時(shí)最好成績,引起了轟動(dòng)[2]。然而,Hopfield的研究成果仍未能指出明斯基等人論點(diǎn)的錯(cuò)誤所在,要推動(dòng)神經(jīng)網(wǎng)絡(luò)研究的全面開展必須直接解除對(duì)感知器——多層網(wǎng)絡(luò)算法的疑慮。[1]
真正打破明斯基冰封魔咒的是,David Rumelhart等學(xué)者出版的《平行分布處理:認(rèn)知的微觀結(jié)構(gòu)探索》一書。書中完整地提出了BP算法,系統(tǒng)地解決了多層網(wǎng)絡(luò)中隱單元連接權(quán)的學(xué)習(xí)問題,并在數(shù)學(xué)上給出了完整的推導(dǎo)。這是神經(jīng)網(wǎng)絡(luò)發(fā)展史上的里程碑,BP算法迅速走紅,掀起了神經(jīng)網(wǎng)絡(luò)的第二次高潮。[1,2]
因此,BP算法的歷史意義:明確地否定了明斯基等人的錯(cuò)誤觀點(diǎn),對(duì)神經(jīng)網(wǎng)絡(luò)第二次高潮具有決定性意義。
這一點(diǎn)是說BP算法在神經(jīng)網(wǎng)絡(luò)領(lǐng)域中的地位和意義。
BP算法是迄今最成功的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法,現(xiàn)實(shí)任務(wù)中使用神經(jīng)網(wǎng)絡(luò)時(shí),大多是在使用BP算法進(jìn)行訓(xùn)練[2],包括最近炙手可熱的深度學(xué)習(xí)概念下的卷積神經(jīng)網(wǎng)絡(luò)(CNNs)。
BP神經(jīng)網(wǎng)絡(luò)是這樣一種神經(jīng)網(wǎng)絡(luò)模型,它是由一個(gè)輸入層、一個(gè)輸出層和一個(gè)或多個(gè)隱層構(gòu)成,它的激活函數(shù)采用sigmoid函數(shù),采用BP算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò)。
BP算法全稱叫作誤差反向傳播(error Back Propagation,或者也叫作誤差逆?zhèn)鞑?算法。其算法基本思想為:在2.1所述的前饋網(wǎng)絡(luò)中,輸入信號(hào)經(jīng)輸入層輸入,通過隱層計(jì)算由輸出層輸出,輸出值與標(biāo)記值比較,若有誤差,將誤差反向由輸出層向輸入層傳播,在這個(gè)過程中,利用梯度下降算法對(duì)神經(jīng)元權(quán)值進(jìn)行調(diào)整。
BP算法中核心的數(shù)學(xué)工具就是微積分的 鏈?zhǔn)角髮?dǎo)法則 。
BP算法的缺點(diǎn),首當(dāng)其沖就是局部極小值問題。
BP算法本質(zhì)上是梯度下降,而它所要優(yōu)化的目標(biāo)函數(shù)又非常復(fù)雜,這使得BP算法效率低下。
[1]、《BP算法的哲學(xué)思考》,成素梅、郝中華著
[2]、《機(jī)器學(xué)習(xí)》,周志華著
[3]、 Deep Learning論文筆記之(四)CNN卷積神經(jīng)網(wǎng)絡(luò)推導(dǎo)和實(shí)現(xiàn)
2016-05-13 第一次發(fā)布
2016-06-04 較大幅度修改,完善推導(dǎo)過程,修改文章名
2016-07-23 修改了公式推導(dǎo)中的一個(gè)錯(cuò)誤,修改了一個(gè)表述錯(cuò)誤
三、一文搞懂梯度下降&反向傳播
如果把神經(jīng)網(wǎng)絡(luò)模型比作一個(gè)黑箱,把模型參數(shù)比作黑箱上面一個(gè)個(gè)小旋鈕,那么根據(jù)通用近似理論(universal approximation theorem),只要黑箱上的旋鈕數(shù)量足夠多,而且每個(gè)旋鈕都被調(diào)節(jié)到合適的位置,那這個(gè)模型就可以實(shí)現(xiàn)近乎任意功能(可以逼近任意的數(shù)學(xué)模型)。
顯然,這些旋鈕(參數(shù))不是由人工調(diào)節(jié)的,所謂的機(jī)器學(xué)習(xí),就是通過程序來自動(dòng)調(diào)節(jié)這些參數(shù)。神經(jīng)網(wǎng)絡(luò)不僅參數(shù)眾多(少則十幾萬,多則上億),而且網(wǎng)絡(luò)是由線性層和非線性層交替疊加而成,上層參數(shù)的變化會(huì)對(duì)下層的輸出產(chǎn)生非線性的影響,因此,早期的神經(jīng)網(wǎng)絡(luò)流派一度無法往多層方向發(fā)展,因?yàn)樗麄冋也坏侥苡糜谌我舛鄬泳W(wǎng)絡(luò)的、簡潔的自動(dòng)調(diào)節(jié)參數(shù)的方法。
直到上世紀(jì)80年代,祖師爺辛頓發(fā)明了反向傳播算法,用輸出誤差的均方差(就是loss值)一層一層遞進(jìn)地反饋到各層神經(jīng)網(wǎng)絡(luò),用梯度下降法來調(diào)節(jié)每層網(wǎng)絡(luò)的參數(shù)。至此,神經(jīng)網(wǎng)絡(luò)才得以開始它的深度之旅。
本文用python自己動(dòng)手實(shí)現(xiàn)梯度下降和反向傳播算法。 請(qǐng)點(diǎn)擊這里 到Github上查看源碼。
梯度下降法是一種將輸出誤差反饋到神經(jīng)網(wǎng)絡(luò)并自動(dòng)調(diào)節(jié)參數(shù)的方法,它通過計(jì)算輸出誤差的loss值( J )對(duì)參數(shù) W 的導(dǎo)數(shù),并沿著導(dǎo)數(shù)的反方向來調(diào)節(jié) W ,經(jīng)過多次這樣的操作,就能將輸出誤差減小到最小值,即曲線的最低點(diǎn)。
雖然Tensorflow、Pytorch這些框架都實(shí)現(xiàn)了自動(dòng)求導(dǎo)的功能,但為了徹底理解參數(shù)調(diào)節(jié)的過程,還是有必要自己動(dòng)手實(shí)現(xiàn)梯度下降和反向傳播算法。我相信你和我一樣,已經(jīng)忘了之前學(xué)的微積分知識(shí),因此,到可汗學(xué)院復(fù)習(xí)下 Calculus
和 Multivariable Calculus 是個(gè)不錯(cuò)的方法,或是拜讀 這篇關(guān)于神經(jīng)網(wǎng)絡(luò)矩陣微積分的文章 。
Figure2是求導(dǎo)的基本公式,其中最重要的是 Chain Rule ,它通過引入中間變量,將“ y 對(duì) x 求導(dǎo)”的過程轉(zhuǎn)換為“ y 對(duì)中間變量 u 求導(dǎo),再乘以 u 對(duì) x 求導(dǎo)”,這樣就將一個(gè)復(fù)雜的函數(shù)鏈求導(dǎo)簡化為多個(gè)簡單函數(shù)求導(dǎo)。
如果你不想涉及這些求導(dǎo)的細(xì)節(jié),可以跳過具體的計(jì)算,領(lǐng)會(huì)其思想就好。
對(duì)于神經(jīng)網(wǎng)絡(luò)模型: Linear -> ReLu -> Linear -> MSE(Loss function) 來說,反向傳播就是根據(jù)鏈?zhǔn)椒▌t對(duì) 求導(dǎo),用輸出誤差的均方差(MSE)對(duì)模型的輸出求導(dǎo),并將導(dǎo)數(shù)傳回上一層神經(jīng)網(wǎng)絡(luò),用于它們來對(duì) w 、 b 和 x (上上層的輸出)求導(dǎo),再將 x 的導(dǎo)數(shù)傳回到它的上一層神經(jīng)網(wǎng)絡(luò),由此將輸出誤差的均方差通過遞進(jìn)的方式反饋到各神經(jīng)網(wǎng)絡(luò)層。
對(duì)于 求導(dǎo)的第一步是為這個(gè)函數(shù)鏈引入中間變量:
接著第二步是對(duì)各中間變量求導(dǎo),最后才是將這些導(dǎo)數(shù)乘起來。
首先,反向傳播的起點(diǎn)是對(duì)loss function求導(dǎo),即 。 :
mse_grad()之所以用unsqueeze(-1)給導(dǎo)數(shù)增加一個(gè)維度,是為了讓導(dǎo)數(shù)的shape和tensor shape保持一致。
linear層的反向傳播是對(duì) 求導(dǎo),它也是一個(gè)函數(shù)鏈,也要先對(duì)中間變量求導(dǎo)再將所有導(dǎo)數(shù)相乘:
這些中間變量的導(dǎo)數(shù)分別是:
對(duì)向量 求導(dǎo),指的是對(duì)向量所有的標(biāo)量求偏導(dǎo)( ),即: ,這個(gè)橫向量也稱為y的梯度。
這里 ,是一個(gè)向量,因此, 求導(dǎo),指的是y的所有標(biāo)量(y_1, y_2, ..., y_n)對(duì)向量x求偏導(dǎo),即:
。
這個(gè)矩陣稱為雅克比矩陣,它是個(gè)對(duì)角矩陣,因?yàn)? ,因此 。
同理, 。
因此,所有中間導(dǎo)數(shù)相乘的結(jié)果:
lin_grad() 中的inp.g、w.g和b.g分別是求 的導(dǎo)數(shù),以inp.g為例,它等于 ,且需要乘以前面各層的導(dǎo)數(shù),即 outp.g @ w.t() ,之所以要用點(diǎn)積運(yùn)算符(@)而不是標(biāo)量相乘,是為了讓它的導(dǎo)數(shù)shape和tensor shape保持一致。同理,w.g和b.g也是根據(jù)相同邏輯來計(jì)算的。
ReLu層的求導(dǎo)相對(duì)來說就簡單多了,當(dāng)輸入 <= 0時(shí),導(dǎo)數(shù)為0,當(dāng)輸入 > 0時(shí),導(dǎo)數(shù)為1。
求導(dǎo)運(yùn)算終于結(jié)束了,接下來就是驗(yàn)證我們的反向傳播是否正確。驗(yàn)證方法是將forward_backward()計(jì)算的導(dǎo)數(shù)和Pytorch自動(dòng)微分得到的導(dǎo)數(shù)相比較,如果它們相近,就認(rèn)為我們的反向傳播算法是正確的。
首先,將計(jì)算好的參數(shù)導(dǎo)數(shù)保存到w1g、b1g、w2g和b2g中,再用Pytorch的自動(dòng)微分來求w11、b11、w22和b22的導(dǎo)數(shù)。
最后,用np.allclose()來比較導(dǎo)數(shù)間的差異,如果有任何一個(gè)導(dǎo)數(shù)不相近,assert就會(huì)報(bào)錯(cuò)。結(jié)果證明,我們自己動(dòng)手實(shí)現(xiàn)的算法是正確的。
反向傳播是遵循鏈?zhǔn)椒▌t的,它將前向傳播的輸出作為輸入,輸入作為輸出,通過遞進(jìn)的方式將求導(dǎo)這個(gè)動(dòng)作從后向前傳遞回各層。神經(jīng)網(wǎng)絡(luò)參數(shù)的求導(dǎo)需要進(jìn)行矩陣微積分計(jì)算,根據(jù)這些導(dǎo)數(shù)的反方向來調(diào)節(jié)參數(shù),就可以讓模型的輸出誤差的優(yōu)化到最小值。
歡迎關(guān)注和點(diǎn)贊,你的鼓勵(lì)將是我創(chuàng)作的動(dòng)力
四、理解梯度下降和反向傳播
梯度下降就是一個(gè)求極值的方法,在深度學(xué)習(xí)里面用于最小化損失來訓(xùn)練權(quán)重和偏差。
先舉個(gè)簡單的例子,
比如,我們要求如上曲線函數(shù)的極小值,我們只要對(duì)其求導(dǎo)然后找導(dǎo)數(shù)為0的點(diǎn)就可以了。
但是在實(shí)際情況會(huì)比這個(gè)要復(fù)雜的多,因?yàn)槲覀儠?huì)有更多的變量,特別是對(duì)于神經(jīng)網(wǎng)絡(luò)而言,它可能以復(fù)雜的方式依賴于幾十億的權(quán)重和偏差,因此依靠微分來求極值顯然是行不通的。
但是你想呀,我們有計(jì)算機(jī)呀,計(jì)算機(jī)最擅長什么?當(dāng)然是硬算呀...
想必玩過猜數(shù)字游戲吧,你先隨便猜一個(gè),然后告知你大了還是小了,如果大了你就往小了猜,小了就往大了猜,如此循環(huán)往復(fù)就猜到對(duì)應(yīng)的數(shù)字了。
梯度下降的過程也是有點(diǎn)類似的,就是你先隨便選一個(gè)點(diǎn),然后往減小的方向一點(diǎn)點(diǎn)移動(dòng),移動(dòng)著移動(dòng)著,你就到了那塊最小的值的區(qū)域了。
那么,這個(gè)方向應(yīng)該怎么確定呢?暫時(shí)先不去想它,假設(shè)我們就給我們的變量 隨意移動(dòng)了很小的一段 ,那么函數(shù)值 會(huì)發(fā)生多少變化呢?微積分告訴我們會(huì)這么改變:
要讓 的值減小,就意味著我們要讓 為負(fù)。
在此之前,我們先把上面的偏導(dǎo)擴(kuò)展到多元變量,即不止有一個(gè)變量 ,而是有 ,我們將所有變量的偏導(dǎo)數(shù)組合在一起構(gòu)成一個(gè)向量,將其稱為梯度向量,即
把所有發(fā)生的變化 也寫到一個(gè)向量里:
我們可以把 的表達(dá)式寫成:
觀察上面的公式,容易想到的是,我們只要選擇
就可以保證 小于等于0了,其中 是一個(gè)小的正數(shù)(我們稱之為學(xué)習(xí)速率或者是步長)。然后,我們就知道該如何移動(dòng)這個(gè)點(diǎn)了:
然后讓計(jì)算機(jī)使用這個(gè)規(guī)則,一遍一遍的迭代,就能讓損失函數(shù)的值 達(dá)到我們希望的極小值。
總而言之,梯度下降算法的工作方式是反復(fù)計(jì)算梯度 ,然后向相反方向移動(dòng)。
那么,我們?nèi)绾伟阉鼞?yīng)用到神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)中?顯而易見的,就是利用梯度下降來找到相應(yīng)的權(quán)重 和偏差 ,讓損失函數(shù)的值盡可能的小。套用上面的公式,我們只要隨機(jī)取一個(gè) 和 ,利用更新的規(guī)則,就有了:
在來想一下我們網(wǎng)絡(luò)損失函數(shù)的定義,當(dāng)使用二次損失時(shí), ,也就是說,神經(jīng)網(wǎng)絡(luò)中的損失,是所有訓(xùn)練樣本損失的平均。但是,當(dāng)數(shù)據(jù)集很大的時(shí)候,這會(huì)花費(fèi)很長很長的時(shí)間,因此網(wǎng)絡(luò)的學(xué)習(xí)速度會(huì)非常非常慢。于是就有了一種叫做隨機(jī)梯度下降的思想來加速學(xué)習(xí)。
這個(gè)想法其實(shí)很簡單,就是隨機(jī)選取一個(gè)小的批次,然后只計(jì)算這個(gè)批次的平均損失,這樣只要每個(gè)批次的平均損失都最小的話,那整體也就最小了。特別的,當(dāng)這個(gè)批次只去一個(gè)樣本的時(shí)候,神經(jīng)網(wǎng)絡(luò)一次只能從一個(gè)訓(xùn)練輸入中學(xué)習(xí),這種行為被稱為在線學(xué)習(xí)。
okay,現(xiàn)在我們已經(jīng)知道用梯度下降來讓網(wǎng)絡(luò)學(xué)習(xí)權(quán)重和偏差了,但是還有一個(gè)問題困擾著我們,就是你這個(gè)方法說起來簡單,可是...可是這個(gè)梯度要怎么算呀?
然后一種快速計(jì)算梯度的算法,叫做 反向傳播算法 就來了。
反向傳播算法的核心在于如何通過最終的損失 計(jì)算網(wǎng)絡(luò)中任意位置的權(quán)值 (或者偏差 )的偏導(dǎo) 。
很明顯,其實(shí)最后一層的偏導(dǎo)是很好計(jì)算的,因?yàn)閾p失只要把樣本 對(duì)應(yīng)的標(biāo)簽 和輸出激活 ,帶到損失函數(shù)里就得到了,問題在于怎么計(jì)算前面層的損失。顧名思義,反向傳播算法的精髓就是搞出了一種方法,可以把誤差從后往前反向傳播,這樣就可以輕松的計(jì)算前面層權(quán)值的偏導(dǎo)了。
在開始正式講解之前,我們先來定義幾個(gè)符號(hào):
根據(jù)上面的符號(hào)表達(dá),我們可以很輕松的寫出正向傳播的遞推公式,就上一層的的輸出激活作為下一層的輸入,然后經(jīng)過線性運(yùn)算再輸出 激活,這里使用向量化的形式:
為了計(jì)算 和 ,我們引入一個(gè)中間變量 ,稱其為第 層的第 個(gè)神經(jīng)元的誤差:
按照慣例,我們用 來代表第 層的誤差向量。
根據(jù)微積分中求導(dǎo)的鏈?zhǔn)椒▌t,有
并且可以得到一個(gè)遞推公式
寫成矩陣的形式,就是
這樣我們就可以將誤差從后往前傳遞了。
那么這個(gè)誤差和我們的偏導(dǎo) 又有什么聯(lián)系呢?還是根據(jù)鏈?zhǔn)椒▌t:
到此,整個(gè)反向傳播的過程就連起來了。求偏差的偏導(dǎo)使用同樣的方法即可。
以上就是關(guān)于反向傳播算法相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
神經(jīng)網(wǎng)絡(luò)誤差反向傳播(神經(jīng)網(wǎng)絡(luò)誤差反向傳播算法)
nginx反向代理內(nèi)網(wǎng)訪問(nginx反向代理內(nèi)網(wǎng)訪問是什么)
上虞景點(diǎn)排行榜(上虞景點(diǎn)排行榜前十名)
杭州大衣批發(fā)市場(chǎng)(杭州大衣批發(fā)市場(chǎng)有哪些)