打開機器學習的黑盒——卷積神經網路原理介紹

Esri北京研發中心原創

作者:Mr.金鷹

Esri(北京)軟體研發中心成立於2011年,它是Esri在美國之外成立的第一個研發中心,也是目前Esri海外最大的研發中心.。

自從去年AlphaGo完虐李世石之後,AI徹底火了,而同時一些「電腦超越人腦」、「人類輸給了機器」、「人類將要滅亡」的言論也開始火了,甚至霍金也在GMIC大會上呼籲人類要警惕。

作者認為,這個警惕是有必要的。現在的機器學習,尤其是深度學習中,有很多模型的使用都類似黑盒,因為你只能看到輸入和輸出,而大部分人對中間層並不能說出一個所以然來。我們知道深度學習也分為監督學習和無監督學習。所謂監督學習,簡單來說你知道你想要的結果,比如分類,比如判斷對錯,你對輸出是有預見的;所謂無監督學習,是指你不知道你想要的是什麼,只是希望通過模型,從一堆數據中挖出某些有效信息來。對於無監督學習,這更像DNA的隨機組合,你不知道最終會得出什麼。

未知,往往是恐懼的源頭。所以,作者本篇文章,將通過介紹深度學習中的卷積神經網路來嘗試打開這個黑盒,讓我們知其然,也知其所以然,避免讓黑盒最終變成潘多拉魔盒。

本文不會涉及太多數學及演算法知識,而是嘗試通過圖片、舉例、模擬等方式來構建卷積神經網路的架構,並儘可能多的解釋裡面涉及到的各種專業名詞以及這些名詞在模型中所發揮的作用,讓讀者有一個清晰直觀的認識。不足之處,還請指正。

神經網路

我們先簡單介紹傳統神經網路。神經網路的基本單元叫做神經元,如下圖:

神經元也被稱為Logistic的回歸模型,神經網路就是期望通過回歸得到模型中的參數,以最終完成模型的訓練。公式中w表示權重,也就是我們最終需要回歸的參數,b是偏置值(bias),最外層的f函數是激活函數。下面對這些名詞進行介紹。

偏置值

偏置值其實就是多項式最後加上的一個常量,但是這裡需要注意,在模型訓練完成之前,它並不是一個常量,也是像w一樣需要慢慢訓練,慢慢調整的。那麼偏置值有什麼作用呢?舉個例子,我們簡化一下,就看y = wx+b,現在有兩個點代表兩個類(如下圖),一個點在(1,1),一個點在(2,2),那麼如果沒有b,你的圖像就是一條經過原點的直線,你會發現你無法將這兩個類分開。那麼,如果有了b呢?你可以表示任意一條直線,你可以畫n條線把這兩個類分開。這就是一個模型的表達能力的問題,表達能力越大,你能解決的問題就越多。

激活函數

激活函數不是指具體的某一個函數,而是滿足不同模型訓練特徵的不同的函數,比如sigmoid函數、tanh函數、ReLU函數等等。那麼激活函數到底什麼作用呢?它解決了什麼問題?說起來還是模型的表達能力的問題,線性模型表達能力不足,只好在神經網路中添加非線性因素。比如下圖:

顯然上圖圖單單使用線性模型顯然無法完成分類的,而從上文的公式我們也可以看出,如果沒有激活函數,那麼訓練出來的是一個線性模型,所以我們就必須引入非線性因素:激活函數。至於激活函數是如何作用的,大家可以參考網上具體的激活函數的介紹。

這些概念搞明白之後,我們接下來把多個神經元組合起來,並進行分層,於是就形成了完整的神經網路模型。下圖是一個具有一個隱含層(之所以叫隱含層,是因為他們其實是隱藏在黑盒之中的,你只需要輸入數據,然後等待輸出就好了)的兩層神經網路。 這裡注意,輸入層是不計算在總層數內的。

其中a1、a2、a3的計算同上,而且需要注意的是,激活函數在每一個神經元都需要使用,並不是只是在最後輸出時才使用,希望不要被誤導。隱含層可以有多層,輸入和輸出各只有一層,每一層的輸出作為下一層(如果有的話)的輸入。這裡用到的訓練演算法是BP反向傳播演算法,但本文不準備完整展現這個演算法,因為到這裡我們已經可以引出卷積神經網路。

卷積神經網路

(圖片來自:docs.google.com/present)

