機器學習講座總結-讀圖時代的識圖技術-車庫咖啡

本文轉至: http://blog.sina.com.cn/s/blog_eb3aea990101f3uo.html


在車庫咖啡見到了傳說的中的大牛 黃暢博士 @黃暢_瞭解的不只是人臉 ,黃博士對於識圖技術進行了一個綜述,下面是這次報告的總結。

1. 關於機器學習優化的目的:黃博士提到機器學習並非以求最優爲目的,而是以控制overfitting爲目的。

這個非正式報告中提到的問題,而是在講座開始前和黃博士交流的時候提到的,引來幾個同學的疑問,首先來解釋一下這個問題

微博上大家也都提到了一些看法:
@等魔炮3rd的高町薇薇歐:其實overfitting原因不就是陷入局部最優解麼?求解全局最優解和客服overfitting其實也是具有等價性吧//@機器學習講座:回覆@Copper_PKU:微博太短,只能記錄大概,實際上黃博士講的更多,是有一定道理的 //@Copper_PKU:這個說法 不是很贊同

這個地方我解釋一下,這個問題源於我問黃博士爲什麼Deep learning現在會火這個話題,我提到原來無法求得最優解,現在由於有了好的初始化方法,導致求解最優是有可能的了。黃博士此時說其實他並不看重一個機器學習問題是否有最優解,而更關注的是是否能夠將overfitting控制到一定的範圍內,這個一定範圍是指的稍微有一點overfitting(畢竟可觀察到的數據更具有可信性)。

這樣來說的主要原因是最優解在實際操作中是很難獲取的:


a. 在很多大規模的學習任務中,機器學習算法都是在試圖學習一個複雜的非線性的函數,這樣的函數實際上存在很多局部極值點,因此求解容易陷入局部極值。

b. 因此在尋優的過程中,通常都會有一個初始值,然後再根據使得目標函數下降的方向不斷的迭代,直到滿足收斂條件,但是這樣的解不一定就是最優的。

c. 爲什麼呢?原因是你求解的目標函數根本就不是原來的問題,而是原來問題的一個近似(說到這裏我只能呵呵)。近一步解釋一下,我們通常在求解一個問題的時候,如果原問題很難直接求解(如NP-Hard的問題),那麼我們就relax一下(如使用1範數來近似0範數),通過求解原來問題的bound來近似,所以這裏的問題不再是原始的我們想求解的問題的解,對於原來問題來說,最後求出的所謂的最優解還可能沒有你選擇的初始值好呢。

d. 既然問題已經被偷換成了最小化bound的問題,那麼就沒有必要太關注於最優這個概念。因爲最後的目的是想讓訓練出的結果在有更好的泛化能力,這個是通過求test error的bound來完成的,而test error< traing error + O(d/N),所以這裏問題就轉變成了控制training error和函數的複雜度問題,實際上也可以看做在控制overfiting的問題。

下面來正式的介紹黃博士的講座。黃博士的講座主要對於圖像處理的技術做了一個綜述,然後重點介紹了deep learning在百度圖像產品中的應用。由於是綜述,這裏也就簡單的羅列一些黃博士講到的東西,然後最後我會把自己對於圖像的一些理解加入到裏面來。

2. 和圖像相關的一些任務和數據集:

 a.和圖像相關的任務: 從Object層面上來說,有 Detection和Recognition; 從Image/Scene層面上來說:有Categorization和Segmentation。
b. 下面着重介紹Categorization,與此有關的數據集:
Caltech101  有101class,9K images;
Scene15 15 classes,5K images;
Caltech256 有256 classes 30k images;
Pascal Voc‘07 20 classes,10k images;
TINY(32*32)75 classes 80M images;
SUN397 899 classes,131K images;
ImageNet 22K classes,14M images; (li feifei v587)

3. Descriptors and Model

a. Descriptors: 在具體描述一張圖像的時候,有兩類特徵可提供我們選擇,一類是全局特徵,如histogram,GIST;還有一類是Local descriptors,如著名的Sift,HOG、LBP、Haar-like等,這些特徵都具有各自的特點,是爲不同的任務而生的。

黃博士也提到了關於good Descriptors的幾個原則:scale,viewpoints,lighting,occlusion,也就是儘量滿足在這些條件下的不變性。

上述提到的的特徵也就滿足good Descriptors的一個或者部分條件,絕對不變的特徵目前還沒有見到,也許試圖尋找絕對不變的特徵這個想法就是錯誤的,任何不變都是暫時的。所說的在線學習方法,我到感覺就是在學習一些動態不變的特徵。

b. Model

Rigid Model: 這一類Model黃博士舉了兩種,一種就是經典的Haar-like + Boosted Cascade;另外一種就是HOG+SVM。
Deformable Part Based Model:這是2008年Felzenszwalb搞出的一個方法,出現之後,就有點一統天下的感覺了

