Deep-learning 是一個黑盒子? CNN是如何運作的呢? (part2)

by wenwu
0 comment

Deep-learning 是一個黑盒子? CNN是如何運作的呢? (part2)

今日的課程來自於: https://youtu.be/5BJDJd-dzzg (33-54分)

What does CNN learn?

What is intelligent?

今天我們要來分析CNN是如何運作的?

我們都知道如果若是有一個模型,他的方法我們可以輕易知道她如何運作的話,那我們自然也不會覺得這個方法 “intelleigent” 了! 
大家都說deep learning 就是一個黑盒子,我們根本就無法知道訓練的東西為甚麼是這樣子,有些人甚至無法相信他。但是其實我們還是可以分析的,今天就來看一下要如何分析CNN,看他到底學了甚麼?

今天本篇會提到三點,分別從 filter 、neuron 和output 來解釋。


就如前一篇提到的 Convolutional Neural network 卷積神經網路 的CNN的架構,重複數次的 Concolution和max pooling,再做Flatten 和 Fully connected network。

第一層的Convolution 的filter是比較容易的,在上一篇的講解提到,這一個3*3 matrix 的filter就是要在這3*3=9 個pixel內,找到特定的patten 。
接下來第二層的filter就開始很難解釋了,因為她的input是做完 convoluion 在做Max pooling 的結果,因此filter考慮的範圍並不是3*3的pixel,而是一個3*3*25的cubic,所以我們很難知道他是怎麼運作的。

那我們先來看filter如何運作


What does filter do?

我們要怎麼分析一個 filter 在做什麼呢? 我們可以這樣做:

我們知道在第二個convolution layer裡面的50個filter,每一個filter的output就是一個11*11的matrix, 假設我們把第 k 個filter的output拿出來,如下圖表示,這個matrix裡的每一個element,我們叫他a_ij^k,上標k表示這是第k個filter,下標i j 表示matrix 里第i個row和第j個column。

接下來定義a^k 叫做degree of the activation of the k-th filter,這個值表示現在的第k個filter,他有多被activate,有多被”啟動”(活躍),值觀來說就是描述現在input的東西跟第k個filter有多接近,他對filter的激活程度有多少,a^k的計算方式如下:

也就是說,我們input一張image,然後把這個filter和image進行捲積所output的11*11的值都加起來,當作現在這個filter被activate的程度

接下來我們要做的事情是這樣的,我們想要知道第 k 個filter的作用是什麼,那我們就找一張image,希望這張image可以讓第k個filter被activate的程度最大 ; 也就是現在要找一張image X ,它可以讓我們定義的activation的degree a^k最大,即:

之前我們求minimize用的是gradient descent,那現在我們求Maximum用gradient ascent(梯度上升法)就可以做到這件事了

仔細一想這個方法蠻奇妙的,因為我們現在是把input x做為要找的參數,他對去用gradient descent 或ascent 進行update,原來在train CNN時,input 是固定的,model的參數是要用gradient descent 去找出來的;但是現在相反,這個task裡面的model的參數是固定的,我們要用gradient ascent 去update 這個 X,讓他可以使degree of activation最大

上圖就是得到的結果,基本上幾個filter就可以分別找到幾張使對應的activation最大的圖,這裡只有12張作展示。

這些image 上有一個公同特徵,就是裡面都是依些反覆出現的某種texture(紋路)。像第三張布滿了小小的斜條紋,表示第三個filter就是detect圖上有沒有斜條紋。如果整張image上布滿這種斜條紋的話,這個時候他會最興奮,他的degree of activation 會最大,也就是filter的activation程度最大,相對應的output值也會達到最大

因此每個filter的工作就是去detect每一種patten,detect某一種線條,上圖所示的filter所detect的就是不同角度的線條,所以今天input有不同線條的話,某一個filter會去找到讓它興奮度最高的匹配对象,這個時候它的output就是最大的


What does neuron do?

第二個要討論neuron是怎麼運作的。

我們做完convolution 和 max pooling 之後,會將結果用Flatten展開,然後丟到Fully connected 的neural network 裡面去,之前已經搞清楚filter是作什麼的,那我們也想知道每一個neuron是作什麼的,所以就對剛才的做法如法炮製

我們定義第j個neuron的output就是a_ij,接下來用gradient ascent 的方法去找一張image X,把他丟到neural network裡面就可以讓 a_j的值被maximize,即:

找到的結果如上圖所示,這裡只有9張image作為展示,會發現這九張圖和之前的情況不一樣,剛才在filter上發現是紋路的東西;但是在做完Flatten以后,每一個neuron不再是只看整張圖的一小部分,它現在的工作是看整張圖,所以對每一個neuron來說,讓它最興奮的、activation最大的image,不再是texture,而是一個完整的圖形


What about output?

接下來我們來討論CNN的output,由於是手寫辨識的demo,因此這裡的ouptut就是10 維,我們把某一維拿出來,然後同樣去找一張image X ,使這個維度的output值最大,即

你可以想像說,既然現在每一個output的每一個dimension就對應到一個數字,那如果我們去找一張image X,它可以讓對應的數字1的那個output layer 的neuron 的 output值最大,那張紙image顯然應該看起來會像是數字1,你甚至可以期待,搞不好這個方法就可以讓machine自動畫出數字

但實際上,我們得到的結果是這樣子,如下圖所示

上面的圖片對應為0-8,你會發現這些圖片看起來一點都不像數字,就像是電視機壞掉的樣子。為了證實這個程序有沒有Bug,這裡做了一個實驗,就是把上述得到的圖片真的做testing data 丟到CNN裡面,結果classify的結果確實還是認為這些image就對到0-8

所以今天這個neural network,它所學到的東西跟我們人類一班的想像認知是不一樣的

那我們有沒有辦法,讓上面這個圖看起來更像數字呢? 想法是這樣,我們知道一張圖是不是一個數字,它會有一些基本的假設,比如這些image,你不知道他是什麼數字,你也會認為它顯然就不是一個digit,因為人類手寫出來的東西就不是長這樣子的,所以我們要對這個 X 做一些 regularization,我們要對找出來的X做一些constraint(限制約束),我們應該告訴 machine說,雖然有一些X 可以讓你的Y 很大,但他們不是數字

那我們應該加上什麼樣的constraint 呢? 最簡單的想法是說,畫圖的時候,白色代表有墨水的地方,而對一個digit 來說,整張 image 上塗白的區域是有限的,像上面整張都白白的一定不會是數字

假設image裡的每一個pixel都用x_ij表示,我們把所有pixel值取絕對值並求和,也就是之前提到 L1的regularization,再用y^i減去這一項,得到

這次我們希望再找一個input X,它可以讓y^i 最大的同時,也讓L1的regularization 越小越好,也就是說我們希望找出來的image,大部分的地方都是沒有塗色的

加上這個constraint以後,得到的結果會像下圖右側所示一樣,已經隱約有一點數字的樣子了

如果再加上一些額外的constraint ,比如你希望相鄰的pixel是同樣的顏色,你應該就可以得到更好的結果


今天就用三個方面 filter 、neuron 和output 來解釋CNN是如何運作的,下一篇會介紹CNN的一些應用

Related Articles

發表迴響