back to index
【機器學習2021】卷積神經網路 (Convolutional Neural Networks, CNN)

link |
我們要來講Network的架構,我們開始探討Network的架構設計。
link |
那我第一個要跟大家講的Network架構的變形呢,是Convolutional的Neural Network,它的縮寫呢就是CNN。
link |
那這個CNN呢,它是專門被用在影像上的。
link |
那我希望透過CNN這個例子,來讓你知道說Network的架構,它的設計有什麼樣的想法。
link |
那為什麼設計Network的架構可以讓我們的Network結果做得更好。
link |
好,那我們接下來呢,要講的例子是跟影像有關的。
link |
我們今天就想像說,我們要做影像的分類。
link |
也就是給機器一張圖片,它要去決定說這張圖片裡面有什麼樣的東西。
link |
那怎麼做呢?我們已經跟大家講過怎麼做分類這件事情。
link |
在以下的討論裡面,我們都假設我們的模型輸入的圖片大小是固定的。
link |
舉例來說,它固定輸入的圖片大小都是100x100的解析度。
link |
我們假設說不會突然出現大小不一的照片。
link |
其實今天一般在做影像辨識的時候,往往都有這樣子的假設。
link |
就算是今天這個Deep Learning已經這麼的popular,我們往往都還是需要假設說一個模型輸入的影像大小都是一樣的。
link |
那你說圖片可能有大有小啊,而且不是所有圖片都是正方形,當然有長方形的怎麼辦。
link |
今天常見的處理方式,丟進影像辨識系統的處理方式就是把所有圖片都先rescale成大小一樣,再丟到影像的辨識系統裡面。
link |
那我們的模型的輸出應該是什麼呢?我們模型的目標是分類。
link |
所以我們會把每一個類別表示成一個one-hot的vector,我們的目標就叫做white hat。
link |
那在這個one-hot的vector裡面,假設我們現在的類別是一個貓的話,貓所對應的dimension數值就是1,其他的東西所對應的dimension數值就是0。
link |
那這個dimension的長度就決定了你現在的模型可以辨識出多少不同種類的東西。
link |
如果你這個像量的長度是2000,就代表說你這個模型可以辨識出2000種不同的東西。
link |
那今天比較強的影像辨識系統往往可以辨識出1000種以上的東西,甚至到上萬種不同的object。
link |
那如果你今天希望你的影像辨識系統可以辨識上萬種object,那你的label就會是一個上萬維,維度是上萬的one-hot vector。
link |
那我們的模型的輸出,通過softmax以後,輸出是Wi-Fi,然後我們就會希望Wi-Fi跟white hat,他們的cross entropy越小越好。
link |
那有關這個cross entropy的部分,我們已經跟大家講過了,所以相信這個地方大家不是問題。
link |
接下來的問題是,怎麼把一張影像當作一個模型的輸入呢?
link |
那我們先來看一下對電腦來說,一張影像是什麼樣的東西。
link |
那其實對一個machine來說,一張圖片其實是一個三維的tensor。
link |
那什麼叫做tensor呢?如果不知道tensor是什麼的話,你就想成它是維度大於二的矩陣,就是tensor。
link |
矩陣是二維的嘛,那二維以上的、超過二維的矩陣,你就叫它tensor。
link |
一張圖片,它是一個三維的tensor。那三維呢,其中一維代表圖片的寬,另外一維代表圖片的高,還有一維代表圖片的channel的數目。
link |
這個所謂的channel是什麼意思呢?一張彩色的圖片,今天它每一個pixel都是由RGB三個顏色所組成的。
link |
所以這三個channel就代表了RGB三個顏色。那長跟寬就代表了今天這張圖片的解析度,代表這張圖片裡面有的pixel,有的像素的數目。
link |
那接下來我們就要把這一個三維的tensor把它拉直,把它拉直以後就可以丟到一個network裡面去了。
link |
記得嗎?到目前為止我們所講的network,它的輸入其實都是一個向量。
link |
所以我們只要能夠把一張圖片變成一個向量,我們就可以把它當作是network的輸入。
link |
但是怎麼把這個三維的tensor變成一個向量呢?最直覺的方法就是直接拉直它。
link |
一個三維的tensor裡面有幾個數字呢?在這個例子裡面有100x100x3個數字。
link |
所以一張圖片是由100x100x3個數字所組成的,把這些數字通通拿出來排成一排就是一個巨大的向量,這個向量可以作為network的輸入。
link |
而這個向量裡面,每一維它裡面存的數值其實就是某一個pixel,某一個顏色的強度。
link |
每一個pixel有RGB三個顏色所組成,每個顏色都有一個數值代表說這個顏色的強度。
link |
在這個向量裡面,每一維它的數值就代表了某一個位置的某一個顏色的強度。
link |
這個向量我們可以把它當作是一個network的輸入。
link |
我們到目前為止只講過了fully connected的network。
link |
如果我們把這個向量當作network的輸入,那我們input這邊這個feature vector它的長度就是100x100x3,非常長的一個vector。
link |
假設我們現在第一層的neuron的數目有1000個,那你能計算一下這邊第一層總共有多少個weight嗎?
link |
我們每一個neuron它跟輸入的向量的每一個數值都會有一個weight。
link |
所以如果輸入的向量的長度是100x100x3有1000個neuron,那我們現在第一層的weight就有1000x100x100x3也就是3x10的7次方,是一個非常巨大的數目。
link |
當然隨著參數的增加,我們可以增加模型的彈性,我們可以增加它的能力,但是我們也增加了overfitting的風險。
link |
有關什麼叫模型的彈性,到底overfitting怎麼產生的,下週吳慧媛老師會從數學上給大家非常清楚的證明。
link |
我們這邊就講概念上,如果模型的彈性越大就越容易overfitting,那我們怎麼減少在做影像辨識的時候,怎麼避免使用這麼多的參數呢?
link |
考慮到影像辨識這個問題本身的特性,其實我們並不一定需要fully connected這件事。
link |
考慮影像本身的特性,我們其實不需要每一個neuron跟input的每一個dimension都有一個weight。
link |
怎麼說呢?接下來就是對影像辨識這個問題,對影像本身的特性的一些觀察。
link |
第一個觀察是對影像辨識這個問題而言,假設我們想要知道說這張圖片裡面有一隻動物,這個動物是一個鳥,要怎麼做呢?
link |
也許對一個影像辨識的系統而言,對一個影像辨識的neuron,對一個影像辨識的內神經網路裡面的神經元而言,
link |
它要做的就是偵測說現在這張圖片裡面有沒有出現一些特別重要的pattern,而這些pattern是代表了某種物件。
link |
舉例來說,如果現在有某一個neuron說它看到鳥嘴這個pattern,有某一個neuron又說它看到眼睛這個pattern,
link |
又有某一個neuron說它看到鳥爪這個pattern,也許看到這些pattern綜合起來就代表說我們看到了一隻鳥。
link |
內神經網路就可以告訴你說,因為看到這些pattern,所以它看到了一隻鳥。
link |
也許你會覺得說看pattern然後決定它是什麼,這件事情好像沒有很聰明。
link |
那你仔細想想,人是不是也是用同樣的方法來看一張圖片中有沒有一隻鳥呢?
link |
你看這邊有一個鳥嘴,這邊有一個眼睛,看起來它是一個烏鴉,但是它其實是一隻貓。
link |
如果你看到它是一隻鳥的話,那你就應該放下酒杯了,因為這是一隻貓。
link |
所以其實就算是人,我們在判斷一個物件的時候,往往也是抓最重要的特徵,
link |
然後看到這些特徵以後,你很直覺地就會覺得說你看到了某種物件。
link |
對機器來說,也許這也是一個有效的判斷影像中有什麼物件的方法。
link |
但是假設我們現在要neuron做的事情,其實就是判斷說現在有沒有某種pattern出現,
link |
那也許我們並不需要每一個neuron都去看一張完整的圖片。
link |
因為這些重要的pattern,比如說鳥嘴、眼睛、鳥爪,並不需要看整張完整的圖片才能夠得到這些資訊。
link |
只要知道說這邊有沒有一個鳥嘴,你其實只要看非常小的範圍就知道了,並不需要看整張圖片。
link |
所以這些neuron也許根本就不需要把整張圖片當作輸入,
link |
他們只需要把圖片的一小部分當作輸入,就足以讓他們偵測某些特別關鍵的pattern有沒有出現了。
link |
根據這個觀察,我們就可以做第一個簡化。
link |
怎麼簡化呢?本來我們每一個neuron,他要看完整的圖片。
link |
把圖片裡面的每一個pixel,每一個pixel都還有三個數字,
link |
把一張圖片裡面所有的資訊都丟給一個neuron,然後讓他產生好分。
link |
這是fully connected network做的事情。
link |
但是現在我們已經觀察到說,也許不需要讓一個neuron看完整的圖片,
link |
那怎麼透過這個觀察來設計我們的neuron network呢?
link |
在CNN裡面有一個這樣的做法,我們會設定一個區域叫做receptive field。
link |
每一個neuron都只關心自己的receptive field裡面發生的事情就好了。
link |
舉例來說,你會先定義說這個藍色的neuron,他的守備範圍就是這個receptive field。
link |
這個receptive field裡面有3乘以3乘以3的數值。
link |
這個小的立方體裡面有3乘以3乘以3的數值。
link |
對這個藍色的neuron來說,他只需要關心這一個小範圍就好了,
link |
不需要在意整張圖片裡面有什麼東西,只在意他自己的receptive field裡面發生的事情就好。
link |
那這個neuron怎麼考慮這個receptive field裡面有發生什麼樣的事情呢?
link |
他要做的事情就是把這3乘以3乘以3的數值拉直,變成一個長度是3乘以3乘以3,
link |
也就是27維的向量,再把這27維的向量作為這個neuron的輸入,
link |
這個neuron會給27維的向量的每一個dimension一個weight,
link |
所以這個neuron有3乘以3乘以3,27個weight,再加上bias得到一個輸出,
link |
這個輸出再送給下一層的neuron當作輸入。
link |
所以每一個neuron他只考慮自己的receptive field。
link |
那這個receptive field要怎麼決定出來呢?
link |
你可以說這邊有個藍色的neuron,他就看左上角這個範圍,這是他的receptive field。
link |
另外又有另外一個黃色的neuron,他是看右下角這個3乘以3乘以3的範圍,
link |
這個立體的部分我們就畫不出來了,我們這邊畫一個正方形代表3乘以3乘以3的範圍,
link |
這個是黃色這個neuron的receptive field。
link |
那receptive field彼此之間也可以是重疊的,
link |
比如說我現在畫一個receptive field在這個地方,
link |
他跟藍色的跟黃色的都有一些重疊的空間,這樣也是可以的。
link |
所以receptive field彼此之間是可以重疊的,
link |
你可以說兩個人的守備範圍彼此是有重疊的,
link |
那你甚至可以兩個不同的neuron他們守備同樣的範圍,
link |
也許一個範圍只用一個neuron來守備,你沒有辦法偵測所有的pattern,
link |
所以同一個範圍可以有多個不同的neuron,
link |
所以同一個receptive field他們可以有多個neuron,
link |
他們可以去守備同一個receptive field。
link |
那接下來你就會浮想連篇,有各式各樣的想法,
link |
舉例來說,那我可不可以receptive field有大有小呢?
link |
因為畢竟pattern有的比較小有的比較大嘛,
link |
有的pattern也許在3x3的範圍內就可以被偵測出來,
link |
有的pattern也許要11x11的範圍才能被偵測出來,
link |
那我可不可以receptive field有大有小呢?
link |
我可不可以receptive field只考慮某些channel呢?
link |
我們這邊看起來我們的receptive field是RGB三個channel都考慮,
link |
但也許有些pattern只在紅色的channel會出現,
link |
也許有些pattern只在藍色的channel會出現,
link |
我可不可以有的neuron只考慮一個channel呢?
link |
可以,其實之後在講到network compression的時候,
link |
有人會問說,這邊的receptive field通通都是正方形的,
link |
你剛才舉的例子裡面3x3 11x11也都是正方形的,
link |
receptive field是你自己定義的,
link |
決定你覺得receptive field應該要長什麼樣子。
link |
當然這邊還可以有各式各樣怪怪的想法,
link |
你可能會說receptive field的範圍一定要相連嗎?
link |
它的receptive field就是影像的左上角跟右上角?
link |
理論上可以,但是你就要想想看為什麼你要這麼做嗎?
link |
你要看一個圖片的左上角跟右下角才能夠找到的?
link |
也許沒有,如果沒有的話,這種receptive field就沒什麼用。
link |
我們之所以receptive field都是一個相連的領地,
link |
就是因為我們覺得要偵測一個pattern,
link |
那這個pattern它就出現在整個圖片裡面的某一個位置,
link |
而不是分成好幾部分出現在圖片裡面的不同的位置。
link |
所以receptive field通常見到的都是相連的領地。
link |
但如果你說你要設計很奇怪的receptive field
link |
去解決很特別的問題,那完全是可以的,
link |
雖然receptive field你可以任意設計,
link |
但這邊要跟大家講一下最經典的receptive field的安排方式。
link |
第一個就是會看所有的channel,
link |
你可能不會覺得有些pattern只出現在某一個channel裡面,
link |
我們在描述一個receptive field的時候,
link |
就不用講它的深度,反正深度一定是考慮全部的channel。
link |
而這個高跟寬合起來叫做kernel size,
link |
我們的kernel size就是3x3,
link |
那一般我們這個kernel size其實不會設太大,
link |
你在影像辨識裡面往往做個3x3的kernel size就足夠了,
link |
如果你說設個7x7、9x9,那這算是蠻大的kernel size,
link |
那如果kernel size都是3x3,
link |
意味著說我們覺得在做影像辨識的時候,
link |
重要的pattern都只在3x3這麼小的範圍內就可以被偵測出來囉,
link |
有些pattern也許很大啊,也許3x3的範圍沒辦法偵測出來啊,
link |
常見的resetting field設定方式就是kernel size是3x3,
link |
然後一般同一個resetting field會有一組neuron去守備這個範圍,
link |
所以你畫一個resetting field以後,
link |
不會只有一個neuron去關照它,不會只有一個neuron去守備它,
link |
往往會有一組、一排neuron去守備它,
link |
比如說64個或者是128個neuron去守備一個resetting field的範圍。
link |
到目前為止我們講的都是一個resetting field,
link |
那各個不同resetting field之間的關係是怎麼樣呢?
link |
你會把你在最左上角的這個resetting field往右移一點,
link |
然後就製造一個新的守備範圍,製造另外一個resetting field。
link |
那這個移動的範圍、移動的量叫做stride,
link |
像在這個例子裡面stride就等於2,
link |
那stride是一個你自己決定的參數、決定的hyperparameter你要自己調的,
link |
那這個stride你往往不會設太大,往往設1或2就可以了,
link |
因為你希望這些resetting field跟resetting field之間是有重疊的。
link |
為什麼我們希望resetting field之間是有重疊的呢?
link |
因為假設resetting field完全沒有重疊,
link |
那有一個pattern就正好出現在兩個resetting field的交界上面,
link |
那就會變成沒有任何neuron去偵測它,
link |
那你可能就會miss掉這個pattern。
link |
所以我們會希望resetting field彼此之間有高度的重疊。
link |
那假設我們設stride等於2,那第一個resetting field就在這邊,
link |
那第二個就在這邊,那第三個就再往右移兩格,
link |
那這邊就遇到一個問題了,它超出了影像的範圍,怎麼辦呢?
link |
那有人可能會說那就不要在這邊擺resetting field,
link |
那你這樣就漏掉了影像的邊邊的地方啊,
link |
有一個pattern出現在邊邊的地方,
link |
你就沒有neuron去觀照那些pattern啦,
link |
沒有neuron去偵測出現在邊邊的pattern啦。
link |
什麼叫padding? Padding就是補0。
link |
所以如果你今天resetting field有一部分超出影像的範圍之外了,
link |
其實也有別的補值的方法啦,padding就是補值的意思,
link |
有別的補值的方法,比如說有人會說我這邊不要補0好不好,
link |
我補整張圖片裡面所有value的平均。
link |
可以,或者你說我把邊邊的這些數字拿出來補,
link |
可以,有各種不同的padding的方法。
link |
那在這邊呢,我們一樣垂直方向的stride也是設2,
link |
所以你有一個resetting field在這邊,
link |
垂直方向移動兩個,就有一個resetting field在這個地方。
link |
都是有被某一個resetting field覆蓋的,
link |
也就是圖片裡面每一個位置都有一群neuron
link |
在偵測那個地方有沒有出現某些padding。
link |
好,那這個是第一個簡化Fully Connected Network的方式。
link |
第二個觀察就是同樣的padding,
link |
雖然它們的形狀都是一樣的,都是鳥嘴,
link |
但是它們可能出現在圖片裡面的不同的位置。
link |
同樣的padding出現在圖片的不同的位置
link |
它一定落在某一個resetting field裡面,
link |
resetting field是蓋滿整個圖片的,
link |
不是在某個neuron的守備範圍內。
link |
所以這個地方一定是某一個neuron的resetting field,
link |
那假設在那個resetting field裡面有一個neuron,
link |
假設這邊一定是在某一個resetting field的範圍裡面,
link |
那個resetting field一定有一組neuron在照顧,
link |
那假設其中有一個neuron它可以偵測鳥嘴的話,
link |
那鳥嘴出現在圖片的中間也會被偵測出來。
link |
都去放一個偵測鳥嘴的neuron嗎?
link |
如果不同的守備範圍都要有一個偵測鳥嘴的neuron,
link |
為什麼教務處希望可以推大型的課程一樣。
link |
假設說每一個科系其實都需要程式相關的課程,
link |
或每一個科系都需要機器學習相關的課程,
link |
那如果放在影像處理上的話是怎麼樣呢?
link |
我們能不能夠讓不同receptive field的neuron,
link |
他們共享參數,也就是做parameter sharing,
link |
這兩個neuron,他們的weight完全是一樣的。
link |
上面這個neuron的第一個weight叫做W1,
link |
下面這個neuron的第一個weight也是W1,
link |
他們是同一個weight,我們都用黃色來表示。
link |
上面這個neuron的第二個weight是W2,
link |
下面這個neuron的第二個weight也是W2,
link |
上面這個neuron跟下面這個neuron,
link |
他們首輩的receptive field是不一樣的,
link |
所以上面這個neuron,我們說他的輸入是X1、X2,
link |
下面這個neuron,我們說他的輸入是X1'、X2'。
link |
上面這個neuron的輸出就是X1W1加X2W2,
link |
然後透過activation function得到輸出。
link |
下面這個neuron雖然也有W1、W2,
link |
所以他的輸出不會跟上面這個neuron一樣。
link |
所以就算是兩個neuron共用參數,
link |
receptive field的neuron共用參數,
link |
如果今天兩個首輩一樣的區域的neuron共用參數的話,
link |
那如果兩個neuron首輩的範圍不一樣,
link |
我們讓一些neuron可以共用參數。
link |
在影像辨識上面的共享方法是怎麼設定的。
link |
每一個receptive field
link |
所以這個receptive field有64個neuron,
link |
這個receptive field也有64個neuron。
link |
所以其實每一個receptive field
link |
就是這個receptive field的第一個neuron
link |
會跟這個receptive field的第一個neuron
link |
他的第二個neuron跟他的第二個neuron
link |
他的第三個neuron跟他的第三個neuron
link |
所以每一個receptive field
link |
那這些參數有一個名字叫做filter。
link |
這兩個neuron他們共用同一組參數,
link |
叫filter3,叫filter4,
link |
這是fully connected的network,
link |
所以我們有了receptive field的概念。
link |
只能看一張圖片裡面的一個範圍的時候,
link |
如果是fully connected的network,
link |
所以fully connected layer
link |
但加上receptive field的概念以後,
link |
所以加receptive field以後,
link |
這兩個network的參數要是什麼。
link |
加上parameter sharing
link |
就是convolutional layer,
link |
convolutional layer。
link |
那有用convolutional layer的network
link |
就叫convolutional neural network,
link |
model bias大不一定是壞事,
link |
model的flexibility很高的時候
link |
Fully connected layer
link |
而convolutional layer
link |
剛才講的receptive field
link |
那因為convolutional layer
link |
什麼叫做convolutional layer?
link |
convolutional layer就是
link |
是3x3xchannel的size,
link |
那一個convolutional layer裡面
link |
3x3xchannel這麼大的tensor,
link |
但這些pattern要在3x3xchannel
link |
其實就是model裡面的parameter,
link |
通過一個convolutional的layer
link |
我們產生出來了一個feature map,
link |
那假設這個convolutional的layer裡面
link |
那我們產生出來的feature map
link |
第一個filter產生4乘以4的數字,
link |
第二個filter也產生4乘以4的數字,
link |
不是RGB這個圖片的channel,
link |
那這個convolutional的layer
link |
就是它要處理的影像的channel,
link |
所以跟剛才第一層的convolution
link |
對第二個convolutional的layer來說
link |
這個64是前一個convolutional layer的filter數目,
link |
前一個convolutional layer
link |
沒有辦法看比較大範圍的pattern呢?
link |
如果我們在第二層convolutional的layer,
link |
看第一個convolutional layer的輸出的
link |
這個feature map的3x3的範圍的時候,
link |
所以雖然我們的filter只有3x3,
link |
所以今天你的network疊得越深,
link |
就是第二個版本故事裡面的filter。
link |
這件事其實就是convolution。
link |
這就是為什麼convolution layer
link |
要叫convolution layer的關係。
link |
這件事情其實就是convolution。
link |
不同的receptive field
link |
這個就是convolution layer。
link |
那convolution layer
link |
activation function
link |
比較像是sigmoid、relu那些
link |
maxpooling是怎麼運作的呢?
link |
所以有各式各樣的pooling的方法
link |
所以我們做完convolution以後
link |
我們就是把這張圖片的channel不變
link |
就是你可能做幾次convolution
link |
比如兩次convolution一次pooling
link |
兩次convolution一次pooling
link |
pooling對於你的performance
link |
performance可能會稍微差一點
link |
for convolution的neural network
link |
你的架構就是convolution加pooling
link |
那如果你做完幾次convolution
link |
丟進fully connected的layer裡面
link |
fully connected的layer
link |
把這個向量輸到一個network裡面
link |
fully connected的network來解決
link |
一般圖片的channel就是RGB嘛
link |
那棋盤上每一個pixel的channel
link |
所以顯然在設計這個network的人覺得說
link |
同樣的pattern可能會出現在不同的位置
link |
也就是一張影像做sub-sampling以後
link |
你隨便拿掉一個column 拿掉一個row
link |
怎麼可能拿掉一個row 拿掉一個column
link |
所以AlphaGo也一定有用pooling
link |
其實AlphaGo在Natural上的paper
link |
就是你的filter如果超出影像的範圍
link |
Zero Padding就是超出範圍就補0
link |
kernel size就是filter的大小
link |
stride是什麼我們剛才也解釋過了
link |
然後kernel size都是3x3
link |
也就是每一層都是192個filter
link |
你不要看影像上面都有用boolean
link |
在下圍棋的時候就是不適合用boolean
link |
那個receptive field的設計
link |
往往都要做Data Augmentation
link |
所謂Data Augmentation的意思就是說
link |
讓CNN有看過不同大小的Pattern
link |
Scaling跟Rotation的問題啊
link |
Special Transformer Layer