Deep Learning in CV and AI (1) -- Intro of CNN

本人computer vision背景,之前沒有科班學習過machine learning,現在要做有關deep learning的研究,為了不建空中樓閣,最近系統地學習了一下,覺得還是頗有趣的。此文旨在記錄下本人在學習過程中的一些思考以及總結,主要是希望從一些有趣的層面去剖析deep learning的內核,使大家體會到research的樂趣而不是枯燥乏味的理論知識和數學公式??。

Intro of Deep Learning & AI

目前deep learning最主要的幾大研究領域包括:Covolutional Neural Network (CNN),Recurrent Neural Network (RNN),其中包含LSTM 和GRU, 以及目前claim下一個熱點趨勢的 Generative Adversarial Networks (GANs)。以學習方式來分則包括 Supervised Learning,Unsupervised Learning 以及 Reinforcement Learning. 這裡先簡單地給各大方法做個Intro, 後面會分篇來展開系統介紹。

  • CNN

不誇張地說,正是CNN的出現,使得DL在CV界大放異彩,趨勢之猛烈基本可以碾壓90%的low level processing 以及 conventional methods了,這一點只要看看近幾年的CVPR便可見一斑。而CNN的正式登場應該是2012年ImageNet Challenge中以壓倒性趨勢奪得第一的AlexNet, 其accuracy達到了80.3%,這也是neural network第一次在CV的經典問題 -- image recognition上徹底碾壓了傳統技術。當時其他team基本還都在用各種複雜的模型折騰SVM,而AlexNet的驚人performance一出便引發學術界沸騰,自此正式拉開了deep learning攻佔CV界的帷幕...

  • RNN

RNN最大的特點在於,它是用來處理sequential information的。在傳統的neural network中,我們assume 所有的 inputs都是 independent 的。然而在很多scenario中, 這樣的assumption 並不理想。舉一個簡單的例子,你告訴machine "我想喝...",然後你想要machine 預測出後面的結果。那麼根據你提供的context, 機器有可能輸出「水,可樂,咖啡...」,總之都是可以喝的液體,它不會給一個譬如桌子,椅子,男票之類的答案,呵呵( ̄▽ ̄)"。這也就是說,RNN的output 是依賴於previous的計算結果的。那這一點是怎麼做到的呢?簡單的來說,我們可以把RNN想成一個具有記憶功能的網路。每一個輸入以序列的方式對應進入一個cell,而每一個cell 將前一個cell的計算結果以及當前輸入融合起來進行學習,再傳遞給下一個cell。

理論上來說RNN可以處理任意長度的序列,然而在實際應用中,其計算序列的長度其實是有限的。這是因為machine learning中一個非常severe 的問題 -- vanishing gradient,這個問題使得RNN在實際中無法學習long-term dependencies. (vanishing gradient 後面會詳細講解)。 由此催生了Long Short Term Memory (LSTM) 以及 (Gated Recurrent Units) GRU。LSTM用了一個gating mechanism 來解決vanishing gradient 的問題,初看LSTM的網路圖其實內心是崩潰的(如下圖), 也是因為LSTM結構相對較為複雜,後來出現了GRU。GRU可以看作是LSTM的簡化版,而它的performance 又不比LSTM差,因此現在也很popular。

上面的LSTM示意圖初看上去著實scary me, 但是了解一下機制,其實也沒有很複雜,下一篇介紹RNN的會具體講。RNN最早是被用在Natural Language Processing (NLP)上,比如我們很熟悉的machine translation, 機器生成詩,代碼之類的。近兩年,Feifei Li team 很popular的男神Andrej Karpathy將NLP 和CV相結合,挖了Image Caption 的坑,之後Image answering, story telling 之類的相繼而出,使得RNN在CV領域也開始廣泛應用了。除此之外,傳統的kernelized canonical correlation analysis (KCCA)在Image Retrieving 中的應用( 實質是得到一個image 和 text 的 common embedding) 也由RNN所取代。總而言之,將NLP和CV相結合是RNN帶來的新趨勢,當然還有video processing之類的。

  • GANs & RL

