日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

史上最清楚的BP算法详解

發(fā)布時間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 史上最清楚的BP算法详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前饋神經(jīng)網(wǎng)絡(luò)

在文章《邏輯回歸到神經(jīng)網(wǎng)絡(luò)》(以下簡寫《LR到NN》)中,小夕為大家描述了一個從邏輯回歸延伸到神經(jīng)網(wǎng)絡(luò)的過程。在《一般化機器學(xué)習(xí)與神經(jīng)網(wǎng)絡(luò)》中,小夕闡述了神經(jīng)網(wǎng)絡(luò)的一般性。這一篇會完全進入神經(jīng)網(wǎng)絡(luò)的狀態(tài),闡述神經(jīng)網(wǎng)絡(luò)的特殊性。

其實在《LR到NN》中的這張簡單的圖,就是本文要講的前饋神經(jīng)網(wǎng)絡(luò)(feed-forward neural network)。

?

?

可以看到,這種簡單粗暴的連法,恰恰就是神經(jīng)網(wǎng)絡(luò)最經(jīng)典的模型。即隱含層的每個單元(神經(jīng)元)均只接受前一層(對于只有一個隱含層的前饋網(wǎng)絡(luò),前一層即輸入層)的輸出作為輸入,并輸出結(jié)果到后一層(對于只有一個隱含層的前饋網(wǎng)絡(luò),后一層即輸出層)。將這種神經(jīng)網(wǎng)絡(luò)看成數(shù)據(jù)結(jié)構(gòu)中的“圖”的話,那就是一個“有向無環(huán)圖”(即前饋網(wǎng)絡(luò)中是不存在反饋的)。

這里的邊,即單元與單元之間連接的強度,也即權(quán)重。設(shè)想一下,當(dāng)兩個單元之間的權(quán)重為0時,一個單元的輸出就無法再通過這條邊傳遞給另一個單元了,即這兩個單元之間斷開連接了(不存在這條邊了),因此神經(jīng)網(wǎng)絡(luò)模型中的模型參數(shù)不僅僅是個數(shù)字了,由于這張基于生物學(xué)中的神經(jīng)系統(tǒng)的模型可視化圖的存在,神經(jīng)網(wǎng)絡(luò)模型中的參數(shù)還代表著兩個神經(jīng)元之間的連接強度。

在《一般化機器學(xué)習(xí)與神經(jīng)網(wǎng)絡(luò)》中,小夕講過了,所謂的前向算法,就是計算了一下模型的假設(shè)函數(shù)而已,只不過計算的過程可視化出來后就是一個沿著神經(jīng)網(wǎng)絡(luò)“向前推進”的樣子,因此起了個名字而已。這里就不再贅述這個俗俗的假算法啦。

根據(jù)機器學(xué)習(xí)框架,假設(shè)函數(shù)有了,我們還需要考慮什么呢?當(dāng)然是如何得到這個假設(shè)函數(shù)啦~也就是如何訓(xùn)練神經(jīng)網(wǎng)絡(luò)這個一般而特殊的機器學(xué)習(xí)模型(即學(xué)習(xí)模型參數(shù))。

石器時代

假設(shè)你是一個完全不懂?dāng)?shù)學(xué)的生物學(xué)家(雖然學(xué)生物的數(shù)學(xué)也很厲害的,吧),你覺得從生物學(xué)的角度來看(將模型參數(shù)看作神經(jīng)元之間的連接強度),這個神經(jīng)網(wǎng)絡(luò)訓(xùn)練好之后應(yīng)該是什么樣子的呢?

回想一下高中生物,如果兩個神經(jīng)元緊緊相連,那么一個神經(jīng)元的興奮必然導(dǎo)致與之相連的神經(jīng)元的興奮。如果經(jīng)過無數(shù)次實驗,我們發(fā)現(xiàn)對于神經(jīng)元A和神經(jīng)元B,只要A興奮,那么B一定興奮,那么就說明A與B之間肯定連接非常緊密(就像一條繩子的螞蚱,一個跳起來肯定把另一個帶起來),也就是說A到B的連接強度非常大!也就是說,A到B這個模型參數(shù)的值肯定很大。