在後邊的講座中,黃博士主要綜述了一下基本的BOW的方法,然後羅列了一下baidu使用deeplearning一類方法所做的工作,具體的可以參考一下黃博士的slides。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


下面主要想談一下我對於傳統的圖像的描述方法以及現在比較火熱的deeplearning之間關係的簡單理解,首先談一下傳統的方法。

1. 傳統的BOF框架

在歸類的任務中,其實就在做一件事情:如何拿到數據的描述,有了描述我們再用一些分類器(如SVM)去分類就好了。

在如何生成圖像的描述方面,BOW(Bag of words)和BOF(Bag of features)是先前比較成功的框架,主要分爲幾個步驟:

a. 圖像基本特徵的提取,如sift,hog,histogram等。這個步驟就是在提取圖像中的基本特徵。

b. Codebook的生成,這個就跟文本中的單詞表一樣的(我們常用的漢字詞彙表有大概6W左右),在圖像中這個初始的book的生成一般是通過聚類算法來完成的,如基本的k-means或者層次化的k-means等。另外這個book後邊一般還要優化,這就是圖像和文本處理的一個不同。

c. Encode features:有了這個codebook之後,我們就要用它來對於基本的a中提出的特徵點進行encode。爲什麼要encode呢,實際上是爲構建圖像的描述做準備。這裏順帶提一下,我們看到的漢字詞表就是一個一個的高度抽象的詞,而文本就是直接使用用這樣一個一個詞組合起來得。但圖像跟文本是不同的是,圖像不是人腦抽象過的,因此如果想要使用類似文本的方法來描述圖像,需要有一個抽象的過程:原始圖像是由像素構成,然後我們再提取sift,hog這樣底層特徵,然後在進行encode。

這個過程實際上是使用Codebook中的word來表示我們提出的sift,hog這樣的特徵(x = c*codebook,這個優化有很多種方法) 這樣就得到一組係數c,我們可以認爲就是把每個底層特徵(sift,hog)映射到了另外一個空間,這個空間是由係數c來構成的。有了c之後,我們就可以來構建圖像的描述了。

d. Pooling(這個被很多同學翻譯成池化):這個就是構建圖像描述的一個過程,常用的有average以及max兩種操作,一種是把圖像patch中所有出現的底層特徵的code取一個平均,一個是取一個最大,這個實際上是在local建立一個feature competition的機制,一個是統計平均,一個是優者勝出,實際在局部區域的特徵選擇上有了And 和 Or的這兩種邏輯(有點UCLA的Zhu老闆的與或圖的意思)。這樣經過幾次pooling後,就得到了不同level的圖像的表示,把這些level的值級聯起來或者經過某種組合,就得到了圖像的描述,其實更深層的是因爲Pooling這個過程跟人的神經元篩選的機制類似。(還要看神經學方面的文獻,都要哭了…...)

總結一下:以上這4個步驟,仔細看來每一步就是一個函數映射,不斷的把上層空間的特徵映射到下層的新空間中,就是 f = f3(f2(f1(x)))這樣一個過程,這不就是一個深度的模型嗎?

2. CNN(卷積神經網絡)模型

現在用在圖像上的最成功的DL模型就是convlutional Neural NetWork(感謝LeCun和Hinton老人家)。在討論CNN前,先來看一個圖像處理的流程。

Input一副圖像,我把圖像分成了4*4一共16塊,使用一個filter(如Gabor)對於圖像的每一塊提取了Gabor特徵(級聯後不就是Gist麼),然後我再把4個2*2區域的Gabor特徵進行Pooling,然後最後得到了一個2*2的一個map,然後最後我把這個2*2的map展成一個vector來作爲圖像的描述。每一副圖像都這樣做,把最後的描述都拿去用svm去train一個model,然後新來的圖像就可以用這個分類器來分類。至少我們用BOF一類的模型就可以這樣來做(以上沒有encode的過程,如果加上也只不過相當於多加一個函數映射而已),不同是可以調整一下filter,調整一下Pooling的策略,調整一下map和pooling的次數。

下面問兩個問題:
a. Gabor filter是人工設計的,一個Gabor出來參數是定死的,用這樣一個filter就真正可以來把某一類的圖像的某種代表性的特徵提取出來嗎?

答案是否定的,因爲圖像的類別是千變萬化的,但是目前人工設計的filter又是有限的,把有限的filter應用到無限的圖像類別中,很難做到普適的。那怎麼辦呢?

b. 如果針對不同的圖像類別能把這樣的filter給學習出來那問題不就解決了,那怎樣學習呢?

這時候問題變成了我們用的filter的參數未知的,只能給它一個大小,比如5*5,10*10。數目上可以假設爲6,7,8….。 好了先暫且假定這些filter已經被求出來了,我們就可以拿它們對圖像進行卷積了,每一個filter可以對應一個map,每個map可以做pooling,pooling完使用另外的一批filter再卷積映射成map,卷積完再pooling,如此往復一定數目就得到了圖像的描述比如是di。到這裏,跟本節開始提到的圖像處理的流程是一致的,問題是這裏面每個filter是未知的,需要求解。我們可以加一個分類器,通過一個求解目標min(sum(lable_est(di) - lable)),來對於這些參數構成一個約束。這個目標就是讓估計的圖像的類別和真實圖像類別一致,這樣一個過程就是使用CNN同時實現圖像描述構建以及分類器求解的的一個過程。

那我們反過頭來看其中未知的參數,每一次映射map就會產生一批filter,這一批filter的某種組合方式(比如前面的兩個map映射到後邊的一個map)又會產生一批參數,這些參數都是要求的,求解就是由構成的目標函數min(sum(lable_est(di) - lable))來控制的。每一次map或者pooling就是產生一個新的映射函數的過程,最後也就構成了第一節中提到的函數 f = f3(f2(f1(x))),不同的是本節這個函數中的參數要求解,是個求解的過程,而第1節之中的那個是設計的過程,不用求解。

3. 關於Deep learning結構的求解

下面討論一下deep model 任務的求解方法

a. convex &  non-convex function: 一般的目標函數可以分爲兩類,一類是Convex的,一類是non-Convex的。前一類就是有一個全局極小值點,後一類就是有多個局部極值點,神經網絡構成的函數就是一個non-convex的,而且是高度複雜非線性的,非線性的結構按照道理來說比線性的結構更能近似任意函數的分佈,這也就是爲什麼如果神經網絡的參數調好了,就能顯示出對於數據精確的擬合能力。

b. 優化的思路:對於前一類,所有的參數隨意初始化一個,可以使用一些基本的優化方法(如基本的梯度下降方法)求得最優解。而對於後一類,如果初始值不好,則非常容易陷入局部最小。由此給出一個基本思路就是選取儘量好的初始值,然後使用梯度下降類的方法來求解。另外一個思路就是採用多次試探求最優的方法,如模擬退火算法,理論上嘗試無限次肯定能拿到最優解,這類算法耗時較多,在大規模的數據中非常不適用。


(在大規模數據的優化算法上 @jingdongc @夏粉_百度 是專家,正在招人呢,小夥伴們快聯繫吧)

c. DNN中的問題:DNN模型80年代就提出來,但是沒有火,原因是DNN參數非常多,因此計算量非常非常大,效率非常低,另外初始值不好找因此一直沒有火起來,直到Hinton老先生在2006年發表的那篇論文出現,似乎找到了提高效率的方法。現在大家努力在多個維度上提升效率,設備上適應GPU,框架上進行並行計算、算法上使用Dropout策略,同時改進SGD算法。在精確度上,則使用pretraining進行神經網絡的預先訓練得到一個比較好的初始值,這樣原來神經網絡中效率和精度的問題就逐漸的解決了。

d. 如何看待Deep learning現在的火爆程度:DL火到一個什麼程度,基本上跟Machine learning沾邊的領域,如果不知道Deep learning就是out了。一般說來,一旦一個很久找不到答案的問題,突然有了曙光,會很快的刺激大家的興奮點,興奮過頭了,就無所不用其極了,一下子就崇拜的不得了。我聽過一些老師的講座或者課程,比如baidu的餘凱老師、黃暢博士、微軟的鄧力老師也請教過他們一些問題,感覺他們還是挺淡定的,呵呵。所以選擇深度學習作爲課題的博士生們,祝你們好運…...:)


4. 總結一下:

a. 圖像在分類一個最爲重要的任務是在找圖像描述,那這個描述可以通過設計一個規則來建立,比如提取sift,Hog等一些底層結構的規則,也可以對於這些底層的結構使用一些已知的結構的函數進行再次變換,這些都屬於人工設計的範疇。

b.Deep learning的一個最大的不同,就是嘗試去自動的學習我們所想要的一些feature,而且可以多任務去做(2013年底 LeCun搞的overFeat),只要能把這些問題formulate成一坨參數,直接扔進去做就可以了,現在DL的火爆其實跟Deep learning這個模型關係只有一半,另外一半是因爲高度複雜非線性的函數可以快速的求解了…

c. 關於百度翻譯中的實拍翻譯功能:看到過baidu的 @餘軼南 在他們主頁上提到過一些,這個功能應該就是使用CNN做的,圖像的標註採用的是自動標註(大家可以看到很多圖像拍攝後翻譯出的一些詞彙都不像人工標註的結果)和手工標註結合,因爲加入了文本標註的技術,有可能採用了google的word2vec的技術通過詞的距離來對圖像的相似程度做一個參考,晚上的數據識別結果不是太好,應該和訓練樣本有關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章