当我们在谈深度学习时,到底在谈论什么(二)--转
原文地址:http://suanfazu.com/t/topic/13742
上一次的分享我們提到了神經(jīng)網(wǎng)絡(luò)的幾個(gè)基本概念,其中提到了隨機(jī)梯度下降(SGD)算法是神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)(或者更通用的,一般性參數(shù)優(yōu)化問(wèn)題)的主流方法。概念上,神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)非常簡(jiǎn)單,可以被歸納為下面的步驟:
(a) 構(gòu)造神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)(選擇層數(shù)、激活函數(shù)等)
(b) 初始化構(gòu)造出的神經(jīng)網(wǎng)絡(luò)參數(shù)
(c) 對(duì)于給定的訓(xùn)練樣本與當(dāng)前的,計(jì)算梯度
(d) 通過(guò)(隨機(jī))梯度下降算法更新。
例如,不考慮任何正則化因子情況的最簡(jiǎn)單參數(shù)更新為
神經(jīng)網(wǎng)絡(luò)的初學(xué)者往往會(huì)發(fā)現(xiàn),上述四個(gè)步驟當(dāng)中,對(duì)于給定樣本,計(jì)算其梯度是最?不直觀?的一個(gè)步驟。本文我們玻森(bosonnlp.com)的討論就圍繞解決梯度的核心算法:后向傳播?算法來(lái)展開(kāi)。
首先理清一個(gè)概念,步驟(d)的梯度下降算法是一種優(yōu)化算法,而我們要討論的后向傳播算法,是計(jì)算步驟(c)中所需要梯度的一種算法。下面的討論,我們首先完成單參數(shù)(即只有一個(gè)參數(shù)需要學(xué)習(xí))的特例情況下的推導(dǎo),進(jìn)而通過(guò)?動(dòng)態(tài)規(guī)劃(Dynamic programming)?思想,將其推導(dǎo)泛化到多變量的情況。需要注意的是,雖然后向傳播概念上并不復(fù)雜,所用到的數(shù)學(xué)工具也很基本,但由于所涉及的變量較多、分層等特點(diǎn),在推導(dǎo)的時(shí)候需要比較仔細(xì),類似繡花。
單參數(shù)情況
特例
在討論后向傳播算法之前,我們簡(jiǎn)單回顧一下單變量微積分中的求導(dǎo)規(guī)則。來(lái)看個(gè)例子,假設(shè)我們有一個(gè)極端簡(jiǎn)化的網(wǎng)絡(luò),其中只有一個(gè)需要學(xué)習(xí)的參數(shù),形式如下
并且假設(shè)損失函數(shù)Cost為平方誤差(MSE)。
假設(shè)我們只有一個(gè)訓(xùn)練樣本。因?yàn)檫@個(gè)形式非常簡(jiǎn)單,我們?cè)囋噷颖局苯訋霌p失函數(shù):
顯然當(dāng)時(shí),我們可以讓損失函數(shù)為0,達(dá)到最優(yōu)。下面讓我們?假裝?不知道最優(yōu)解,考慮如何用梯度下降方法來(lái)求解。假設(shè)我們猜為最優(yōu),帶入計(jì)算得到
嗯,不算太壞的一個(gè)初始值。讓我們計(jì)算其梯度,或者損失函數(shù)關(guān)于的導(dǎo)數(shù)。
設(shè)置學(xué)習(xí)率參數(shù),我們可以通過(guò)梯度下降方法來(lái)不斷改進(jìn),以達(dá)到降低損失函數(shù)的目的。三十個(gè)迭代的損失函數(shù)變化如下:
生成上圖采用的是如下Python代碼
import matplotlib.pyplot as plt
w0, eta, n_iter = 2, 0.02, 30
gradient_w = lambda w: 2*(w**3)
cost = lambda w: 0.5*(w**4)
costs = []
w = w0
for i in range(n_iter):
costs.append(cost(w))
w = w – eta*gradient_w(w) # SGD
plt.plot(range(n_iter), costs)
可以發(fā)現(xiàn),經(jīng)過(guò)30次迭代后,我們的參數(shù)從初始的2改進(jìn)到了0.597,正在接近我們的最優(yōu)目標(biāo)。
對(duì)于一般的情況
回憶一下,上面的結(jié)果是基于我們給定?下得到的,注意這里我們假設(shè)輸入信號(hào)為常量。我們將上面的求解步驟做一點(diǎn)點(diǎn)泛化。
重復(fù)上面的求解
關(guān)于w求導(dǎo),
注意,上面求導(dǎo)用到了?鏈?zhǔn)椒▌t(Chain Rule),即
或者寫(xiě)成偏導(dǎo)數(shù)形式:
對(duì)于一般性損失函數(shù)的情況
上式推導(dǎo)基于損失函數(shù)為平方最小下得出,那么我們?cè)俜夯稽c(diǎn),對(duì)于任意給定的可導(dǎo)損失函數(shù),其關(guān)于的梯度:
其中是損失函數(shù)關(guān)于的導(dǎo)數(shù)。實(shí)際上這個(gè)形式很通用,對(duì)于?任意?特定的損失函數(shù)和神經(jīng)網(wǎng)絡(luò)的激活函數(shù),都可以通過(guò)這個(gè)式子進(jìn)行梯度計(jì)算。譬如,對(duì)于一個(gè)有三層的神經(jīng)網(wǎng)絡(luò)
同樣通過(guò)鏈?zhǔn)椒▌t,
上式看上去比較復(fù)雜,我們可以在符號(hào)上做一點(diǎn)簡(jiǎn)化。令每一層網(wǎng)絡(luò)得到的激活函數(shù)結(jié)果為,即, 那么:
即:不論復(fù)合函數(shù)本身有多么復(fù)雜,我們都可以將其導(dǎo)數(shù)拆解成每一層函數(shù)的導(dǎo)數(shù)的乘積。
上面的推導(dǎo)我們給出了當(dāng)神經(jīng)網(wǎng)絡(luò)僅僅被一個(gè)可學(xué)習(xí)參數(shù)所刻畫(huà)的情況。一句話總結(jié),在單參數(shù)的網(wǎng)絡(luò)推導(dǎo)中,我們真正用到的唯一數(shù)學(xué)工具就是?鏈?zhǔn)椒▌t。實(shí)際問(wèn)題中,我們面對(duì)的參數(shù)往往是數(shù)以百萬(wàn)計(jì)的,這也就是為什么我們無(wú)法采用直覺(jué)去“猜”到最優(yōu)值,而需要用梯度下降方法的原因。下面我考慮在多參數(shù)情況下,如何求解梯度。
多參數(shù)情況
首先,不是一般性的,我們假設(shè)所構(gòu)建的為一個(gè)層的神經(jīng)網(wǎng)絡(luò),其中每一層神經(jīng)網(wǎng)絡(luò)都經(jīng)過(guò)線性變換和非線性變換兩個(gè)步驟(為簡(jiǎn)化推導(dǎo),這里我們略去對(duì)bias項(xiàng)的考慮):
定義網(wǎng)絡(luò)的輸入,而作為輸出層。一般的,我們令網(wǎng)絡(luò)第層具有個(gè)節(jié)點(diǎn),那么。注意此時(shí)我們網(wǎng)絡(luò)共有個(gè)參數(shù)需要優(yōu)化。
為了求得梯度,我們關(guān)心參數(shù)關(guān)于損失函數(shù)的的導(dǎo)數(shù):,但似乎難以把簡(jiǎn)單地與損失函數(shù)聯(lián)系起來(lái)。問(wèn)題在哪里呢?事實(shí)上,在單參數(shù)的情況下,我們通過(guò)鏈?zhǔn)椒▌t,成功建立第一層網(wǎng)絡(luò)的參數(shù)與最終損失函數(shù)的聯(lián)系。譬如,,的改變影響函數(shù)的值,而連鎖反應(yīng)影響到的函數(shù)結(jié)果。那么,對(duì)于值的改變,會(huì)影響,從而影響。通過(guò)的線性變換(因?yàn)?,的改變將會(huì)影響到每一個(gè)。
將上面的過(guò)程寫(xiě)下來(lái):
可以通過(guò)上式不斷展開(kāi)進(jìn)行其梯度計(jì)算。這個(gè)方式相當(dāng)于我們枚舉了?每一條?改變對(duì)最終損失函數(shù)影響的?路徑。通過(guò)簡(jiǎn)單使用鏈?zhǔn)椒▌t,我們得到了一個(gè)?指數(shù)級(jí)?復(fù)雜度的梯度計(jì)算方法。稍仔細(xì)觀察可以發(fā)現(xiàn),這個(gè)是一個(gè)典型的遞歸結(jié)構(gòu)(為什么呢?因?yàn)槎x的是一個(gè)遞歸結(jié)構(gòu)),可以采用動(dòng)態(tài)規(guī)劃(Dynamic programming)方法,通過(guò)記錄子問(wèn)題答案的進(jìn)行快速求解。設(shè)用于動(dòng)態(tài)規(guī)劃的狀態(tài)記錄。我們先解決最后一層的邊界情況:
上式為通用形式。對(duì)于Sigmoid, Tanh等形式的element-wise激活函數(shù),因?yàn)榭梢詫?xiě)成的形式,所示上式可以簡(jiǎn)化為:
即該情況下,最后一層的關(guān)于的導(dǎo)數(shù)與損失函數(shù)在導(dǎo)數(shù)和最后一層激活函數(shù)在的導(dǎo)數(shù)相關(guān)。注意當(dāng)選擇了具體的損失函數(shù)和每層的激活函數(shù)后,與也被唯一確定了。下面我們看看動(dòng)態(tài)規(guī)劃的?狀態(tài)轉(zhuǎn)移?情況:
成功建立與的遞推關(guān)系,所以整個(gè)網(wǎng)絡(luò)的可以被計(jì)算出。在確定了后,我們的對(duì)于任意參數(shù)的導(dǎo)數(shù)可以被簡(jiǎn)單表示出:
至此,我們通過(guò)鏈?zhǔn)椒▌t和動(dòng)態(tài)規(guī)劃的思想,不失一般性的得到了后向傳播算法的推導(dǎo)。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/5607057.html
總結(jié)
以上是生活随笔為你收集整理的当我们在谈深度学习时,到底在谈论什么(二)--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 当我们在谈深度学习时,到底在谈论什么(一
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习