AI入門:卷積神經網絡
講到AI不得不講深度學習,而講到深度學習,又不能不講卷積神經網絡。如果把深度學習比作中國的互聯網界,那卷積神經網絡和循環神經網絡就是騰訊和阿里級別的地位。今天我們主要討論的卷積神經網絡,到底卷積神經網絡能解決什么問題,它的結構是怎樣的?是怎么學習的?應用在哪些具體的產品上?本文將為大家一一解答。
如果對深度學習還不了解的同學,建議你先看下之前的文章《深度學習到底有多深?》,對深度學習有一定的認知,對接來了的討論可能會更容易理解。
以下是本文討論內容的大綱:
下文的卷積神經網絡,我們用簡稱CNN表示。
01 為什么需要用到CNN?
1. 普通的神經網絡會遇到什么問題?
假設我們要做圖像識別,把一張圖片丟到機器,機器能理解的就是每個像素點的值,如下圖:
我們在搭建好神經網絡模型之后,需要做的就是用數據訓練,最終需要確定的是每一個神經元參數w和b,這樣我們就可以確定模型了。
假設我們輸入的是50*50像素的圖片(圖片已經很小了),這依然有2500個像素點,而我們生活中基本都是RGB彩色圖像,有三個通道,那么加起來就有2500*3=7500個像素點。
如果用普通的全連接,深度比較深時,那需要確認的參數太多了,對于計算機的計算能力,和訓練模型來說都是比較困難一件事。
因此,普通神經網絡的問題是:需要確認的參數太多。
那CNN是怎么解決這個問題的呢?請接著往下看。
2. CNN是怎么解決這個問題的?
第一步:局部監測
假設我們要看一張圖片中有沒有貓耳朵,也許我們不需要看整張圖片,只需要看一個局部就行了。因此看是否是一只貓,只需要看是否有貓尾、是否有貓嘴、是否有貓眼,如果都有,那機器就預測說這張圖片是一只貓。
因為這種方法看的是圖片的局部,而不是全部,也就是說神經元連接的是部分的特征變量,而不是全部的特征變量,因此參數比較少。(如果這里看不懂沒關系,我們后面會詳細解釋)。
看到這里你可能會疑問,我怎么知道取哪個局部,我怎么知道貓耳在圖片的哪個部位?不著急,后面會講到。
第二步:抽樣,縮小圖片
假設我們要識別一張50*50像素的貓相片,如果我們把圖片縮小到25*25個像素點,那其實還是能看出這是一只貓的照片。
因此,如果把圖片縮小了,就相當于輸入的特征變量變少了,這樣也能減少參數的量。
卷積神經網絡就是用上面這兩步的思想來減少參數,那具體CNN的架構是怎樣的?又是怎么運行的?我們接下來詳細討論。
02? CNN的架構
CNN的架構流程圖:
第一步:卷積,即局部監測。
第二步:特征抽樣,即縮小圖片。
然后重復第一、第二步(具體重復多少次,人為決定)。
第三步:全連接,把第一、二步的結果,輸入到全連接的神經網絡中,最后輸出結果。
1. 卷積(Convolution)
首先,把圖片轉化成機器可以識別的樣子,把每一個像素點的色值用矩陣來表示。這里為了方便說明,我們就簡化,用6*6像素來表示,且取只RGB圖片一層。
然后,我們用一些過濾器跟輸入的圖片的矩陣做卷積。(如果不知道卷積怎么運行的話,可以去問下百度)
那過濾器是什么呢?
——過濾器就是用來檢測圖片是否有某個特征,卷積的值越大,說明這個特征越明顯。
說到這里,我們回顧一下前面提到的問題:我怎么知道取哪個局部,我怎么知道貓耳在圖片的哪個部位?
用的辦法就是:移動窗口卷積。
同一個過濾器,會在原圖片矩陣上不斷的移動,每移動一步,就會做一次卷積。(每一移動的距離是人為決定的)
因此移動完之后,就相當于一個過濾器就會檢測完整張圖片,哪里有相似的特征。
卷積跟神經元是什么樣的關系呢?
上圖所示有3點需要說明:
1)每移動一下,其實就是相當于接了一個神經元。
2)每個神經元,連接的不是所有的輸入,只需要連接部分輸出。
說到這里可能你又會有疑問了,移動一下就是一神經元,這樣不就會有很多神經元了嗎?那不得又有很多參數了嗎?
確實可能有很多神經元,但是同一個過濾器移動時,參數是強行一致的,公用參數的。
3)所以同一個過濾器移動產生的神經元可能有很多個,但是他們的參數是公用的,因此參數不會增加。
跟不同過濾器卷積:
同一層可能不止是跟一個過濾器卷積,可能是多個。
不同的過濾器識別不同的特征,因此不同的過濾器,參數不一樣。但相同的過濾器,參數是一樣的。
因此卷積的特點是:
- 局部檢測
- 同一個過濾器,共享參數
3. 池化(Max pooling)
先卷積,再池化,流程圖:
用過濾器1卷積完后,得到了一個4*4的矩陣,假設我們按每4個元素為一組(具體多少個為一組是人為決定的),從每組中選出最大的值為代表,組成一個新的矩陣,得到的就是一個2*2的矩陣。這個過程就是池化。
因此池化后,特征變量就縮小了,因而需要確定的參數也會變少。
4. 全連接
經過多次的卷積和池化之后,把最后池化的結果,輸入到全連接的神經網絡(層數可能不需要很深了),最后就可以輸出預測結果了。
那到這里,我們把CNN的工作流程就講完了,但是每一步具體的意義是什么,怎么理解?
可能你還不太理的順,接下來我們會用一些可視化的方式幫助大家理解。
03 CNN是怎樣學習的?
我們以AlexNet為例,給大家展示下CNN大致的可視化過程。
AlexNet是Alex Krizhevsky等人于2012年的ImageNet比賽中提出了新型卷積神經網絡,并獲得了圖像分類問題的最好成績(Top-5錯誤率為15.3%)。
AlexNet的網絡架構:
其實AlexNet的結構很簡單,輸入是一個224×224的圖像,經過5個卷積層,3個全連接層(包含一個分類層),達到了最后的標簽空間。
AlexNet學習出來的特征是什么樣子的?
- 第一層:都是一些填充的塊狀物和邊界等特征。
- 中間層:學習一些紋理特征。
- 更高層:接近于分類器的層級,可以明顯的看到物體的形狀特征。
- 最后一層:分類層,完全是物體的不同的姿態,根據不同的物體展現出不同姿態的特征了。
所以,它的學習過程都是:邊緣→部分→整體。
關于卷積神經網絡的可視化,大家想了解更多的話,可以參考文章《卷積神經網絡超詳細介紹》。
04 AlphaGo
前面我們提到了AlphaGo有用到CNN,那具體是怎么應用的呢,這里簡答給大家科普下:
我們把圍棋看成是一個19*19像素的圖片,,每個像素點的取值:有黑子是1、有白子是-1,空為0。
因此,輸入棋盤就是所有像素點的矩陣值,輸出是下一步落子的位置。
那這個跟CNN有什么關系?
我們知道CNN擅長做的事情就是檢測局部特征,那也可以把這項技能運用到下圍棋上。
比如說上圖這種特征,檢測盤面上有沒有這樣的特征,如果有的話,通常下一步的落子是怎樣。就好比玩剪刀石頭布,檢測到對方出剪刀,那機器的應對策略就是出石頭。
同樣可能有很多不同的特征,因此需要用不同的過濾器去檢測。
而且,同一個特征可能會出現在不同的位置,因此也可以用過濾器移動的方法去檢測。
AlphaGo 有沒有池化?
講到這里你會不會好奇,AlphaGo到底有沒有用到CNN的池化。因為池化是把圖片縮小的,圍棋是19*19個點,如果縮成10*10個點,能行嗎?
實際上AlphaGo是沒有用到池化這一步的,所以說CNN也未見得一定要使用池化,還是需要實際問題實際解決,靈活應用。
好了,到這里就介紹完了CNN,后續我會寫一篇文章介紹深度學習的另一大門派:循環神經網絡RNN,感興趣的同學記得關注哦。
本文由 @Jimmy 原創發布于人人都是產品經理。未經許可,禁止轉載。
題圖來自Unsplash,基于CC0協議。
很好,學習了,很希望能多學習一些AI的相關知識
考古了