其實(shí)我本來(lái)是不打算學(xué)這個(gè)算法的。雖然這個(gè)算法很基礎(chǔ)草讶,但是跟數(shù)學(xué)太緊密了,滿屏的公式讓我有種欲哭無(wú)淚的感覺炉菲《檎剑可是,每次看到深度學(xué)習(xí)一些新技術(shù)的時(shí)候拍霜,這個(gè)算法(或者其變體)總要跳出來(lái)干擾我的理解嘱丢。就跟隔壁老王一樣,你不摸清楚他的來(lái)龍去脈祠饺,總感覺心里不踏實(shí)越驻。
我能怎么辦?我也很絕望啊缀旁!在飽受其困擾之后记劈,我決定一探究竟,自己實(shí)現(xiàn)以下該算法诵棵,順便學(xué)習(xí)以下python以及NumPy抠蚣。這代碼一寫,好家伙履澳,我發(fā)現(xiàn)之前對(duì)epoch和mini_batch的理解都是有偏差的嘶窄。果然還是要實(shí)踐才能發(fā)現(xiàn)我只是錯(cuò)誤的以為我以為我懂了。
[注:已經(jīng)了解基礎(chǔ)概念的距贷,希望看證明或者詳細(xì)介紹backpropagation的柄冲,不需要看本篇水文,直接跳到下一篇]
要講Backpropagation忠蝗,得從基礎(chǔ)的神經(jīng)網(wǎng)絡(luò)說(shuō)起(前一篇有講到神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)等這些詞是嘛意思)现横。神經(jīng)網(wǎng)絡(luò)有許多種形式,比較基礎(chǔ)的一種稱之為feedforward神經(jīng)網(wǎng)絡(luò)(另外還有recurrent神經(jīng)網(wǎng)絡(luò)阁最,這里不涉及)戒祠。它是啥意思呢,盜一張圖說(shuō)明一下:
簡(jiǎn)單點(diǎn)說(shuō)速种,就是前一層的輸出姜盈,作為后一層的輸入,后一層的輸出(或者中間值)并不對(duì)前一層造成影響配阵。
圖中馏颂,每個(gè)圓圈,代表一個(gè)神經(jīng)元棋傍。每一根箭頭救拉,代表一個(gè)權(quán)重(weight, w),它表示輸出神經(jīng)元與接收神經(jīng)元之間聯(lián)系的強(qiáng)弱瘫拣。每個(gè)圓圈(除了第一層的)會(huì)有一個(gè)偏差(bias亿絮, b)對(duì)應(yīng),表示一個(gè)修正麸拄,是一個(gè)與前一層神經(jīng)元無(wú)關(guān)的常數(shù)派昧。
如果認(rèn)為前一層的輸出是x的話, 后一層跟前一層關(guān)聯(lián)的輸入就是
這玩意用矩陣的方式表示斗锭,就是wx(這里w和x都是矩陣, 對(duì)于圖中第一層和第二層而言地淀,w是
4*6
的矩陣失球,x是6*1
的矩陣,為啥我要說(shuō)這么細(xì),因?yàn)檫@樣子對(duì)初學(xué)者來(lái)說(shuō)才直觀)实苞。但這里我們還需要加入一個(gè)常量起到偏移作用豺撑, 所以輸入就是z=wx+b
(注意,這里都是矩陣)黔牵。但是這樣還沒完聪轿,單純這樣的變化,并不能讓神經(jīng)元的表達(dá)能力逆天猾浦,所以發(fā)明這些的人陆错,又給神經(jīng)元再套了一個(gè)函數(shù),稱之為激活函數(shù)(Activation Function)金赦,它為神經(jīng)元的輸出加入非線性特性音瓷,增強(qiáng)了神經(jīng)網(wǎng)絡(luò)對(duì)訓(xùn)練數(shù)據(jù)的學(xué)習(xí)能力。所以夹抗,神經(jīng)元的輸出就變成了:
這里的a就是上文中的x绳慎。把這個(gè)公式不斷地應(yīng)用到下一層,就可以計(jì)算出整個(gè)神經(jīng)網(wǎng)絡(luò)的輸出漠烧。
深度學(xué)習(xí)的過(guò)程杏愤,說(shuō)白了,就是先隨機(jī)
(當(dāng)然并不是完全隨機(jī)已脓,里面藏著一些貓膩)生成每一層的w和b珊楼,然后用一些方法不斷對(duì)它們進(jìn)行修正。憑什么修正呢摆舟?數(shù)據(jù)亥曹!你得預(yù)先準(zhǔn)備好一堆數(shù)據(jù),每個(gè)數(shù)據(jù)的意思就是給定一個(gè)輸入(x)恨诱, 應(yīng)該得到什么輸出(d)媳瞪。因?yàn)橛辛溯斎胫螅欢梢愿鶕?jù)上面的公式和已有的w和b(我們已經(jīng)隨機(jī)好了初始值)照宝, 算出一個(gè)最終輸出(y)蛇受,算的過(guò)程就是上面這個(gè)公式一層一層迭代過(guò)去。這個(gè)輸出(y)跟真正的輸出(d)不一樣厕鹃。學(xué)習(xí)過(guò)程就是不斷調(diào)整w和b兢仰, 讓d和y之間的差距盡量小。
這里又有一個(gè)地方要注意了剂碴,圖中最后一層只有一個(gè)神經(jīng)元把将,但是實(shí)際上最后一層可以有多個(gè)神經(jīng)元的,因此y是一個(gè)矩陣忆矛。相應(yīng)的d也是一個(gè)矩陣察蹲。那怎么定義差距呢请垛?下面兩個(gè)公式說(shuō)明了一種定義方式:
這個(gè)看起來(lái)很直觀吧,就跟幾何上的“距離”類似洽议。不過(guò)再次強(qiáng)調(diào)一下宗收,這只是損失函數(shù)的一種形式(搞機(jī)器學(xué)習(xí)的學(xué)者們還發(fā)明了一堆奇形怪狀的損失函數(shù),腦洞之大亚兄,我只能說(shuō)在下心服口服)混稽。
本來(lái)只想寫backpropagation的,因?yàn)榫W(wǎng)上很多推導(dǎo)不全审胚,或者講得不夠直白匈勋。但沒想到只是介紹最最基礎(chǔ)的東西, 就這么多了膳叨, 那剩余的部分颓影,待下回分解吧。