將這個生物學(xué)思想往數(shù)學(xué)上靠一下,那就是“如果神經(jīng)元A的激活帶來B的激活,就代表A與B具有相關(guān)性,因此A與B之間的連接權(quán)重應(yīng)該被加強,即應(yīng)增大模型參數(shù)(下標BA代表從A出發(fā),到達B的有向邊)”。

這個思想叫什么呢?叫“Hebb規(guī)則”,這個思想是神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)算法的最本質(zhì),也是最原始的思想。

那么如何去實現(xiàn)這個思想呢?

青銅時代

設(shè)想一下,我們的網(wǎng)絡(luò)到達了這么一種狀態(tài):

?

顯然,模型犯錯了!輸出單元(輸出層在這里只有一個單元)應(yīng)該是1,結(jié)果預(yù)測的是0!也就是應(yīng)該興奮,實際在睡覺!而根據(jù)Hebb規(guī)則,我們應(yīng)該讓輸出單元加強與那些興奮的神經(jīng)元的連接,也就是增大與“隱含層輸出為1(專業(yè)說法叫被激活)的神經(jīng)元”的連接!減弱與“隱含層輸出為0(未激活)的神經(jīng)元”的連接!

再想一下,“隱單元未激活/輸出為0”代表著什么?

還記得《邏輯回歸到神經(jīng)網(wǎng)絡(luò)》中放大的這個隱單元的圖嗎?

?

隱單元的核心就是激活函數(shù),比如sigmoid、tanh等。如下sigmoid:

?

因此隱單元輸出為0時,也就是未激活時,就意味著隱單元的輸入為負值!

所以,為了迎合Hebb規(guī)則,應(yīng)該讓未激活的神經(jīng)元減小權(quán)重,激活的神經(jīng)元增加權(quán)重,那么我們可以直接讓權(quán)重加上隱單元的輸入啊:

即對于全部的隱單元:w=w+a。(注:a為隱單元的輸入,未激活的神經(jīng)元的a為負,激活的為正)

而對于如下這種情況,也就是應(yīng)該輸出0,實際輸出了1的情況:

?

?

通過跟前面一樣的推理我們發(fā)現(xiàn),只要讓w的更新方式與前面相反,即:

對于全部的隱單元:w=w-a。(注:a為隱單元的輸入,未激活的神經(jīng)元的a為負,激活的為正)

那么有沒有辦法將上面兩種情況合起來表示呢?

機智的你應(yīng)該想到了,那就是:

w=w+(真實值-預(yù)測值)*a

對啊,用這條通用的規(guī)則,就可以反復(fù)的更新隱藏層到輸出層的權(quán)重了~這個規(guī)則叫什么呢?這就是1986年認知心理學(xué)家Rumellhart等人提出的δ學(xué)習(xí)規(guī)則,也叫廣義Hebb規(guī)則,這是對神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法的Hebb思想的直接實現(xiàn)!

等等,有沒有覺得似曾相識呢?趕緊翻開書,看看BP算法的權(quán)重更新公式!有沒有發(fā)現(xiàn)BP中的權(quán)重更新公式與這個規(guī)則所表達的意思驚人的相似!

相似就對了~

鐵器時代

想一想,在廣義Hebb規(guī)則中,我們做了一些簡化:

首先,權(quán)重更新的方向很明確,但是更新的步長我們是直接用了隱單元的輸入a,而沒有證明這個a是最合理的步長。其次,我們這里直接用真實值減去預(yù)測值,也是很啟發(fā)式的做法。

那么顯然這個廣義Hebb規(guī)則在數(shù)學(xué)上極有可能是非最優(yōu)的,畢竟這是一個啟發(fā)式的(即拍腦袋的)算法。那么如何得到最優(yōu)的做法呢?那就是從這個規(guī)則的目的著手去提出更上層的理論!

