Ⅰ ResNet網路
ResNet (Resial Neural Network,殘差網路)由微軟研究院何凱明等人提出的,通過在深度神經網路中加入殘差單元(Resial Unit)使得訓練深度比以前更加高效。ResNet在2015年的ILSVRC比賽中奪得冠軍,ResNet的結構可以極快的加速超深神經網路的訓練,模型准確率也有非常大的提升。
在ResNet之前,瑞士教授Schimidhuber提出了Highway Network,其原理與ResNet非常相似。通常認為神經網路的深度對其性能非常重要,但是網路越深訓練越困難,Highway Network的目標就是解決極深的神經網路難以訓練的問題。
Highway Network相當於修改了每一層激活函數,此前激活函數只是對輸入做一次非線性變換y=H(x, Wh), 而Highway Network則允許保留一部分比例的原始輸入x,即y=H(x, Wh)* T(x , Wt)+x*C(x, Wc),其中T為變換系數,C為保留系數,論文中令C=1-T。這樣前面一層的信息,有一定比例可以不經過矩陣乘法和非線性變換,直接傳輸到下一層,彷彿一條信息高速公路,因此得名Highway Network。
結果顯示,B比A略好,這是因為A中的零填充確實沒有殘差學習。而C比B稍好,這是由於投影快捷連接引入了額外參數。但A、B、C之間的細微差異表明投影連接對於解決退化問題不是至關重要的,而不/少使用投影連接可以減少內存/時間復雜性和模型大小。而且無參數恆等快捷連接對於瓶頸架構(3層殘差學習單元)尤為重要,因為瓶頸架構中層具有較小的輸入輸出,快捷連接是連接到兩個高維端,此時恆等快捷連接無需參數,而使用投影的話則會顯示時間和模型復雜度加倍。因此,恆等快捷連接可以為瓶頸設計得到更有效的模型。
最後,作者嘗試了更深的1000層以上的神經網路,發現神經網路仍然能夠較好的學習,但是其測試誤差比100多層的殘差網路要差,而訓練誤差則與100多層的殘差網路相似,作者認為這可能是由於過擬合導致的,可通過加大正則化來解決這一問題。
在ResNet V1中,作者研究通過加入殘差單元使得訓練深度達到上百層的神經網路成為可能,解決了梯度消失/爆炸的問題。而在ResNet V2中作者進一步證明了恆等映射(Identity mapping)的重要性。同時作者還提出了一種新的殘差單元(採用了預激活)使得訓練變得更簡單,同時還提高了模型的泛化能力。
在ResNet V2中,作者提出了不止在殘差單元內部,而是在整個神經網路中都創建了『直接』的計算傳播路徑。在ResNet V1中,殘差學習單元的
上式同樣表明了在一個mini-batch中不可能出現梯度消失的現象,因為上式求導的第二部分對於一個mini-batch來說,不可能所有樣本其導數都為-1,因此,可能會出現權重很小的情況,但是不會出現梯度消失的情況。
通過研究這些不同的快捷連接,作者發現大部分快捷連接方式無法很好地收斂,其中很大部分是由於使用這些快捷連接後或多或少會出現梯度消失或者梯度爆炸的現象,最後結果顯示恆等映射效果最好。
雖然恆等映射在這些方法中表寫結果最好,仍需引起注意的是1×1的卷積捷徑連接引入了更多的參數,本應該比恆等捷徑連接具有更加強大的表達能力。事實上,shortcut-only gating 和1×1的卷積涵蓋了恆等捷徑連接的解空間(即,他們能夠以恆等捷徑連接的形式進行優化)。然而,它們的訓練誤差比恆等捷徑連接的訓練誤差要高得多,這表明了這些模型退化問題的原因是優化問題,而不是表達能力的問題。
在上圖b中,採用先加後BN再激活的方法,此時f(x)就包含了BN和ReLU。這樣的結果比原始a要差。這主要是因為BN層改變了流經快捷連接的信號,阻礙了信息的傳遞。
在c中,ReLU在相加之前,此時f(x)=x,為恆等映射。此時殘差單元中的F(x)輸出經由ReLU後變為非負,然而一個「殘差」函數的輸出應該是(−∞,+∞) 的。造成的結果就是,前向傳遞的信號是單調遞增的。這會影響表達能力,結果也變得更差了。
結果顯示,只使用ReLU預激活(d)的結果與原始ResNet結果很接近,這個與ReLU層不與BN層連接使用,因此無法獲得BN所帶來的好處。而當BN和ReLU都使用在預激活上時(e),結果得到了可觀的提升。
預激活的影響有兩個方面:第一,由於f(x)也是恆等映射,相比於V1優化變得更加簡單;第二,在預激活中使用BN能提高模型的正則化。
對於f(x)為恆等映射的好處:一方面若使用f= ReLU,如果信號是負的時候會造成一定的影響,無法傳遞有用的負信號,而當殘差單元很多時,這個影響將會變得尤為突出;另一方面當f是一個恆等映射時,信號在兩個單元間能夠很直接的傳遞。
在ResNet V1中作者提出了殘差學習單元,並從理論和實驗上證明使用直連的shortcuts有助於解決深度達到上百層的神經網路的訓練問題。而在ResNet V2中作者證明了在shortcuts中使用直接映射(即H(x) = h(x) + F(x)中h(x) = x)得到的效果最好。在ResNext中作者將bottleneck拆分成多個分支,提出了神經網路中的第三個維度(另外兩個維度分別為depth,神經網路層數深度,width,寬度,channel數),命名為 Cardinality ,並在多個數據集中證明了將bottleneck拆分能夠降低訓練錯誤率和提高准確率。
ResNext的靈感來源於VGG/ResNet和Inception:(1)在VGG、ResNet中,作者使用了相同結構的卷積層進行了堆疊,構建了層數很深但是結構簡單的神經網路;(2)而在Inception中,提出了一種叫做 split-transform-merge 的策略,將輸入(採用1x1 卷積核)分裂為幾個低維 embedding,再經過一系列特定卷積層的變換,最後連接在一起。
而在ResNet中,作者將原ResNet bottleneck中的一條path拆分為多個分支(multi branch),以此分支數量提出神經網路中的第三個重要維度——Cardinality。這一想法結合了VGG中的相同結構堆疊和Inception中的split-transform-merge策略,即如上圖所示,每個bottleneck 拆分為多個分支進行堆疊,這些分支的結構相同(這里借鑒了VGG的思想),而具體到分支的結構時又採用了Inception的split-transform-merge策略。與Inception不同的是Inception的每個分支結構都是需要認為的設計,而在ResNext中每個分支結構都相同。最終每個bottleneck的輸出就變成了:
這些所有的bottlenecks結構都遵循兩個原則:
作者提出了 三種效果相同的ResNext的表示方法,如下圖所示:
其中a,b 結構相似,只是在merge這一步的地方不同,而c則借鑒了AlexNet中分組卷積的思想,將輸入和輸出都分為多個組。
作者首先評估權衡了cardinality和width的關系。
接著,作者又評估了使用增加cardinality和depth/width來增加模型復雜度後的效果:
最後,作者還研究了shortcuts對於ResNext的重要性,在ResNet-50中,不使用shortcuts准確率下降了7%,而在ResNext-50中准確率也下降了4%,說明shortcuts對於殘差網路來說確實是非常重要的。
簡言之,增加cardinality比增加depth和width效果要好,同時,shortcuts對於模型的准確率也是至關重要的。
參考:
Deep Resial Learning for Image Recognition.
Aggregated Resial Transformations for Deep Neural Networks.
Identity Mappings in Deep Resial Networks.
ResNet論文翻譯——中文版
Identity Mappings in Deep Resial Networks(譯)
TensorFlow實現經典卷積網路. 黃文堅,唐源
Ⅱ 深入理解BP神經網路
BP神經網路是一種多層的前饋神經網路,其主要的特點是:信號是前向傳播的,而誤差是反向傳播的。具體來說,對於如下的只含一個隱層的神經網路模型:
BP神經網路的過程主要分為兩個階段,第一階段是信號的前向傳播,從輸入層經過隱含層,最後到達輸出層;第二階段是誤差的反向傳播,從輸出層到隱含層,最後到輸入層,依次調節隱含層到輸出層的權重和偏置,輸入層到隱含層的權重和偏置。
神經網路的基本組成單元是神經元。神經元的通用模型如圖所示,其中常用的激活函數有閾值函數、sigmoid函數和雙曲正切函數。
神經元的輸出為:
神經網路是將多個神經元按一定規則聯結在一起而形成的網路,如圖 所示。
從圖 可以看出,一個神經網路包括輸入層、隱含層(中間層)和輸出層。輸入層神經元個數與輸入數據的維數相同,輸出層神經元個數與需要擬合的數據個數相同,隱含層神經元個數與層數就需要設計者自己根據一些規則和目標來設定。在深度學習出現之前,隱含層的層數通常為一層,即通常使用的神經網路是3層網路。
BP網路採用的傳遞函數是非線性變換函數——Sigmoid函數(又稱S函數)。其特點是函數本身及其導數都是連續的,因而在處理上十分方便。為什麼要選擇這個函數,等下在介紹BP網路的學習演算法的時候會進行進一步的介紹。S函數有單極性S型函數和雙極性S型函數兩種,單極性S型函數定義如下:f(x)=1/1+e−x
其函數曲線如圖所示:
雙極性S型函數:f(x)=1−e−x/1+e−x
使用S型激活函數時,輸入:
輸出:
輸出的導數:
使用S型激活函數時,BP網路的輸出及其導數圖形:
根據S激活函數的圖形:
net在 -5~0 的時候導數的值為正,且導數的值逐漸增大, 說明此時f(x)在逐漸變大 且 變大的速度越來越快
net在 0~5 的時候導數的值為正,且導數的值逐漸減小, 說明此時f(x)在逐漸變大 但是 變大的速度越來越慢
對神經網路進行訓練,我們應該盡量將net的值盡量控制在收斂比較快的范圍內。
1. 定義一個BP神經網路的類,設置網路相關參數
2. 實例化該神經網路,按下圖被構建成一個輸出3維,輸出1維,帶有3個隱藏層(每個隱藏層10個節點)的BP網路;(此處還可以隨意擴展輸入、輸出維度和隱藏層相關系數)
3. 初始化BP神經網路的時候,開始初始化各層網路節點的 權重、權重動量、誤差初始值
4. 引入學習訓練數據;4組輸入、輸出數據迭代5000次
5000次中不斷向前逐層計算輸出的節點數據
並同時逐層計算誤差反向修改權重值,直到迭代完畢;注意誤差函數值必須呈現下降趨勢
5. 引入數據進行結果預測,將數據帶回模型計算得結果;最終可知預測結果趨近於0.7
神經網路利用現有的數據找出輸入與輸出之間得權值關系(近似),然後利用這樣的權值關系進行模擬,例如輸入一組數據模擬出輸出結果,當然你的輸入要和訓練時採用的數據集在一個范疇之內。例如預報天氣:溫度 濕度 氣壓等作為輸入 天氣情況作為輸出利用歷史得輸入輸出關系訓練出神經網路,然後利用這樣的神經網路輸入今天的溫度 濕度 氣壓等 得出即將得天氣情況。同理,運用到自動化測試中,使用測試數據反映結果走向,bug數,質量問題等情況也可以做到提前預測的!
附錄:
Ⅲ 嵌入式與神經網路(一):CNN概述
姓名:王央京 學號:18050100052 學院:電子工程學院
轉自:https://blog.csdn.net/qq_25762497/article/details/51052861
【嵌牛導讀】本文介紹了卷積神經網路的基本概念
【嵌牛鼻子】CNN(卷積神經網路)
【嵌牛提問】對於深度學習進行初步學習,需要了解哪些概念?
【嵌牛正文】
卷積神經網路(Convolutional Neural Network, CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋范圍內的周圍單元,對於大型圖像處理有出色表現。
卷積神經網路與普通神經網路非常相似,它們都由具有可學習的權重和偏置常量(biases)的神經元組成。每個神經元都接收一些輸入,並做一些點積計算,輸出是每個分類的分數,普通神經網路里的一些計算技巧到這里依舊適用。
所以哪裡不同呢?卷積神經網路默認輸入是圖像,可以讓我們把特定的性質編碼入網路結構,使我們的前饋函數更加有效率,並減少了大量參數。
卷積神經網路利用輸入是圖片的特點,把神經元設計成三個維度 : width, height, depth(注意這個depth不是神經網路的深度,而是用來描述神經元的) 。比如輸入的圖片大小是 32 × 32 × 3 (rgb),那麼輸入神經元就也具有 32×32×3 的維度。下面是圖解:
傳統神經網路
一個卷積神經網路由很多層組成,它們的輸入是三維的,輸出也是三維的,有的層有參數,有的層不需要參數。
卷積神經網路通常包含以下幾種層:
卷積層(Convolutional layer) ,卷積神經網路中每層卷積層由若干卷積單元組成,每個卷積單元的參數都是通過反向傳播演算法優化得到的。卷積運算的目的是提取輸入的不同特徵,第一層卷積層可能只能提取一些低級的特徵如邊緣、線條和角等層級,更多層的網路能從低級特徵中迭代提取更復雜的特徵。
線性整流層(Rectified Linear Units layer, ReLU layer) ,這一層神經的活性化函數(Activation function)使用線性整流(Rectified Linear Units, ReLU)f(x)=max(0,x)f(x)=max(0,x)。
池化層(Pooling layer) ,通常在卷積層之後會得到維度很大的特徵,將特徵切成幾個區域,取其最大值或平均值,得到新的、維度較小的特徵。
全連接層( Fully-Connected layer) , 把所有局部特徵結合變成全局特徵,用來計算最後每一類的得分。
最後展示一個卷積神經網路各層應用實例:
Ⅳ 一文讀懂神經網路
要說近幾年最引人注目的技術,無疑的,非人工智慧莫屬。無論你是否身處科技互聯網行業,隨處可見人工智慧的身影:從 AlphaGo 擊敗世界圍棋冠軍,到無人駕駛概念的興起,再到科技巨頭 All in AI,以及各大高校向社會輸送海量的人工智慧專業的畢業生。以至於人們開始萌生一個想法:新的革命就要來了,我們的世界將再次發生一次巨變;而後開始焦慮:我的工作是否會被機器取代?我該如何才能抓住這次革命?
人工智慧背後的核心技術是深度神經網路(Deep Neural Network),大概是一年前這個時候,我正在回老家的高鐵上學習 3Blue1Brown 的 Neural Network 系列視頻課程,短短 4 集 60 多分鍾的時間,就把神經網路從 High Level 到推導細節說得清清楚楚,當時的我除了獲得新知的興奮之外,還有一點新的認知,算是給頭腦中的革命性的技術潑了盆冷水:神經網路可以解決一些復雜的、以前很難通過寫程序來完成的任務——例如圖像、語音識別等,但它的實現機制告訴我,神經網路依然沒有達到生物級別的智能,短期內期待它來取代人也是不可能的。
一年後的今天,依然在這個春運的時間點,將我對神經網路的理解寫下來,算是對這部分知識的一個學習筆記,運氣好的話,還可以讓不了解神經網路的同學了解起來。
維基網路這樣解釋 神經網路 :
這個定義比較寬泛,你甚至還可以用它來定義其它的機器學習演算法,例如之前我們一起學習的邏輯回歸和 GBDT 決策樹。下面我們具體一點,下圖是一個邏輯回歸的示意圖:
其中 x1 和 x2 表示輸入,w1 和 w2 是模型的參數,z 是一個線性函數:
接著我們對 z 做一個 sigmod 變換(圖中藍色圓),得到輸出 y:
其實,上面的邏輯回歸就可以看成是一個只有 1 層 輸入層 , 1 層 輸出層 的神經網路,圖中容納數字的圈兒被稱作 神經元 ;其中,層與層之間的連接 w1、w2 以及 b,是這個 神經網路的參數 ,層之間如果每個神經元之間都保持著連接,這樣的層被稱為 全連接層 (Full Connection Layer),或 稠密層 (Dense Layer);此外,sigmoid 函數又被稱作 激活函數 (Activation Function),除了 sigmoid 外,常用的激活函數還有 ReLU、tanh 函數等,這些函數都起到將線性函數進行非線性變換的作用。我們還剩下一個重要的概念: 隱藏層 ,它需要把 2 個以上的邏輯回歸疊加起來加以說明:
如上圖所示,除輸入層和輸出層以外,其他的層都叫做 隱藏層 。如果我們多疊加幾層,這個神經網路又可以被稱作 深度神經網路 (Deep Neural Network),有同學可能會問多少層才算「深」呢?這個沒有絕對的定論,個人認為 3 層以上就算吧:)
以上,便是神經網路,以及神經網路中包含的概念,可見,神經網路並不特別,廣義上講,它就是
可見,神經網路和人腦神經也沒有任何關聯,如果我們說起它的另一個名字—— 多層感知機(Mutilayer Perceptron) ,就更不會覺得有多麼玄乎了,多層感知機創造於 80 年代,可為什麼直到 30 年後的今天才爆發呢?你想得沒錯,因為改了個名字……開個玩笑;實際上深度學習這項技術也經歷過很長一段時間的黑暗低谷期,直到人們開始利用 GPU 來極大的提升訓練模型的速度,以及幾個標志性的事件:如 AlphaGo戰勝李世石、Google 開源 TensorFlow 框架等等,感興趣的同學可以翻一下這里的歷史。
就拿上圖中的 3 個邏輯回歸組成的神經網路作為例子,它和普通的邏輯回歸比起來,有什麼優勢呢?我們先來看下單邏輯回歸有什麼劣勢,對於某些情況來說,邏輯回歸可能永遠無法使其分類,如下面數據:
這 4 個樣本畫在坐標系中如下圖所示
因為邏輯回歸的決策邊界(Decision Boundary)是一條直線,所以上圖中的兩個分類,無論你怎麼做,都無法找到一條直線將它們分開,但如果藉助神經網路,就可以做到這一點。
由 3 個邏輯回歸組成的網路(這里先忽略 bias)如下:
觀察整個網路的計算過程,在進入輸出層之前,該網路所做的計算實際上是:
即把輸入先做了一次線性變換(Linear Transformation),得到 [z1, z2] ,再把 [z1, z2] 做了一個非線性變換(sigmoid),得到 [x1', x2'] ,(線性變換的概念可以參考 這個視頻 )。從這里開始,後面的操作就和一個普通的邏輯回歸沒有任何差別了,所以它們的差異在於: 我們的數據在輸入到模型之前,先做了一層特徵變換處理(Feature Transformation,有時又叫做特徵抽取 Feature Extraction),使之前不可能被分類的數據變得可以分類了 。
我們繼續來看下特徵變換的效果,假設 為 ,帶入上述公式,算出 4 個樣本對應的 [x1', x2'] 如下:
再將變換後的 4 個點繪制在坐標系中:
顯然,在做了特徵變換之後,這兩個分類就可以很容易的被一條決策邊界分開了。
所以, 神經網路的優勢在於,它可以幫助我們自動的完成特徵變換或特徵提取 ,尤其對於聲音、圖像等復雜問題,因為在面對這些問題時,人們很難清晰明確的告訴你,哪些特徵是有用的。
在解決特徵變換的同時,神經網路也引入了新的問題,就是我們需要設計各式各樣的網路結構來針對性的應對不同的場景,例如使用卷積神經網路(CNN)來處理圖像、使用長短期記憶網路(LSTM)來處理序列問題、使用生成式對抗網路(GAN)來寫詩和作圖等,就連去年自然語言處理(NLP)中取得突破性進展的 Transformer/Bert 也是一種特定的網路結構。所以, 學好神經網路,對理解其他更高級的網路結構也是有幫助的 。
上面說了,神經網路可以看作一個非線性函數,該函數的參數是連接神經元的所有的 Weights 和 Biases,該函數可以簡寫為 f(W, B) ,以手寫數字識別的任務作為例子:識別 MNIST 數據集 中的數字,數據集(MNIST 數據集是深度學習中的 HelloWorld)包含上萬張不同的人寫的數字圖片,共有 0-9 十種數字,每張圖片為 28*28=784 個像素,我們設計一個這樣的網路來完成該任務:
把該網路函數所具備的屬性補齊:
接下來的問題是,這個函數是如何產生的?這個問題本質上問的是這些參數的值是怎麼確定的。
在機器學習中,有另一個函數 c 來衡量 f 的好壞,c 的參數是一堆數據集,你輸入給 c 一批 Weights 和 Biases,c 輸出 Bad 或 Good,當結果是 Bad 時,你需要繼續調整 f 的 Weights 和 Biases,再次輸入給 c,如此往復,直到 c 給出 Good 為止,這個 c 就是損失函數 Cost Function(或 Loss Function)。在手寫數字識別的列子中,c 可以描述如下:
可見,要完成手寫數字識別任務,只需要調整這 12730 個參數,讓損失函數輸出一個足夠小的值即可,推而廣之,絕大部分神經網路、機器學習的問題,都可以看成是定義損失函數、以及參數調優的問題。
在手寫識別任務中,我們既可以使用交叉熵(Cross Entropy)損失函數,也可以使用 MSE(Mean Squared Error)作為損失函數,接下來,就剩下如何調優參數了。
神經網路的參數調優也沒有使用特別的技術,依然是大家剛接觸機器學習,就學到的梯度下降演算法,梯度下降解決了上面迭代過程中的遺留問題——當損失函數給出 Bad 結果時,如何調整參數,能讓 Loss 減少得最快。
梯度可以理解為:
把 Loss 對應到 H,12730 個參數對應到 (x,y),則 Loss 對所有參數的梯度可以表示為下面向量,該向量的長度為 12730:
$$
abla L(w,b) = left[
frac{partial L}{partial w_1},
frac{partial L}{partial w_2},...,
frac{partial L}{partial b_{26}}
ight] ^ op
$$
所以,每次迭代過程可以概括為
用梯度來調整參數的式子如下(為了簡化,這里省略了 bias):
上式中, 是學習率,意為每次朝下降最快的方向前進一小步,避免優化過頭(Overshoot)。
由於神經網路參數繁多,所以需要更高效的計算梯度的演算法,於是,反向傳播演算法(Backpropagation)呼之欲出。
在學習反向傳播演算法之前,我們先復習一下微積分中的鏈式法則(Chain Rule):設 g = u(h) , h = f(x) 是兩個可導函數,x 的一個很小的變化 △x 會使 h 產生一個很小的變化 △h,從而 g 也產生一個較小的變化 △g,現要求 △g/△x,可以使用鏈式法則:
有了以上基礎,理解反向傳播演算法就簡單了。
假設我們的演示網路只有 2 層,輸入輸出都只有 2 個神經元,如下圖所示:
其中 是輸入, 是輸出, 是樣本的目標值,這里使用的損失函數 L 為 MSE;圖中的上標 (1) 或 (2) 分別表示參數屬於第 (1) 層或第 (2) 層,下標 1 或 2 分別表示該層的第 1 或 第 2 個神經元。
現在我們來計算 和 ,掌握了這 2 個參數的偏導數計算之後,整個梯度的計算就掌握了。
所謂反向傳播演算法,指的是從右向左來計算每個參數的偏導數,先計算 ,根據鏈式法則
對左邊項用鏈式法則展開
又 是輸出值, 可以直接通過 MSE 的導數算出:
而 ,則 就是 sigmoid 函數的導數在 處的值,即
於是 就算出來了:
再來看 這一項,因為
所以
注意:上面式子對於所有的 和 都成立,且結果非常直觀,即 對 的偏導為左邊的輸入 的大小;同時,這里還隱含著另一層意思:需要調整哪個 來影響 ,才能使 Loss 下降得最快,從該式子可以看出,當然是先調整較大的 值所對應的 ,效果才最顯著 。
於是,最後一層參數 的偏導數就算出來了
我們再來算上一層的 ,根據鏈式法則 :
繼續展開左邊這一項
你發現沒有,這幾乎和計算最後一層一摸一樣,但需要注意的是,這里的 對 Loss 造成的影響有多條路徑,於是對於只有 2 個輸出的本例來說:
上式中, 都已經在最後一層算出,下面我們來看下 ,因為
於是
同理
注意:這里也引申出梯度下降的調參直覺:即要使 Loss 下降得最快,優先調整 weight 值比較大的 weight。
至此, 也算出來了
觀察上式, 所謂每個參數的偏導數,通過反向傳播演算法,都可以轉換成線性加權(Weighted Sum)計算 ,歸納如下:
式子中 n 代表分類數,(l) 表示第 l 層,i 表示第 l 層的第 i 個神經元。 既然反向傳播就是一個線性加權,那整個神經網路就可以藉助於 GPU 的矩陣並行計算了 。
最後,當你明白了神經網路的原理,是不是越發的認為,它就是在做一堆的微積分運算,當然,作為能證明一個人是否學過微積分,神經網路還是值得學一下的。Just kidding ..
本文我們通過
這四點,全面的學習了神經網路這個知識點,希望本文能給你帶來幫助。
參考:
Ⅳ 深層神經網路
如上圖所示,邏輯回歸是一個淺層模型,可以理解為是單層神經網路。深層或淺層是一個程度的問題。如果將邏輯回歸模型加入一個隱藏層就變了一個雙層神經網路,但還是比較淺的。如果加入 5 個隱藏層,則可以說是一個深層模型。通常可以把隱藏層數當作超參數,然後在交叉驗證數據集上進行評估,從而選擇合適的深度。
上圖是一個 4 層的神經網路,包括三個隱藏層和一個輸出層,隱藏層的單元數分別是 5 5 3,輸出層只有一個單元。通常用 L 表示神經網路的層數,用 表示第 層的單元數,可以把輸入層當作第 0 層孫雹。那麼圖中 L = 4, , , , , 。可以用 表示第 層的激活值,即 ,用 和 表示在 公式中計算 值的權重,即 。輸入用 X 表示,X 也是第 0 層,所以 ,最後一層 ,也就是說 即為神經網路的預測值(輸出值)。
假設有一個樣本 x,那麼:
第一層計算: ,其中 x 也可以表示為 , w 和 b 是會影響第 1 層的激活單元的參數,接下來計算: ,後面幾層的計算也是如此。
第二層計算: ,
第三層計算: ,
第四層計算: ,
可以總結出,計算規律為:
前向傳播的向量化計算:
輸入 X 即 ,是將 m 個樣本橫向堆疊構成的矩陣,前向傳播需要一層一層來迭代計算,所以需要用 for 循環從第 1 層迭代計算到第 L 層,深層神經網路只是比淺層神經網路有更多層的迭代計算。
在上圖的神經網路中,除去輸入層一共有 5 層,其中 4 個隱藏層,一個輸出層。第 1 個隱藏層有 3 個隱藏單元,可以表示為 , 是第 1 個隱藏層的激活函數向量,是一個 3 x 1 的列向量,x 有兩個輸入特徵,所以 x 是 2 x 1 的列向量。在第一層的計算中: ,如果忽略偏置項 , 。 乘以一個 2 x 1 的列向量 x,需要等於一個 3 x 1 的列向量,那麼 必須是一個 3 x 2 的矩陣,即 的矩陣。 的結果是一個 3 x 1 的向量, 也搜殲是一個 3 x1 的向量,所以結果 也是一個 3 x 1 的向量。可以發現, 必須是 維的矩陣, 必須是 維的列向量,所以 的維數是 5 x 3,即 , 的維數是 5 x 1,即 x 1,所以在第二層的計算中: ,5 x 3 的矩陣 乘以 3 x 1 的列向量 等於一個 5 x 1 的列向量,再加上一個 5 x 1 的偏置項 ,結果 是一個 5 x 1 的列向量。以此類推, 的維數是 4 x 5, 的維數是 2 x 4, 的維數是 1 x 2。
前面證實了, 必須是 維的矩陣, 必須是 維的列向量。而且,在反向傳播中, 和 的維度相同, 和 的維度相同。又因為 ,所以 和 的維度也相同,都是 。
以上是神經網路中單個樣本的計算,其中 x 表示單個樣本,通常為了加速運算,需要將 m 個樣本進行向量化計算,可以用 X 表示 m 個樣本,第一個隱藏層的向量化計算公式即為: ,其中 還是 維, X 變為 維, 的結果是 的矩陣, 的維度還是 ,但當一個 的矩陣和 相加時,Python會通過廣播將 復製成為 的矩陣,然後兩個矩陣逐個元素相加。所以 的維度變為 ,即 3 x m。 表示每一個單獨的 橫向疊加構成的行向量,即 。
單個樣本時, 和 的維世凱沖度相同,都是 ,m 個樣本時, 和 的維度相同,都是 ,當 等於 0 時, 等於 ,其中 是 x 的輸入特徵數。反向傳播時,dZ、dA 和 Z、A 的維度相同。
從直覺上可以把深度神經網路的前幾層當做探測簡單的函數,也就是學習一些低層次的簡單特徵,之後把它們和後幾層結合在一起,也就是把簡單的特徵結合起來,那麼總體上就能學習更多復雜的函數,也就是去探測更復雜的東西。可以把深度學習神經網路和人類大腦做類比,人的大腦也是先探測簡單的東西,然後組合起來才能探測復雜的物體。
神經網路為何有效的理論來源於電路理論,它和能夠用電路元件計算哪些函數有著分不開的聯系,根據不同的基本邏輯門(與,或,非),在非正式情況下,這些函數都可以用相對較小(指隱藏單元數量)但很深的神經網路來計算 ,如果用淺層神經網路則需要指數增長的隱藏單元數量才能達到同樣的效果。
上圖是一個 4 層的神經網路,梯度下降的一個迭代過程即為前向傳播和反向傳播的計算過程,如下圖所示:
在前向傳播計算中,從第 1 層開始,第 層的輸入為上一層(第 層)的激活函數計算結果 和當前層的參數 ,輸出為當前層激活函數計算結果 ,還要緩存 和 以供反向傳播使用, 則輸入到下一層(第 層),計算過程如下:
向量化計算為:
當計算完所有層的前向傳播後,第 L 層的激活函數計算結果 即當前樣本的預測值。接下來將進行反向傳播計算,從第 L 層開始,第 層的輸入為當前層激活函數計算結果的導數值 和當前層的參數 ,輸出為上一層(第 層)激活函數計算結果的導數值 ,以及當前層參數的導數值 ,計算過程如下:
首先
由 可知 ,將 da 帶入可求得:
向量化計算為:
首先
在每一層中根據梯度下降公式,更新參數:
這就是神經網路中梯度下降一個迭代的計算過程。
神經網路中的參數包括: W 和 b。超參數包括:學習率 ,梯度下降迭代次數(iterations),隱層數(L),隱藏單元數(units),激活函數(activefunction),因為這些參數是在某種程度上決定了參數 W 和 b 的參數,所以叫做超參數。其他超參數包括:momentum,batch size,正則化參數等
可以通過嘗試不同的超參數,觀察代價函數曲線變化,從而選擇表現最好的超參數。
沒有。
https://mooc.study.163.com/smartSpec/detail/1001319001.htm
Ⅵ 神經網路(Neural Network)
(1)結構:許多樹突(dendrite)用於輸入,一個軸突 (axon)用於輸出。
(2)特性:興奮性和傳導性。興奮性是指當信號量超過某個閾值時,細胞體就會被激活,產生電脈沖。傳導性是指電脈沖沿著軸突並通過突觸傳遞到其它神經元。
(3)有兩種狀態的機器:激活時為「是」,不激活時為「否」。神經細胞的狀態取決於從其他神經細胞接收到的信號量,以及突觸的性質(抑制或加強)。
(1)神經元——不重要
① 神經元是包含權重和偏置項的 函數 :接收數據後,執行一些計算,然後使用激活函數將數據限制在一個范圍內(多數情況下)。
② 單個神經元:線性可分的情況下,本質是一條直線, ,這條直線將數據劃分為兩類。而線性分類器本身就是一個單層神經網路。
③ 神經網路:非線性可分的情況下,神經網路通過多個隱層的方法來實現非線性的函數。
(2)權重/參數/連接(Weight)——最重要
每一個連接上都有一個權重。一個神經網路的訓練演算法就是讓權重的值調整到最佳,以使得整個網路的預測效果最好。
(3)偏置項(Bias Units)——必須
① 如果沒有偏置項,所有的函數都會經過原點。
② 正則化偏置會導致欠擬合:若對偏置正則化,會導致激活變得更加簡單,偏差就會上升,學習的能力就會下降。
③ 偏置的大小度量了神經元產生激勵(激活)的難易程度。
(1)定義:也稱為轉換函數,是一種將輸入 (input) 轉成輸出 (output) 的函數。
(2)作用:一般直線擬合的精確度要比曲線差很多,引入激活函數能給神經網路 增加一些非線性 的特性。
(3)性質:
① 非線性:導數不是常數,否則就退化成直線。對於一些畫一條直線仍然無法分開的問題,非線性可以把直線變彎,就能包羅萬象;
② 可微性:當優化方法是基於梯度的時候,處處可導為後向傳播演算法提供了核心條件;
③ 輸出范圍:一般限定在[0,1],使得神經元對一些比較大的輸入會比較穩定;
④ 非飽和性:飽和就是指,當輸入比較大的時候輸出幾乎沒變化,會導致梯度消失;
⑤ 單調性:導數符號不變,輸出不會上躥下跳,讓神經網路訓練容易收斂。
(1)線性函數 (linear function)—— purelin()
(2)符號函數 (sign function)—— hardlim()
① 如果z值高於閾值,則激活設置為1或yes,神經元將被激活。
② 如果z值低於閾值,則激活設置為0或no,神經元不會被激活。
(3)對率函數 (sigmoid function)—— logsig()
① 優點:光滑S型曲線連續可導,函數閾值有上限。
② 缺點:❶ 函數飽和使梯度消失,兩端梯度幾乎為0,更新困難,做不深;
❷ 輸出不是0中心,將影響梯度下降的運作,收斂異常慢;
❸ 冪運算相對來講比較耗時
(4)雙曲正切函數(hyperbolic tangent function)—— tansig()
① 優點:取值范圍0中心化,防止了梯度偏差
② 缺點:梯度消失現象依然存在,但相對於sigmoid函數問題較輕
(5)整流線性單元 ReLU 函數(rectified linear unit)
① 優點:❶ 分段線性函數,它的非線性性很弱,因此網路做得很深;
❷ 由於它的線性、非飽和性, 對於隨機梯度下降的收斂有巨大的加速作用;
② 缺點:❶ 當x<0,梯度都變成0,參數無法更新,也導致了數據多樣化的丟失;
❷ 輸出不是0中心
(6)滲漏型整流線性單元激活函數 Leaky ReLU 函數
① 優點:❶ 是為解決「ReLU死亡」問題的嘗試,在計算導數時允許較小的梯度;
❷ 非飽和的公式,不包含指數運算,計算速度快。
② 缺點:❶ 無法避免梯度爆炸問題; (沒有體現優於ReLU)
❷ 神經網路不學習 α 值。
(7)指數線性單元 ELU (Exponential Linear Units)
① 優點:❶ 能避免「死亡 ReLU」 問題;
❷ 能得到負值輸出,這能幫助網路向正確的方向推動權重和偏置變化;
❸ 在計算梯度時能得到激活,而不是讓它們等於 0。
② 缺點:❶ 由於包含指數運算,所以計算時間更長;
❷ 無法避免梯度爆炸問題; (沒有體現優於ReLU)
❸ 神經網路不學習 α 值。
(8)Maxout(對 ReLU 和 Leaky ReLU的一般化歸納)
① 優點:❶ 擁有ReLU的所有優點(線性和不飽和)
❷ 沒有ReLU的缺點(死亡的ReLU單元)
❸ 可以擬合任意凸函數
② 缺點 :參數數量增加了一倍。難訓練,容易過擬合
(9)Swish
① 優點:❶ 在負半軸也有一定的不飽和區,參數的利用率更大
❷ 無上界有下界、平滑、非單調
❸ 在深層模型上的效果優於 ReLU
每個層都包含一定數量的單元(units)。增加層可增加神經網路輸出的非線性。
(1)輸入層:就是接收原始數據,然後往隱層送
(2)輸出層:神經網路的決策輸出
(3)隱藏層:神經網路的關鍵。把前一層的向量變成新的向量,讓數據變得線性可分。
(1)結構:僅包含輸入層和輸出層,直接相連。
(2)作用:僅能表示 線性可分 函數或決策,且一定可以在有限的迭代次數中收斂。
(3)局限:可以建立與門、或門、非門等,但無法建立更為復雜的異或門(XOR),即兩個輸入相同時輸出1,否則輸出0。 (「AI winter」)
(1)目的:擬合某個函數 (兩層神經網路可以逼近任意連續函數)
(2)結構:包含輸入層、隱藏層和輸出層 ,由於從輸入到輸出的過程中不存在與模型自身的反饋連接,因此被稱為「前饋」。 (層與層之間全連接)
(3)作用: 非線性 分類、聚類、預測等,通過訓練,可以學習到數據中隱含的知識。
(4)局限:計算復雜、計算速度慢、容易陷入局部最優解,通常要將它們與其他網路結合形成新的網路。
(5)前向傳播演算法(Forward Propagation)
① 方法:從左至右逐級依賴的演算法模型,即網路如何根據輸入X得到輸出Y,最終的輸出值和樣本值作比較, 計算出誤差 。
② 目的:完成了一次正反向傳播,就完成了一次神經網路的訓練迭代。通過輸出層的誤差,快速求解對每個ω、b的偏導,利用梯度下降法,使Loss越來越小。
② 局限:為使最終的誤差達到最小,要不斷修改參數值,但神經網路的每條連接線上都有不同權重參數,修改這些參數變得棘手。
(6)誤差反向傳播(Back Propagation)
① 原理:梯度下降法求局部極值
② 方法:從後往前,從輸出層開始計算 L 對當前層的微分,獲得各層的誤差信號,此誤差信號即作為修正單元權值的依據。計算結束以後,所要的兩個參數矩陣的 梯度 就都有了。
③ 局限:如果激活函數是飽和的,帶來的缺陷就是系統迭代更新變慢,系統收斂就慢,當然這是可以有辦法彌補的,一種方法是使用 交叉熵函數 作為損失函數。
(1)原理:隨著網路的層數增加,每一層對於前一層次的抽象表示更深入。在神經網路中,每一層神經元學習到的是前一層神經元值的更抽象的表示。通過抽取更抽象的特徵來對事物進行區分,從而獲得更好的區分與分類能力。
(2)方法:ReLU函數在訓練多層神經網路時,更容易收斂,並且預測性能更好。
(3)優點:① 易於構建,表達能力強,基本單元便可擴展為復雜的非線性函數
② 並行性號,有利於在分布是系統上應用
(4)局限:① 優化演算法只能獲得局部極值,性能與初始值相關
② 調參理論性缺乏
③ 不可解釋,與實際任務關聯性模糊
(1)原理:由手工設計卷積核變成自動學習卷積核
(2)卷積(Convolutional layer): 輸入與卷積核相乘再累加 (內積、加權疊加)
① 公式:
② 目的:提取輸入的不同特徵,得到維度很大的 特徵圖(feature map)
③ 卷積核:需要訓練的參數。一般為奇數維,有中心像素點,便於定位卷積核
④ 特點:局部感知、參數變少、權重共享、分層提取
(3)池化(Pooling Layer):用更高層的抽象表達來表示主要特徵,又稱「降采樣」
① 分類: 最大 (出現與否)、平均(保留整體)、隨機(避免過擬合)
② 目的:降維,不需要訓練參數,得到新的、維度較小的特徵
(4)步長(stride):若假設輸入大小是n∗n,卷積核的大小是f∗f,步長是s,則最後的feature map的大小為o∗o,其中
(5)填充(zero-padding)
① Full模式:即從卷積核(fileter)和輸入剛相交開始做卷積,沒有元素的部分做補0操作。
② Valid模式:卷積核和輸入完全相交開始做卷積,這種模式不需要補0。
③ Same模式:當卷積核的中心C和輸入開始相交時做卷積。沒有元素的部分做補0操作。
(7)激活函數:加入非線性特徵
(8)全連接層(Fully-connected layer)
如果說卷積層、池化層和激活函數層等是將原始數據映射到隱層特徵空間(決定計算速度),全連接層則起到將學到的「分布式特徵表示」映射到樣本標記空間的作用(決定參數個數)。
參考:
[1] 神經網路(入門最詳細)_ruthy的博客-CSDN博客_神經網路演算法入門
[2] 神經網路(容易被忽視的基礎知識) - Evan的文章 - 知乎
[3] 人工神經網路——王的機器
[4] 如何簡單形象又有趣地講解神經網路是什麼? - 舒小曼的回答 - 知乎
[5] 神經網路15分鍾入門!足夠通俗易懂了吧 - Mr.括弧的文章 - 知乎
[6] 神經網路——最易懂最清晰的一篇文章_illikang的博客-CSDN博客_神經網路
[7] 直覺化深度學習教程——什麼是前向傳播——CSDN
[8] 「反向傳播演算法」過程及公式推導(超直觀好懂的Backpropagation)_aift的專欄-CSDN
[9] 卷積、反卷積、池化、反池化——CSDN
[10] 浙大機器學習課程- bilibili.com
Ⅶ 理解神經網路卷積層、全連接層
https://zhuanlan.hu.com/p/32472241
卷積神經網路,這玩意兒乍一聽像是生物和數學再帶點計算機技術混合起來的奇怪東西。奇怪歸奇怪,不得不說,卷積神經網路是計算機視覺領域最有影響力的創造之一。
2012年是卷積神經網路崛起之年。這一年,Alex Krizhevsky帶著卷積神經網路參加了ImageNet競賽(其重要程度相當於奧運會)並一鳴驚人,將識別錯誤率從26%降到了15%,。從那開始,很多公司開始使用深度學習作為他們服務的核心。比如,Facebook在他們的自動標記演算法中使用了它,Google在照片搜索中使用了,Amazon在商品推薦中使用,Printerst應用於為他們的家庭飼養服務提供個性化定製,而Instagram應用於他們的搜索引擎。
然而,神經網路最開始也是最多的應用領域是圖像處理。那我們就挑這塊來聊聊,怎樣使用卷積神經網路(下面簡稱CNN)來進行圖像分類。
圖像分類是指,向機器輸入一張圖片,然後機器告訴我們這張圖片的類別(一隻貓,一條狗等等),或者如果它不確定的話,它會告訴我們屬於某個類別的可能性(很可能是條狗但是我不太確定)。對我們人類來說,這件事情簡單的不能再簡單了,從出生起,我們就可以很快地識別周圍的物體是什麼。當我們看到一個場景,我們總能快速地識別出所有物體,甚至是下意識的,沒有經過有意的思考。但這種能力,機器並不具有。所以我們更加要好好珍惜自己的大腦呀! (:зゝ∠)
電腦和人看到的圖片並不相同。當我們輸入一張圖片時,電腦得到的只是一個數組,記錄著像素的信息。數組的大小由圖像的清晰度和大小決定。假設我們有一張jpg格式的480 480大小的圖片,那麼表示它的數組便是480 480*3大小的。數組中所有數字都描述了在那個位置處的像素信息,大小在[0,255]之間。
這些數字對我們來說毫無意義,但這是電腦們可以得到的唯一的信息(也足夠了)。抽象而簡單的說,我們需要一個接受數組為輸入,輸出一個數組表示屬於各個類別概率的模型。
既然問題我們已經搞明白了,現在我們得想想辦法解決它。我們想讓電腦做的事情是找出不同圖片之間的差別,並可以識別狗狗(舉個例子)的特徵。
我們人類可以通過一些與眾不同的特徵來識別圖片,比如狗狗的爪子和狗有四條腿。同樣地,電腦也可以通過識別更低層次的特徵(曲線,直線)來進行圖像識別。電腦用卷積層識別這些特徵,並通過更多層卷積層結合在一起,就可以像人類一樣識別出爪子和腿之類的高層次特徵,從而完成任務。這正是CNN所做的事情的大概脈絡。下面,我們進行更具體的討論。
在正式開始之前,我們先來聊聊CNN的背景故事。當你第一次聽說卷積神經網路的時候,你可能就會聯想到一些與神經學或者生物學有關的東西,不得不說,卷積神經網路還真的與他們有某種關系。
CNN的靈感的確來自大腦中的視覺皮層。視覺皮層某些區域中的神經元只對特定視野區域敏感。1962年,在一個Hubel與Wiesel進行的試驗( 視頻 )中,這一想法被證實並且拓展了。他們發現,一些獨立的神經元只有在特定方向的邊界在視野中出現時才會興奮。比如,一些神經元在水平邊出現時興奮,而另一些只有垂直邊出現時才會。並且所有這種類型的神經元都在一個柱狀組織中,並且被認為有能力產生視覺。
在一個系統中,一些特定的組件發揮特定的作用(視覺皮層中的神經元尋找各自特定的特徵)。這一想法應用於很多機器中,並且也是CNN背後的基本原理。 (譯者註:作者沒有說清楚。類比到CNN中,應是不同的卷積核尋找圖像中不同的特徵)
回到主題。
更詳細的說,CNN的工作流程是這樣的:你把一張圖片傳遞給模型,經過一些卷積層,非線性化(激活函數),池化,以及全連層,最後得到結果。就像我們之前所說的那樣,輸出可以是單獨的一個類型,也可以是一組屬於不同類型的概率。現在,最不容易的部分來了:理解各個層的作用。
首先,你要搞清楚的是,什麼樣的數據輸入了卷積層。就像我們之前提到的那樣,輸入是一個32 × 32 × 3(打個比方)的記錄像素值的數組。現在,讓我來解釋卷積層是什麼。解釋卷積層最好的方法,是想像一個手電筒照在圖片的左上角。讓我們假設手電筒的光可以招到一個5 × 5的區域。現在,讓我們想像這個手電筒照過了圖片的所有區域。在機器學習術語中,這樣一個手電筒被稱為卷積核(或者說過濾器,神經元) (kernel, filter, neuron) 。而它照到的區域被稱為感知域 (receptive field) 。卷積核同樣也是一個數組(其中的數被稱為權重或者參數)。很重要的一點就是卷積核的深度和輸入圖像的深度是一樣的(這保證可它能正常工作),所以這里卷積核的大小是5 × 5 × 3。
現在,讓我們拿卷積核的初始位置作為例子,它應該在圖像的左上角。當卷積核掃描它的感知域(也就是這張圖左上角5 × 5 × 3的區域)的時候,它會將自己保存的權重與圖像中的像素值相乘(或者說,矩陣元素各自相乘,注意與矩陣乘法區分),所得的積會相加在一起(在這個位置,卷積核會得到5 × 5 × 3 = 75個積)。現在你得到了一個數字。然而,這個數字只表示了卷積核在圖像左上角的情況。現在,我們重復這一過程,讓卷積核掃描完整張圖片,(下一步應該往右移動一格,再下一步就再往右一格,以此類推),每一個不同的位置都產生了一個數字。當掃描完整張圖片以後,你會得到一組新的28 × 28 × 1的數。 (譯者註:(32 - 5 + 1) × (32 - 5 + 1) × 1) 。這組數,我們稱為激活圖或者特徵圖 (activation map or feature map) 。
如果增加卷積核的數目,比如,我們現在有兩個卷積核,那麼我們就會得到一個28 × 28 × 2的數組。通過使用更多的卷積核,我們可以更好的保留數據的空間尺寸。
在數學層面上說,這就是卷積層所做的事情。
讓我們來談談,從更高角度來說,卷積在做什麼。每一個卷積核都可以被看做特徵識別器。我所說的特徵,是指直線、簡單的顏色、曲線之類的東西。這些都是所有圖片共有的特點。拿一個7 × 7 × 3的卷積核作為例子,它的作用是識別一種曲線。(在這一章節,簡單起見,我們忽略卷積核的深度,只考慮第一層的情況)。作為一個曲線識別器,這個卷積核的結構中,曲線區域內的數字更大。(記住,卷積核是一個數組)
現在我們來直觀的看看這個。舉個例子,假設我們要把這張圖片分類。讓我們把我們手頭的這個卷積核放在圖片的左上角。
記住,我們要做的事情是把卷積核中的權重和輸入圖片中的像素值相乘。
(譯者註:圖中最下方應是由於很多都是0所以把0略過不寫了。)
基本上,如果輸入圖像中有與卷積核代表的形狀很相似的圖形,那麼所有乘積的和會很大。現在我們來看看,如果我們移動了卷積核呢?
可以看到,得到的值小多了!這是因為感知域中沒有與卷積核表示的相一致的形狀。還記得嗎,卷積層的輸出是一張激活圖。所以,在單卷積核卷積的簡單情況下,假設卷積核是一個曲線識別器,那麼所得的激活圖會顯示出哪些地方最有可能有曲線。在這個例子中,我們所得激活圖的左上角的值為6600。這樣大的數字表明很有可能這片區域中有一些曲線,從而導致了卷積核的激活 (譯者註:也就是產生了很大的數值。) 而激活圖中右上角的數值是0,因為那裡沒有曲線來讓卷積核激活(簡單來說就是輸入圖像的那片區域沒有曲線)。
但請記住,這只是一個卷積核的情況,只有一個找出向右彎曲的曲線的卷積核。我們可以添加其他卷積核,比如識別向左彎曲的曲線的。卷積核越多,激活圖的深度就越深,我們得到的關於輸入圖像的信息就越多。
在傳統的CNN結構中,還會有其他層穿插在卷積層之間。我強烈建議有興趣的人去閱覽並理解他們。但總的來說,他們提供了非線性化,保留了數據的維度,有助於提升網路的穩定度並且抑制過擬合。一個經典的CNN結構是這樣的:
網路的最後一層很重要,我們稍後會講到它。
現在,然我們回頭看看我們已經學到了什麼。
我們講到了第一層卷積層的卷積核的目的是識別特徵,他們識別像曲線和邊這樣的低層次特徵。但可以想像,如果想預測一個圖片的類別,必須讓網路有能力識別高層次的特徵,例如手、爪子或者耳朵。讓我們想想網路第一層的輸出是什麼。假設我們有5個5 × 5 × 3的卷積核,輸入圖像是32 × 32 × 3的,那麼我們會得到一個28 × 28 × 5的數組。來到第二層卷積層,第一層的輸出便成了第二層的輸入。這有些難以可視化。第一層的輸入是原始圖片,可第二層的輸入只是第一層產生的激活圖,激活圖的每一層都表示了低層次特徵的出現位置。如果用一些卷積核處理它,得到的會是表示高層次特徵出現的激活圖。這些特徵的類型可能是半圓(曲線和邊的組合)或者矩形(四條邊的組合)。隨著卷積層的增多,到最後,你可能會得到可以識別手寫字跡、粉色物體等等的卷積核。
如果,你想知道更多關於可視化卷積核的信息,可以看這篇 研究報告 ,以及這個 視頻 。
還有一件事情很有趣,當網路越來越深,卷積核會有越來越大的相對於輸入圖像的感知域。這意味著他們有能力考慮來自輸入圖像的更大范圍的信息(或者說,他們對一片更大的像素區域負責)。
到目前為止,我們已經識別出了那些高層次的特徵吧。網路最後的畫龍點睛之筆是全連層。
簡單地說,這一層接受輸入(來自卷積層,池化層或者激活函數都可以),並輸出一個N維向量,其中,N是所有有可能的類別的總數。例如,如果你想寫一個識別數字的程序,那麼N就是10,因為總共有10個數字。N維向量中的每一個數字都代表了屬於某個類別的概率。打個比方,如果你得到了[0 0.1 0.1 0.75 0 0 0 0 0 0.05],這代表著這張圖片是1的概率是10%,是2的概率是10%,是3的概率是75%,是9的概率5%(小貼士:你還有其他表示輸出的方法,但現在我只拿softmax (譯者註:一種常用於分類問題的激活函數) 來展示)。全連層的工作方式是根據上一層的輸出(也就是之前提到的可以用來表示特徵的激活圖)來決定這張圖片有可能屬於哪個類別。例如,如果程序需要預測哪些圖片是狗,那麼全連層在接收到一個包含類似於一個爪子和四條腿的激活圖時輸出一個很大的值。同樣的,如果要預測鳥,那麼全連層會對含有翅膀和喙的激活圖更感興趣。
基本上,全連層尋找那些最符合特定類別的特徵,並且具有相應的權重,來使你可以得到正確的概率。
現在讓我們來說說我之前有意沒有提到的神經網路的可能是最重要的一個方面。剛剛在你閱讀的時候,可能會有一大堆問題想問。第一層卷積層的卷積核們是怎麼知道自己該識別邊還是曲線的?全連層怎麼知道該找哪一種激活圖?每一層中的參數是怎麼確定的?機器確定參數(或者說權重)的方法叫做反向傳播演算法。
在講反向傳播之前,我們得回頭看看一個神經網路需要什麼才能工作。我們出生的時候並不知道一條狗或者一隻鳥長什麼樣。同樣的,在CNN開始之前,權重都是隨機生成的。卷積核並不知道要找邊還是曲線。更深的卷積層也不知道要找爪子還是喙。
等我們慢慢長大了,我們的老師和父母給我們看不同的圖片,並且告訴我們那是什麼(或者說,他們的類別)。這種輸入一幅圖像以及這幅圖像所屬的類別的想法,是CNN訓練的基本思路。在細細講反向傳播之前,我們先假設我們有一個包含上千張不同種類的動物以及他們所屬類別的訓練集。
反向傳播可以被分成四個不同的部分。前向傳播、損失函數、反向傳播和權重更新。
在前向傳播的階段,我們輸入一張訓練圖片,並讓它通過整個神經網路。對於第一個輸入圖像,由於所有權重都是隨機生成的,網路的輸出很有可能是類似於[.1 .1 .1 .1 .1 .1 .1 .1 .1 .1]的東西,一般來說並不對任一類別有偏好。具有當前權重的網路並沒有能力找出低層次的特徵並且總結出可能的類別。
下一步,是損失函數部分。注意,我們現在使用的是訓練數據。這些數據又有圖片又有類別。打個比方,第一張輸入的圖片是數字「3」。那麼它的標簽應該是[0 0 0 1 0 0 0 0 0 0]。一個損失函數可以有很多定義的方法,但比較常見的是MSE(均方誤差)。被定義為(實際−預測)22(實際−預測)22。
記變數L為損失函數的值。正如你想像的那樣,在第一組訓練圖片輸入的時候,損失函數的值可能非常非常高。來直觀地看看這個問題。我們想到達CNN的預測與數據標簽完全一樣的點(這意味著我們的網路預測的很對)。為了到達那裡,我們想要最小化誤差。如果把這個看成一個微積分問題,那我們只要找到哪些權重與網路的誤差關系最大。
這就相當於數學中的δLδWδLδW (譯者註:對L關於W求導) ,其中,W是某個層的權重。現在,我們要對網路進行 反向傳播 。這決定了哪些權重與誤差的關系最大,並且決定了怎樣調整他們來讓誤差減小。計算完這些導數以後,我們就來到了最後一步: 更新權重 。在這里,我們以與梯度相反的方向調整層中的權重。
學習率是一個有程序員決定的參數。一個很高的學習率意味著權重調整的幅度會很大,這可能會讓模型更快的擁有一組優秀的權重。然而,一個太高的學習率可能會讓調整的步伐過大,而不能精確地到達最佳點。
前向傳播、損失函數、反向傳播和更新權重,這四個過程是一次迭代。程序會對每一組訓練圖片重復這一過程(一組圖片通常稱為一個batch)。當對每一張圖片都訓練完之後,很有可能你的網路就已經訓練好了,權重已經被調整的很好。
最後,為了驗證CNN是否工作的很好,我們還有另一組特殊的數據。我們把這組數據中的圖片輸入到網路中,得到輸出並和標簽比較,這樣就能看出網路的表現如何了。