我們在4.2節講到了神經網絡已經逐步成為人類智能生活的璀璨明珠,並介紹了全連接神經網絡的整個訓練過程(深度學習開端-全連接神經網絡),整個流程緊湊而又科學,似乎全連接神經網絡已經能解決很多問題了,但細心的讀者會發現筆者並沒有提及全連接神經網絡的缺點。因此,這一節筆者正好通過全連接神經網絡的缺點來開展CNN卷積神經網絡(Convolutional Neural Network)的教學。
為了講清全連接神經網絡的局限性,筆者還是拿出上一節最簡單的全連接網絡結構圖來講解,如圖4.3所示,相信大家對這個圖也不陌生了。設想一下,我們為了求解損失Loss 列出了關於w,b 的方程,並通過梯度下降的方法去求解最佳的(w , b),從而得到最小的損失Loss。換言之,4.2節的內容簡單來講就是站在山上找最陡峭的地方(梯度),不斷地往下走,一直走到山谷,這時候我們所在坐標(w , b)就是Loss方程的最優解。
為此,針對圖 4.3的這個網絡結構,我們要對隱藏層和輸出層求4個偏導,又因為隱藏層的輸出作為輸出層的輸入,這時我們就要用到求偏導的鏈式法則,公式如下:
由公式(4.14)~(4.19),我們可以看出,兩個神經元,為了求出隱藏層和輸出層最佳的(w , b),我們就要求四個偏導,期間還得為鏈式求導付出3次連乘的代價。
現在,重點來了,如圖 4.8所示,倘若我們的網絡層次越深,偏導連乘也就越多,付出的計算代價也就越大。
緊接著,一個網絡層不單止一個神經元,它可能會有多個神經元,那麼多個神經元的輸出作為下一級神經元的輸入時,就會形成多個複雜的嵌套關係。
我們知道全連接神經網絡層級之間都是全連接的,所以網絡結構越複雜,那要求的(w , b)就會非常多,整個網絡就會收斂得非常慢,這是我們所不希望看到的。這就是全連接神經網絡的局限性,特別是針對圖像這些冗餘信息特別多的輸入,如果用全連接神經網絡去訓練,簡直就是一場計算災難。那麼既然問題出現了,就會有人提出解決方法。這時候CNN卷積神經網絡便應運而生了。
圖 4.8 多層全連接神經網絡
說了這麼多,筆者這就給大家附上一張CNN網絡結構圖,如圖 4.9所示,讓大家都有個直觀的了解。大家可以看到一個經典的CNN網絡結構一般包含輸入層(Input layer)、卷積層(convolutional layer)、池化層(pooling layer)和輸出層(全連接層+softmax layer)。雖說目前除了輸入層,咱啥也不認識,不過,不要慌,接下來就是剖析CNN的精彩時刻。
圖 4.9 CNN卷積神經網絡示意圖
1)總有至少1個的卷積層,用以提取特徵。
2)卷積層級之間的神經元是局部連接和權值共享,這樣的設計大大減少了(w , b)的數量,加快了訓練。
以上便是卷積神經網絡的特點,為了讓大家更清晰地了解這個網絡結構的特點,筆者接下來將分別對它的兩個特性和特有的網絡層次進行詳細講解。
前面我們提到,圖像擁有很多冗餘的信息,而且往往作為輸入信息,它的矩陣又非常大,利用全連接神經網絡去訓練的話,計算量非常大,前人為此提出了CNN,它的亮點之一就是擁有卷積層。
大家可以想像一下,如果信息過於冗餘,那麼我們能否去除冗餘取出精華部分呢?對,卷積層就是幹這個的,通俗易懂來說就是壓縮提純。
那捲積層又是如何工作的呢?大家可以看下圖 4.9的CNN網絡結構圖。卷積層裡面有個小框框,那個就是卷積核(Convolutional Kernel),壓縮提純的工作主要通過它來實現的。
現在,筆者再附上一張圖,如圖 4.10,讓大家明白卷積核是怎麼工作的,我們可以把藍色矩陣看做卷積層的上一層,綠色矩陣看做卷積層,在藍色矩陣上蠕動的便是卷積核,卷積核通過與他所覆蓋藍色矩陣的一部分進行卷積運算,然後把結果映射到綠色矩陣中。
圖 4.10 卷積核運算示意圖1
那麼接下來我們要了解卷積核是如何將結果映射到卷積層的。如圖 4.11所示。
圖 4.11卷積核運算示意圖2
現在大家也看到了,卷積核在滑動過程中做的卷積運算就是卷積核w 與其所覆蓋的區域的數進行點積,最後將結果映射到卷積層。具體的運算公式如式(4.20)所示。
這樣看來,我們將9個點的信息量,壓縮成了1個點,也就是有損壓縮,這個過程我們也可以認為是特徵提取。
公式中(w , b)和之前全連接神經網絡並沒有區別,就是權值w 和偏置b ,它們在初始化之後,隨著整個訓練過程一輪又一輪的迭代逐漸趨向於最優。
在卷積核 之後一般會加一個Relu的激勵函數,就跟4.2節介紹的全連接神經網絡的神經元計算組合公式(4.1)和(4.2)一樣,只不過這裡換成了Relu激勵函數,而全連接神經網絡用的是sigmod激勵函數。這麼做的目的都是讓訓練結果更優。
好了,講到這,大家應該大致明白了卷積層的工作方式,就是個壓縮提純的過程,而且每個卷積層不單止一個卷積核,它是可以多個的,大家又可以看一下圖 4.9的CNN網絡的卷積層,大家會看到輸出的特徵圖在「變胖」,因為特徵圖的上一級經過多個卷積核壓縮提純,每個卷積核對應一層,多層疊加當然會「變胖」。
筆者在全連接神經網絡的局限性中提它的網絡層與層之間是全連接的,這就導致了整個訓練過程要更新多對(w , b),為此CNN特定引入了局部連接和權值共享的兩個特性,來減少訓練的計算量。
筆者先給大家介紹一下這麼做的科學性在哪?圖像或者語言亦或者文本都是冗餘信息特別多的東西,倘若我們依照全連接神經網絡那般全連接,也就是將所有信息的權值都考慮進了訓練過程。
講到這,大家應該明白這麼設計的用途了吧,沒錯,就是適當得放棄一些連接(局部連接),不僅可以避免網絡將冗餘信息都學習進來,同時也和權值共享特性一樣減少訓練的參數,加快整個網絡的收斂。
局部連接與權值共享如圖 4.12和圖 4.13所示。
圖 4.12 局部連接
圖 4.13權值共享
大家可以重點看權值共享這張圖,它同時也採用了局部連接,總共就有3*4=12個權值,再加上權值共享,我們就只用求3個權值了,大大減少了我們的計算量。
一般來說,卷積層後面都會加一個池化層,這時候大家又可以往上看看圖 4.9的CNN網絡結構了,並且可以將它理解為對卷積層進一步特徵抽樣,池化層主要分為兩種,這時候筆者認為前面說了這麼多,現在給大家上一張圖,大家應該就明白池化層是何用處。池化層運算如圖 4.14所示。
圖 4.14 Pooling運算示意圖
是的,max就是將對應方塊中最大值一一映射到最大池化層(max pooling layer),mean就是將對應方塊的平均值一一映射到平均池化層(mean pooling layer)。
好了,講到這,我們終於把整個CNN架構特有的層次結構和屬性都過了一遍,這時候大家應該大致明白整個CNN架構就是一個不斷壓縮提純的過程,目的不單止是為了加快訓練速度,同時也是為了放棄冗餘信息,避免將沒必要的特徵都學習進來,保證訓練模型的泛化性。
CNN整個訓練過程和全連接神經網絡差不多,甚至是筆者之後介紹的RNN、LSTM模型,他們的訓練過程也和全連接神經網絡差不多,唯一不同的就是損失Loss 函數的定義,之後就是不斷訓練,找出最優的(w , b),完成建模,所以大家搞懂了全連接神經網絡的訓練過程,就基本吃遍了整個深度學習最重要的數學核心知識了。
這時候,細心的讀者們會發現CNN網絡結構的輸出層也就是softmax層沒介紹,是的,筆者現在就開始介紹。CNN損失函數之所以不同也是因為它,這層是CNN的分類層,如圖 4.15所示。
圖 4.15 softmax層示意圖
softmax層的每一個節點的激勵函數
上面的公式,我們可以理解為每個節點輸出一個概率,所有節點的概率加和等於1,這也是CNN選擇softmax層進行分類的原因所在,可以將一張待分類的圖片放進模型,softmax輸出的概率中,最大概率所對應的標籤便是這張待分類圖的標籤。
這時候,筆者給大家舉個例子就明白了。現在我們的softmax層有3個神經元,也就是說我們可以訓練一個分三類的分類器,現在假設我們有一組帶標籤的訓練樣本,他們的標籤可以如此標記,對應節點標記1,其他標記0。其實就是onehot編碼,如圖 4.16所示。
圖 4.16 One-hot編碼示意圖
訓練的時候將訓練樣本圖片放入輸入層,標籤向量放入輸出層,最終訓練出一個模型。
此時,筆者將一張待分類的圖片放入我們的模型中,如果最後softmax層輸出的結果是結果(4.25)。
這時,大家就明白了上訴公式的含義了,0.85對應著最大概率,說明這張圖片是貓。接著所有概率加起來等於1,這樣是不是好理解很多啦。好了,講了這麼久,我們還是沒有把softmax的損失函數給寫出來,它有點特殊,叫交叉熵,如式(4.26)~(4.27)所示。
雖說它長得奇奇怪怪的,但是整體的訓練過程和全連接神經網絡的思路是一樣,都是通過梯度下降法找出最優的(w , b),使Loss 最小,最終完成建模。
接下來介紹的內容就比較愉快了,主要是介紹訓練CNN網絡之前有些參數需要大家手動去設置,行話稱之為超參數設置(hyperparameters setting)。
1. 卷積核初始化
卷積核的權值w和偏置b一開始是需要我們人工去初始化的,這裡初始化的方法有很多,Tensorflow或者Keras在我們構建卷積層的時候自行給我們初始化了,但是哪天大家心血來潮想自己初始化也是可以的,我們的權值初始化可以根據高斯分布去設置,這樣得到的初始化權值更加符合自然規律,畢竟咱們的計算機也是自然界的一部分。
2. Padding
Padding是指對輸入圖像用多少個像素去填充,如圖 4.17所示。
這麼做的目的也非常的簡單,就是為了保持邊界信息,倘若不填充,邊界信息被卷積核掃描的次數遠比不是中間信息的掃描次數,這樣就降低了邊界信息的參考價值了。
其次還有另外一個目的是,有可能輸入圖片的尺寸參差不齊,通過Padding來使所有的輸入圖像尺寸一致,避免訓練過程中沒必要的錯誤。
圖 4.17 Padding示意圖
3. Stride步幅
就是卷積核工作的時候,每次滑動的格子數,默認是1,但是也可以自行設置,步幅越大,掃描次數越少,得到的特徵也就越「粗糙」,至於如何設置,業界並沒有很好的判斷方法,也就是說,一切全靠大家自己去試,怎麼優秀怎麼來。如圖 4.18所示。
圖 4.18 Stride示意圖
上面講了這麼多,其實放在TensorFlow或者Keras裡面就是幾行代碼的事,但是筆者還是傾向於讓大家理解整個CNN到底是怎麼訓練的,它的優點又在哪,這樣大家也不至於只知道CNN能用來幹嘛,也知道了CNN為什麼能這麼做,這樣對大家以後自己組建一個厲害的網絡是很有指導意義的。
下一期,我們將講授
神經網絡的超參數(Hyperparameters)敬請期待~
關注我的微信公眾號~不定期更新相關專業知識~