承接上文神經網絡基礎篇二
sigmoid函數計算梯度的問題
最早的神經網絡就是用Sigmoid計算梯度的
sigmoid激活函數每一點的梯度都可以計算,但問題就是随着x變大或變小,梯度約等于0,導緻梯度不進行更新,不進行傳播。
x w1 w2 w3 w4
反向傳播計算w3的梯度,如果梯w3的梯度為0,就會導緻w2和w1的梯度為0。
這就是sigmoid函數帶來的問題,一旦數值較大或較小,會發生梯度消失的現象。
由于個别層的影響使得梯度最後計算完之後,變成了0,因為它是一個乘法的操作,計算到某一層的梯度為0,後面就不會更新了。
改進
Relu函數借鑒了Max函數,90%都使用這個激活函數。
小于0都等于0,大于0都等于x本身,梯度為1,不會出現梯度消失即不會變成0。
數據預處理
不同的預處理效果會使得模型的效果發生很大的差異!
拿到數據之後,不能直接輸入到神經網絡當中,得稍微的做一些變換,比如做一些标準化操作。
在标準化操作當中,第一步就是把這個地方變成中心化即每個地方的實際坐标值減去均值就可以了,得到了以圓點為中心對稱的結果,接下來進行各種維度的放縮或擴充即除上标準差就可以了,這就是數據的标準化。所有的數據問題都會涉及到數據預處理操作,這是一個比較常見的标準化操作。
參數初始化
參數初始化同樣非常重要,通常我們都使用随機策略來進行參數初始化。
比如有一隻貓的圖片數據,經過一個3x4(即D=3,H=4)的權重參數矩陣變換,對3x4的權重參數矩陣進行初始化,先随機生成初始化參數,然後在數據訓練的過程中,反向傳播重新計算參數值。
不能讓權重參數矩陣中的不同的權重參數值差異過大,比如有些w很大,大部分w都很小,希望它盡可能穩定一些,當把初始化後的值乘以0.01,得到的值就都會很小。
Drop Out
整個網絡架構中層數比較多,每一層神經元個數也比較多,就會使得整個神經網絡過拟合風險比較高。
上圖是全連接的神經網絡,每一個神經元都和其他神經元全連在一起,隻用其中一部分行不行?
在神經網絡訓練過程中,每一層随機的殺死一部分神經元。每一層畫叉的神經元就表示這次前向傳播、反向傳播就不帶畫叉的神經元玩了。更新權重參數,這些畫叉的神經元保持原來的參數不變,不參與。每層畫叉的神經元是随機被選中的,隻是這次訓練不使用,并不是永遠不用。梯度下降算法要疊代很多次,疊代10萬次或100萬次都有可能,每次訓練的時候随機“殺死”部分神經元,訓練的網絡架構就會簡單些,防止網絡模型太複雜。
drop-out是一個比例,比如50%,在訓練的過程中,每次有50%的神經元是不參與這次訓練的,隻訓練剩下的50%。
小結
對數據先進行預處理,比如文本數據去一些停用詞,圖像數據做一些标準化操作等。預處理完之後,得到輸入層,往神經網絡中輸入數據的3個特征x1,x2,x3,輸入層和隐藏層就是一組權重參數矩陣連接起來的,w1是3x4的權重參數矩陣,表示左邊連接3個,左邊連接4個,再對中間層做不限制的特征提取,比如做個8層、10層。最後一組權重參數就是要得到的最終輸出結果。隐藏層做完之後,再用激活函數做下變換,一般用relu函數,這就是前向傳播的過程。最後用輸出的結果,計算loss值。
整個神經網絡就圍繞一件事情去做的:什麼樣的權重參數最适合于當前的這個任務。神經網絡做完之後,99%都會過拟合,一旦過拟合了,就需要想什麼樣的解決方案是最合适的,一種方式就是加上正則化懲罰項。
計算機視覺CV領域的發展
這個是imagenet圖像分類的錯誤率,y軸是錯誤率。10,11年使用的是傳統的機器學習算法,12年開始使用深度學習。Human表示人類用肉眼識别的錯誤率,大概5%,16年用深度學習網絡達到的錯誤率已經遠低于人類了。
計算機視覺領域的任務用深度學習算法做的比較多。
卷積神經網絡能夠想到的傳統的計算機視覺任務或者說以後可能出現的,全部都可以由卷積神經網絡CNN來做。比如常見的檢測任務,在圖片或視屏當中進行檢測或追蹤現在做的都已經比較好了,之前的準确率可能沒有那麼高,卷積神經網絡來了之後,準确率已經比較高了。
分類與檢索
分類就是最傳統的計算機視覺任務,這張圖片是什麼。檢索是輸入一張圖片返回相似的結果。比如淘寶中,看中一個商品,可能不知道它的名字叫什麼,不知道它具體的型号,把它拍照下來,進行拍照的搜索,就會返回一些同款,這個就是檢索,也可以用神經網絡來做。
判斷這張圖片是什麼,然後在當前這個領域中哪些商品跟它的相似度是比較高的。神經網絡和卷積神經網絡都是用來做特征提取的。比如有了A和B特征,都是一個300維的向量,就可以去計算相似度。所以核心一點就是怎樣做特征提取。
傳統的神經網絡在特征提取上有一些問題,比如權重參數矩陣特别大:一張圖片784個像素點,隐層有128個神經元,那麼中間的矩陣就是784x128,訓練花的時間就會比較多,過拟合的風險也挺高。
卷積神經網絡在圖像數據(視屏也是一張張圖片組成的)上一定程度解決了該問題。
卷積神經網絡的應用
現在計算機視覺和醫學結合的比較多了,比如做一些細胞檢測、人體透視圖、動态圖結果的分析;OCR字體識别;停車場進出自動擡杆;車牌的識别;标志的識别等。所有任務但凡和圖像搭上邊的,都能用神經網絡或卷積神經網絡實現出來。
提取臉部關鍵點特征,分析判斷是否是一個人或者判斷這個人是誰。
卷積神經網絡和傳統網絡的區别
上圖左側是傳統的神經網絡NN,上圖右側是卷積神經網絡CNN。左側看起來像二維的,右側看起來像三維的。
傳統網絡輸入層說784,這是表示784個像素點,這個隻是一列特征。而卷積神經網絡不是輸入784個像素點,而是輸入的是一張原始的圖片,比如28x28x1,這是三維的,不是一列,不是一個向量,不是一個特征,而是一個長方體矩陣,三維的(h * w * c),所以接下來處理的數據都是三維的。不會先把數據拉成一個向量,而是直接對這個樣本就是圖像數據進行特征提取。
卷積神經網絡的整體架構
輸入層比如輸入一張28x28x3的圖像數據;卷積層是提取特征;池化層是壓縮特征;全連接層就是通過一組權重參數比如784x50把輸入層和隐層連接在一起。輸出層是每個類别的概率值,比如貓的概率0.82,狗的概率0.56。
卷積到底做了什麼事情
輸入數據是一張32x32x3的貓的圖像數據,它邊界的特征和它中間眼睛的特征以及它嘴的特征,肯定不同,對不同的區域提取出來不同的特征,得知道一點,它在邊界的特征沒有那麼重要,它的眼睛特征很重要,胡須特征也很重要,把一張圖像分成了不同的好多部分,不同的地方要區别進行處理。
在做卷積的過程當中,需要先把圖像進行一個分割,來分割成很多的小塊。
每一小塊它不是一個像素點,一個眼睛可能是一個小區域,一個小區域它可能是由多個像素點組成的。
比如1這小塊假設是3x3x3的區域,對1号區域進行特征提取,選一個特征,再對2号區域選一個特征,再對3号區域選一個特征。
怎麼才能再上圖深藍色區域(3x3x3區域)選擇出來它的一個特征值?
在神經網絡當中用一組權重參數達到一個特征值,在卷積神經網絡中也是一樣用一組權重參數得到的。
首先看第一個3x3的區域,下圖左上角深色部分,其中的332 001 312是輸入數據,012 220 012是權重參數,要找的還是最好的這組權重參數矩陣,使得特征提取完之後,效果能夠做好。
正常情況下它是一個3x3x3 三維的數據,三維的不好畫,先畫一個一維度的了解其原理。
在這個區域選擇一個特征,得到綠色特征圖中的第一個特征值12.0,表示當前這個3x3的區域,它的代表值就是12。然後再往右移動一個單元格,
再在這個區域選擇一個特征,得到綠色特征圖中的第二個特征值12.0,依次類推,就可以得到這樣的一個特征圖。
一開始是3x3的原始輸入數據,經過一次卷積完之後,得到了一個特征圖,特征圖中的值就是當前得到的一個結果了。
卷積的過程首先把一張圖像分割成每個小區域,不同的區域得到的特征值是不同的,然後通過一個計算方法計算每個區域對應的特征值是多少。
圖像顔色通道
常見的顔色通道是3顔色通道(RGB),32x32x3 這個3就表示3顔色通道(RGB),3分成了上圖的右側3個部分,分别是R、G、B,實際當在做計算的過程中,要每個顔色通道分别計算,R通道單獨計算,G通道單獨計算,B通道單獨計算,最終再把每個通道卷積計算的結果加到一起就可以了。
上圖右側部分紅、綠、藍分别表示RGB三個顔色通道。
比如R通道計算完的結果是1,G通道計算完之後的結果是3,B通道計算完之後的結果是2,最終結果就是1 2 3=6。
上面演示的對一個小區域提取特征值的過程是一個顔色通道的,實際上需要3個通道分别去計算的。
上圖隻是畫了2個顔色通道R、B,對每一個立體區域進行特征提取,得到最終的一個特征值。
接下來再詳細說下整個卷積的過程
輸入數據是7x7x3(h w c)的數據,通道數就是第三個維度c(channel),每個顔色通道的大小都是7x7,3個顔色通道的維度都是一樣的,它們合在一起就是7x7x3的輸入數據,然後分區域對當前的輸入數據進行特征提取。
filter w0 先随機初始化一組權重參數矩陣,filter中的第三個維度必須是3和輸入數據的第三個維度必須是一緻的。3x3就是一個卷積核大小,表示在原始數據中每3x3的小區域進行一個特征選擇。filter中的前兩個h和w表示在原始圖像區域中每多大的區域選擇一個特征即多大的區域對應一個值。
在filter wo分别對R、G、B進行計算,每個通道裡面的權重參數值都是不同的,所以要區分對待不同的一個輸入數據即同一份輸入數據當中不同的部分。
所有的卷積網絡中都是用的内積做的計算即對應位置相乘,結果相加。
比如上圖R通道的值是怎麼計算的:
原屬數據中像素點為0的位置就忽略,因為0乘以任何數都為0。那麼就剩下四個1的位置,每個對應位置上的2個值相乘,然後再相加即1x(-1) 1x0 1x1 1x0=0
同理G通道的計算結果為2,B通道的計算結果為0,3個通道的結果相加就為2,這個就是filter w0内積計算的結果,一個特征提取的值。再加上一個偏置項b(圖中給小b初始化的值為1),所以最終結果為3,即圖中綠色圈中的部分3。在原始圖中第一個小區域3x3,3個顔色通道,這樣的一個區域對應的特征值為3。
特征圖的個數
filter w0得到一個特征圖,filter w1對應一個特征圖,所以這裡有2個特征圖,相當于2中不同的特征提取方法,得到兩種不同的結果。
w0和w1的規格相同,都是3x3的。
輸出的結果是3x3x2的,2表示深度即特征圖的個數,filter w0生成一個特征圖,filter w1生成一個特征圖。
對于同樣的輸入數據來說,可以多粒度的進行特征提取,不光要用一個filter,一個卷積核進行特征提取,可以用很多個卷積核進行特征提取,f1,f2,f3....f100,選擇不同的矩陣,得到的特征結果是不同的,那就可以讓特征更豐富起來了。
上圖有6個不同的特征圖,每個都是28x28x1的,把每個特征圖堆疊在一起即28x28x6,相當于得到了一個比較豐富的特征。
以上隻是對一個區域做了一次卷積的過程,還有第二個區域,第三個區域.....
第一個區域做完之後,往右平移了2個單元格,
計算方式都是一樣的。
滑動完所有的單元格之後,那也就計算完了。
卷積完之後,得到特征圖,就算提取出了一個特征。
原始的輸入比如一張圖片,第一步low-level fetaure,這個隻是一個形象的解釋,實際并沒有高低之分,一開始先粗粒度的提取下大緻的特征,然後在細粒度的提取出來一些中間特征,最後再提取處一些組成起來的高級特征,然後把高級特征去做分類,它其實在說這樣一個事情: 一張輸入數據來了之後,做一次卷積是不夠的,而是需要做好多次卷積。除了第一次卷積,每次的卷積都是在前一次卷積得到的特征圖的基礎之前做的。
首先開始輸入一張32x32x3的圖像數據,做了一次卷積之後,得到特征圖,特征圖也是三維的hwc,hw是特征圖的大小,c是有多少個特征圖。
上圖第一個卷積層,用了6個不同的filter即6個不同的卷積核,那得到的特征圖的深度是6
這個是一個特征圖,特征圖中有6個不同的圖疊加在一起。
相當于在原始圖像上卷積一次得到一個中間特征,再在中間特征上做卷積,相當于對特征做了進一步的特征提取,所以卷積是一步一步去做的。
第二次卷積,卷積核是5x5x6,前一個卷積核是5x5x3,卷積核的第三個值一定和前一個輸入是一緻的。
用10個不同的filter來執行這樣一次卷積,執行完之後,得到一個特征圖,深度是10。經過多次卷積得到的特征,才認為是比較好用的。和神經網絡中,加一個隐層,再加一個隐層,道理都是一樣的。卷積可以無限次的往下堆疊,但不追求無限次。
卷積層涉及到的參數
步長為1的,得到的特征圖是5x5的,步長為2的,得到的特征圖是3x3的,對于當前任務來說,輸入的數據都是一樣的,能移動的窗口越多,得到的特征值越多,得到的特征圖也會越大。當步長比較小的時候,慢慢的去提取特征,細粒度的去提取特征,這樣得到的特征是比較豐富的。當步長比較大的時候,大刀闊斧的去提取特征,滑動比較大,得到的特征比較少,得到的特征沒有那麼豐富。這個就是步長對結果的影響。一般情況下,對于圖像任務來說,選擇步長為1就可以了,但有些任務跟圖像不太一樣,比如文本任務,卷積神經網絡不隻是做計算機視覺,文本數據以及其他數據都能用上。
比如一個文本數據,最終還想做一個分類任務,二分類,判斷1或0。
文本數據:我今天去打籃球。
對于圖像數據來說都是3x3x3或5x5x3,h和w都是一樣的,一般情況下都是用正方形的一個大小來做卷積。
而文本任務比如1x3 表示在文本中的“我今天”這3個字,3個字提取一個特征或5個字提取一個特征,所以步長大小的設置跟具體任務相關的。
一般情況下圖像任務,常用的步長為1。
步長越小,得到的特征越多,計算的效率越慢。
但在文本任務中不同的任務設置的卷積核大小可以不同,設置的步長也可以不一樣,你可以2個字2個字的滑,也可以3個字3個字的滑動。
步長為3表示兩個區域相同位置相距為3個詞。區域大小為5表示卷積核大小為5即一個區域的長度是5。
上圖藍色區域是第一次卷積到的區域,綠色區域是第二次卷積到的區域,紅色部分是第三次卷積到的區域。
粉紅色橢圓圈住的區域是第一個區域和第二個區域重合(交接點)的部分。黃色橢圓圈住的區域是第二個區域和第三個區域重合的部分。
那重合部分的值比如粉紅色橢圓中的一個點0
它對最終的計算結果3和-5都有貢獻。
藍色區域和綠色區域分别得到的值是3和-5,重合地方的值貢獻大,對最終結果影響比較多,因為它可以影響2個地方。其他位置的值即非重合的部分,隻跟filter計算了一次。有些點對計算結果天生有優勢,計算又多,有些點天生沒有這個優勢,計算又少。什麼樣的點多,什麼樣的點少呢?越往邊界的點能被利用的次數越少,越往中間的點,最終被利用的次數越多,那怎麼解決這個問題呢?怎麼使得邊界的點能被計算的多點呢?
原本數據的大小是5x5的,就是上圖紫色的點,表示原始輸入就這麼大,最左上角的1就是邊界點,如果在這個邊界外面再加一圈0,原本是邊界的點就不是邊界了,既然不是邊界的點,那能被利用的次數就更多了,一定程度上彌補了邊界信息缺失的問題、邊界提取特征利用不充分的問題。這就是padding要做的事情,隻加了一圈0,卻使得邊界特征能被充分利用,讓卷積神經網絡能更公平的對待邊界特征。
為什麼拿0做填充?
若是拿1做填充,在和filter做計算的時候,新添加進來的東西會對最終結果有影響,但是添加0呢,0乘以任何數都為0,此時相當于最外層隻是添加了一個擴充,而不會對最終結果産生影響,而我們也希望所添加的内容不會對結果産生影響,所以它叫zero padding即以0為值,進行邊界擴充,按自己的需求添加1圈、2圈、3圈,通常情況下添加一圈就夠了。為了能整除,為了能更好的計算,自己選擇填充的次數,這就是邊緣填充。
文本數據也會涉及到邊緣填充,比如有2個文本,一個文本有100個詞,另一個文本中有120個詞,兩者的大小是不一樣的,這是不行的,因為基本前提是輸入大小必須是一樣的。則在100個詞的文本後面填充20個0就行了。
最終計算的時候要得到多少個特征圖,比如要得到10個特征圖,那卷積核就是10。
這10個卷積核中的每個卷積核中的值都是不一樣的,一開始進行随機初始化,分别進行各自參數的更新。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!