GANs 和 RL屬於另外兩個區別較大的領域,所以本文不多說了,後面再具體講吧。這裡只簡單介紹一下背景,先說reinforcement learning (RL), RL可以說是現在robotics領域的大熱,也是工業界投入大精力在研究的方向。其原因很明顯--無人車。雖然現在RL還不是很成熟,但是沖著無人駕駛這一點強大的誘惑,足以驅動工業界了,(我們知道deep learning是一項很奢侈的研究,說它奢侈不僅僅是因為燒GPU費錢,最主要的是大量的data太寶貴。現在真是得data者得天下,Amazon近兩年的成功顯而易見,好像扯得有點遠了,Alexa以後再細說...)

GANs 是很有趣的,它是2014年由大神Ian Goodfellow提出的(現在在OpenAI -- deep learning 的聖地??)。它主要的思想是使用兩個相互對抗的神經網路。其中一個叫generator, 它以noise 作為輸入,生成samples。 另外一個叫discriminator,它分別從generator 和 training data 同時接收samples,然後辨別者兩種不同的sources。整個過程中,兩個網路不斷進行對抗,generator 的任務是生成越來越真實的samples 以使得discriminator 難以區分; 而discriminator的任務則是在學習中具備越來越高的辨別能力。這兩個網路同時進行訓練,當generator 生成的samples與真實數據難以區分的時候訓練就完成了。

source:ishmaelbelghazi.github.io

GANs 的idea看起來很fancy對不對?但個人見解GANs玩兒的是一套升級版的Turing Test。Turing Test 是說假定一個人C,去問一個人B和一個機器A一連串的問題,如果一段詢問過後,C無法區分出A和B的區別,那麼機器A通過測試,說明其具備智能。換句話來說,Turing Test可以看作一種對於AI的定義。那麼GANs是什麼呢?Discriminator 扮演了C的角色,training data 是B,當C無法區分generator A 生成的數據與真實數據的時候,任務就完成啦!所以你看,科學發展飛速,但是事物的本質是不變的,若掌握了事物的核心本質,則萬變不離其宗。GANs現在在CV領域多用來做image generation,下圖是一些GANs生成的人臉圖像。

初看這些機器生成的人臉還是有點驚悚的,但是這是機器從無到有生成的圖像,已經是一個很大的飛躍。試想讓你拿筆畫幾張人臉你也未必比機器畫的好呢??。

不好意思,此處我分裂出了一個上帝視角來BB兩句。近兩年DL使得AI實在太火了,外界有各種各樣的聲音。有諂媚逢迎的,有酸腐譏諷的,也有躺沙發上看熱鬧的吃瓜群眾時不時跑來吐槽兩聲。我想說對待它還是冷靜點好,既不要把它炒成泡沫,也不要對它太苛刻。學術界一波詬病DL 沒有理論依據的人也想開點吧,這時代變了,人類在追求真理的路上越走越遠,一騎絕塵。這已經不是幾套數學公式就可以建模出來的世界了,因為我們對於機器的需求越來越高,我們需要機器給我們越來越接近真實世界,真實人性的feedback。然而人類世界之複雜豈是幾套複雜的數學公式就能建模出來的,至少目前沒有。因為現在,我們連我們自己都沒有徹底了解,如何依靠這有限的了解去建模一個真實的人類世界?此時,DL跑出來了,它說:管它呢!?給我數據,我來學習!我學出來接近真實的答案,可以嗎?結果,DL做到了。這時候你非要站出來說,你丫給我個解釋!拜託……沒解釋,performance 說明一切。你小時候突然學會說話的時候,你知道你是怎麼學會的嗎?給我一個解釋……當年圖靈對AI的定義精髓在於,機器具有智能只看答案,不要解釋。當然,我不是說不需要reasoning,回過頭來,we do need explore why,我的point 在於不要因為不知道why 就不start。 二者本應該是一個相輔相成的探索過程。

DL, AI還處於蹣跚學步的初期階段,請給它成長的空間。科研的本質是探索,探索的過程需要不斷試錯,請給它一點耐心。愛它就應該去了解它,懂得它真實的樣子,欣賞它美好fancy 的一面也能接收它笨拙驚悚的一面,只要你知道它在努力的成長,在不斷improving,就心懷希望地好好乾吧!對於Tesla 出事故的時候,吃瓜群眾站出來吐槽無人車之類的。我想說:你們還是回家追電視劇吧,別人在夜以繼日地奮鬥,改變世界的時候,你們別出來添亂就好了…… ?? 有人說DL是否印證著CV的結束,我說definitely not, it is the end of the beginning!