上圖即是一個典型的卷積神經網路,前面是輸入層、卷積層(convolution layer)和池化層(pooling layer)。卷積層中的一個個單元也不再叫神經元,而是卷積核。再往後面看,是傳統的全連接神經網路。這可能看起來有點奇怪,為什麼卷積神經網路最後還需要全連接神經網路呢?這個問題我會在最後回答,現在,我們先來了解卷積神經網路。

一個新事物的出現,往往是為了解決某個難題,那麼我們先來通過網上的一個例子來分析一下傳統神經網路會遭遇什麼問題。

一個全連接神經網路,一個1000x1000大小的圖像作為輸入數據,這個圖像可以表示為一個1000000大小的向量來輸入到神經網路中,假如隱含層的神經元數量與輸入向量相同也是1000000。那麼,根據上文神經網路部分可知,w的數量是1000000x1000000,也就是說是10^12個特徵參數!

這根本無法訓練,為什麼?

首先,這麼龐大的參數量,你需要非常龐大的數據集;其次即使你有了這麼大的數據集,你也需要非常長的時間進行訓練;再次,即使你訓練出了模型,也極有可能是過擬合的;最後,即使你的模型沒有過擬合,你的模型在實際使用的時候效率也是極差的(運行會非常慢)。

什麼是過擬合呢?舉個例子,假如你在做一個貓的識別,你的參數量非常大,包含了圖片的所有特徵,而訓練圖片里,有那麼幾張圖片,是貓正在捕捉老鼠,結果模型就認為,如果要使圖片中有貓這個結論成立,圖片里就應該包含老鼠。這就導致模型過於嚴格,從而使識別正確率非常低。與過擬合對立的是欠擬合,當參數量過少時,就會導致欠擬合。

問題拋出來了,主角也該正式登場了。卷積神經網路就是用來解決這個問題的。卷積神經網路具有3大功能來降低特徵參數量:局部連接、參數共享、池化層降採樣。我們一一介紹。

局部連接

卷積神經網路的概念最早源自19世紀60年代科學家提出的感受野。當時科學家通過對貓的視覺皮層細胞研究發現,每一個視覺神經元只會處理一小塊區域的視覺圖像,即感受野。而局部連接又叫局部感受野。一般認為圖像的空間聯繫是局部的像素聯繫較為緊密,而距離較遠的像素相關性則較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然後在更高層將局部的信息綜合起來就得到了全局的信息。

有了理論基礎,我們還是開始解決上文特徵參數過多的問題。之前隱含層的每一個神經元都和全部像素相連,現在我們只需要將每一個神經元連接到局部的像素節點。如下圖,左圖是全連接,右圖是局部連接。

假設局部感受野大小是10×10,即每個隱含節點只與10×10個像素點相連,那麼現在就只需要10×10×1000000=10^8個連接了。好的,現在我們已經把參數量降到了原來的萬分之一。可是1億個參數,仍然太多,我們繼續。

參數共享

參數共享又叫做權值共享,簡單來說,就是多個神經元共用相同的權值。試想一下,如果上面那1000000個隱含節點的10x10個參數都是相等的,那麼參數數目是不是就一下子降為10x10了呢?

這簡直是自行車到火箭的飛躍,但是為什麼可以相等?

這其中隱含的原理則是:圖像的一部分的統計特性與其他部分是一樣的。這也意味著我們在這一部分學習的特徵也能用在另一部分上,所以對於這個圖像上的所有位置,我們都能使用同樣的學習特徵。

怎麼理解呢?我們首先變換一下角度,我們不要這1000000個節點了,我們只要一個節點,但是用這一個節點去掃描整張圖片,每次掃描10x10大小的像素塊,而在掃描過程中,這個節點都是以一種相同的標準來掃描的,比如我只看邊緣,比如我只看某個顏色通道,又或者其他什麼標準,總之要是相同的標準,那麼,當我們模型訓練完成之後,權重也就固定了,也就是說我掃描的每一個像素塊都共享了這些權重,或者換個角度,我通過某種標準,從圖像里提取了10x10種特徵。而這節點使用完全相同的的模板(標準)去進行局部連接(抓取特徵)的過程就是卷積,這個節點就叫做卷積核。這個或許有點抽象,難以理解,我們再看一下下圖:

(圖片來自卷積神經網路 - 雨石 - 博客頻道 - CSDN.NET)

上圖展示了一個3×3的卷積核在5×5的圖像上做卷積的過程。每個卷積都是一種特徵提取方式,就像一個篩子,將圖像中符合條件(激活值越大越符合條件)的部分篩選出來。注意,上圖已經不是訓練過程,而是訓練好的模型在通過卷積提取圖片特徵,並作為下一層的輸入來繼續分析特徵。

其實,卷積從某種意義上來說更像是一種疊加。我之前看到一個很慘、很形象的解釋。大概說是一個人打臉,打一巴掌,會腫10分鐘,他每隔一分鐘就去打一下,並且假設每次都打同一個地方,但是每次受力都還相同……好吧,就是每打一次就會多腫10分鐘(相同標準)。那麼,第二次打的時候,已經過去了1分鐘,就是9+10分鐘消腫,第三次打就是8+9+10,第四次……這裡注意還有一點假設,就是每次打的消腫都是時空分離的,就是單獨計時。這不就是就是疊加嗎?而如果我們把1分鐘改為了無限小,那麼就可以用積分符號了,於是就變成了通常所說的卷積了。

那麼,現在我們就只有一個卷積核了,看起來很簡潔。但是,我們現在也只能提取一類特徵了。這顯然是不夠的,我們需要提取更多類的特徵,那麼,我們就需要多卷積核,一個卷積核可以提取一類特徵。那麼一個卷積層多少卷積核才合適呢,我認為這沒有一個標準答案,不同的模型,不用的數據,都是不一樣的,但有一點可以肯定,需要的一定不會太多。

一方面,我們通過權值共享好不容易減少的卷積核數量,如果又增長上來了,那我們豈不是又回到了原點?另一方面,從理論角度講,一張圖像,也就是點,線元素,再進一步可以組合成三角形,四邊形……再進一步就是抽象組合,比如耳朵,眼睛……這些特徵類別都很有限,而且根據經驗,一般來說,第一個卷積層包含100個以內的卷積核就足夠了。假如我們第一個卷積層使用了100個卷積核,現在,我們的參數數量是100x10x10=10^4個,和1億相比,好多了,不是嗎?

池化層

我們的參數優化之路還沒有走完,參數數量還可以更優化。現在我們有10^4個參數,如果我們對這100x100個特徵進行再劃分,如下圖:

這裡作者作圖偷了下懶,特徵當然不會都是相同的,但是用來講解池化卻是夠了。圖中我們進行了2x2劃分,在這2x2中我們對4個特徵量取平均值或者最大值或者其他運算從而得到一個新的特徵量,比如左上角,按取最大值就是取4,取平均值就是2.5了。那麼,我們的參數量又進一步縮減為了10000/4=2500個了。這個過程,其實就叫做池化,根據操作不同,可能叫最大池化,平均池化或者其他池化。這個其實就比較好理解,這無非是對基礎特徵進行了聚合,比如取最大值就是取最顯著的特徵,取平均值就是取最普遍的特徵等等。

到這裡,卷積神經網路的主要結構就介紹完了,總結一下就是局部連接(Local?Connection)、權值共享(Weight?Sharing)和池化層(Pooling)中的降採樣(Down-Sampling)三部分。

還剩下一個問題,回到前文的舉例的卷積神經網路的結構圖,為什麼卷積神經網路後面還要接上全連接神經網路?

首先卷積神經網路是為了簡化特徵參數的,它是為了解決全連接參數過多的問題的。但是,在解決問題時,它使用了權值共享,這意味著獲取到的這些特徵都是基礎特徵,都跟空間無關。而當我們需要組合更高級特徵時,比如耳朵,鼻子等,是需要位置等因素的。那麼不同的位置就需要不同的權重,卷積層就無法勝任了,必須使用局部全連接層和全連接層;其次,我想說這其實還揭示了一個令人興奮的事實,卷積神經網路是可遷移的!這意味這什麼呢?我們沒有必要所有的模型都從頭去進行訓練,在我們拿到了基礎的特徵之後,我們只需要再去提供一些新的數據去訓練得到我們需要的高級特徵即可。作為一個攻城獅,作者敏銳的感覺到,未來,卷積神經網路基礎模型的輪子也會開始滿天飛了。

未來,機器學習將會更加繁榮。面對這種繁榮,我們也更加需要明白繁榮背後的本質,以免樂極生悲。

最後,給大家推薦一個數字識別的深度學習模型的3D可視化網站:

scs.ryerson.ca/~aharley。(國外網站,需要翻牆)

相信通過親自動手操作,再結合本篇文章,能夠對卷積神經網路有一個更清晰的認識。

推薦閱讀:

TAG:機器學習 | 卷積神經網路CNN | GIS地理信息系統 |