CNN的應用 What can CNN do? (Part3)

by wenwu
0 comment

CNN的應用 What can CNN do? (Part3)

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

前兩篇中分別介紹了 CNN如何使用CNN是如何運作的
今天要來介紹幾種CNN的應用方法


Deep Dream

Deep Dream就是,如果你給machine一張image,他會在這image加上他看到的東西,將圖片丟到CNN裡面去,然後你把某一個convolution layer裡面的filter或 fully connected layer 裡的某一個 hidden layer 的output (vector)拿出來,把裡面的值調大(正的調大,負的調小),然後把它作為新的image的目標

調整好之後,然後用gradient descent 的方法找一張image X,讓他通過這個hidden layer後的output 就是你調整的target,這麼做的目的就是,讓CNN誇大化他看到的東西 — make CNN exaggerates what is sees

也就是說,如果某個filter有被activate,那你讓他被activate的更劇烈,CNN可能本來看到了某一樣東西,那現在你就讓他看起來更像原來看到的東西,這就是所謂的誇大化

將上面的image 拿去做Deep Dream 的話,你看到的結果就會像下面這個樣子

你會發現,圖片中有一些念獸,要仔細看才看得到,比方像右側的熊,他原本只是一個石頭,對機器來說,它在看這張圖片時,本來就覺得像一隻熊,所以你更強化這件事,讓他看起來真的就變成了一隻熊,這就是deep dream


Deep Style

Deep Dream還有一個進階的版本,就叫做Deep Style,如果今天你input 一張image,Deep Style 做的事情就是讓machine去修改這張圖,讓他有另外一張圖的風格,如下圖所示:

具體的做法參考reference: A Neural Algorithm of Artistic Style

可以發現將image餵給機器之後,出現了一張像吶喊的照片
Deep Style 的思路如下: 你把原本的image丟給CNN,得到CNN filter的 output,代表這樣image裡面有甚麼樣的content,然後你把吶喊也丟到CNN裡面得到filter的output
注意! 我們並不在乎一個filter output的value到底是什麼,一個單獨的數字並不能代表任何問題,我們真正在意的是,filter和filter的output之間的correlation,這個correlation代表一張image的style

接下來你就再用一個CNN去找一張image,這張image的content像左邊的圖片,比如這張的image的filter output的value像左邊的圖片;同時,讓這張image的style像右邊的圖片,所謂的style像右邊的圖片是說,這張image output的filter之間的correlation像右邊這張圖片

最終你用gradient descent找一張image,同時可以maximize左邊的content和右邊的style,他的樣子就像上圖左下角所示


CNN 使用於AlphaGo | What does CNN do in Playing Go

CNN 不只可以處理影像,還可以應用於其他東西上,比如出名的alphaGo

想讓machine來下圍棋,不見得要使用CNN,其實一般typical的neural network也可以幫我們做到這件事情

你只要learn一個network,也就是找一個function,他的input是棋盤當前的局勢,output是你下一步落子的位置,這樣其實就可以讓machine學會下圍棋了,所以用fully connected 的 feedforward network 也可以做到讓machine下圍棋這件事情

也就是說,你只要告訴她input是一個19*19的vector,vector的每一個dimension對應到棋盤上的某一個位置,如果有一個黑子就是1,如果有一個白子的話就是-1,沒有東西就是0。所以你若把棋盤描述成一個19*19的vector,丟到fully connected的feedforward network裡,output也是19*19個dimension,每一個dimension對應到棋盤上的一個位置,那machine就可以學習下圍棋了

但實際上,如果我們使用CNN的話,可以得到更好的performance,我們之前舉的例子都是把CNN應用在圖片上面,也就是input一個matrix,而棋盤也可以表達成一個19*19的matrix,那對CNN來說,就直接把他當成一個image來對待,然後再output下一步要落子的位置,具體的training process是這樣子的:

Why CNN for Playing Go

自從AlphaGo用了CNN之後,大家都覺得CNN很厲害,所以有時候如果你沒有用CNN處理問題,人家可能來問你,你怎麼沒有用CNN,他可能不知道CNN是什麼,但是他就會問你為甚麼沒有用CNN,CNN不是比較強嗎?

什麼時候可以用CNN呢? 你的image該有哪些特性,也是CNN(part 1)提到的三點:

  1. Some patterns are much smaller than the whole image
  2. The same patterns appear in different regions
  3. Subsampling the pixels will not change the object

CNN能夠用在AlphaGo上,因為圍棋有一些特性和圖像處裡是很相似的

在property 1, 有一些pattern是比整張image要小的,在圍棋上,可能也有同樣的現象。我們只需要偵測一部分就能知道是否白子處於被吃的狀態,我們不需要看一整張棋盤,這跟image有著同樣的性質;在AlphaGo裡面,他第一個layer其實就是用5*5的filter,顯然做這個設計的人,覺得圍棋上最基本的patten可能都是在5*5的範圍內可以被偵測出來

在property 2,同樣的pattern可能會出現在不同的region,在圍棋上可能也有這個現象,像這個叫吃的pattern。所以你可以用同一個detector,來處理這些在不同位置的pattern

所以對圍棋來說,他在第一個observation和第二個observaion是有image的特性的,但是沒有辦法想通的,就是第三點Max pooling

Max pooling for AlphaGo? — read alpha-go paper

