魚書(深度學(xué)習(xí)入門):第五章 誤差反向傳播法
????上一章介紹了神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí),并通過數(shù)值微分計(jì)算了神經(jīng)網(wǎng)絡(luò)的權(quán)重參數(shù)的梯度。數(shù)值微分雖然簡單,也容易實(shí)現(xiàn),但缺點(diǎn)是計(jì)算上比較費(fèi)時(shí)間。本章將介紹一個(gè)能夠高效計(jì)算權(quán)重參數(shù)的梯度的方法——誤差反向傳播法。本章將主要使用計(jì)算圖理解誤差反向傳播法。
一、計(jì)算圖
????計(jì)算圖將計(jì)算過程用圖形表示出來。這里說的圖形是數(shù)據(jù)結(jié)構(gòu)圖,通 過多個(gè)節(jié)點(diǎn)和邊表示(連接節(jié)點(diǎn)的直線稱為“邊”)。
????1.用計(jì)算圖求解
????下面介紹通過計(jì)算圖求解問題的簡單例子。計(jì)算圖通過節(jié)點(diǎn)和箭頭表示計(jì)算過程。
問題1:太郎在超市買了2個(gè)100日元一個(gè)的蘋果,消費(fèi)稅是10%,請(qǐng)計(jì)算支付金額。

問題2:太郎在超市買了2個(gè)蘋果、3個(gè)橘子。其中,蘋果每個(gè)100日元,橘子每個(gè)150日元。消費(fèi)稅是10%,請(qǐng)計(jì)算支付金額。

????綜上,用計(jì)算圖解題的情況下,需要按如下流程進(jìn)行。
????1.構(gòu)建計(jì)算圖。
????2.在計(jì)算圖上,從左向右進(jìn)行計(jì)算。
????這里的第2歩“從左向右進(jìn)行計(jì)算”是一種正方向上的傳播,簡稱為正向傳播(forward propagation)。正向傳播是從計(jì)算圖出發(fā)點(diǎn)到結(jié)束點(diǎn)的傳播。既然有正向傳播這個(gè)名稱,當(dāng)然也可以考慮反向(從圖上看的話,就是從右向左)的傳播。實(shí)際上,這種傳播稱為反向傳播(backward propagation)。反向傳播將在接下來的導(dǎo)數(shù)計(jì)算中發(fā)揮重要作用。
????2.局部計(jì)算
????計(jì)算圖的特征是可以通過傳遞“局部計(jì)算”獲得最終結(jié)果?!熬植俊边@個(gè)詞的意思是“與自己相關(guān)的某個(gè)小范圍”。局部計(jì)算是指,無論全局發(fā)生了什么,都能只根據(jù)與自己相關(guān)的信息輸出接下來的結(jié)果。如下例:

????計(jì)算圖可以集中精力于局部計(jì)算。無論全局的計(jì)算有多么復(fù)雜, 各個(gè)步驟所要做的就是對(duì)象節(jié)點(diǎn)的局部計(jì)算。雖然局部計(jì)算非常簡單,但是通過傳遞它的計(jì)算結(jié)果,可以獲得全局的復(fù)雜計(jì)算的結(jié)果。
????3.為何用計(jì)算圖解題
????計(jì)算圖有哪些優(yōu)點(diǎn)?一個(gè)是前面所提到的局部計(jì)算。無論全局是多么復(fù)雜的計(jì)算,都可以通過局部計(jì)算使各個(gè)節(jié)點(diǎn)致力于簡單的計(jì)算,從而簡化問題。另一個(gè)優(yōu)點(diǎn)是,利用計(jì)算圖可以將中間的計(jì)算結(jié)果全部保存起來。實(shí)際上,使用計(jì)算圖最大的原因是,可以通過反向傳播高效計(jì)算導(dǎo)數(shù)。
????在介紹計(jì)算圖的反向傳播之前,我們先介紹一個(gè)例子。對(duì)于問題1,假設(shè)我們想知道蘋果價(jià)格的上漲會(huì)在多大程度上影響最終的支付金額,即求“支付金額關(guān)于蘋果的價(jià)格的導(dǎo)數(shù)” ,這個(gè)導(dǎo)數(shù)的值表示當(dāng)蘋果的價(jià)格稍微上漲時(shí),支付金額會(huì)增加多少。這個(gè)導(dǎo)數(shù)的值可以通過計(jì)算圖的反向傳播求出來。先來看一下結(jié)果,如下圖所示:

????如圖所示,反向傳播使用與正方向相反的箭頭(粗線)表示。反向傳播傳遞“局部導(dǎo)數(shù)”,將導(dǎo)數(shù)的值寫在箭頭的下方。在這個(gè)例子中,反向傳播從右向左傳遞導(dǎo)數(shù)的值(1 → 1.1 → 2.2)。從這個(gè)結(jié)果中可知,“支付金額關(guān)于蘋果的價(jià)格的導(dǎo)數(shù)”的值是2.2。
????這里只求了關(guān)于蘋果的價(jià)格的導(dǎo)數(shù),不過“支付金額關(guān)于消費(fèi)稅的導(dǎo)數(shù)”“支付金額關(guān)于蘋果的個(gè)數(shù)的導(dǎo)數(shù)”等也都可以用同樣的方式算出來。并且,計(jì)算中途求得的導(dǎo)數(shù)的結(jié)果(中間傳遞的導(dǎo)數(shù))可以被共享,從而可以 高效地計(jì)算多個(gè)導(dǎo)數(shù)。綜上,計(jì)算圖的優(yōu)點(diǎn)是,可以通過正向傳播和反向傳播高效地計(jì)算各個(gè)變量的導(dǎo)數(shù)值。
二、鏈?zhǔn)椒▌t
????反向傳播將局部導(dǎo)數(shù)向正方向的反方向(從右到左)傳遞,一開始可能會(huì)讓人感到困惑。傳遞這個(gè)局部導(dǎo)數(shù)的原理,是基于鏈?zhǔn)椒▌t(chain rule)的。
????1.計(jì)算圖的反向傳播
????我們先來看一個(gè)使用計(jì)算圖的反向傳播的例子。假設(shè)存在 y = f(x)的計(jì)算,這個(gè)計(jì)算的反向傳播如圖所示。

????如圖,反向傳播的計(jì)算順序是,將信號(hào)E乘以節(jié)點(diǎn)的局部導(dǎo)數(shù)
,然后將結(jié)果傳遞給下一個(gè)節(jié)點(diǎn)。這里所說的局部導(dǎo)數(shù)是指正向傳播中y = f(x)的導(dǎo)數(shù),也就是y關(guān)于x的導(dǎo)數(shù)。把這個(gè)局部導(dǎo)數(shù)乘以上游傳過來的值(本例中為E),然后傳遞給前面的節(jié)點(diǎn)。這就是反向傳播的計(jì)算順序。通過這樣的計(jì)算,可以高效地求出導(dǎo)數(shù)的值,這是反向傳播的要點(diǎn)。這是通過鏈?zhǔn)椒▌t的原理實(shí)現(xiàn)的,下面介紹鏈?zhǔn)椒▌t.
????2.什么是鏈?zhǔn)椒▌t
????我們需要先從復(fù)合函數(shù)說起。復(fù)合函數(shù)是由多個(gè)函數(shù)構(gòu)成的函數(shù)。比如,z = (x + y)
2
是由下圖所示的兩個(gè)式子構(gòu)成的。

????鏈?zhǔn)椒▌t是關(guān)于復(fù)合函數(shù)的導(dǎo)數(shù)的性質(zhì),定義如下。如果某個(gè)函數(shù)由復(fù)合函數(shù)表示,則該復(fù)合函數(shù)的導(dǎo)數(shù)可以用構(gòu)成復(fù)合函數(shù)的各個(gè)函數(shù)的導(dǎo)數(shù)的乘積表示。
????????其原理可以表示為下圖.其導(dǎo)數(shù)正好可以像下面這樣“互相抵消”,所以記起來很簡單。

????????所以上式的導(dǎo)數(shù)可以由下圖所示:

????3.鏈?zhǔn)椒▌t和計(jì)算圖
????現(xiàn)在我們嘗試將上式的鏈?zhǔn)椒▌t的計(jì)算用計(jì)算圖表示出來。如下圖所示:

????如圖所示,計(jì)算圖的反向傳播從右到左傳播信號(hào)。反向傳播的計(jì)算順序是,先將節(jié)點(diǎn)的輸入信號(hào)乘以節(jié)點(diǎn)的局部導(dǎo)數(shù)(偏導(dǎo)數(shù)),然后再傳遞給下一個(gè)節(jié)點(diǎn)。
????代入具體式子如下圖所示.

三、反向傳播
????下面將以“+”
和“×”等運(yùn)算為例,介紹反向傳播的結(jié)構(gòu)。
????1.加法節(jié)點(diǎn)的反向傳播
????首先來考慮加法節(jié)點(diǎn)的反向傳播。這里以z = x + y為對(duì)象,觀察它的反向傳播。z = x + y的導(dǎo)數(shù)可由下式(解析性地)計(jì)算出來。

用計(jì)算圖表示的話,如下圖所示。

加法節(jié)點(diǎn)的反向傳播將上游的值原封不動(dòng)地輸出到下游
????從圖中可知,加法節(jié)點(diǎn)的反向傳播只乘以1,所以輸入的值會(huì)原封不動(dòng)地流向下一個(gè)節(jié)點(diǎn)。加法節(jié)點(diǎn)的反向傳播只是將輸入信號(hào)輸出到下一個(gè)節(jié)點(diǎn).
????2.乘法節(jié)點(diǎn)的反向傳播
????接下來,我們看一下乘法節(jié)點(diǎn)的反向傳播。這里我們考慮z = xy。這個(gè)式子的導(dǎo)數(shù)用下式表示。

????我們可以跟上面一樣,畫出相似的計(jì)算圖.

????由圖可知,乘法的反向傳播會(huì)將上游的值乘以正向傳播時(shí)的輸入信號(hào)的“翻轉(zhuǎn)值” 后傳遞給下游。翻轉(zhuǎn)值表示一種翻轉(zhuǎn)關(guān)系,如圖所示,正向傳播時(shí)信號(hào)是x的話,反向傳播時(shí)則是y;正向傳播時(shí)信號(hào)是y的話,反向傳播時(shí)則是x。
????另外,加法的反向傳播只是將上游的值傳給下游,并不需要正向傳播的輸入信號(hào)。但是,乘法的反向傳播需要正向傳播時(shí)的輸入信號(hào)值。因此,實(shí)現(xiàn)乘法節(jié)點(diǎn)的反向傳播時(shí),要保存正向傳播的輸入信號(hào)。
????3.蘋果的例子
????再來思考一下本章最開始舉的購買蘋果的例子(2個(gè)蘋果和消費(fèi)稅)。這里要解的問題是蘋果的價(jià)格、蘋果的個(gè)數(shù)、消費(fèi)稅這3個(gè)變量各自如何影響最終支付的金額。這個(gè)問題相當(dāng)于求“支付金額關(guān)于蘋果的價(jià)格的導(dǎo)數(shù)”“支付金額關(guān)于蘋果的個(gè)數(shù)的導(dǎo)數(shù)”“支付金額關(guān)于消費(fèi)稅的導(dǎo)數(shù)”。用計(jì)算圖的反向傳播來解的話,求解過程如下圖所示。

四、簡單層的實(shí)現(xiàn)
????本節(jié)將用Python實(shí)現(xiàn)前面的購買蘋果的例子。這里,我們把要實(shí)現(xiàn)的計(jì)算圖的乘法節(jié)點(diǎn)稱為“乘法層”(MulLayer),加法節(jié)點(diǎn)稱為“加法層”
(AddLayer)。
????1.乘法層的實(shí)現(xiàn)
????層的實(shí)現(xiàn)中有兩個(gè)共通的方法(接口)forward()和backward()。forward()對(duì)應(yīng)正向傳播,backward()對(duì)應(yīng)反向傳播。
????現(xiàn)在來實(shí)現(xiàn)乘法層。乘法層作為MulLayer類,其實(shí)現(xiàn)過程如下所示:
????__init__()中會(huì)初始化實(shí)例變量x和y,它們用于保存正向傳播時(shí)的輸入值。forward()接收x和y兩個(gè)參數(shù),將它們相乘后輸出。backward()將從上游傳來的導(dǎo)數(shù)(dout)乘以正向傳播的翻轉(zhuǎn)值,然后傳給下游。這就是MulLayer的實(shí)現(xiàn)。
????對(duì)于上面購買蘋果的例子,其中正向傳播,反向傳播可以像下面這樣實(shí)現(xiàn):
????這里,調(diào)用backward()的順序與調(diào)用forward()的順序相反。此外,要注意backward()的參數(shù)中需要輸入“關(guān)于正向傳播時(shí)的輸出變量的導(dǎo)數(shù)”。比如,mul_apple_layer乘法層在正向傳播時(shí)會(huì)輸出apple_price,在反向傳播時(shí),則會(huì)將apple_price的導(dǎo)數(shù)dapple_price設(shè)為參數(shù)。
????2.加法層的實(shí)現(xiàn)
????接下來,我們實(shí)現(xiàn)加法節(jié)點(diǎn)的加法層,如下所示。
????加法層不需要特意進(jìn)行初始化,所以__init__()中什么也不運(yùn)行(pass語句表示“什么也不運(yùn)行”)。加法層的forward()接收x和y兩個(gè)參數(shù),將它們相加后輸出。backward()將上游傳來的導(dǎo)數(shù)(dout)原封不動(dòng)地傳遞給下游。
五、激活函數(shù)層的實(shí)現(xiàn)
????現(xiàn)在,我們將計(jì)算圖的思路應(yīng)用到神經(jīng)網(wǎng)絡(luò)中。這里把構(gòu)成神經(jīng)網(wǎng)絡(luò)的層實(shí)現(xiàn)為一個(gè)類。先來實(shí)現(xiàn)激活函數(shù)的ReLU層和Sigmoid層。
????1.ReLU層
????激活函數(shù)ReLU(Rectified Linear Unit)由下式表示。

????可以求出y關(guān)于x的導(dǎo)數(shù),如下式所示。

????如圖所示,如果正向傳播時(shí)的輸入x大于0,則反向傳播會(huì)將上游的值原封不動(dòng)地傳給下游。反過來,如果正向傳播時(shí)的x小于等于0,則反向傳播中傳給下游的信號(hào)將停在此處。用計(jì)算圖表示的話,如下圖所示。

????現(xiàn)在我們來實(shí)現(xiàn)ReLU層。在神經(jīng)網(wǎng)絡(luò)的層的實(shí)現(xiàn)中,一般假定forward()和backward()的參數(shù)是NumPy數(shù)組。
????Relu類有實(shí)例變量mask。這個(gè)變量mask是由True/False構(gòu)成的NumPy數(shù)組,它會(huì)把正向傳播時(shí)的輸入x的元素中小于等于0的地方保存為True,其他地方(大于0的元素)保存為False。
????如果正向傳播時(shí)的輸入值小于等于0,則反向傳播的值為0。因此,反向傳播中會(huì)使用正向傳播時(shí)保存的mask,將從上游傳來的dout的mask中的元素為True的地方設(shè)為0。
????2.Sigmoid層
????接下來,我們來實(shí)現(xiàn)sigmoid函數(shù)。sigmoid函數(shù)由下式表示。

????其計(jì)算圖如下所示:

????下面是sigmiod函數(shù)的反向傳播計(jì)算圖,其推導(dǎo)過程省略.

????將其進(jìn)一步整理如下:

????則其計(jì)算圖可以簡化如下:

????現(xiàn)在,我們用Python實(shí)現(xiàn)Sigmoid層。
????這個(gè)實(shí)現(xiàn)中,正向傳播時(shí)將輸出保存在了實(shí)例變量out中。然后,反向 傳播時(shí),使用該變量out進(jìn)行計(jì)算。
六、Affine/Softmax層的實(shí)現(xiàn)
????1.Affine層
????神經(jīng)網(wǎng)絡(luò)的正向傳播中進(jìn)行的矩陣的乘積運(yùn)算在幾何學(xué)領(lǐng)域被稱為“仿射變換”。因此,這里將進(jìn)行仿射變換的處理實(shí)現(xiàn)為“Affine層”。其計(jì)算圖如圖所示:

????神經(jīng)元的加權(quán)和用Y = np.dot(X, W) + B計(jì)算出來。然后,Y 經(jīng)過激活函數(shù)轉(zhuǎn)換后,傳遞給下一層。這就是神經(jīng)網(wǎng)絡(luò)正向傳播的流程。上圖是比較簡單的計(jì)算圖,不過要注意X、W、B是矩陣(多維數(shù)組)。之前我們見到的計(jì)算圖中各個(gè)節(jié)點(diǎn)間流動(dòng)的是標(biāo)量,而這個(gè)例子中各個(gè)節(jié)點(diǎn)間傳播的是矩陣。
????以矩陣為對(duì)象的反向傳播,按矩陣的各個(gè)元素進(jìn)行計(jì)算時(shí),步驟和以標(biāo)量為對(duì)象的計(jì)算圖相同。實(shí)際寫一下的話,可以得到下式(這里省略了推導(dǎo)過程)。

????現(xiàn)在,我們根據(jù)上式,嘗試寫出計(jì)算圖的反向傳播,如下圖所示。

該變量的形狀
????這里要特別注意的是計(jì)算圖中各個(gè)變量的形狀。因?yàn)榫仃嚨某朔e運(yùn)算要求對(duì)應(yīng)維度的元素 個(gè)數(shù)保持一致,通過確認(rèn)一致性,就可以導(dǎo)出上式。
????2.批版本的Affine層
????前面介紹的Affi ne層的輸入X是以單個(gè)數(shù)據(jù)為對(duì)象的?,F(xiàn)在我們考慮N個(gè)數(shù)據(jù)一起進(jìn)行正向傳播的情況,也就是批版本的Affine層。先給出批版本的Affine層的計(jì)算圖,如下圖所示。

????????與剛剛不同的是,現(xiàn)在輸入X的形狀是(N, 2)。之后就和前面一樣,在計(jì)算圖上進(jìn)行單純的矩陣計(jì)算。加上偏置時(shí),需要特別注意。正向傳播時(shí),偏置被加到X·W的各個(gè)數(shù)據(jù)上。正向傳播時(shí),偏置會(huì)被加到每一個(gè)數(shù)據(jù)(第1個(gè)、第2個(gè)……)上。因此,反向傳播時(shí),各個(gè)數(shù)據(jù)的反向傳播的值需要匯總為偏置的元素。
????綜上所述,Affine的實(shí)現(xiàn)如下所示。
????3.Softmax-with-Loss 層??
????最后介紹一下輸出層的softmax函數(shù)。前面我們提到過,softmax函數(shù)會(huì)將輸入值正規(guī)化之后再輸出。??
????下面來實(shí)現(xiàn)Softmax層。考慮到這里也包含作為損失函數(shù)的交叉熵誤差(cross entropy error),所以稱為“Softmax-with-Loss層”。Softmax-with-Loss層(Softmax函數(shù)和交叉熵誤差)的計(jì)算圖如下圖所示。

????上面的計(jì)算圖可以簡化為以下形式.

????上圖中softmax函數(shù)記為Softmax層,交叉熵誤差記為 Cross Entropy Error層。這里假設(shè)要進(jìn)行3類分類,從前面的層接收3個(gè)輸入(得分)。如上圖所示,Softmax層將輸入(a1, a2, a3)正規(guī)化,輸出(y1, y2, y3)。Cross Entropy Error層接收Softmax的輸出(y1, y2, y3)和教師標(biāo)簽(t1, t2, t3),從這些數(shù)據(jù)中輸出損失L。
? ? 上圖中要注意的是反向傳播的結(jié)果。Softmax層的反向傳播得到了(y1 ? t1, y2 ? t2, y3 ? t3)這樣“漂亮”的結(jié)果。由于(y1, y2, y3)是Softmax層的輸出,(t1, t2, t3)是監(jiān)督數(shù)據(jù),所以(y1 ? t1, y2 ? t2, y3 ? t3)是Softmax層的輸出和教師標(biāo)簽的差分。神經(jīng)網(wǎng)絡(luò)的反向傳播會(huì)把這個(gè)差分表示的誤差傳遞給前面的層,這是神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)中的重要性質(zhì)。
????神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的目的就是通過調(diào)整權(quán)重參數(shù),使神經(jīng)網(wǎng)絡(luò)的輸出(Softmax的輸出)接近教師標(biāo)簽。因此,必須將神經(jīng)網(wǎng)絡(luò)的輸出與教師標(biāo)簽的誤差高效地傳遞給前面的層。剛剛的(y1 ? t1, y2 ? t2, y3 ? t3)正是Softmax層的輸出與教師標(biāo)簽的差,直截了當(dāng)?shù)乇硎玖水?dāng)前神經(jīng)網(wǎng)絡(luò)的輸出與教師標(biāo)簽的誤差。
????現(xiàn)在來進(jìn)行Softmax-with-Loss層的實(shí)現(xiàn),實(shí)現(xiàn)過程如下所示。
????這個(gè)實(shí)現(xiàn)利用了之前實(shí)現(xiàn)的softmax()和cross_entropy_ error()函數(shù)。因此,這里的實(shí)現(xiàn)非常簡單。請(qǐng)注意反向傳播時(shí),將要傳播的值除以批的大?。╞atch_size)后,傳遞給前面的層的是單個(gè)數(shù)據(jù)的誤差。
七、誤差反向傳播法的實(shí)現(xiàn)
????通過像組裝樂高積木一樣組裝上一節(jié)中實(shí)現(xiàn)的層,可以構(gòu)建神經(jīng)網(wǎng)絡(luò)。下面我們將通過組裝已經(jīng)實(shí)現(xiàn)的層來構(gòu)建神經(jīng)網(wǎng)絡(luò)。
????1.神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的全貌
????在進(jìn)行具體的實(shí)現(xiàn)之前,我們再來確認(rèn)一下神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的全貌圖。神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的步驟如下所示。
前提??神經(jīng)網(wǎng)絡(luò)中有合適的權(quán)重和偏置,調(diào)整權(quán)重和偏置以便擬合訓(xùn)練數(shù)據(jù)的過程稱為學(xué)習(xí)。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)分為下面4個(gè)步驟。?
步驟1(mini-batch) 從訓(xùn)練數(shù)據(jù)中隨機(jī)選擇一部分?jǐn)?shù)據(jù)。?
步驟2(計(jì)算梯度) 計(jì)算損失函數(shù)關(guān)于各個(gè)權(quán)重參數(shù)的梯度。?
步驟3(更新參數(shù)) 將權(quán)重參數(shù)沿梯度方向進(jìn)行微小的更新。?
步驟4(重復(fù)) 重復(fù)步驟1、步驟2、步驟3。
????之前介紹的誤差反向傳播法會(huì)在步驟2中出現(xiàn)。數(shù)值微分雖然實(shí)現(xiàn)簡單,但是計(jì)算要耗費(fèi)較多的時(shí)間。和需要花費(fèi)較多時(shí)間的數(shù)值微分不同,誤差反向傳播法可以快速高效地計(jì)算梯度。
????2.對(duì)應(yīng)誤差反向傳播法的神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)
????現(xiàn)在來進(jìn)行神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)。這里我們要把2層神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)為TwoLayerNet。這個(gè)類的實(shí)例變量和方法如下圖所示:


????通過使用層,獲得識(shí)別結(jié)果的處理(predict())和計(jì)算梯度的處理(gradient())只需通過層之間的傳遞就能完成。下面是TwoLayerNet的代碼實(shí)現(xiàn)。
???OrderedDict是有序字典,“有序”是指它可以記住向字典里添加元素的順序。因此,神經(jīng)網(wǎng)絡(luò)的正向傳播只需按照添加元素的順序調(diào)用各層的forward()方法就可以完成處理,而反向傳播只需要按照相反的順序調(diào)用各層即可。因?yàn)锳ffine層和ReLU層的內(nèi)部會(huì)正確處理正向傳播和反向傳播,所以這里要做的事情僅僅是以正確的順序連接各層,再按順序(或者逆序)調(diào)用各層。
????像這樣通過將神經(jīng)網(wǎng)絡(luò)的組成元素以層的方式實(shí)現(xiàn),可以輕松地構(gòu)建神經(jīng)網(wǎng)絡(luò)。這個(gè)用層進(jìn)行模塊化的實(shí)現(xiàn)具有很大優(yōu)點(diǎn)。
????3.誤差反向傳播法的梯度確認(rèn)
????到這里,我們已經(jīng)介紹了兩種求梯度的方法.一種是基于數(shù)值微分的方法,另一種是解析性地求解數(shù)學(xué)式的方法。后一種方法通過使用誤差反向傳播法,即使存在大量的參數(shù),也可以高效地計(jì)算梯度。所以,一般都使用誤差反向傳播法求梯度。但是,實(shí)際上,在確認(rèn)誤差反向傳播法的實(shí)現(xiàn)是否正確時(shí),是需要用到數(shù)值微分的。
????數(shù)值微分的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,因此,一般情況下不太容易出錯(cuò)。確認(rèn)數(shù)值微分求出的梯度結(jié)果和誤差反向傳播法求出的結(jié)果是否一致(嚴(yán)格地講,是非常相近)的操作稱為梯度確認(rèn)(gradient check)。
????梯度確認(rèn)的代碼實(shí)現(xiàn)如下所示:
????4.使用誤差反向傳播法的學(xué)習(xí)
????最后,我們來看一下使用了誤差反向傳播法的神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)的實(shí)現(xiàn)。
和之前的實(shí)現(xiàn)相比,不同之處僅在于通過誤差反向傳播法求梯度這一點(diǎn)。
????