本人水平有限闷旧,如果有錯(cuò)誤的地方长豁,希望各位大神能夠不吝賜教,及時(shí)指正忙灼。
按照慣例匠襟,喝水不忘掘井人,首先要感謝發(fā)明人工神經(jīng)網(wǎng)絡(luò)的那些前輩该园。其次酸舍,也要感謝Sean的引領(lǐng),把我?guī)脒@一行里初,否則啃勉,光靠我自己摸索,會(huì)花去更多的時(shí)間双妨、精力淮阐。最后,要感謝無數(shù)的人刁品,那些對(duì)我的思考方式產(chǎn)生影響的人泣特。
現(xiàn)在每掌握一種新的算法,心情都是喜憂參半挑随,喜的是状您,技多不壓身,又多了一個(gè)解決問題的手段,憂的是膏孟,這手段來錢快么眯分?好像不能指望其預(yù)測(cè)股價(jià)啊。
在神經(jīng)網(wǎng)絡(luò)模型中柒桑,需要用到導(dǎo)數(shù)的概念弊决,如果還不是太了解導(dǎo)數(shù)(偏導(dǎo)、鏈?zhǔn)椒▌t)魁淳,這里給出以下幾種辦法:
1丢氢、先行補(bǔ)導(dǎo)數(shù)的知識(shí)
2、跳過相關(guān)推導(dǎo)過程
3先改、請(qǐng)我喝一杯咖啡,我把半桶水的功力全部傳授給你
4蒸走、硬著頭皮看下推導(dǎo)
5仇奶、或許我可能會(huì)稍微解釋一下
那個(gè)有關(guān)神經(jīng)的生物圖,我就不再畫了比驻,應(yīng)該每個(gè)人都有一個(gè)印象了该溯,主要還是畫畫技術(shù)不過關(guān),但是計(jì)算機(jī)領(lǐng)域神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖還是要畫的别惦。
(感覺畫圖不太適合自己狈茉,為了節(jié)省時(shí)間,部分線條采用手工繪制掸掸,圖畫只能將就將就了)
(大概也只有靈魂畫手才能畫出這樣的圖了吧氯庆,希望拙劣的圖片不會(huì)影響文字的講解)
當(dāng)然,最右邊的藍(lán)色橢圓N扰付,也可以有多個(gè)堤撵。
聰明的你,看圖應(yīng)該可以猜到了羽莺,既然最右的藍(lán)色橢圓N可以有多個(gè)实昨,那就意味著,神經(jīng)網(wǎng)絡(luò)模型既可以用來作為二分類盐固,也可以用來作為多分類荒给,而且它是非線性回歸的。
在繼續(xù)下去之前刁卜,有些地方需要解釋一下志电,藍(lán)色橢圓中,N的右上角的字符长酗,表示N所在的列數(shù)溪北,N右下角的字符,表示它是該列的第幾個(gè)N;每一根褐色和藍(lán)色的手繪線條之拨,都代表了相應(yīng)的權(quán)重茉继。最右邊的黑色箭頭,代表著輸出蚀乔;紅色的框框表示烁竭,框內(nèi)的都是隱藏層,很明顯吉挣,除了第一層的輸入以及最后一層的那個(gè)N之外派撕,其余都屬于隱藏層。
(題外話睬魂,另一個(gè)同樣是我個(gè)人覺得有必要再說明一下的是:采用“輸入”终吼、“權(quán)重”這樣的字眼是不是有點(diǎn)那啥.... 沒錯(cuò),我完全可以用x, w氯哮,甚至一些希臘字母來代替际跪,但是,你們應(yīng)該發(fā)現(xiàn)了喉钢,我這里使用了'N'姆打,僅僅是它是“Neural”的首字母縮寫,其它的相關(guān)文章肠虽,可能這里會(huì)使用其它的代號(hào)幔戏,這正是數(shù)學(xué)美麗的地方,也是容易讓人產(chǎn)生錯(cuò)覺的地方税课,從小到大我們習(xí)慣接受了X闲延,X是變量,但是變量不一定就是X韩玩,完全可以用B慨代、i、n啸如、H侍匙、a、o叮雳,這些來表示變量想暗,甚至一些稀奇古怪的符號(hào),比如五角星帘不,或者這里的N+右上角的字符说莫,甚至我也可以就用Binhao來做變量,你可以把Binhao看作一個(gè)單獨(dú)的變量寞焙,也可以把它理解為之前B储狭、i互婿、n、H辽狈、a慈参、o,6個(gè)變量的乘積刮萌,放在這里作為輸入驮配,同理,權(quán)重也可以出現(xiàn)五花八門的表現(xiàn)形式着茸,以致于壮锻,我們經(jīng)常會(huì)產(chǎn)生錯(cuò)覺,在看不同作者的文章時(shí)涮阔,經(jīng)常會(huì)問自己“他講的和我想的是同一個(gè)事物么猜绣?”“我之前大概學(xué)的是假的吧?”敬特,所以我們應(yīng)該明白途事,這些都是數(shù)學(xué)的變幻,其本質(zhì)是相通的擅羞。)
繼續(xù),這里的每一個(gè)藍(lán)色的橢圓里的N會(huì)干些什么呢义图?它就是每一個(gè)連接到它的輸入乘以權(quán)重的總和减俏,再作為另一個(gè)被稱之為Activation函數(shù)的輸入。這里碱工,我們先不討論Activation函數(shù)又是什么娃承,暫且認(rèn)為它是一個(gè)關(guān)于N的函數(shù),那么怕篷,每一個(gè)N具體至少包括以下兩個(gè)步驟:
(1).? z = ∑wx(1....n)
(2).? y = f(z)
[限于鍵盤輸入的限制历筝,也是為了節(jié)省時(shí)間,這里的w(權(quán)重)廊谓,x(輸入)其實(shí)是代表了向量梳猪,因?yàn)閺膱D里就能看到了,一串的輸入和一串的權(quán)重]
接下去的問題是蒸痹,這樣得到的z是不是可以直接作為參數(shù)給f()然后activation傳遞到下一層了呢春弥?不行,我們還需要給它設(shè)置一個(gè)閾值叠荠,假設(shè)匿沛,就叫作T吧,那就是z要減去T榛鼎,如果這個(gè)相減結(jié)果大于0逃呼,才能輸出鳖孤。你可能會(huì)問為什么,為什么要來一個(gè)閾值抡笼,ok苏揣,我們現(xiàn)在討論的是神經(jīng)網(wǎng)絡(luò),就是人工模擬大腦神經(jīng)的活動(dòng)蔫缸,實(shí)際上真實(shí)的神經(jīng)被激活需要脈沖達(dá)到一定的電位腿准,也就是臨界閾值,然后才會(huì)對(duì)累積的外界信號(hào)做出響應(yīng)進(jìn)行傳遞拾碌。(T也就是R代碼實(shí)現(xiàn)時(shí)的“Bias Terms”偏差項(xiàng)吐葱,也可以看作y=wx + b的b(w、x是向量)校翔。所以你看弟跑,代號(hào)并不重要,理清本質(zhì)比較關(guān)鍵)
其實(shí)防症,我們不需要為這個(gè)T而煩惱孟辑,數(shù)學(xué)很美麗,而且會(huì)變幻蔫敲,我們?cè)缇陀龅竭^饲嗽,我可以完全把T也看作一個(gè)恒定的輸入,它的權(quán)重是-1奈嘿,這樣一來貌虾,z=∑wx 其實(shí)下標(biāo)就是從0開始?z=∑wx? (0...n) 【再次說明,限于鍵盤輸入的限制裙犹,也是為了節(jié)省時(shí)間尽狠,你們應(yīng)該能理解其實(shí)它真正是什么樣子的。這正好也印證了之前提到的叶圃,不要拘泥于公式的表象用了什么變量和展現(xiàn)形式】我們最終要對(duì)模型進(jìn)行訓(xùn)練袄膏,就是不斷調(diào)整所有這些權(quán)重(包括這個(gè)閾值)和隱藏層數(shù),最后達(dá)到比較理想的效果掺冠。
是時(shí)候來討論一波Activation函數(shù)了沉馆。為什么需要Activation函數(shù),首先德崭,模仿神經(jīng)悍及,累積的能量達(dá)到臨界閾值需要被激活,其次接癌,Sean已經(jīng)給我們解釋過了心赶,沒有激活函數(shù)的話,就完完全全是線性的了缺猛,那么中間一大堆隱藏層就顯得毫無意義缨叫,所以需要一個(gè)Activation函數(shù)來加入非線性的元素椭符。那么,我們需要什么樣的Activation函數(shù)耻姥?它必須得非線性销钝,而且我們希望它能把數(shù)據(jù)映射到0-1之間,這樣可以應(yīng)用到概率上琐簇,進(jìn)行分類蒸健。(Sean其實(shí)已經(jīng)給我們講了好幾個(gè)Activation函數(shù)了)
先來看看,假設(shè)我們之前沒有采用數(shù)學(xué)技巧把T給變幻了婉商,Activation函數(shù)會(huì)是怎樣的:
大致是這樣的似忧,在遇到T(大于T)之前,不會(huì)被激活丈秩,所以一直是0盯捌,遇到T之后,開始被激活蘑秽,變?yōu)?饺著。
再來看看,我們采用數(shù)學(xué)技巧肠牲,把T變幻了之后幼衰,Activation函數(shù)又是怎么樣的:
T被作為一個(gè)恒定輸入,權(quán)重為-1缀雳,提前被減掉了渡嚣。
看起來不錯(cuò),數(shù)值都被映射到了0-1之間俏险,那它就是我們要的Activation函數(shù)了么?不扬绪,不是竖独。理由很簡(jiǎn)單,本文開頭挤牛,已經(jīng)提到了莹痢,神經(jīng)網(wǎng)絡(luò)需要用到導(dǎo)數(shù)知識(shí),而導(dǎo)數(shù)的一個(gè)先決條件是墓赴,在包含求導(dǎo)的這一點(diǎn)的某區(qū)間內(nèi)竞膳,函數(shù)曲線必須是連續(xù)的,平滑的诫硕。這個(gè)顯然不是坦辟。
既然要連續(xù),平滑章办,于是我們找到了它(Sigmoid函數(shù)):
就是它了锉走。(當(dāng)然別的也是可以的滨彻,Sean都已經(jīng)提到過)
看看還有什么遺漏的,哦挪蹭,對(duì)亭饵,那些個(gè)隱藏層,既然它們叫做隱藏層梁厉,那就真的可以把它們看作是黑盒子辜羊,所以,簡(jiǎn)化下圖-1和圖-2词顾,得到下圖:
難看是難看了一點(diǎn)八秃,將就一下吧。但不影響接下去的重點(diǎn)计技。
從神經(jīng)網(wǎng)絡(luò)角度喜德,我們簡(jiǎn)單地把輸出看作是:y = f(w,x) 輸出y是向量w和x的函數(shù)(鍵盤輸入限制,不畫那根箭頭了垮媒,但是心里要清楚舍悯,這是向量)
而實(shí)際的結(jié)果則是:a = g(x) 實(shí)際值a是輸入x的函數(shù)(x是向量,理由同上)睡雇。
寫到這里萌衬,你應(yīng)該已經(jīng)明白了,判斷一個(gè)神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練結(jié)果好壞它抱,其實(shí)就是?1/2 * [(a - y)^2]的值要最小秕豫。這里1/2沒有其它意義,純碎是數(shù)學(xué)便利观蓄,求導(dǎo)方便混移。這個(gè)1/2 * [(a - y)^2]的圖像是個(gè)凸函數(shù),求最小值即可侮穿,也就是切線斜率為0的點(diǎn)歌径。
但是,Sean曾經(jīng)告訴過我們亲茅,從山頂下坡到最低點(diǎn)的例子了回铛,所以,我打算求個(gè)最大值克锣,也就是從山腳爬坡到最高點(diǎn)茵肃,所以這個(gè)函數(shù)要變一下:
-1/2 * [(a - y)^2],加了個(gè)負(fù)號(hào)袭祟,則求最小值就變?yōu)榍笞畲笾盗搜椴小M购瘮?shù)變凹函數(shù)了。梯度下降改為梯度上升巾乳。
在這之前胚膊,先補(bǔ)充講解一下等高線圖故俐。因?yàn)槲疫€沒辦法展示多維平面的山坡圖,所以等高線圖就是一個(gè)不錯(cuò)的備選紊婉。遐想一下從山頂俯瞰一座山药版,看到的應(yīng)該是如下的圖:
越里面的圓,表示的高度越高喻犁,最高的高度在最中間的圓心槽片,每個(gè)圓上的所有點(diǎn)的高度都是相同的。
假設(shè)最開始隨機(jī)的幾個(gè)權(quán)限w肢础,在靠近外圍的圓还栓,那我所要做的就是調(diào)整w,使它往高處走传轰。令 p = -1/2 * [(a - y)^2]
根據(jù)導(dǎo)數(shù)和向量的知識(shí)剩盒,我們可以知道,delta w = 步長(zhǎng) *(p對(duì)橫向數(shù)值的求導(dǎo) * 橫向的單位向量 + p對(duì)縱向數(shù)值的求導(dǎo) * 縱向的單位向量)
步長(zhǎng)可以看作希臘字母lamda慨蛙,是為了控制權(quán)重w不要變化得太快辽聊,這個(gè)是我們自己可以設(shè)置的值。
那至于接下去該怎么求得這個(gè)最優(yōu)權(quán)重呢期贫?它和哪些因素有關(guān)呢跟匆?不妨從最簡(jiǎn)單的一個(gè)單一輸入神經(jīng)網(wǎng)絡(luò)模型入手。
x是輸入通砍,w1玛臂,w2是權(quán)重,p1封孙,p2是爬坡中途某個(gè)階段的輸出迹冤,S是Sigmoid函數(shù)。
現(xiàn)在我們要利用鏈?zhǔn)椒▌t求P的偏導(dǎo)數(shù)虎忌。
【簡(jiǎn)單講下鏈?zhǔn)椒▌t:
s = 1/2 * gt^2泡徙,物理學(xué)的重力加速度g,在這里可以看作常數(shù)呐籽,那么唯一的變量就是t了锋勺,對(duì)t求導(dǎo)應(yīng)該都會(huì)蚀瘸,gt狡蝶。假設(shè) t又等于x^2,現(xiàn)在我要求s對(duì)x求導(dǎo)贮勃,那么就是在s對(duì)t求導(dǎo)的基礎(chǔ)上贪惹,再乘以t對(duì)x的求導(dǎo)(即x^2的導(dǎo)數(shù)),就是gt*2x(當(dāng)然這個(gè)例子不太好寂嘉,直接1/2 * gx^4也能求導(dǎo)奏瞬,但是主要是體會(huì)下鏈?zhǔn)角髮?dǎo)的規(guī)則)枫绅。同理,圖中P對(duì)y求導(dǎo)硼端,即-(a-y) * (-1) = (a-y)并淋,減法的導(dǎo)數(shù)等于分別求導(dǎo)再減法,a是實(shí)際值常數(shù)珍昨,導(dǎo)數(shù)為0县耽,y對(duì)自己的導(dǎo)數(shù)是1×偷洌】
ΔP/Δw2 =?ΔP/Δy *?Δy/Δw2 = (a-y) *?Δy/Δp2 *?Δp2/Δw2 = (a-y) *?Δy/Δp2 * z
【p2兔毙,我們知道,就是z乘以權(quán)重w2兄春,所以p2對(duì)w2求偏導(dǎo)澎剥,就是 z的導(dǎo)數(shù)乘以w2 + z乘以w2的導(dǎo)數(shù)(乘法導(dǎo)數(shù)規(guī)則),z是常數(shù)導(dǎo)數(shù)為0赶舆,w2的導(dǎo)數(shù)是1哑姚,所以和等于z。什么是偏導(dǎo)涌乳?偏導(dǎo)的求法其實(shí)和導(dǎo)數(shù)的求法是一樣的蜻懦,只不過多了一點(diǎn),這里對(duì)w2求偏導(dǎo)夕晓,那么w2以外的都看作是常數(shù)宛乃。】
ΔP/Δw1 =?ΔP/Δy *?Δy/Δw1 = (a-y) *?Δy/Δp2 *?Δp2/Δw1?
? ? ? ? ? ? ? = (a-y) *?Δy/Δp2 *?Δp2/Δz *Δz/Δw1 =?(a-y) *?Δy/Δp2 * w2 *Δz/Δw1
? ? ? ? ? ? ? =?(a-y) *?Δy/Δp2 * w2 *?Δz/Δp1 *?Δp1/Δw1
? ? ? ? ? ?? ?= (a-y) *?Δy/Δp2 * w2 *?Δz/Δp1 * x
現(xiàn)在來看一下分別對(duì)w1和w2求偏導(dǎo)后的公式蒸辆,Δy/Δp2 征炼,Δz/Δp1 這兩個(gè)的導(dǎo)數(shù)我們還不得而知,可是我們還有圖-9躬贡,不是么谆奥?p2是y的輸入,p1是z的輸入拂玻,y是p2經(jīng)過Sigmoid后的輸出酸些,
z是p1經(jīng)過Sigmoid后的輸出,所以Δy/Δp2 檐蚜,Δz/Δp1其實(shí)就是求Sigmoid的導(dǎo)數(shù)魄懂。
那就來對(duì)Sigmoid求導(dǎo):
1/(1 + e^(-α))? 【圖-5里,e的指數(shù)使用了z闯第,但是這里為了避免混淆市栗,所以改用希臘字母α。同時(shí)再次表明,數(shù)學(xué)公式變量是隨便可以展現(xiàn)的填帽,關(guān)鍵在于其核心思想】
也就等于 (1 + e^(-α))^(-1)
根據(jù)鏈?zhǔn)椒▌t:= [-(1 + e^(-α) )^(-2)] * e^(-α) * (-1)? = e^(-α) / (1 + e^(-a))^2
接下去還是畫圖吧蛛淋,不然有點(diǎn)眼花繚亂。圖雖然丑了點(diǎn)篡腌,但便于直觀褐荷。
根據(jù)圖-10繼續(xù)運(yùn)算的結(jié)果,Sigmoid函數(shù) S =?1/(1 + e^(-α))嘹悼,?求導(dǎo)的結(jié)果诚卸,S*(1-S)。
再回過頭去看绘迁,Δy/Δp2 合溺,Δz/Δp1其實(shí)分別是y*(1-y),z*(1-z)缀台。
所以:
ΔP/Δw2 = (a-y) * y*(1-y) * z
ΔP/Δw1?= (a-y) * y*(1-y) * w2 * z*(1-z) * x
從公式看出棠赛,w2依賴于鄰近的y和z,而w1除了依賴于鄰近的x膛腐、y和z之外睛约,還依賴于w2。
即便我們有N多個(gè)層的神經(jīng)元哲身,每個(gè)權(quán)重只依賴于它相鄰的值以及上一層(我們這個(gè)例子辩涝,w2在w1之前)的權(quán)重。這就是反向神經(jīng)網(wǎng)絡(luò)傳播勘天。我們剛剛從右端推導(dǎo)到了左端怔揩。根據(jù)最終結(jié)果,首先推算出最鄰近的w值脯丝,再算出下一列的w值商膊,然后一列一列追溯上去,直到最末端宠进,而且每一列的計(jì)算量差不多是相同的晕拆,不會(huì)有很大差別。
【說句題外話材蹬,在N多個(gè)算法中实幕,我們已經(jīng)看到很多類似的技巧,比如閾值替代堤器,凹凸函數(shù)求極值昆庇,決策規(guī)則,概率....等等吼旧。包括這個(gè)凰锡,“一個(gè)變量的狀態(tài)只和它相鄰的數(shù)值有關(guān)聯(lián)”未舟,很容易讓我想起馬爾科夫模型圈暗,這就給我了一個(gè)啟發(fā)掂为,很多算法可以試著找出它們技巧的關(guān)鍵點(diǎn),聯(lián)合起來學(xué)習(xí)】
神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練员串,會(huì)存在過擬合的問題勇哗,因?yàn)樗鋵?shí)類似于曲線擬合。但曲線擬合可以有其它很多種方式寸齐,所以欲诺,有一種觀點(diǎn)我是非常認(rèn)同,并沒有哪一個(gè)特別神奇的算法(包括后面可能繼續(xù)寫到的SVM算法)渺鹦。在面對(duì)不同的問題時(shí)扰法,重要的是如何將原始數(shù)據(jù)轉(zhuǎn)換成輸入向量,來有效反應(yīng)問題本質(zhì)毅厚,這個(gè)我覺得才是最難的塞颁。Sean即便把他那套預(yù)測(cè)股價(jià)走勢(shì)的算法告訴我,我也肯定不會(huì)超越他吸耿,因?yàn)閷⒃紨?shù)據(jù)轉(zhuǎn)換成輸入向量這一點(diǎn)祠锣,至少在股票問題上,我肯定是完敗的咽安。
本人水平有限伴网,如果有錯(cuò)誤的地方,希望各位大神能夠不吝賜教妆棒,及時(shí)指正澡腾。
拋磚引玉,獻(xiàn)丑糕珊,獻(xiàn)丑蛋铆。