1.從最簡單的神經(jīng)網(wǎng)絡(luò)基本開始
X=[x1,x2,x3]T,是一個(gè)三維的樣本點(diǎn)
現(xiàn)在我們有一個(gè)4*3的權(quán)重矩陣W1
W1=[w11,w12,w13
? ? ? w21,w22,w23
? ? ? w31,w32,w33
? ? ? w41,w42,w43
? ? ? ? ]
由于y = WX卤材,而W1是4*3的矩陣,X是3*1的矩陣术吗,所以最后得出來的y是4*1的矩陣[y1,y2,y3,y4]T
可以看到對(duì)于權(quán)重矩陣的行數(shù)藐翎,我們可以對(duì)應(yīng)理解為一個(gè)小濾波器
例如W1[0],就是W1中的第一個(gè)濾波器用來提取特征昆庇,這一行中的每一個(gè)權(quán)重都和輸入樣本的每一個(gè)維度整吆,也就是神經(jīng)元結(jié)點(diǎn)相乘表蝙,假設(shè)第一層的濾波器W1有4層府蛇,那么就有4個(gè)濾波器汇跨,一共會(huì)產(chǎn)生4個(gè)輸出
同理我們再看從y到z的過程穷遂,最后輸出一個(gè)神經(jīng)元結(jié)點(diǎn)娱据,因此第二層的濾波器只有1個(gè)濾波器忌穿,W2是一個(gè)一行的濾波器伴网,且權(quán)重個(gè)數(shù)與y的神經(jīng)元個(gè)數(shù)相同W2 = 1*4
z = W2*y? ------> 1*4? ? ^? 4*1澡腾,最后得到1*1的單神經(jīng)元輸出。
我們回頭看邏輯回歸可以發(fā)現(xiàn)毅糟,LR應(yīng)該算一個(gè)沒有隱藏層的最簡單的神經(jīng)網(wǎng)絡(luò)
而根據(jù)我們的知識(shí)知道這里面的一個(gè)一行四列的權(quán)重W是一個(gè)線性分類器,所以我們更正之前的說法坟乾,W應(yīng)該是多個(gè)線性分類器的疊加明吩,如果W有n行則代表有n個(gè)線性分類器疊加在一起構(gòu)成n印荔,而單純的線性疊加很難達(dá)到很好的效果仍律,這也就是為什么后面會(huì)使用激活函數(shù)引入非線性因素(你可以想象成把之前的線性分類器邊界進(jìn)行彎曲)同時(shí)水泉,我之前所說的濾波器更多的時(shí)候使用在CNN之中茶行,即Filter用來提取特征畔师。
2.卷積神經(jīng)網(wǎng)絡(luò)
在理解卷積神經(jīng)網(wǎng)絡(luò)之前看锉,我們需要先遷移性地理解一點(diǎn)伯铣,那就是腔寡,將所在層的通道數(shù)類比于1中的神經(jīng)元結(jié)點(diǎn)的個(gè)數(shù)放前,把卷積核類比于1中的線性分類器個(gè)數(shù)葱她,我們知道有幾個(gè)分類器就會(huì)有多少輸出吨些,所以在進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)的過程中豪墅,輸出結(jié)果與輸入的維度或者說通道數(shù)無關(guān)但校,只與卷積核的個(gè)數(shù)有關(guān)术裸。
假設(shè)我們有一張圖片作為輸入袭艺,我們知道它是三通道的猾编,那么可以將這張圖片表示為W*H*3轰传,實(shí)際上看源碼也知道圖片用ndarray格式保存的時(shí)候也是這種形式获茬,然后假設(shè)我們有5個(gè)Kenel,那么我們實(shí)際的輸出與kenel的個(gè)數(shù)是相等的恕曲,即輸出了5張?zhí)卣鲌D,那么具體是什么工作的呢茸俭?
以R,G,B三通道為例,共有5個(gè)卷積核w1,w2,w3,w4,w5率翅,那么與1中類似冕臭,我們先選取卷積核w1,注意這里有一個(gè)卷積核深度的概念,該層所有的卷積核深度等該層輸入的通道數(shù)托慨,可以理解為上面1中所說的w11,w12,w13.
以三通道來表示
我們的卷積核應(yīng)該定義深度厚棵,個(gè)數(shù),個(gè)數(shù)我們可以隨意設(shè)置彬犯,而深度必須保持與當(dāng)前輸入的通道數(shù)一直
W=[w11,w12,w13
? ? ? w21,w22,w23
? ? ? w31,w32,w33
? ? ? w41,w42,w43
? ? ? ? ]
那么這里有4個(gè)卷積核,例如W1 = [w11,w12,w13]我們分別將這三個(gè)特征圖與每個(gè)通道進(jìn)行卷積然后相加得到最終輸入即
y1 = w11*R+w12*G+w13*B
然后我們有4個(gè)卷積核查吊,因此最終輸出的通道數(shù)為4.
類比:
通道數(shù)----->神經(jīng)元結(jié)點(diǎn)個(gè)數(shù)谐区,? ? ? ? 你可以把這些通道數(shù)想象成從上往下依次展開的
卷積核深度------->每一個(gè)線性分類器的特征W維度 ,? 你可以把每個(gè)通道對(duì)應(yīng)每個(gè)WIJ的過程想象成W*X的過程
卷積核個(gè)數(shù)---------->線性分類器個(gè)數(shù)逻卖,? ? ? ? 你可以想象成到底有幾個(gè)分類器宋列。
有了以上概念來一波立即推
當(dāng)前輸入共有m個(gè)通道,那么我們應(yīng)該用多深的卷積核评也?
立即推m個(gè)通道對(duì)應(yīng)m個(gè)神經(jīng)元結(jié)點(diǎn)虚茶,就應(yīng)該有m個(gè)權(quán)重值诈乒,因此卷積核深度為m;
如果我用了n個(gè)卷積核消约,那么輸出多少個(gè)通道的特征圖?
立即推氯材,n個(gè)卷積核對(duì)應(yīng)了n次卷積相加的過程,因此共有n個(gè)通道的輸出。
因此當(dāng)我們定義模型的時(shí)候裂七,我們只需要關(guān)心卷積核的個(gè)數(shù)是多少即可,因?yàn)榫矸e核的深度由當(dāng)前的通道數(shù)決定芭逝,假設(shè)最后一層卷積層用到了M個(gè)卷積核蒲稳,立即推,最后一層的深度為M,這也是深度學(xué)習(xí)的深度體現(xiàn)啊犬。
現(xiàn)在讓來看一下卷積神經(jīng)網(wǎng)絡(luò)中一些常用的概念睡腿,和基本組成部件。
假設(shè)我們的輸入為(Width=W,Height=W,Depth=N)代表了N張長寬均為W的特征圖孽锥,我們的卷積層為(Kenel_size=F*F,Depth=N,Num=M),代表了M個(gè)深度為N的尺寸為F*F的卷積核,假定我們進(jìn)行卷積操作的步長Stride = S,Padding為P,那么首先由N張?zhí)卣鲌D與一個(gè)卷積核的N層進(jìn)行卷積操作得到新的邊長為W* =(W-F+2P)/S + 1(請(qǐng)牢記這個(gè)公式)的N張新特征圖,我們把這N張?zhí)卣鲌D按對(duì)應(yīng)位置相加得到一張完整的新特征圖介粘,即完成了一個(gè)卷積核特征提取的操作爵憎,我們有M個(gè)卷積核,所以我們最終得到的輸出為
(Width=(W-F+2P)/S + 1,Height=(W-F+2P)/S + 1,Depth=M)
之后再進(jìn)行池化操作,一般采取最大池化督弓,計(jì)算方式一樣狂塘,假設(shè)步長為1
Padding
如果我們想使得輸出的特征圖尺寸與原特征圖尺寸一致,我們就可以使用padding,padding=1代表我們在原圖的周圍加上一圈0。
Tensorflow中有主要有兩種padding方式,“Same”和“Valid”趟径,代表當(dāng)濾波器或池化到邊界的時(shí)候是否自動(dòng)補(bǔ)0惧蛹,Same方式結(jié)果向上取整装畅,例如我們的輸入邊長為5,步長為2,? ?5/2=2.5迅诬,向上取整得到3俏蛮,則最終輸出一張3*3的特征圖。
池化層
池化層的作用就是減小特征圖的面積,使用最大池化,提取到的是特征圖中每一小塊區(qū)域中取值最大到的那個(gè)數(shù),一定程度上代表了提取出特征圖中的關(guān)鍵信息。例如我們只關(guān)心圖像的輪廓和紋理變化。
降低輸出規(guī)模雕凹,增加可解釋性汽摹;
光滑信息,避免丟失更多信息。
對(duì)于沒有經(jīng)過最大池化的圖片廓鞠,從三維角度來看砌们,取值高高低低影兽,而提取出的都是每塊區(qū)域中最大的值捐名,相當(dāng)于使得數(shù)據(jù)區(qū)域光滑。
而現(xiàn)在1個(gè)點(diǎn)就能代表以前的4個(gè)點(diǎn),一定程度上代表增大了我們的感知野踱葛。
此外還有平均池化,即取區(qū)域中的平均值,有點(diǎn)像均值濾波。
激活函數(shù)
FC層(全連接層)
在完成所有卷積層之后决采,將所有輸出特征圖扁平化展開成一個(gè)列向量
例如3張2*2的特征圖可以按順序展開成1個(gè)12個(gè)神經(jīng)元結(jié)點(diǎn)的輸出旺嬉,然后我們用12個(gè)帶有12個(gè)參數(shù)的線性分類器雨效,得到一個(gè)新的12個(gè)神經(jīng)元結(jié)點(diǎn)的FC層据悔,最后根據(jù)我們的需要連接上一個(gè)softmax函數(shù)或者sigmoid函數(shù)即可。
正則化
L1 =?
L2 =?
與傳統(tǒng)機(jī)器學(xué)習(xí)方法一致躯肌,都是為了抑制模型復(fù)雜度校仑。
損失函數(shù)
一般使用交叉熵?fù)p失函數(shù)
對(duì)于sigmoid函數(shù)直接帶入以下交叉熵?fù)p失函數(shù)中
y代表標(biāo)簽值羊瘩,y^代表預(yù)測值
對(duì)于softmax睬捶,由于是多分類介劫,假設(shè)有1,2,3,4,5共5個(gè)分類誉碴,我們的輸出為output=[0.1,????0.2,????0.4? ? 0.1? ? 0.2]
由于我們采用的one-hot編碼,所以當(dāng)我們看某一類時(shí)慨默,其它的類別都為0
例如我們要算第3類時(shí)的損失函數(shù)
Loss = -[0*In0.1+0*In0.2+1*In0.4+0*In0.1+0*In0.2]
? ? ? ? ?= -In0.4
即
反向傳播
這里先補(bǔ)充一個(gè)概念就是張量,我們可以把張量理解為數(shù)字容器;
0維張量:一個(gè)數(shù)
1維張量:一個(gè)數(shù)組
2維張量:一個(gè)矩陣
3維張量:以特征圖來說就是三維張量? ? ? 高*寬*通道數(shù)
4維張量:以卷積核來說就是四維張量? ? ? ?高*寬*通道數(shù)*卷積核個(gè)數(shù)
再說反向傳播
先從最簡單的神經(jīng)元結(jié)點(diǎn)之間的反向傳播開始
反向傳播就是遵從我們的鏈?zhǔn)角髮?dǎo)法則
假設(shè)我們要求最后的損失值相對(duì)于圖中W的偏導(dǎo)數(shù)顶别,也就是W的變化會(huì)給損失值帶來怎樣的變化谋旦,假設(shè)這個(gè)偏導(dǎo)數(shù)為負(fù)數(shù)指蚜,則代表W增大時(shí)損失函數(shù)減小是辕,而W減小時(shí)損失函數(shù)增大棺聊,我們更新W的時(shí)候就用這個(gè)梯度去更新 W = W -?*祟同,讓我們來驗(yàn)證一下這個(gè)公式广辰,偏導(dǎo)數(shù)為正的時(shí)候,W增大會(huì)使得損失函數(shù)增大所森,因此我們要減小W,對(duì)應(yīng)于公式正好W是減小的,同理如果偏導(dǎo)數(shù)為負(fù)谴咸,則W增大會(huì)使得損失函數(shù)減小,因此我們就增大這個(gè)值。
具體來求一求L對(duì)W的偏導(dǎo)帆焕,由以下鏈?zhǔn)角髮?dǎo)法則
然后我們一層一層來算
第一層假設(shè)我們最后用的是二分之一平方損失函數(shù)钥星,那么第一層求導(dǎo)數(shù)值為,其中y為標(biāo)簽值魂莫。
第二層讼溺,是一個(gè)激活函數(shù)的求導(dǎo),假設(shè)我們使用的是Relu激活函數(shù),如果Z的值大于0,那么導(dǎo)數(shù)就為1扩灯,否則就為0,假設(shè)我們現(xiàn)在Z值大于0,那么這一層的導(dǎo)數(shù)值就為1
第三層坑鱼,由于Z = W*a(L-1) + b,因此Z對(duì)W求導(dǎo)就是a(L-1)
最后我們把他們乘起來得到L對(duì)W的偏導(dǎo)值為(aL-y)*a(L-1)
然后計(jì)算W = W -?*(aL-y)*a(L-1)即可
注意當(dāng)我們用的批量的時(shí)候(aL-y)應(yīng)該改為
然后很重要一點(diǎn),假設(shè)我們再要求L-2層的權(quán)重的時(shí)候狭园,
我們要先求最后的結(jié)果對(duì)a(l-1)層的偏導(dǎo)結(jié)果抑胎,我們把上面的第三步改一下就是
而a(L-1)又是由W(l-2)*a(l-2)+b(l-2)和一層激活層得到
因此
可以看出來對(duì)于每個(gè)數(shù)值上的點(diǎn)都有對(duì)應(yīng)的偏導(dǎo)數(shù)破托,且對(duì)權(quán)值調(diào)整起著非常重要的作用
例如我記錄序臂,那么我再用a(l-1)對(duì)W(l-2)進(jìn)行求偏導(dǎo)侮叮,然后根據(jù)鏈?zhǔn)椒▌t相乘即可
所以對(duì)于每個(gè)數(shù)值點(diǎn)孔庭,我們有:損失函數(shù)對(duì)該數(shù)值點(diǎn)處的偏導(dǎo)數(shù),再求改點(diǎn)對(duì)前面的權(quán)重或偏置的導(dǎo)數(shù),相乘即可哪怔。
理解了這一點(diǎn)茉盏,就很好理解卷積神經(jīng)網(wǎng)絡(luò)中反向傳播中的一些操作。
池化層的反向傳播
從池化層開始罚斗,假設(shè)我們是最大池化
以圖為例饲趋,我們計(jì)算并記錄下了6這個(gè)點(diǎn)的導(dǎo)數(shù)讨衣,由于是最大池化燎孟,那么傳播到它的之前的激活層的時(shí)候1處的導(dǎo)數(shù)為0,1處的導(dǎo)數(shù)為0,5處的導(dǎo)數(shù)為0,6處的導(dǎo)數(shù)為1,你可以這樣理解,由于我們采取到了池化這個(gè)降采樣操作,所以1,1,5這些點(diǎn)都廢了,沒啥用,甭調(diào)節(jié)它了橄浓;
對(duì)于平均池化來說重抖,第一塊兒的值為(1+1+5+6)/4恨统,所以每一塊兒的權(quán)重都是0.25掩宜,所以每一塊兒的權(quán)重都是6這個(gè)位置計(jì)算所得的權(quán)重乘以0.25.
卷積層的反向傳播
數(shù)值部分的傳播
這里引用知乎大神南柯一夢寧沉淪的圖(上面的部分圖也取自他的圖)
我們在理解前向反向傳播過程中始終抓住一個(gè)核心點(diǎn),就是前向傳播的時(shí)候桦沉,哪些點(diǎn)對(duì)哪些點(diǎn)造成了什么影響渴语,然后我們反向把這些影響給傳播回去腹暖,傳播就是求導(dǎo),導(dǎo)數(shù)相乘的過程翰萨。例如上圖脏答,我們求得了C出的導(dǎo)數(shù),然后我們相求A出的導(dǎo)數(shù)亩鬼,怎么求殖告?看C是怎么通過A得到的嘛,顯然是C = A*B +C*D + E*F + G*H雳锋,顯然我們這里只關(guān)心A黄绩,通過C對(duì)A求導(dǎo),得到B玷过,因此A處的導(dǎo)數(shù)值等于C處的導(dǎo)數(shù)值乘以B爽丹。
現(xiàn)在我們把A移動(dòng)到如圖所示的位置,還是抓住核心問題辛蚊,這個(gè)點(diǎn)對(duì)后面哪些點(diǎn)產(chǎn)生了哪些影響粤蝎,我們不斷滑動(dòng)卷積核,發(fā)現(xiàn)A參與了A*C得到D袋马,然后還參與了A*B得到E初澎,那么A處的導(dǎo)數(shù)值就應(yīng)該等于D處的導(dǎo)數(shù)值乘以C加上E處的導(dǎo)數(shù)值乘以B。
卷積核的反向傳播
與上面類似虑凛,我們始終關(guān)注一個(gè)核心點(diǎn)碑宴,我們要求的位置通過何種方式對(duì)哪些位置產(chǎn)生了影響软啼,以下圖來表示
在結(jié)果特征圖里,我簡單粗暴用de1--de4來代表4個(gè)位置的反向傳播誤差延柠,然后我們想對(duì)卷積核中的1,2,3,4幾個(gè)參數(shù)進(jìn)行反向傳播祸挪,我們就看1,1參與了與A相乘然后輸出de1位置贞间,1與B相乘然后輸出de2位置贿条,所以1處的誤差為de1*A+de2*B,1處的權(quán)重應(yīng)該更新為W-*(de1*A+de2*B)
但是注意一點(diǎn)的是,我們現(xiàn)在計(jì)算的是某一個(gè)通道乘以其中一個(gè)卷積核的某一個(gè)通道榜跌,而有幾個(gè)卷積核闪唆,就能得到幾張?zhí)卣鲌D,如下表示
假設(shè)我們輸入了兩張?zhí)卣鲌D钓葫,然后用兩個(gè)深度為2的卷積核會(huì)得到兩個(gè)特征圖輸出悄蕾,那么我們在計(jì)算A點(diǎn)的誤差時(shí),應(yīng)該等于deC*B+deD*E,即疊加础浮!
綜上帆调!所有的反向傳播,統(tǒng)統(tǒng)從一個(gè)角度考慮豆同,就不需要記憶了番刊,很簡單,要求的位置對(duì)哪些點(diǎn)產(chǎn)生了哪些影響影锈,然后通過求導(dǎo)和鏈?zhǔn)椒▌t芹务,然后相加就能得到這一點(diǎn)的導(dǎo)數(shù)。
dropout
就是讓某些結(jié)點(diǎn)工作鸭廷,某些結(jié)點(diǎn)不工作枣抱,可以類比于隨機(jī)森林,每次都選擇若干個(gè)特征進(jìn)行構(gòu)造決策樹辆床,每一層的dropout都可以設(shè)置一定的比例佳晶,例如dropout = 0.6,則代表有百分之六十的神經(jīng)元工作讼载,每一次的前向傳播和誤差反饋調(diào)節(jié)都可以看成是一棵決策樹轿秧,每次dropout選擇不工作的神經(jīng)元都是隨機(jī)選擇的,那么每一次權(quán)重更新過程都可以類比為構(gòu)造一棵決策樹咨堤。
以該圖為例菇篡,如果沒有dropout,那么調(diào)節(jié)的權(quán)重個(gè)數(shù)為5*5+5*5+5*1 = 55個(gè)吱型;
用圖中dropout方式連接逸贾,則只有激活的神經(jīng)元對(duì)應(yīng)的權(quán)重參與調(diào)節(jié),共3*2+2*3+3*1=15個(gè)津滞;
如此看來使用dropout可以大大減輕我們的計(jì)算量铝侵,而且更重要的原因是dropout的方式很像隨機(jī)森林的投票模式,這樣能夠大大增強(qiáng)網(wǎng)絡(luò)的泛化能力触徐,對(duì)抗過擬合情況的出現(xiàn)咪鲜。
Batch Normalization(BN)
如果數(shù)據(jù)集體不呈正態(tài)分布,那么使用一些激活函數(shù)撞鹉,例如sigmoid的時(shí)候疟丙,大量的數(shù)據(jù)可能集中在很小的調(diào)節(jié)范圍內(nèi),極其容易產(chǎn)生梯度消失鸟雏。
可以看到享郊,如果數(shù)據(jù)都集中落在較大(或者較小)的區(qū)域孝鹊,那么梯度就會(huì)很小很小趨近于0炊琉,到之后后面的網(wǎng)絡(luò)基本上無法調(diào)節(jié),最后定格在這里了又活,我們的模型很可能不會(huì)收斂苔咪。
BN層連接在激活層之前。
CNN整體架構(gòu)
梯度彌散與梯度爆炸
梯度彌散就是在梯度反向傳播中遵從鏈?zhǔn)椒▌t柳骄,所有梯度相乘后可能出現(xiàn)一個(gè)很小的值团赏,而梯度又代表了權(quán)重的更新快慢和方向,所以如果梯度消失耐薯,很有可能收斂地非常慢甚至不收斂舔清;
對(duì)應(yīng)梯度彌散的就是梯度爆炸,如果梯度值大于1曲初,則經(jīng)過若干層鏈?zhǔn)絺鞑ブ筇遐耍苡锌赡芴荻瘸芍笖?shù)級(jí)增長,這樣造成的效果也很有可能不能收斂复斥。