BP算法是从天上掉下来的吗?
第二個(gè)標(biāo)題:一般而特殊的前饋神經(jīng)網(wǎng)絡(luò)
前饋神經(jīng)網(wǎng)絡(luò)
?在文章《邏輯回歸到神經(jīng)網(wǎng)絡(luò)》(以下簡(jiǎn)寫《LR到NN》)中,小夕為大家描述了一個(gè)從邏輯回歸延伸到神經(jīng)網(wǎng)絡(luò)的過(guò)程。在《一般化機(jī)器學(xué)習(xí)與神經(jīng)網(wǎng)絡(luò)》中,小夕闡述了神經(jīng)網(wǎng)絡(luò)的一般性。這一篇會(huì)完全進(jìn)入神經(jīng)網(wǎng)絡(luò)的狀態(tài),闡述神經(jīng)網(wǎng)絡(luò)的特殊性。
?
其實(shí)在《LR到NN》中的這張簡(jiǎn)單的圖,就是本文要講的前饋神經(jīng)網(wǎng)絡(luò)(feed-forward neural network)。
可以看到,這種簡(jiǎn)單粗暴的連法,恰恰就是神經(jīng)網(wǎng)絡(luò)最經(jīng)典的模型。即隱含層的每個(gè)單元(神經(jīng)元)均只接受前一層(對(duì)于只有一個(gè)隱含層的前饋網(wǎng)絡(luò),前一層即輸入層)的輸出作為輸入,并輸出結(jié)果到后一層(對(duì)于只有一個(gè)隱含層的前饋網(wǎng)絡(luò),后一層即輸出層)。將這種神經(jīng)網(wǎng)絡(luò)看成數(shù)據(jù)結(jié)構(gòu)中的“圖”的話,那就是一個(gè)“有向無(wú)環(huán)圖”(即前饋網(wǎng)絡(luò)中是不存在反饋的)。
?
這里的邊,即單元與單元之間連接的強(qiáng)度,也即權(quán)重。設(shè)想一下,當(dāng)兩個(gè)單元之間的權(quán)重為0時(shí),一個(gè)單元的輸出就無(wú)法再通過(guò)這條邊傳遞給另一個(gè)單元了,即這兩個(gè)單元之間斷開連接了(不存在這條邊了),因此神經(jīng)網(wǎng)絡(luò)模型中的模型參數(shù)不僅僅是個(gè)數(shù)字了,由于這張基于生物學(xué)中的神經(jīng)系統(tǒng)的模型可視化圖的存在,神經(jīng)網(wǎng)絡(luò)模型中的參數(shù)還代表著兩個(gè)神經(jīng)元之間的連接強(qiáng)度。
?
在《一般化機(jī)器學(xué)習(xí)與神經(jīng)網(wǎng)絡(luò)》中,小夕講過(guò)了,所謂的前向算法,就是計(jì)算了一下模型的假設(shè)函數(shù)而已,只不過(guò)計(jì)算的過(guò)程可視化出來(lái)后就是一個(gè)沿著神經(jīng)網(wǎng)絡(luò)“向前推進(jìn)”的樣子,因此起了個(gè)名字而已。這里就不再贅述這個(gè)俗俗的假算法啦。
?
根據(jù)機(jī)器學(xué)習(xí)框架,假設(shè)函數(shù)有了,我們還需要考慮什么呢?當(dāng)然是如何得到這個(gè)假設(shè)函數(shù)啦~也就是如何訓(xùn)練神經(jīng)網(wǎng)絡(luò)這個(gè)一般而特殊的機(jī)器學(xué)習(xí)模型(即學(xué)習(xí)模型參數(shù))。
石器時(shí)代
?假設(shè)你是一個(gè)完全不懂?dāng)?shù)學(xué)的生物學(xué)家(雖然學(xué)生物的數(shù)學(xué)也很厲害的,吧),你覺(jué)得從生物學(xué)的角度來(lái)看(將模型參數(shù)看作神經(jīng)元之間的連接強(qiáng)度),這個(gè)神經(jīng)網(wǎng)絡(luò)訓(xùn)練好之后應(yīng)該是什么樣子的呢?
?
回想一下高中生物,如果兩個(gè)神經(jīng)元緊緊相連,那么一個(gè)神經(jīng)元的興奮必然導(dǎo)致與之相連的神經(jīng)元的興奮。如果經(jīng)過(guò)無(wú)數(shù)次實(shí)驗(yàn),我們發(fā)現(xiàn)對(duì)于神經(jīng)元A和神經(jīng)元B,只要A興奮,那么B一定興奮,那么就說(shuō)明A與B之間肯定連接非常緊密(就像一條繩子的螞蚱,一個(gè)跳起來(lái)肯定把另一個(gè)帶起來(lái)),也就是說(shuō)A到B的連接強(qiáng)度非常大!也就是說(shuō),A到B這個(gè)模型參數(shù)的值肯定很大。
?
將這個(gè)生物學(xué)思想往數(shù)學(xué)上靠一下,那就是“如果神經(jīng)元A的激活帶來(lái)B的激活,就代表A與B具有相關(guān)性,因此A與B之間的連接權(quán)重應(yīng)該被加強(qiáng),即應(yīng)增大模型參數(shù)(下標(biāo)BA代表從A出發(fā),到達(dá)B的有向邊)”。
?
這個(gè)思想叫什么呢?叫“Hebb規(guī)則”,這個(gè)思想是神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)算法的最本質(zhì),也是最原始的思想。
?
那么如何去實(shí)現(xiàn)這個(gè)思想呢?
青銅時(shí)代
?設(shè)想一下,我們的網(wǎng)絡(luò)到達(dá)了這么一種狀態(tài):
?
顯然,模型犯錯(cuò)了!輸出單元(輸出層在這里只有一個(gè)單元)應(yīng)該是1,結(jié)果預(yù)測(cè)的是0!也就是應(yīng)該興奮,實(shí)際在睡覺(jué)!而根據(jù)Hebb規(guī)則,我們應(yīng)該讓輸出單元加強(qiáng)與那些興奮的神經(jīng)元的連接,也就是增大與“隱含層輸出為1(專業(yè)說(shuō)法叫被激活)的神經(jīng)元”的連接!減弱與“隱含層輸出為0(未激活)的神經(jīng)元”的連接!
?
再想一下,“隱單元未激活/輸出為0”代表著什么?
?
還記得《邏輯回歸到神經(jīng)網(wǎng)絡(luò)》中放大的這個(gè)隱單元的圖嗎?
?
?
隱單元的核心就是激活函數(shù),比如sigmoid、tanh等。如下sigmoid:
因此隱單元輸出為0時(shí),也就是未激活時(shí),就意味著隱單元的輸入為負(fù)值!
?
所以,為了迎合Hebb規(guī)則,應(yīng)該讓未激活的神經(jīng)元減小權(quán)重,激活的神經(jīng)元增加權(quán)重,那么我們可以直接讓權(quán)重加上隱單元的輸入啊:
?
即對(duì)于全部的隱單元:w=w+a。(注:a為隱單元的輸入,未激活的神經(jīng)元的a為負(fù),激活的為正)
?
而對(duì)于如下這種情況,也就是應(yīng)該輸出0,實(shí)際輸出了1的情況:
?
通過(guò)跟前面一樣的推理我們發(fā)現(xiàn),只要讓w的更新方式與前面相反,即:
?
對(duì)于全部的隱單元:w=w-a。(注:a為隱單元的輸入,未激活的神經(jīng)元的a為負(fù),激活的為正)
?
那么有沒(méi)有辦法將上面兩種情況合起來(lái)表示呢?
機(jī)智的你應(yīng)該想到了,那就是:
?
w=w+(真實(shí)值-預(yù)測(cè)值)*a
?
對(duì)啊,用這條通用的規(guī)則,就可以反復(fù)的更新隱藏層到輸出層的權(quán)重了~這個(gè)規(guī)則叫什么呢?這就是1986年認(rèn)知心理學(xué)家Rumellhart等人提出的δ學(xué)習(xí)規(guī)則,也叫廣義Hebb規(guī)則,這是對(duì)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法的Hebb思想的直接實(shí)現(xiàn)!
?
等等,有沒(méi)有覺(jué)得似曾相識(shí)呢?趕緊翻開書,看看BP算法的權(quán)重更新公式!有沒(méi)有發(fā)現(xiàn)BP中的權(quán)重更新公式與這個(gè)規(guī)則所表達(dá)的意思驚人的相似!
?
相似就對(duì)了~
鐵器時(shí)代
想一想,在廣義Hebb規(guī)則中,我們做了一些簡(jiǎn)化:
?
首先,權(quán)重更新的方向很明確,但是更新的步長(zhǎng)我們是直接用了隱單元的輸入a,而沒(méi)有證明這個(gè)a是最合理的步長(zhǎng)。其次,我們這里直接用真實(shí)值減去預(yù)測(cè)值,也是很啟發(fā)式的做法。
?
那么顯然這個(gè)廣義Hebb規(guī)則在數(shù)學(xué)上極有可能是非最優(yōu)的,畢竟這是一個(gè)啟發(fā)式的(即拍腦袋的)算法。那么如何得到最優(yōu)的做法呢?那就是從這個(gè)規(guī)則的目的著手去提出更上層的理論!
廣義Hebb規(guī)則的目的是什么呢??
這個(gè)規(guī)則的直接目的是讓最終的輸出逼近真實(shí)輸出,也就是減小模型輸出與真實(shí)輸出之間的誤差。具體做法是讓每個(gè)隱單元的權(quán)重個(gè)性化修改,來(lái)向著使誤差減小的方向移動(dòng)。
?
等等!再重復(fù)一遍,具體做法是讓每個(gè)隱單元的權(quán)重個(gè)性化修改,來(lái)向著使誤差減小的方向移動(dòng)。
?
再再重復(fù)一遍!具體做法是讓每個(gè)隱單元的權(quán)重個(gè)性化修改,來(lái)向著使誤差減小的方向移動(dòng)!
?
所以我們可以怎樣做?如果有一個(gè)函數(shù)可以直接描述這個(gè)誤差!(這不就是損失函數(shù)做的事兒?jiǎn)?#xff01;)那么!以權(quán)重為誤差的自變量,使誤差減小的方向不就是權(quán)重的負(fù)梯度方向嗎。那讓權(quán)重沿著這個(gè)方向移動(dòng)不久好了嗎?(這不就是梯度下降法嗎!)
?
如圖,自變量(x軸)是權(quán)重,因變量(y軸)是誤差!顯然使誤差減小的方向就是權(quán)重的負(fù)梯度方向啊~
?
所以!求出此時(shí)權(quán)重的負(fù)梯度(即此時(shí)每個(gè)隱單元的權(quán)重的導(dǎo)數(shù)!)!然后讓權(quán)重向這個(gè)方向移動(dòng)一定的步長(zhǎng)!反復(fù)這個(gè)移動(dòng)的過(guò)程!直到誤差最小,即訓(xùn)練完成!得到最優(yōu)的權(quán)重!
?
所以說(shuō)這是什么?這就是梯度下降法呀~同時(shí),這還是BP算法對(duì)隱含層與輸出層連接權(quán)重的更新方式啊!
?
那么如何更新輸入層到隱含層的權(quán)重呢?
一樣的呀,數(shù)學(xué)思想都這么清晰了~誤差依然是誤差,只需要將自變量換成輸入層到隱含層的權(quán)重,不就可以啦~其他的完全照舊啊。
?
只不過(guò),損失函數(shù)是“間接包含”輸入層到隱含層的權(quán)重的,因此在求此時(shí)的負(fù)梯度時(shí),要進(jìn)行鏈?zhǔn)角髮?dǎo)~也就是下面這個(gè)爛大街的推理過(guò)程:
?
這個(gè)推理過(guò)程摘自http://blog.csdn.net/lu597203933/article/details/46575803,有興趣的可以去看看,反正哪里都能找到這個(gè)推導(dǎo)過(guò)程~
?
數(shù)學(xué)好的一眼就看懂了,不太好的就隨便找個(gè)講BP算法的書或者帖子啦,這是真正的爛大街推理過(guò)程。。。因此,各層權(quán)重的負(fù)梯度利用上面的鏈?zhǔn)角髮?dǎo)法則就很輕松的求出來(lái)了,然后w=w-α*負(fù)梯度,就可以啦~其中,α是步長(zhǎng)~
?
看,源于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的最na?ve的Hebb思想,為了實(shí)現(xiàn)這個(gè)思想而提出了δ算法,用數(shù)學(xué)去描述δ算法的本質(zhì)目標(biāo),得出通過(guò)引入損失函數(shù)并(鏈?zhǔn)角髮?dǎo))求解負(fù)梯度來(lái)更新權(quán)重的過(guò)程,即誤差反向傳播算法(BackPropagation,簡(jiǎn)稱BP算法)。
╮(╯▽╰)╭
只不過(guò)在神經(jīng)網(wǎng)絡(luò)中可視化一下,看起來(lái)就像一個(gè)人們定義的誤差從模型輸出層向輸入層傳播而已啦,然后起了個(gè)形象的名字叫所謂的誤差反向傳播算法。
?
不過(guò),人們抽象出來(lái)的這個(gè)前向與反向算法的概念還是有更多原因的,一是可以幫助人們理解,使其可以從生物學(xué)模型上得到解釋,進(jìn)而以這種思想變形出其他形式的前向與反向傳播算法來(lái)描述或訓(xùn)練更復(fù)雜的神經(jīng)網(wǎng)絡(luò);另一方面也是給我們程序猿(喵)們提供了一種簡(jiǎn)潔無(wú)腦的編程模型,使得哪怕不懂鏈?zhǔn)角髮?dǎo)等BP算法原理的程序猿也能輕松的寫出來(lái)這個(gè)數(shù)學(xué)上不算太簡(jiǎn)單的算法。
?
╮(╯▽╰)╭哎,要是小夕早出生了幾十年,說(shuō)不定提出BP算法的就是小夕了(捂臉光速逃\(//?//)\
總結(jié)
以上是生活随笔為你收集整理的BP算法是从天上掉下来的吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Boot开发Web应用
- 下一篇: 镣铐之舞:美团安全工程师Black Ha