反向传播
說明
學習深度學習的過程中,遇到了一個用例子講解反向傳播算法的博文,簡單粗暴容易理解,很適合我這種小白,所以打算翻譯一下分享,英文水平有限,翻譯不對的地方請告知。原文地址在這。下面是譯文。
背景
反向傳播在神經(jīng)網(wǎng)絡的訓練中是一種經(jīng)常被用到的算法。關于反向傳播算法網(wǎng)上有很多講解,但是很少有用真實的數(shù)字為大家舉例子來解釋的。在本篇博文中,我將努力用一個具體的例子來解釋反向傳播是怎樣工作的,為了確定自己理解的是否正確,大家可以先按照自己的理解算一下。
如果這篇博文吸引到了你,你可以注冊我的時事通訊,在里面會張貼一些我正在研究的人工智能相關的博文。
在Python中使用反向傳播
你也可以用我寫的Python腳本玩一玩,程序已經(jīng)實現(xiàn)了反向傳播算法。
反向傳播算法可視化
對于展示一個神經(jīng)網(wǎng)絡訓練的交互式可視化,大家可以來我的神經(jīng)網(wǎng)絡可視化看一下。
一些其他的資源
如果你覺得這個教程對你是有用的且想繼續(xù)學習關于神經(jīng)網(wǎng)絡的知識和它們的應用,我強烈推薦Adrian Rosebrock的教程,Getting Started with Deep Learning and Python.
總覽
這個教程,我們打算用兩個輸入節(jié)點、兩個隱藏節(jié)點和兩個輸出節(jié)點。另外,輸出節(jié)點和隱藏節(jié)點將會包含一個偏置。(這個地方,我感覺應該是輸入節(jié)點和輸出節(jié)點,但是還是按照原文翻譯了。)
下面是一個基本的架構:
為了有些數(shù)可以算,下面標注了初始化權重、偏置量和訓練集的輸入輸出:
反向傳播算法的目標是優(yōu)化權重,使神經(jīng)網(wǎng)絡能夠?qū)W習到怎樣正確地在任意的輸入輸出之間映射。
教程的其他部分都會圍繞一個單一樣本進行,給定的輸入時0.05和0.10,我們想讓這個神經(jīng)網(wǎng)絡能夠分別對應輸出0.01和0.99。
先走一遍前向傳播
一開始,先讓我們看一下在當前給定值的情況下神經(jīng)網(wǎng)絡預測的怎么樣。所以我們先把輸入數(shù)據(jù)喂給神經(jīng)網(wǎng)絡。
我們每個隱藏層節(jié)點的總凈輸入,用一個激活函數(shù)(這里使用的邏輯回歸)壓縮這個總凈輸入,然后對輸出節(jié)點重復這個過程。
總凈出入也被稱為凈輸入,參考了某些資料。
下面我們計算h1h1的總凈輸入
然后我們再用邏輯回歸函數(shù)去獲得輸出h1h1的輸出:
對于h2h2執(zhí)行同樣的過程:
我們將會對輸出層的節(jié)點重復這個過程,用隱藏層的輸出作為輸入。
下面是這個輸出o1o1:
并且對o2o2執(zhí)行同樣的過程:
outo2=0.772928465outo2=0.772928465
計算總誤差
我們現(xiàn)在可以用平方誤差函數(shù)來計算每個輸出節(jié)點的誤差,并且把它們加起來得到總誤差。
Etotal=∑12(target?output)2Etotal=∑12(target?output)2
一些資料把目標值也叫作理想值,把輸出值叫做實際值。
比如說,o1o1的目標輸出是0.01,但是神經(jīng)網(wǎng)絡的輸出是0.75136507,因此誤差是:
Eo1=12(targeto1?outo1)2=12(0.01?0.75136507)2=0.274811083Eo1=12(targeto1?outo1)2=12(0.01?0.75136507)2=0.274811083
對o2o2重復這個過程(記住目標值為0.99),
Eo2=0.023560026Eo2=0.023560026
整個神經(jīng)網(wǎng)絡的總誤差是這些誤差的和:
Etotal=Eo1+Eo2=0.274811083+0.023560026=0.298371109Etotal=Eo1+Eo2=0.274811083+0.023560026=0.298371109
走一遍反向傳播
反向傳播算法的目標是更新神經(jīng)網(wǎng)絡中的每一個權重,以便得到實際輸出和目標輸出更接近,因此要最小化輸出節(jié)點和整個網(wǎng)絡的誤差。
輸出層
看一下w5w5。
通過應用我們熟知的鏈式法則,有:
可視化我們正在做的工作:
我們需要計算出這個方程式的每塊。
首先,總誤差相對于輸出的梯度是多少呢?
?(target?out)?(target?out)
當我們?nèi)】傉`差相對于outo1outo1不會影響它。
接下來,輸出o1o1相對于總凈輸入的偏導是多少呢?
邏輯回歸的偏導是輸出乘以1減去輸出:
最后,總凈輸入相對于w5w5的偏導是多少呢?
把它們組織起來:
你會經(jīng)常看到以delta法則組織計算的式子
?Etotal?w5=?(tageto1?outo1)?outo1?(1?outo1)?outh1?Etotal?w5=?(tageto1?outo1)?outo1?(1?outo1)?outh1
另外,我們可以讓?Etotal?outo1??outo1?neto1?Etotal?outo1??outo1?neto1。我們可以用這個重寫上面的計算式:
δo1=?Etotal?outo1??outo1?neto1=?Etotal?neto1δo1=?Etotal?outo1??outo1?neto1=?Etotal?neto1
δo1=?(tageto1?outo1)?outo1?(1?outo1)δo1=?(tageto1?outo1)?outo1?(1?outo1)
因此:
?Etotal?w5=δo1outh1?Etotal?w5=δo1outh1
一些資料抽象出了負號:
?Etotal?w5=?δo1outh1?Etotal?w5=?δo1outh1
為了減少總誤差,我們用當前的權重值減去這個值(可以乘以學習效率,eta,在這里我們設為0.5):
一些資料用αα(epsilon).
我們可以重復這個過程得到w6,w7,w8w6,w7,w8的新權重:
我們在神經(jīng)網(wǎng)絡中實際執(zhí)行更新的操作是在隱藏層中所有的權重都有更新的動作之后(也就是說,在下面的反向傳播過程中,我們使用的是開始的權重,而不是更新后的權重)。此處翻譯不確定!此處翻譯不確定!
隱藏層
接下來,我們將會計算w1,w2,w3,w4w1,w2,w3,w4的新值,繼續(xù)完成這個后向傳播算法。
看一下大圖,這里面有我們要計算的:
?Etotal?w1=?Etotal?outh1??outh1?neth1??neth1?w1?Etotal?w1=?Etotal?outh1??outh1?neth1??neth1?w1
可視化如下:
我們將會用一個相似的過程來計算,就像對輸出層做的那樣,但是也會有一些不同, 那就是每個隱藏節(jié)點的輸出都會對多個輸出神經(jīng)元和誤差有影響。我們知道outh1outh1需要被考慮進去。
以 ?Etotal?outh1?Etotal?outh1的計算開始:
我們可以用之前計算出的值來計算?Eo1?neto1?Eo1?neto1:
而?neto1?outh1?neto1?outh1:
插進去:
接下來對?Eo2?outh1?Eo2?outh1執(zhí)行同樣的過程:
?Eo2?outh1=?0.019049119?Eo2?outh1=?0.019049119
因此:
既然我們已經(jīng)算出了?Etotal?outh1?Etotal?outh1,接下來再對每一個權重計算?neth1?w
總結(jié)
- 上一篇: paddle 问题
- 下一篇: 深度学习的分布式训练--数据并行和模型并