FPGA 卷積神經網路(CNN)深度學習 筆記Lesson 1 – 基本原理&名詞介紹

前言

卷積神經網路(Convolutional Neural Networks,CNN),是目前深度學習算法的主要領域,能應用在圖形識別、圖形驗證;同時卷積神經網路也能應用在網路相關領域,比如網路加速器,算法應用加速器,能幫助人類用更快的方式,得到最好的結果。

本文引用參考:How do Convolutional Neural Networks work?

(此參考作者 Brandon Rohrer 有 CC BY 授權,非營利目的使用)

卷積神經網路(CNN)

卷積神經網路(CNN) 聽起來像是很難的東西,但基本原理其實非常簡單,大概是有學過國中數學的程度,相信仔細推敲是能懂得,這邊舉個例子來說明基本原理。以下兩張圖人類可以很輕易分別出,這是叉叉圈圈,但在電腦的世界裡,這些黑白的空缺不過就是0和1所組合的陣列,對於電腦是完全沒有意義的。可如果通過CNN處理,每當我們給電腦相似的圖,電腦就能用已經學習完成的對叉叉圈圈識別模型來做判斷。

比如下圖的相似卻不規則的叉叉,一般的電腦算法,會去比較像素每一點的資料是黑(0)或是白(1),來去判斷兩張圖是否一樣,對於電腦來說果不其然地就是兩張完全不一樣的圖,但這達不到人類的要求,因為對於人類來說這就是張有點醜的叉叉,但不至於沒有辦法分別,理想上我們希望電腦能不管是在平移、放大縮小,旋轉變相的形況下都能正常判斷,至此CNN就被發展出來了。

特徵(feature)

CNN運算會去抓取不同大小的範圍去做重複比較,每一次被抓取出來的範圍就稱之為特徵(feature) ,對於以往的比較整張圖的像素陣列,抓取不同範圍的像素區域,能更好的來判斷圖形的相似處,能更有效地判斷相似的圖形。如下圖:

原本可能是一個較大的二維陣列,但藉由抓取局部的像素組成更多無數新的二維陣列,去做比較運算,可以看到構成叉叉這個符號的特徵就是中間的交叉點和尾端的散射和對角線,所以較難辨識的叉叉有符合這些的話,在CNN運算面前就是歸於叉叉這個符號的範疇內。

卷積

需要去比對每一個像素陣列的時候,需要比較計算的陣列量是難以估計的,如果有一個方法能夠縮小無數的篩選量,那這樣子數學應用就被稱之為:卷積

卷積的原理是要運算兩張圖構成的像素陣列,其中區域的相符程度,是將兩個像素陣列上的值相乘,其總和的值再去除以像素的數量。好比上圖的白色區域如果相符合(白為1)總和就是  1*1=1;同理黑色區域如果相符合 (黑為0)總和就是(-1)*(-1)=1:說明符合的區域就是為1,所以像素運算相同的區域為1, 像素運算的相異區域為(-1)。

引用作者:Brandon Rohrer示範的卷積示意圖

如上圖拿原本的叉叉圖去跟中間的3*3陣列做比較,再進行無數上述卷積的完成後,得到有著比較兩張圖後,新的7*7陣列。此陣列數值越靠近1的區域表示與該特徵越相符,反之陣列數值越靠近(-1)的區域表示與該特徵越相異,至於數值靠近0的區域則沒有參考價值。

池化(pooling)

所謂的池化就是指壓縮原數值陣列,卻又可以保留其原來的特徵特性。假設把原本需要運算比較兩張7*7的陣列,壓縮成兩張4*4去做比較,這樣運算速度上會快上許多。其運算是選取一個可能是2*2或是3*3的區域,取出裡面的最大值,建構出另一個新的陣列,這樣的好處是同樣知道相符值的同時也縮小了陣列的大小。

線性整流單元(Rectified Linear Unit,ReLU)

是把卷積後得出來的陣列,負值的部分全部代替為0,這項技術能避免CNN運算到0或是無限大,因此不想這些狀況出現,出現的技術。

輸入/輸出/隱含層(Input layer/Hidden layer/Output layer)

輸入層就是輸入進去的資訊,擔當最初的模型架構層;輸出層就是 輸出 進去的資訊,擔當最末的模型架構層 ;其中的隱含層,就是深度學習當中的處理層,像是卷積層、池化層就是屬於這一層裡面。其中隱含層還有很多的特殊的處理方式,就不一一舉例,日後有提到在多做解釋。

深度學習的階層架構

深度學習(Deep Learning)

深度學習架構圖

你可能已經注意到上圖就是,此為一組二維陣列經過CNN處理過的架構。原始的圖形陣列,經過不斷地卷積、線性整流單元、池化,使得陣列大小不斷地縮小。一般來說低階層的特徵陣列,擁有的圖形特徵更簡單,像是圖形的邊緣、亮點;高階層的特徵陣列,擁有地圖形特徵更複雜,像是已經能辨別圖形的輪廓。如果在人臉辨識的CNN下,最高層就是會拿來作為判斷依據的一層。


如果對深度學習有興趣的話,能多多研究本文所參考的作者,我自己本身在學習的過程中,獲益良多,以後可能會出FPGA做深度學習的介紹文,感謝看到這裡的讀者。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *