ML_2021_3-1 卷積神經網路

  • network架構的其中一種變形:CNN
  • 此講專注在CNN專門用在影像上的講解(目前也普遍用在影像)

Image classification - Version 1

  • 我們需要假設圖片輸入的大小都是固定的
    • 如果大小不一,就得要rescale
  • 是classification問題,所以輸出one-hot vector (向量的長度代表你能分出多少種類別)

如何把影像當作輸入

  • 一張圖片其實是一個3維的Tensor (RGB)
    • Tensor(長跟寬),並有3個Channel
  • 我們把3維的Tensor拉直,成為一個向量 (這也是為何影像大小需要相同)

Train with fully connected network?

  • 如果我們依然使用fully connected network來訓練,又假設neuron取1000個,則一個100x100的圖片輸入,會產生$1001003(彩色)1000 = 310^7$個weight,是一個巨大的數字,大幅增加了overfitting的風險 (彈性過大)
  • 不採用全連接層,以下透過一些觀察來嘗試簡化這個網路

Observation 1

  • 對於圖片辨識,我們要做的是針對圖片裡面找到一些關鍵的部位 (ex. 鳥嘴、眼睛、翅膀)
  • 每個neuron並不需要看過整張圖片(即,不用fully connected)
  • 我們可以讓每個neuron只看特定的區塊就好

Simplification 1 - typical settig

  • CNN會設定一個『Receptive Field』,每個neuron讀取一個他負責的區塊

  • Receptive Field可以重疊

  • Different neuron是可以有不同的receptive field的

  • 上述案例裡面,就是3x3的kernel size

  • 通常會有一排(64、128等)個neuron去守備他

  • 不同的receptive field之間的距離差距稱為『stride』

  • 通常receptive field都會高度重疊

  • 如果一個receptive field關注的範圍超出圖片範圍,就需要把外面的值補值(補0、補平均等),稱為『padding』

  • Receptive fields cover the whole image

Observation 2

  • 當一個特殊部位落在不同的receptive field內怎麼處理?

Simplification 2 -typical setting

  • 我們可以讓一些neuron採用共用參數(Parameter sharing),讓他們的參數都一模一樣
  • 因為輸入(receptive field)不一樣,所以各自的輸出也不會相同
  • 可能rf1的第一個neuron跟rf2的第一個neuron共用參數,rf1的第二個跟rf2的第二個neuron共參… etc
  • 這些共用的參數稱為『Filter』

Benefit of Convolutional layer

  • 根據上述的觀察,我們成功讓CNN network針對相片輸入的訓練更加簡化
  • Convolutional layer的model bias會比較大,但CNN是專門為影像設計的network
    PS. 這邊為何CNN bias會比較大,以及為何這樣不好,可以再google一下

另一個說明CNN的版本

Convolutional layer

  • 所謂Convolutional Layer,裡面有很多的Filter,裡面都有一個3x3xchannel維的tensor

  • 每一個filter都是要抓取某個pattern

  • 以下假設是channel = 1(黑白照片)

  • 我們把各個rf跟filter做內積,得出各值

  • 接下來把所有pattern對各filter一樣的計算

  • 這內積出來的一群數字稱為『Feature map』,再這個例子中,我們有64個filter,則我們的feature map會有64組(channels)數字,每組有4x4個數字

  • 接下來進到第二層的convolution,我們的filter必須變成3x3x64,因為上一層輸出了64個channel,相對於第一層只有一個channel,第二層會出現64個channel

Note:

  • 隨著捲積層的深入,我們觀察的圖片pattern會越來越大
  • 繼續上面的例子,如果我們的filter之rf一樣是看3x3大小的話,因為我們的feature map中的3x3大小實際上是對應到圖片裡面的5x5大小(跟stride有關),所以其實層數越高,我們一次考慮的範圍會越大!

Comparison of 2 version

  • 第一個版本的共用參數,就是第二版本的filter(本slide忽略bias)
  • 把一個filter掃過一張圖片,稱作『convolves over』
    • 例句(?): each filter convolves over the input image

Observation 3

  • 如果我們把一張大圖片縮小、拿掉odd columns,圖片還是不會有所影響(看起來差不多),稱為subsampling -> pooling
  • Pooling 本身沒有參數,沒有任何東西要learn,有些人稱他為一種激發函數
  • pooling就是把圖片像素分組,然後從裡面只選一個像素留下,簡化圖片像素大小
  • 下圖為示意圖
  • 過度pooling仍會傷害訓練效益

The whole CNN

  • 做完卷積層以後要做flatten
  • flatten就是把矩陣數值拉直
  • flatten完以後扔進fully connected layer訓練完,配個softmax(分類),就是一個經典的CNN network

Application: GO

  • 我們用一個19x19的向量來描述一個棋盤,把它扔進network以後輸出next move應該在的位置

  • 下圍棋可以是一個類別分類問題

  • 這個問題也可以用fully-connected network解決

  • 但用CNN效果更好-> 棋盤可以看做一個19x19來描述

  • 每個棋盤格的channel有48個(這格可能被叫吃等等)

  • 這意味著圍棋與影像有許多相似特性

    • 可以只看小區塊(alpha go: 5x5)
         - Same pattern appear in different regions (雙叫吃等等)
  • 棋盤可否用pooling ? 因為每格都很重要(精細度高) -> Alpha Go有沒有用呢?  

  • 李宏毅教你畫重點XD:學著幫論文畫重點,抓critical terms

  • alpha go 正文沒有提到神經網路結構,這是在附件找到的

    1. 視為19x19x48的image
    2. zero pads(padding補0至23x23)
    3. 有k個filter(競賽用的go,filter = 192)
    4. filter的kernel size = 5x5
    5. stride = 1
    6. 用到rectifier nonlinearity(ReLU)
    7. 2~12層都有做zero padding至21x21,filter數同,kernel size = 3x3,stride = 1
    8. 最後apply softmax function
  • alpha go 沒有用pooling!!


Hen重要的Notes:

  • 語音上、文字處理上,文獻上的方法要仔細看,CNN的receptive field設計會特別為他們特化,這裡講的單純是影像的
  • CNN並不能處理影像放大縮小(Scaling)旋轉(Rotation)的問題… (向量問題)
    • 為此我們需要data augmentation
  • 其實有Network架構(Spatial Transformer Layer)可以解決這個問題,請Ref.這個影片