[ML筆記] Convolutional Neural Network (CNN)

ML Lecture 10: Convolutional Neural Network CNN
本篇為台大電機系李宏毅老師 Machine Learning (2016) 課程筆記
上課影片:
https://www.youtube.com/watch?v=FrKWiRv254g
課程網 (投影片出處):
http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html

在 NN 架構中
每一個 Neural 都可視為一個簡單的 Classifier
螢幕快照 2017-07-06 下午3.37.48.png
如果有一張 100x100 大小的彩色圖片,每個 pixel 有 R,G,B 三個 Channel
所以整張圖片 vector 攤平後總共有 30000 維度,有 30000 個參數
當我們使用整張影像處理時,往往會需要太多的參數!
但是其實影像上要很多 pixel 在一起才有意義,所以我們可以利用一些方法把一些參數濾掉,用比較少的參數來做!
為什麼我們可以用比較少的參數來做這件事情?
螢幕快照 2017-07-06 下午3.47.59.png
例如我們只要看圖片中小塊的區域,偵測到鳥嘴,就可以知道圖中有鳥類!
螢幕快照 2017-07-06 下午3.50.01.png
同樣都是偵測鳥嘴的  Neuron 可以直接共用! 減少需要用的參數!
螢幕快照 2017-07-06 下午3.51.30.png
一張高解析度的圖,經過 subsampling 可以變成較小的圖,但是圖中的鳥的資訊不會受到影響!所以可以透過 subsampling 來減少訓練 NN 時需使用到參數數量!


CNN 完整架構
螢幕快照 2017-07-06 下午3.53.16.png
輸入圖片後,先做 Convolution 在做 Max Pooling
然後  Convolution 搭配  Pooling 的次數與細節是可以設計的,上圖例為兩次,做完後的結果攤平 “Flatten” 成一個一維的 Vector 然後丟到傳統的 DNN 架構: Fully Connected Feedforward network 裡面,最後得到 output
螢幕快照 2017-07-06 下午3.56.52.png
螢幕快照 2017-07-06 下午3.57.22.png
Convolution
螢幕快照 2017-07-06 下午3.58.31.png


舉一個黑白照片的例子
0 代表沒訊號:白色
1 代表有訊號:黑色
上圖中有一張  6x6 的圖,以及有兩種 Filter  (Filter 1 , Filter 2)
我們的 Filter 大小為 3x3 要偵測圖中是否出現特定的形狀
Filter 1 斜對角左上到右下都是 1 ,其餘是 -1 ,所以  Filter 1 的功能是偵測圖中是否有符合 “左上到右下” 斜直線的形狀
Filter 2 中間由上到下都是 1 ,其餘是 -1 ,所以  Filter 2 的功能是偵測圖中是否有符合直線的形狀


使用 Filter 在圖中運作原理如下:


螢幕快照 2017-07-06 下午3.58.46.png
將 3x3 大小的 Filter 1 疊到圖上右上角,圖中每一個 pixel 都跟對應到 Filter 1 上面的每個 pixel 相乘,最後全部相加,得到 1x1 + 1x1 + 1x1 + 其餘的都是 0 x(-1)  = 3
同理,Filter 1 往右移動一格 (stride = 1),並做相同的運算得到結果為 -1
螢幕快照 2017-07-06 下午3.58.51.png

移動的格數,Filter 的大小都可以設定,假如我們每次移動為兩格 (stride = 2),則經過 Filter 1 運算:得到 1 x (-1) +  1 x (-1) + 1 x (-1) + 0 x 1 (三次) + 其餘都是 0 x (-1) = -3
移動後運算的結果為 -3
螢幕快照 2017-07-06 下午3.58.57.png
經過 Convolution 的運到,得到的結果當中,出現最大值的地方就是圖中最符合 Filter 要篩選的形狀之處!
大小為 6x6 的圖片,經過 3x3 的 Filter 1以 stride =1 的移動步伐做完 convolution 後,得到 4x4 的結果 “圖” ( 圖就是矩陣matrix )


螢幕快照 2017-07-06 下午3.59.01.png
同理,我們把 Filter 2 也在圖中運算完畢後,得到另一個結果圖 (藍色圓圈部分)
我們有兩個 Filter (大小都是 3x3) 就會產生兩張 Convolution 的結果 image (大小都是 4x4)
有很多 Filter 就會得到很多張 Convolution 的 image