我們可以對一個image做subsampling,拿掉奇數行、偶數列的pixel,把image變成原本的1/4也不會影像你看這個圖的樣子,基於這個觀察才有Max pooling這個layer;但是對圍棋來說,好像不適合作max pooling

我們來看AlphaGo的paper,他只說使用了CNN,卻沒有在正文裡面仔細苗訴他的CNN架構,但是在附錄中,其實是有描述neural network structure的,如下圖所示

他是這樣說的,input是一個19*19*48的image,其中19*19是棋盤的格局,對AlphaGo來說,每一個位置都用48個value來描述,因為加上了domain knowledge,他不只是描述某位置有沒有白子或黑子,他還會觀察這個位置是不是處於被吃得狀況等等

先用一個hidden layer對 image做 zero padding,也就是把原來19*19的image外圍捕0,讓她變成一張23*23的image,然後使用k個5*5的filter對該image做convolution,stride設為1,activation function 用的是ReLU,得到的output是21*21的image;接下來使用k個3*3的filter,stride=1,activation function 還是使用ReLU,……

你會發現這個AlphaGo的network structure 一直在用convolution,其實根本就沒有使用Max pooling,原因並不是疏失了甚麼,而是根據圍棋的特性,本來就不需要Maz pooling

Neural Network 架構的設計,是應用之道,存乎一心


More Application — Speech、Text

Speech

CNN不只可以應用在圍棋上,也可以使用於語音處裡,我們把一段聲音表示成spectrogram,spectrogram的橫軸是時間,縱軸是這段時間裡聲音的頻率

下圖是一段”你好”的音頻,偏紅色代表這段時間裡該頻率的energy是比較大的,也就對應著”你”和”好”這兩個字,也就是說spectrogram用顏色來描述某一個時刻不同頻率的能量

我們也可以讓機器把這個spectrogram當作一張image,然後讓CNN來判讀,input這張image對應著甚麼樣的聲音信號,那通常用來判斷結果的單位,比如phoneme,就是類似音標這樣的單位

這邊比較神奇的地方就是,當我們把一段spectrogram當作image丟到CNN裡面的時候,在語音上,我們通常只考慮在frequency(頻率)方向上移動的filter,我們的filter就像上圖這樣,是長方形的,他的寬跟image的寬是一樣的,並且filter只在Frequency即縱座標上移動,而不再時間的序列上移動

這是因為在語音裡面,CNN的output後面都還會在接別的東西,比如LSTM之類,他們都已經有考慮typical 的 information,所以你在CNN裡面再考慮一次時間的information其實沒什麼特別的幫助,但是為甚麼在音頻上的filter有幫助呢?

我們用CNN的目的是為了用同一個filter把相同的patten給detect 出來,在聲音訊號上,男女說同樣畫看起來這個spectrogram是非常不一樣的,但只是一個頻率的shift(位移)而已,其實pattern是相同的,比如pattern是spectrogram變化的情形,男女的聲音片化情況可能是一樣的,他的差別可能只是所在的範圍不同而已,所以filter在frequency的direction上移動是有效的

所以,這又是另一個例子,當你把CNN用在一個Application的時候呢,你永遠要想一想Application的特性是甚麼,根據這個特性你再去design network的structure,才會真正在理解的基礎上去解決問題


Text

CNN也可以用在文字處理上,假設你的input是一個word sequence,你要做的事情是讓machine偵測這個word sequence代表的意思是positive的還是negative的

首先你把這個word sequence裡面的每一個word都用一個vector來表示,vector代表的這個word本身的semantic(語意),那如果兩個word本身含意越接近的話,他們的vector在高維的空間上就越接近,這個東西就叫做word embedding

把一個sentence裡面所有word的vector牌再一起,它就變成了一張image,你把CNN套用這個image上,那filter的樣子就是上圖的藍色matrix,他的高和image的高是一樣的,然後把filter沿著句子裡詞彙的順序來移動,每一個filter移動完成之後都會得到一個由內積結果組成的vector,不同的filter就會得到不同的vector,接下來做max pooling,然後把max pooling的結果丟到fully connected layer裡面,你就會得到最後的output

與語音處理不同的是,在文字處理上,filter只在時間的序列(按照word的順序)上移動,而不在這個embedding的dimension上移動;因為在word embedding裡面,不同dimension是independent的,他們是互相獨立的,不會出現有兩個相同的pattern的情況,所以在這個方向上面移動的filter是沒有意義的

所以這又是另外一個例子,雖然大家覺得CNN很powerful,你可以用在各種不同的地方,但是當你應用到一個新的task的時候,你要想一想這個新的task在設計CNN架構的時候,到底要怎麼做


Conclusion

本篇的重點在於CNN 的theory base,也就是What is CNN? What does CNN do? Why CNN? 總結起來就是三個preperty,兩個架構和一個理念,這也是用CNN的基礎:

三個Property:

Some patterns are much smaller than the whole image (property1)

The same patterns appear in different regions (property2)

Subsampling the pixels will not change the object (property3)

兩個架構:

Convolution 架構: 針對 property 1 和 property 2

Max pooling 架構: 針對 property 3

一個理念:

針對不同的application要設計符合他特性的network structure,而不是生硬套用,這就是CNN架構的設計理念: 應用之道,存乎一心

Related Articles

發表迴響