反向传播算法_反向传播算法:定义,概念,可视化
定義
向前傳播
通常,當(dāng)我們使用神經(jīng)網(wǎng)絡(luò)時(shí),我們輸入某個(gè)向量x,然后網(wǎng)絡(luò)產(chǎn)生一個(gè)輸出y,這個(gè)輸入向量通過(guò)每一層隱含層,直到輸出層。這個(gè)方向的流動(dòng)叫做正向傳播。
在訓(xùn)練階段,輸入最后可以計(jì)算出一個(gè)代價(jià)標(biāo)量J(θ)。
反向傳播算法
然后,代價(jià)通過(guò)反向算法返回到網(wǎng)絡(luò)中,調(diào)整權(quán)重并計(jì)算梯度。未完待續(xù)……
分析
可能是你們?cè)趯W(xué)校里做過(guò)用代數(shù)的方法來(lái)分析反向傳播。對(duì)于普通函數(shù),這很簡(jiǎn)單。但當(dāng)解析法很困難時(shí),我們通常嘗試數(shù)值微分。
數(shù)值微分
由于代數(shù)操作很困難,在數(shù)值方法中,我們通常使用計(jì)算量大的方法,因此經(jīng)常需要用到計(jì)算機(jī)。一般有兩種方法,一種是利用近鄰點(diǎn),另一種是利用曲線擬合。
隨機(jī)梯度下降法
負(fù)責(zé)“學(xué)習(xí)”的算法。它使用了由反向傳播算法產(chǎn)生的梯度。
反向傳播算法
然后,反向傳播算法返回到網(wǎng)絡(luò)中,調(diào)整權(quán)重來(lái)計(jì)算梯度。一般來(lái)說(shuō),反向傳播算法不僅僅適用于多層感知器。它是一個(gè)通用的數(shù)值微分算法,可以用來(lái)找到任何函數(shù)的導(dǎo)數(shù),只要給定函數(shù)是可微的。
該算法最重要的特點(diǎn)之一是,它使用了一個(gè)相對(duì)簡(jiǎn)單和廉價(jià)的程序來(lái)計(jì)算微分,提高效率。
如何計(jì)算一個(gè)代價(jià)函數(shù)的梯度
給定一個(gè)函數(shù)f,我們想要找到梯度:
x是一組我們需要它的導(dǎo)數(shù)的變量,y是額外的變量,我們不需要它的導(dǎo)數(shù)。
為了使網(wǎng)絡(luò)繼續(xù)學(xué)習(xí),我們想要找到代價(jià)函數(shù)的梯度。
損失函數(shù)
這個(gè)函數(shù)通常應(yīng)用于一個(gè)數(shù)據(jù)點(diǎn),尋找預(yù)測(cè)點(diǎn)和實(shí)際點(diǎn)之間的距離。大多數(shù)情況下,這是距離的平方損失。
代價(jià)函數(shù)
這個(gè)函數(shù)是所有損失函數(shù)的組合,它不總是一個(gè)和。但有時(shí)是平均值或加權(quán)平均值。例如:
如何計(jì)算一個(gè)代價(jià)函數(shù)的梯度
給定一個(gè)函數(shù)f,我們想要找到梯度:
x是一組我們需要它的導(dǎo)數(shù)的變量,y是額外的變量,我們不需要它的導(dǎo)數(shù)。
為了網(wǎng)絡(luò)的學(xué)習(xí),我們想要找到代價(jià)函數(shù)的梯度。
微積分鏈?zhǔn)椒▌t
假設(shè)x是實(shí)數(shù),f和g都是實(shí)數(shù)到實(shí)數(shù)的映射函數(shù)。此外,
根據(jù)鏈?zhǔn)椒▌t,
多變量鏈?zhǔn)椒▌t
已知x和y是不同維數(shù)的向量,
g和f也是從一個(gè)維度映射到另一個(gè)維度的函數(shù),
或者說(shuō),
?y /?x是g的n×m雅可比矩陣。
梯度
而導(dǎo)數(shù)或微分是沿一個(gè)軸的變化率。梯度是一個(gè)函數(shù)沿多個(gè)軸的斜率矢量。
雅可比矩陣
有時(shí)我們需要找出輸入和輸出都是向量的函數(shù)的所有偏導(dǎo)數(shù)。包含所有這些偏導(dǎo)數(shù)的矩陣就是雅可比矩陣。
有函數(shù)
雅可比矩陣J為:
張量的鏈?zhǔn)椒▌t
我們大部分時(shí)間都在處理高維數(shù)據(jù),例如圖像和視頻。所以我們需要將鏈?zhǔn)椒▌t擴(kuò)展到張量。
想象一個(gè)三維張量,
z值對(duì)這個(gè)張量的梯度是,
對(duì)于這個(gè)張量, i?? 指數(shù)給出一個(gè)向量,
所以考慮到這一點(diǎn),
張量的鏈?zhǔn)椒▌t是,
概念
計(jì)算圖
這是一個(gè)關(guān)于直線方程的計(jì)算圖的例子。開(kāi)始節(jié)點(diǎn)是你將在方程中看到的,為了計(jì)算圖的方便,總是需要為中間節(jié)點(diǎn)定義額外的變量,在這個(gè)例子中是節(jié)點(diǎn)u。節(jié)點(diǎn)“u”等價(jià)于“mx”。
我們引入這個(gè)概念來(lái)說(shuō)明復(fù)雜的計(jì)算流程的支撐算法。
還記得之前,當(dāng)我們把損失函數(shù)定義為差的平方,這就是我們?cè)谟?jì)算圖的最后一層使用的。其中y是實(shí)際值a是預(yù)測(cè)值。
請(qǐng)注意,我們的損失值嚴(yán)重依賴于最后的激活值,而最后的激活值又依賴于前一個(gè)激活值,再依賴于前一個(gè)激活值,以此類(lèi)推。
在神經(jīng)網(wǎng)絡(luò)的前進(jìn)過(guò)程中,我們最終得到一個(gè)預(yù)測(cè)值a。在訓(xùn)練階段,我們有一個(gè)額外的信息,這就是網(wǎng)絡(luò)應(yīng)該得到的實(shí)際結(jié)果,y。我們的損失函數(shù)就是這些值之間的距離。當(dāng)我們想要最小化這個(gè)距離時(shí),我們首先要更新最后一層的權(quán)重。但這最后一層依賴于它的前一層,因此我們更新它們。所以從這個(gè)意義上說(shuō),我們是在向后傳遞神經(jīng)網(wǎng)絡(luò)并更新每一層。
敏感性改變
當(dāng)x的一個(gè)小變化導(dǎo)致函數(shù)f的一個(gè)大變化時(shí),我們說(shuō)函數(shù)對(duì)x非常敏感如果x的一個(gè)小變化導(dǎo)致f的一個(gè)小變化,我們說(shuō)它不是很敏感。
例如,一種藥物的有效性可用f來(lái)衡量,而x是所使用的劑量。靈敏度表示為:
為了進(jìn)一步擴(kuò)展,我們假設(shè)現(xiàn)在的函數(shù)是多變量的。
函數(shù)f可以對(duì)每個(gè)輸入有不同的敏感度。舉個(gè)例子,也許僅僅進(jìn)行數(shù)量分析是不夠的,所以我們把藥物分解成3種活性成分,然后考慮每種成分的劑量。
最后一點(diǎn)擴(kuò)展,如果其中一個(gè)輸入值,比如x也依賴于它自己的輸入。我們可以用鏈?zhǔn)椒▌t來(lái)找出敏感性。同樣的例子,也許x被分解成它在身體里的組成部分,所以我們也要考慮這個(gè)。
我們考慮x的組成,以及它的成分如何影響藥物的整體效果。
在這里,我們測(cè)量的是整個(gè)藥物的效果對(duì)藥物中這個(gè)小成分的敏感度。
一個(gè)簡(jiǎn)單的模型
這個(gè)計(jì)算圖考慮了節(jié)點(diǎn)a和它前面的節(jié)點(diǎn)a '之間的連接。
用鏈?zhǔn)椒▌t,
它測(cè)量了a對(duì)u的微小變化有多敏感。然后我們繼續(xù)前面的3次計(jì)算,
測(cè)量u對(duì)以下每一項(xiàng)的微小變化的敏感度:
權(quán)重,w
之前的激活值,a '
偏質(zhì),b
把這些放在一起,
簡(jiǎn)單模型的復(fù)雜性
如果在前面的例子中,我們有兩個(gè)節(jié)點(diǎn)和它們之間的一個(gè)鏈接。在這個(gè)例子中,我們有3個(gè)節(jié)點(diǎn)和2個(gè)鏈接。
因?yàn)殒準(zhǔn)椒▌t的鏈?zhǔn)介L(zhǎng)度是沒(méi)有限制的。我們可以對(duì)任意數(shù)量的層繼續(xù)這樣做。對(duì)于這一層,注意計(jì)算圖是這樣的,
請(qǐng)注意,需要用附加的刻度對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行注釋。這些刻度不是衍生物,它們只是表示u和u '是不同的、唯一的值或?qū)ο?/p>
復(fù)雜模型的復(fù)雜性
到目前為止的例子都是線性的,鏈表式的神經(jīng)網(wǎng)絡(luò)。把它擴(kuò)展到現(xiàn)實(shí)的網(wǎng)絡(luò)是這樣的,
我們需要給網(wǎng)絡(luò)添加一些額外的符號(hào)。
讓我們通過(guò) a1?計(jì)算一下計(jì)算圖 a2?。
實(shí)際上你會(huì)發(fā)現(xiàn)兩個(gè)計(jì)算圖有一個(gè)很大的共同點(diǎn),特別是到a1?。這意味著,如果一個(gè)計(jì)算已經(jīng)被計(jì)算過(guò),那么它可以在下一次和下下次被重用,依此類(lèi)推。雖然這增加了內(nèi)存的占用,但它顯著減少了計(jì)算時(shí)間,而且對(duì)于大型神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),這是必要的。
如果我們用鏈?zhǔn)椒▌t,得到的公式幾乎是一樣的,只是增加了索引。
復(fù)雜模型的進(jìn)一步復(fù)雜化
你會(huì)發(fā)現(xiàn)一個(gè)a2? 會(huì)有幾個(gè)路徑輸出層節(jié)點(diǎn),。
所以我們需要對(duì)前一層求和。我們從所有前面的節(jié)點(diǎn)和它們的梯度的總和中得到的這個(gè)值有更新它的指令,以便我們最小化損失。
最小化成本函數(shù)
如果你還記得定義6和7,特別是定義7,你會(huì)記得成本函數(shù)在概念上是預(yù)測(cè)產(chǎn)出和實(shí)際產(chǎn)出之差的平均值或加權(quán)平均值。
如果我們使用線性回歸或邏輯回歸的梯度下降算法來(lái)最小化代價(jià)函數(shù)。
對(duì)于神經(jīng)網(wǎng)絡(luò),我們使用反向傳播算法。我想現(xiàn)在已經(jīng)很清楚為什么我們不能對(duì)神經(jīng)網(wǎng)絡(luò)使用單一方程了。神經(jīng)網(wǎng)絡(luò)并不是我們可以很好地求導(dǎo)數(shù)的連續(xù)函數(shù)。相反,它們近似一個(gè)函數(shù)的離散節(jié)點(diǎn)。因此需要一個(gè)遞歸算法來(lái)找到它的導(dǎo)數(shù)或梯度,這需要考慮到所有的節(jié)點(diǎn)。
完整的成本函數(shù)是這樣的:
從概念上講
符號(hào)對(duì)符號(hào)導(dǎo)數(shù)
到目前為止,您已經(jīng)了解了如何得到神經(jīng)網(wǎng)絡(luò)中節(jié)點(diǎn)梯度的代數(shù)表達(dá)式。通過(guò)鏈?zhǔn)椒▌t在張量上的應(yīng)用和計(jì)算圖的概念。
代數(shù)表達(dá)式或計(jì)算圖不處理具體問(wèn)題,而只是給我們的理論背景,以驗(yàn)證我們正在正確地計(jì)算它們。它們幫助指導(dǎo)我們的編碼。
在下一個(gè)概念中,我們將討論符號(hào)對(duì)數(shù)值導(dǎo)數(shù)的影響。
符號(hào)-數(shù)值導(dǎo)數(shù)
這里我們開(kāi)始脫離理論,進(jìn)入實(shí)踐領(lǐng)域。
算法
基本設(shè)置+計(jì)算節(jié)點(diǎn)的梯度
首先我們要做一些設(shè)置,包括神經(jīng)網(wǎng)絡(luò)的順序以及與網(wǎng)絡(luò)相關(guān)的節(jié)點(diǎn)的計(jì)算圖。我們把它們排列好。
每個(gè)節(jié)點(diǎn)u^{(n)} 都與一個(gè)操作f^{(i)}相關(guān)聯(lián),使得:
在?^ {(i)}是所有節(jié)點(diǎn)的集合,u^ {(n)}的父節(jié)點(diǎn)。
首先我們需要計(jì)算所有的輸入節(jié)點(diǎn),為此我們需要將所有的訓(xùn)練數(shù)據(jù)以x向量的形式輸入:
?for i = 1, ...., n_i u_i = get_u(x_i)注意,n_i為輸入節(jié)點(diǎn)數(shù),其中輸入節(jié)點(diǎn)為:
如果這些是輸入節(jié)點(diǎn),則節(jié)點(diǎn):
是輸入節(jié)點(diǎn)之后最后一個(gè)節(jié)點(diǎn)之前的節(jié)點(diǎn)u^{(n)}。
?for i = n_i+1, ..., n A_i = { u_j = get_j(Pa(u_i)) } u_i = fi(A_i)你會(huì)注意到,這和我們鏈?zhǔn)椒▌t計(jì)算圖的概念上的方向是相反的。這是因?yàn)檫@部分詳細(xì)說(shuō)明了正向傳播。
我們稱(chēng)這個(gè)圖為:
利用這個(gè)圖,我們可以構(gòu)造另一個(gè)圖:
G中的每個(gè)節(jié)點(diǎn)計(jì)算正向圖節(jié)點(diǎn)u^i,而B(niǎo)中的每個(gè)節(jié)點(diǎn)使用鏈?zhǔn)椒▌t計(jì)算梯度。
如果你考慮神經(jīng)網(wǎng)絡(luò)中的所有節(jié)點(diǎn)和連接它們的邊,你就能想到反向傳播所需的計(jì)算量隨著邊的數(shù)量線性增加。因?yàn)槊織l邊都代表了一條鏈規(guī)則的計(jì)算,它將一些節(jié)點(diǎn)連接到它的一個(gè)父節(jié)點(diǎn)。
附加約束+簡(jiǎn)單的反向傳播
如前所述,該算法的計(jì)算復(fù)雜度與網(wǎng)絡(luò)的邊數(shù)呈線性關(guān)系。但這是假設(shè)求每條邊的偏導(dǎo)數(shù)需要一個(gè)常數(shù)時(shí)間。
在這里,我們的目標(biāo)是建立一個(gè)具體反向傳播算法。
?Run forward propagation這將獲得處于隨機(jī)的或非有用狀態(tài)的網(wǎng)絡(luò)的激活值。
?Initialize grad_table在這個(gè)數(shù)據(jù)結(jié)構(gòu)中,我們將存儲(chǔ)所有我們計(jì)算的梯度。
?To get an individual entry, we use grad_table(u_i)這將存儲(chǔ)計(jì)算值:
?grad_table[u_n] = 1這將最后一個(gè)節(jié)點(diǎn)設(shè)置為1。
?for j = n-1 to 1 grad_table[u_j] = \\sum grad_table[u_i] du_i/du_j理論上是這樣的:
?return grad_table反向傳播算法只訪問(wèn)每個(gè)節(jié)點(diǎn)一次來(lái)計(jì)算偏置,這避免了不必要的重新計(jì)算子表達(dá)式的步驟。請(qǐng)記住,這是以更多內(nèi)存占用為代價(jià)的。
作者:Tojo Batsuuri
deephub翻譯組:孟翔杰
總結(jié)
以上是生活随笔為你收集整理的反向传播算法_反向传播算法:定义,概念,可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 坦克大战java_清华毕业大佬用一个坦克
- 下一篇: redirect通过url_for传递参