機(jī)器學(xué)習(xí)可以看做是數(shù)理統(tǒng)計(jì)的一個(gè)應(yīng)用猜旬,在數(shù)理統(tǒng)計(jì)中一個(gè)常見(jiàn)的任務(wù)就是擬合,也就是給定一些樣本點(diǎn)弟胀,用合適的曲線揭示這些樣本點(diǎn)隨著自變量的變化關(guān)系狸演。
深度學(xué)習(xí)同樣也是為了這個(gè)目的,只不過(guò)此時(shí)滑黔,樣本點(diǎn)不再限定為(x, y)點(diǎn)對(duì)笆包,而可以是由向量、矩陣等等組成的廣義點(diǎn)對(duì)(X,Y)略荡。而此時(shí)庵佣,(X,Y)之間的關(guān)系也變得十分復(fù)雜,不太可能用一個(gè)簡(jiǎn)單函數(shù)表示汛兜。然而巴粪,人們發(fā)現(xiàn)可以用多層神經(jīng)網(wǎng)絡(luò)來(lái)表示這樣的關(guān)系,而多層神經(jīng)網(wǎng)絡(luò)的本質(zhì)就是一個(gè)多層復(fù)合的函數(shù)序无。
借用網(wǎng)上找到的一幅圖[1]验毡,來(lái)直觀描繪一下這種復(fù)合關(guān)系。
其對(duì)應(yīng)的表達(dá)式如下:
上面式中的Wij就是相鄰兩層神經(jīng)元之間的權(quán)值帝嗡,它們就是深度學(xué)習(xí)需要學(xué)習(xí)的參數(shù)晶通,也就相當(dāng)于直線擬合y=k*x+b中的待求參數(shù)k和b。
和直線擬合一樣哟玷,深度學(xué)習(xí)的訓(xùn)練也有一個(gè)目標(biāo)函數(shù)狮辽,這個(gè)目標(biāo)函數(shù)定義了什么樣的參數(shù)才算一組“好參數(shù)”。在機(jī)器學(xué)習(xí)中巢寡,一般是采用成本函數(shù)(cost function)喉脖,然后,訓(xùn)練目標(biāo)就是通過(guò)調(diào)整每一個(gè)權(quán)值Wij來(lái)使得cost達(dá)到最小抑月。cost函數(shù)也可以看成是由所有待求權(quán)值Wij為自變量的復(fù)合函數(shù)树叽,而且基本上是非凸的,即含有許多局部最小值谦絮。但實(shí)際中發(fā)現(xiàn)题诵,采用我們常用的梯度下降法就可以有效的求解最小化cost函數(shù)的問(wèn)題洁仗。
凸函數(shù)是一個(gè)定義在某個(gè)向量空間的凸子集C(區(qū)間)上的實(shí)值函數(shù)f,而且對(duì)于凸子集C中任意兩個(gè)向量, f((x1+x2)/2)>=(f(x1)+f(x2))/2,則f(x)是定義在凸子集c中的凸函數(shù)性锭。(定義和圖片來(lái)自百度百科)
梯度下降法需要給定一個(gè)初始點(diǎn)赠潦,并求出該點(diǎn)的梯度向量,然后以負(fù)梯度方向為搜索方向草冈,以一定的步長(zhǎng)進(jìn)行搜索她奥,從而確定下一個(gè)迭代點(diǎn),再計(jì)算該新的梯度方向怎棱,如此重復(fù)直到cost收斂哩俭。那么如何計(jì)算梯度呢?
假設(shè)我們把cost函數(shù)表示為
那么它的梯度向量[2]就等于
其中
表示正交單位向量蹄殃。為此携茂,我們需求出cost函數(shù)H對(duì)每一個(gè)權(quán)值Wij的偏導(dǎo)數(shù)。而BP算法正是用來(lái)求解這種多層復(fù)合函數(shù)的所有變量的偏導(dǎo)數(shù)的利器诅岩。
我們以求e=(a+b)*(b+1)的偏導(dǎo)[3]為例讳苦。
它的復(fù)合關(guān)系畫出圖可以表示如下:
在圖中,引入了中間變量c,d吩谦。
為了求出a=2, b=1時(shí)鸳谜,e的梯度,我們可以先利用偏導(dǎo)數(shù)的定義求出不同層之間相鄰節(jié)點(diǎn)的偏導(dǎo)關(guān)系式廷,如下圖所示咐扭。
利用鏈?zhǔn)椒▌t我們知道:
以及
鏈?zhǔn)椒▌t在上圖中的意義是什么呢?其實(shí)不難發(fā)現(xiàn)
的值等于從a到e的路徑上的偏導(dǎo)值的乘積滑废,而
的值等于從b到e的路徑1(b-c-e)上的偏導(dǎo)值的乘積加上路徑2(b-d-e)上的偏導(dǎo)值的乘積蝗肪。也就是說(shuō),對(duì)于上層節(jié)點(diǎn)p和下層節(jié)點(diǎn)q蠕趁,要求得
需要找到從q節(jié)點(diǎn)到p節(jié)點(diǎn)的所有路徑薛闪,并且對(duì)每條路徑,求得該路徑上的所有偏導(dǎo)數(shù)之乘積俺陋,然后將所有路徑的 “乘積” 累加起來(lái)才能得到
的值豁延。
大家也許已經(jīng)注意到,這樣做是十分冗余的腊状,因?yàn)楹芏?b>路徑被重復(fù)訪問(wèn)了诱咏。比如上圖中,a-c-e和b-c-e就都走了路徑c-e缴挖。對(duì)于權(quán)值動(dòng)則數(shù)萬(wàn)的深度模型中的神經(jīng)網(wǎng)絡(luò)袋狞,這樣的冗余所導(dǎo)致的計(jì)算量是相當(dāng)大的。
同樣是利用鏈?zhǔn)椒▌t,BP算法則機(jī)智地避開了這種冗余硕并,它對(duì)于每一個(gè)路徑只訪問(wèn)一次就能求頂點(diǎn)對(duì)所有下層節(jié)點(diǎn)的偏導(dǎo)值法焰。
正如反向傳播(BP)算法的名字說(shuō)的那樣,BP算法是反向(自上往下)來(lái)尋找路徑的倔毙。
從最上層的節(jié)點(diǎn)e開始,初始值為1乙濒,以層為單位進(jìn)行處理陕赃。對(duì)于e的下一層的所有子節(jié)點(diǎn),將1乘以e到某個(gè)節(jié)點(diǎn)路徑上的偏導(dǎo)值颁股,并將結(jié)果“堆放”在該子節(jié)點(diǎn)中么库。等e所在的層按照這樣傳播完畢后,第二層的每一個(gè)節(jié)點(diǎn)都“堆放"些值甘有,然后我們針對(duì)每個(gè)節(jié)點(diǎn)诉儒,把它里面所有“堆放”的值求和,就得到了頂點(diǎn)e對(duì)該節(jié)點(diǎn)的偏導(dǎo)亏掀。然后將這些第二層的節(jié)點(diǎn)各自作為起始頂點(diǎn)忱反,初始值設(shè)為頂點(diǎn)e對(duì)它們的偏導(dǎo)值,以"層"為單位重復(fù)上述傳播過(guò)程滤愕,即可求出頂點(diǎn)e對(duì)每一層節(jié)點(diǎn)的偏導(dǎo)數(shù)温算。
以上圖為例,節(jié)點(diǎn)c接受e發(fā)送的1*2并堆放起來(lái)间影,節(jié)點(diǎn)d接受e發(fā)送的1*3并堆放起來(lái)注竿,至此第二層完畢,求出各節(jié)點(diǎn)總堆放量并繼續(xù)向下一層發(fā)送魂贬。節(jié)點(diǎn)c向a發(fā)送2*1并對(duì)堆放起來(lái)巩割,節(jié)點(diǎn)c向b發(fā)送2*1并堆放起來(lái),節(jié)點(diǎn)d向b發(fā)送3*1并堆放起來(lái)付燥,至此第三層完畢宣谈,節(jié)點(diǎn)a堆放起來(lái)的量為2,節(jié)點(diǎn)b堆放起來(lái)的量為2*1+3*1=5, 即頂點(diǎn)e對(duì)b的偏導(dǎo)數(shù)為5.
舉個(gè)不太恰當(dāng)?shù)睦踊幔绻焉蠄D中的箭頭表示欠錢的關(guān)系蒲祈,即c→e表示e欠c的錢。以a, b為例萝嘁,直接計(jì)算e對(duì)它們倆的偏導(dǎo)相當(dāng)于a, b各自去討薪梆掸。a向c討薪,c說(shuō)e欠我錢牙言,你向他要酸钦。于是a又跨過(guò)c去找e。b先向c討薪咱枉,同樣又轉(zhuǎn)向e卑硫,b又向d討薪徒恋,再次轉(zhuǎn)向e』斗可以看到入挣,追款之路,充滿艱辛硝拧,而且還有重復(fù)径筏,即a, b 都從c轉(zhuǎn)向e。
而BP算法就是主動(dòng)還款障陶。e把所欠之錢還給c滋恬,d。c抱究,d收到錢恢氯,樂(lè)呵地把錢轉(zhuǎn)發(fā)給了a,b鼓寺,皆大歡喜勋拟。
------------------------------------------------------------------
【參考文獻(xiàn)】
[1]技術(shù)向:一文讀懂卷積神經(jīng)網(wǎng)絡(luò)CNN
[2]Gradient
[3]http://colah.github.io/posts/2015-08-Backprop/
其他推薦網(wǎng)頁(yè):
2.Neural networks and deep learning
作者:胡逸夫
鏈接:https://www.zhihu.com/question/27239198/answer/89853077
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)侄刽,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處指黎。