廣義Hebb規(guī)則的目的是什么呢?

這個規(guī)則的直接目的是讓最終的輸出逼近真實輸出,也就是減小模型輸出與真實輸出之間的誤差。具體做法是讓每個隱單元的權(quán)重個性化修改,來向著使誤差減小的方向移動。

等等!再重復(fù)一遍,具體做法是讓每個隱單元的權(quán)重個性化修改,來向著使誤差減小的方向移動。

再再重復(fù)一遍!具體做法是讓每個隱單元的權(quán)重個性化修改,來向著使誤差減小的方向移動!

所以我們可以怎樣做?如果有一個函數(shù)可以直接描述這個誤差!(這不就是損失函數(shù)做的事兒嗎!)那么!以權(quán)重為誤差的自變量,使誤差減小的方向不就是權(quán)重的負梯度方向嗎。那讓權(quán)重沿著這個方向移動不久好了嗎?(這不就是梯度下降法嗎!)

?

如圖,自變量(x軸)是權(quán)重,因變量(y軸)是誤差!顯然使誤差減小的方向就是權(quán)重的負梯度方向啊~

所以!求出此時權(quán)重的負梯度(即此時每個隱單元的權(quán)重的導(dǎo)數(shù)!)!然后讓權(quán)重向這個方向移動一定的步長!反復(fù)這個移動的過程!直到誤差最小,即訓(xùn)練完成!得到最優(yōu)的權(quán)重!

所以說這是什么?這就是梯度下降法呀~同時,這還是BP算法對隱含層與輸出層連接權(quán)重的更新方式啊!

那么如何更新輸入層到隱含層的權(quán)重呢?

一樣的呀,數(shù)學(xué)思想都這么清晰了~誤差依然是誤差,只需要將自變量換成輸入層到隱含層的權(quán)重,不就可以啦~其他的完全照舊啊。

只不過,損失函數(shù)是“間接包含”輸入層到隱含層的權(quán)重的,因此在求此時的負梯度時,要進行鏈式求導(dǎo)~也就是下面這個爛大街的推理過程:

?

?

?

這個推理過程摘自http://blog.csdn.net/lu597203933/article/details/46575803,有興趣的可以去看看,反正哪里都能找到這個推導(dǎo)過程~

數(shù)學(xué)好的一眼就看懂了,不太好的就隨便找個講BP算法的書或者帖子啦,這是真正的爛大街推理過程。。。因此,各層權(quán)重的負梯度利用上面的鏈式求導(dǎo)法則就很輕松的求出來了,然后w=w-α*負梯度,就可以啦~其中,α是步長~

看,源于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的最na?ve的Hebb思想,為了實現(xiàn)這個思想而提出了δ算法,用數(shù)學(xué)去描述δ算法的本質(zhì)目標,得出通過引入損失函數(shù)并(鏈式求導(dǎo))求解負梯度來更新權(quán)重的過程,即誤差反向傳播算法(BackPropagation,簡稱BP算法)。

╮(╯▽╰)╭

只不過在神經(jīng)網(wǎng)絡(luò)中可視化一下,看起來就像一個人們定義的誤差從模型輸出層向輸入層傳播而已啦,然后起了個形象的名字叫所謂的誤差反向傳播算法。

不過,人們抽象出來的這個前向與反向算法的概念還是有更多原因的,一是可以幫助人們理解,使其可以從生物學(xué)模型上得到解釋,進而以這種思想變形出其他形式的前向與反向傳播算法來描述或訓(xùn)練更復(fù)雜的神經(jīng)網(wǎng)絡(luò);另一方面也是給我們程序猿(喵)們提供了一種簡潔無腦的編程模型,使得哪怕不懂鏈式求導(dǎo)等BP算法原理的程序猿也能輕松的寫出來這個數(shù)學(xué)上不算太簡單的算法。

總結(jié)

以上是生活随笔為你收集整理的史上最清楚的BP算法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。