螢幕快照 2017-07-06 下午4.17.45.png
如果圖片是彩色的話,代表每個 pixel 都有三個維度,所以我們 convolution 所使用的 Filter 就是立體的 (3x3x3),然後把立體 Filter 跟圖中的值做內積!


其實  convolution 可以視為 fully connected layer 拿掉一些 weight 的結果
螢幕快照 2017-07-06 下午4.17.59.png
螢幕快照 2017-07-06 下午4.22.04.png
螢幕快照 2017-07-06 下午4.22.13.png
把原始圖片拉直,加上編號,對於 Filter 1 結果圖中 “第一個神經元” 而言,它只連結到原圖中的 9 個點, weight 部分我們用不同顏色表示。對於 Filter 1 結果圖中 “第二個神經元” 而言,他也只連接到原圖中 9 個點,有些跟上一個重複,且連接所使用的 weight 跟剛剛的都一樣!這件事稱為 weight sharing
Max Pooling
螢幕快照 2017-07-06 下午4.27.46.png


螢幕快照 2017-07-06 下午4.28.01.png
螢幕快照 2017-07-06 下午4.28.20.png


Max Pooling 的原理很簡單,我們把剛剛 convolution 得到的結果圖,每四個 pixel 當成一個單位,挑出最大值的留下來,如此即可使用一個值代表四個值,達到降低解析度的結果
我們上例當中,把 4x4 的圖片,降為 2x2 的
至於 2x2 結果當中,每一個 pixel 的 “深度” 或者說是  “高度” 多少取決於我們使用了幾個 Filter
螢幕快照 2017-07-06 下午4.32.04.png 每個 filter 代表一個 channel
螢幕快照 2017-07-06 下午4.32.11.png
到目前為止,我們把圖片經過 convolution 在經過 pooling 後就得到一個比較小的 image
如果再把這個比較小的 image 拿去做 convolution 再做 pooling 後可以得到更小的 image !


問題:我們使用 25 個 Filter 經過兩回合 convolution 後,請問是否得到 252的 Feature Map ?
不是!因為就算到了第二回合 convolution 時,他仍然考量 25 個 filter 只是每一個  Filter 的形狀是 “立體” 的,而立體的高度是 25 !,所以全部做完,仍得到25 個  “更立體” 高維度的 feature map
螢幕快照 2017-07-06 下午4.32.20.png螢幕快照 2017-07-06 下午4.32.27.png
最後的 Flatten 的部分很簡單,就是把我們得到的結果攤平,然後全部丟到 Fully Connected Neural Network 就結束了!
螢幕快照 2017-07-06 下午4.42.59.png
螢幕快照 2017-07-06 下午4.43.06.png
問題1: 3 x 3 = 9 ; 問題 2: 3 x 3 x 25 = 225
螢幕快照 2017-07-06 下午4.43.13.png


分析每個 Filter 學到什麼
螢幕快照 2017-07-06 下午4.46.14.png
我們取出第 k 個 Filter 然後定義 ak 代表此第 k 個 Filter 有多被 activate 的程度
想要看 Filter 學到什麼,我們以 MNIST 手寫數字圖片資料為例
我們現在要解的問題是,找一個 image x 可以讓有 ak  最大的 “反應” (by Gradient ascent)
也就是找一張 input x 他可以讓我們的 Filter 有最劇烈的 “反應”,等於把立場反過來!
螢幕快照 2017-07-06 下午4.46.22.png ← 結果大概長這樣子
這些結果的共同特徵就是某種 texture 在圖上不斷地重複


我們接下來可以分析 Fully Connected Layer 裡面
Neural Network 裡面的 Neuron 的工作是什麼
我們如法炮製剛剛做的事情
產生出來的 images 跟剛剛在 Filter 部分產生的很不一樣
螢幕快照 2017-07-06 下午4.51.58.png
因為現在每一個 Neuron 的工作都是看長張圖,而不是局部了!


如果我們今天考慮的是  output  層呢?
以上述同樣手法來產生最 activate 的圖片
螢幕快照 2017-07-07 下午4.31.28.png
結果發現出來的圖片都亂亂的


參考影片
螢幕快照 2017-07-07 下午4.31.33.png
所以我們應該進一步針對找出來的 input x 加上一些 constraint 限制
告訴 Machine 說,有一些 x 雖然可以讓你的 y 很大,但是不能考慮它!
對一個數字 Digits 來說,整張圖中大部分都是背景,只有寫數字的地方才有資訊,只有整張圖當中某一個小部分才會有筆劃
右上的式子加號應該要改成減號,他做的是 L1 reuglarization
如此做完後,得到一個比較像數字的結果