絮絮叨叨的Intro終於做完了,下面開始具體講,先從CNN開始。

Intro of CNN

當我們在談論CNN時,我們在談論什麼?Actually, CNN實質上還是一個neural network, 當你理解了神經網路的運行機制,你離理解CNN就只差一步了(注意我這裡說的只是理解)。所以我們先從基本的神經網路講起,基本上所有的機器學習的主旨思想都由三大塊構成:即forward, loss function 以及 backpropagation。

  • Linear Classifier
  1. Forward

我們先從最簡單的線性分類來看一張圖像是如何被分類的。一個簡單的線性分類函數可以表示為:

f(x_i,W,b)=Wx_i+b

其中x_i是輸入,在此例中為輸入圖像的每一個像素點。W和b分別是我們需要學習的weights 和 bias。 當一個網路學習完成,也就是指weights 和 bias 學好了,此時你輸入一張圖片,函數f便會計算出一個vector,其中每個row對應了一個class的score。score最高的便是分類結果了。這個過程叫做forward,當一個網路train好之後,在test階段只需進行forward就可以了。

source:CS231n Convolutional Neural Networks for Visual Recognition

2. Loss Function (Objective Function)

2.1 Data Loss

那麼問題來了,weights 和 bias是怎麼學習的呢?換句話說,我們是如何進行training的?要想學習,我們首先得制定一個小目標,(當然不是一個億,呵呵??) Loss Function 就是制定的目標函數。一般常用的有hinge loss 和 cross entropy 兩種。說hinge loss 也許你不了解,但說SVM你一定知道,SVM其實用的就是hinge loss。簡單粗暴的理解,hinge loss就是讓正樣本和負樣本之間的距離(margin Δ)盡量大。這裡需要一個hyper-parameter -- margin Δ,它決定了我們期望的正負樣本之間的差距有多大,函數如下:

L_i=sum_{j
e y_i}{max(0,s_j-s_{y_i}+Delta )}

而cross entropy 則是現在更popular的softmax用到的loss function。Softmax其實就是binary Logistic Regression 的升級版,也就是把binary classes upgrade到了multiple classes。與SVM不同的是,它不是給每個class一個score,取而代之的是probabilities。loss function 如下:

L_i=-log(frac{e^{f_{y_i}}}{sum_{j}{e^{f_j}} } )

我們來對比一下二者 SVM vs. Softmax:

首先要說,這兩者沒有絕對的好壞,用哪一個要根據你的具體任務來定。至於怎麼定,那就要來看看二者的區別了。借用Andrej karpathy的一個例子可以很形象的說明問題。假定一個樣本得到了[10, -2, 3]的scores,一個SVM(Δ=1)會給出loss=0, 因為正負樣本之間的距離已經超過了margin,於是任務完成。然而我們再來看另外兩個樣本 [10, -100, -100] or [10, 9, 9] 這兩個樣本在SVM眼裡完全一樣,因為loss也同樣為0。但實際我們知道,這兩個樣本的scores還是差別很大的。然而這個情況就不會發生再Softmax 里,因為softmax 會計算出更大的loss給 [10, 9, 9]。換句話說,Softmax 是從來不滿足於現有scores的,正樣本總會得到更高的probabilities, 負樣本會得到更低的probabilities,而loss 會越來越小。但是SVM一旦滿足Δ,它就滿足了。

二者的這個區別還是蠻重要的。一般來說,做classification 的會選用softmax,為什麼呢?這樣想,SVM可以為你分別出貓和狗,可是它不容易分辨出這狗是貴賓,還是吉娃娃,還是薩摩耶……而softmax 則具備這樣的能力。Hinge loss現在一般用在計算text 和 image的common embedding 上,具體應用比如image caption, retrieval等。

2.2 Regularization Loss

理論上來說,loss function 就這樣定義完成了,然而在實際應用中,我們希望得到比較small and diffuse的weights。why?我們來看一個例子:

假設我們有input x=[1,1,1,1] 以及兩個weight vectors w1=[1,0,0,0], w2=[0.25,0.25,0.25,0.25]. 那麼w1_T*x=w2_T*x=1,看起來兩個weight vectors 得出了同樣的結果,然而我們更prefer w2, 因為w2比較small 和 diffuse, 這樣它就會考慮到所有input dimensions而不是少量幾個inputs. 如上述例子,四個 input dimensions 通過w2 都會被計算到,而通過w1隻有第一維度的input被考慮到了。顯而易見w1這樣的weights很容易引起一個非常嚴重的問題--就是overfitting。因此,為了discourage large weights 在實際設定loss function 的時候我們一般會引入 Regularization. 其中最常用的是L2 norm:

R(W)=sum_{k}sum_{l}{W_{k,l}^{2} }

通過公式可以看出,w1 的 L2 penalty 是1.0 而w2 僅為 0.25,這樣我們就達到了prefer smaller and more diffuse weights 的目的。所以實際的loss function一般由兩部分構成,即data loss 和regularization loss:

L=frac{1}{N} sum_{i}{L_i} +lambda R(W)

3. Backpropagation

okay, we r done with the loss function. Next lets look at the most important part -- backpropagation。為什麼說backpropagation很重要,因為在我看來,學習的過程在於不斷基於反饋進行修正,修正其實就是不斷地update, update weights 的方法有很多,比如SGD, Adam, Adagrad 等等。然而不論哪一種update的演算法都需要一個很關鍵的因素即gradient。所謂gradient 其實就是告訴我們應該改變的方向。而backpropagation 就是用來計算gradient的。說到這裡大家應該明白為什麼backpropagation 如此重要了。Backpropagation 的原理很簡單,其實就是用到了我們中學學導數就學過的chain rule。這裡不能用MathType,我就不多寫公式了,只講原理。

  • Neural Network

當我們理解了上述三個步驟,基本我們就懂得了機器學習的核心思想。而Neural Network只是在其基礎上再往前走一步。首先我們來說為什麼需要neural network。

上圖(左)為一組data sample, 我們想要將三種顏色的數據區分開來。那麼通過應用linear classifier 只能得到圖(中)的結果。然而我們所期望的(圖左)分類結果則需要通過構建更複雜的網路模型,更多的parameter 才能實現。現實生活中,其實真正線性的東西很少,因此neural network才尤為重要。

Neural network 的最小組成單元是neuron, 我們先來看一個單獨的neuron 結構:

sorry 我偷懶直接上照片了??。我們可以通過公式看到,一個單獨的neuron 實質上扮演了一個binary classifier 的角色。每個neuron 的輸出是通過activation function 來實現的,而activation function 是使得neuron 具備"like" (activation near one) or "dislike" (activation near zero)的能力。一個完整的神經網路就是由很多個neuron 組合構成的,基本結構如下圖:

source:CS231n Convolutional Neural Networks for Visual Recognition

這裡說一下activation function 的選擇有很多,比如Sigmoid, Tanh, Relu, Prelu, maxout, leaky relu等等。這點以後再單獨講,這裡展開的話內容太多了。另外還有一些調hyperparameter, set up data等實際應用中的一些小trick都以後單獨講。本文旨在介紹原理和核心思想。

講到這裡也許你已經快沒耐心了,怎麼還沒到CNN。別急,其實你已經懂了80% 的CNN了, as long as u know 2D convolution。當然我這麼說為了把問題簡化,其實CNN的思想還是很有趣的。緣何CNN 和computer vision 是如此match的soulmate 呢?這麼說吧,CNN可以說根本就是為image 設計的。我們知道傳統的regular neural network 都是由fully connected layer 構成的,然而對於圖像來說,這就存在一個很大的問題。如果我們把原始圖像作為輸入,即將每一個像素點作為一個feature。那麼假如輸入一個200*200*3的圖片, first hidden layer的一個neuron 就有200*200*3的weights。而一個layer肯定不能只有一個neuron, 多個Neuron下來就會產生a huge number of parameters, 隨之而來的就是overfitting了……

在CNN出現之前,CV guys 都是通過建立各種數學模型來先從原始圖像中提取feature, 然後再將其送入classifier 裡面。然而feature 提取的再牛逼最終也會遇到瓶頸,沒有任何一個feature 能夠perfect capture 原始圖像中很subtle 的內容,並且無法適用於各種情況。於是我們冥思苦想,如何能直接將原始圖像送入網路而又不引起overfitting呢?基於此,CNN誕生了。CNN的assumption 就是其輸入是image, 於是這就使得我們可以應用image 特有的一些properties 來encode 進網路中,下一節,我們具體來講……(累死了??)

推薦閱讀:

TAG:計算機視覺 | 深度學習DeepLearning | 人工智慧 |