以上其實就是 Deep Dream 的概念
Deep Dream
螢幕快照 2017-07-07 下午4.31.42.png
我們把一張圖片丟到 CNN 裡面後,把它某一個 Layer 隨便抽出一個,得到一串 Vector
然後把正的讓它變個更正,負的變得更負
然後把這個東西當作是新的 image 的 “目標” ,(更新)找一張 image (用 gradient ascent) 更能符合我們調整後的結果,讓 CNN 誇大化它所看到的東西!

螢幕快照 2017-07-07 下午4.31.50.png
得到的結果就變成這樣子!


Deep Dream 的進階版本就是 Deep Style


Deep Style

螢幕快照 2017-07-07 下午5.19.59.png
螢幕快照 2017-07-07 下午5.20.02.png
螢幕快照 2017-07-07 下午5.20.07.png
首先把原圖丟進 CNN,得到 CNN Filter 的 output 代表這張圖中有什麼樣的 content

吶喊這張圖也丟到 CNN Filter 裡面,但是這次我們要的不是 Filter output value 而是 Filter 跟  Filter 之間的 corelation 代表 style

接下來就用同一個 CNN 找一個 content 他同時 maximize 左邊照片的元素,以及他的 Filter 之間的 corelation 像右邊那張吶喊
就可以得到 Deep Style 的結果
paper:
CNN 應用
例如用於下圍棋 Alpha Go !
螢幕快照 2017-07-07 下午5.43.08.png
把整盤棋當成一張 image 19x19 然後 output 出下一步要下哪裡就結束了!
螢幕快照 2017-07-07 下午5.43.15.png
螢幕快照 2017-07-07 下午5.43.23.png
什麼時候可以用 CNN 呢?
要有 image 該有的特性才能用!
image 上某些 pattern 比起整張圖小得多
→ 圍棋上也有 pattern 比整盤棋小 ex.叫吃
image 上同樣的 pattern 會出現在不同位置,但是太婊同樣的意義
→ 圍棋上的 “叫吃” 也是相同的概念!
螢幕快照 2017-07-07 下午5.43.28.png

但是 image 可以透過 Max Pooling 像解析度,圍棋上不行這樣做,解析度改片等於整盤棋就毀了!
所以根據 alpha go 的 paper 表示:他的 CNN 架構中沒有提到 Max Pooling !
根據圍棋的特性,我們本來就不適用 Max Pooling 這樣的架構來處理


螢幕快照 2017-07-07 下午5.43.38.png

CNN 用於語音辨識:
左圖是 “你好” 語音的頻譜圖
我們使用 CNN 再圖上分析時,只會針對頻率的維度上移動做 convolution ,時間方向上做移動根據實驗,沒有太大的幫助,原因可能是他做完CNN 分析後,後面可能還會接 LSTM 的架構去做時間序列分析
而且男生說的 “你好” 跟女生說的 “你好” 可能只是在頻率上的 shift 而已,所以在 time domain 上的分析沒有太大的幫助
CNN 用在文字處理方面
例如 input 一組 word sequence 要 CNN 判別他是正面的還是負面的!
螢幕快照 2017-07-07 下午5.43.44.png
最左邊圖中的縱軸是 “word embedding”:將每一個 word 都用一個 vector 表示!


我們把一句話的每一個文字轉成 vector 然後我們使用 CNN Filter 做分析!使用多組 Filter 分析得到的 feature map 再經由 pooling 處理後丟到神經網路中訓練,最後產出結果 (正面 / 負面 / 中立)


→ 在使用 CNN 的 Filter 在文字處理的問題中, Filter 只會在時間的方向上移動 (藍色區塊),而不會在 word embedding 這個 dimension 上移動 (紅色框框)
因為在 word embedding 方向上不同 dimension 彼此是獨立的,所以在這個方向上移動 Filter 是沒有意義的
而 Filter 在時間方向上移動才能看出不同單字組成的句子產生的特徵!


螢幕快照 2017-07-07 下午6.07.10.png
螢幕快照 2017-07-07 下午6.07.58.png
這些 reference 是關於可以讓 CNN 學完後畫出的圖更 “漂亮” 接近人所想看到的版本


相關文章整理


留言

張貼留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking