1. 程式人生 > >gcForest演算法理解

gcForest演算法理解

一、相關理論

本篇博文主要介紹南京大學周志華教授在2017年提出的一種深度森林結構——gcForest(多粒度級聯森林)。近年來,深度神經網路在影象和聲音處理領域取得了很大的進展。關於深度神經網路,我們可以把它簡單的理解為多層非線性函式的堆疊,當我們人工很難或者不想去尋找兩個目標之間的非線性對映關係,我們就多堆疊幾層,讓機器自己去學習它們之間的關係,這就是深度學習最初的想法。既然神經網路可以堆疊為深度神經網路,那我們可以考慮,是不是可以將其他的學習模型堆疊起來,以獲取更好的表示效能,gcForest就是基於這種想法提出來的一種深度結構。gcForest通過級聯的方式堆疊多層隨機森林,以獲得更好的特徵表示和學習效能。

深度神經網路雖然取得很好的效能,但是也存在一些問題。

第一、要求大量的訓練資料。深度神經網路的模型容量很大,為了獲得比較好的泛化效能,需要大量的訓練資料,尤其是帶標籤的資料。獲取大規模資料需要耗費很大的人工成本;

第二、深度神經網路的計算複雜度很高,需要大量的引數,尤其是有很多超引數(hyper-parameters)需要優化。比如網路層數、層節點數等。所以神經網路的訓練需要很多trick;

第三、深度神經網路目前最大的問題就是缺少理論解釋。就像“煉丹”一樣,反正“丹藥”出來了,怎麼出來的我也不知道。

gcForest使用級聯的森林結構來進行表徵學習,需要很少的訓練資料,就能獲得很好的效能,而且基本不怎麼需要調節超引數的設定。gcForest不是要推翻深度神經網路,也不是以高效能為目的的研究,只是在深度結構研究方面給我們提供了一些思路,而且確實在一些應用領域獲得了很好的結果,是一項很有意義的研究工作。
 

二、演算法介紹

這種方法生成一個深度樹整合方法(deep forest ensemble method),使用級聯結構讓gcForest學習。
gcForest模型把訓練分成兩個階段:Multi-Grained Scanning和Cascade Forest。Multi-Grained Scanning生成特徵,Cascade Forest經過多個森林多層級聯得出預測結果。


Cascade Forest(級聯森林)


1. 級聯中的每一級接收到由前一級處理的特徵資訊,並將該級的處理結果輸出給下一級。
2. 級聯的每個級別包括兩個隨機森林(藍色字型標出)和兩個完全隨機樹木森林(黑色)。[可以是多個,為了簡單這裡取了2種森林4個弱分類器]
3. 每個完全隨機的樹森林包含1000(超引數)個完全隨機樹,通過隨機選擇一個特徵在樹的每個節點進行分割實現生成,樹一直生長,直到每個葉節點只包含相同類的例項或不超過10個例項。
4. 類似地,每個隨機森林也包含1000(超引數)棵樹,通過隨機選擇√d數量(輸入特徵的數量開方)的特徵作為候選,然後選擇具有最佳gini值的特徵作為分割。(每個森林中的樹的數值是一個超引數)
假設有三個類要預測; 因此,每個森林將輸出三維類向量,然後將其連線輸入特徵以重新表示下一次原始輸入。

 

類別概率向量生成:
給定一個例項,每個森林會通過計算在相關例項落入的葉節點處的不同類的訓練樣本的百分比,然後對森林中的所有樹計平均值,以生成對類的分佈的估計。即每個森林會輸出一個類別概率向量。
 

為了降低過擬合風險,每個森林產生的類向量由k折交叉驗證(k-fold cross validation)產生。具體來說,每個例項都將被用作 k -1 次訓練資料,產生 k -1 個類向量,然後對其取平均值以產生作為級聯中下一級的增強特徵的最終類向量。需要注意的是,在擴充套件一個新的級後,整個級聯的效能將在驗證集上進行估計,如果沒有顯著的效能增益,訓練過程將終止;因此,級聯中級的數量是自動確定的。與模型的複雜性固定的大多數深度神經網路相反,gcForest 能夠適當地通過終止訓練來決定其模型的複雜度(early stop)。這使得 gcForest 能夠適用於不同規模的訓練資料,而不侷限於大規模訓練資料。
 

 



假設有三個類,則四個森林每一個都將產生一個三維的類向量,因此,級聯的下一級將接收12 = 3×4個增強特徵(augmented feature)則下一層的輸入特徵向量維度為(3×4 + length of x)。


Multi-Grained Scanning(多粒度掃描)

用多粒度掃描流程來增強級聯森林,使用滑動視窗掃描的生成例項,輸入森林後結果合併,生成新的特徵。


 

對於400維的序列資料,採用100維的滑動窗對輸入特徵進行處理,得到301(400 - 100 + 1)個100維的特徵向量。

對於20×20的影象資料,採用10×10的滑動窗對輸入特徵進行處理,得到121((20-10+1)*(20-10+1))個10×10的二維特徵圖。

然後將得到的特徵向量(或特徵圖)分別輸入到一個completely-random tree forest和一個random forest中(不唯一,也可使用多個森林),以三分類為例,會得到301(或121)個3維類分佈向量,將這些向量進行拼接,得到1806(或726)維的特徵向量。

維度變化:1個例項400維->301個例項100維->2棵森林301個例項3維->1806維(2x301x3)

維度變化:1個例項20*20->121個例項10*10->2棵森林121個3維->726維(2x121x3)


整體流程

 


階段1:
1. 利用滑動視窗切分成多例項特徵向量,經過森林變換輸出類別概率向量。
2. 合併類別概率向量生成新的特徵。
階段2:
3. 輸入特徵經過森林輸出類別概率向量,連線原始輸入作為下一層輸出。
4. 經過多個級聯森林,輸出最終的類別概率向量。
5. 對多個森林輸出的類別概率向量求類別的均值概率向量,取最大的類別概率為預測結果。

 

使用多粒度掃描對輸入特徵進行預處理。以使用三個尺寸的滑動窗為例,分別為100-dim,200-dim和300-dim。輸入資料為400-dim的序列特徵,使用100-dim滑動窗會得到301個100-dim向量,然後輸入到一個completely-random tree forest和一個random forest中,兩個森林會分別得到的301個3-dim向量(3分類),將兩個森林得到的特徵向量進行拼接,會得到1806-dim的特徵向量。同理,使用200-dim和300-dim滑動窗會分別得到1206-dim和606-dim特徵向量
 

三、演算法實現

gcForest模型的Python實現

GitHub上有兩個star比較多的gcForest專案,這裡要說明的是其中 是官方提供(由gcForest的作者之一Ji Feng維護)的一個Python版本。

目前gcForest演算法的官方Python包並未託管在Pypi, 但v1.1.1支援Python3.5

1. 官方開源地址:https://github.com/kingfengji/gcForest

使用請參考:https://mp.csdn.net/postedit/84774888

2 實現基於Python3.x的gcForest version0.1.6版本(https://github.com/pylablanche/gcForest),但其功能要相對弱

 

四、總結

相比於深度神經網路,gcForest具有以下優點:

1. 對於某些領域,gcForest的效能較之深度神經網路具有很強的競爭力

2. gcForest所需引數少,較深度神經網路容易訓練得多

3. gcForest具有少得多的超引數,並且對引數設定不太敏感,在幾乎完全一樣的超引數設定下,在處理不同領域的不同資料時,也能達到極佳的效能,即對於超引數設定效能魯棒性高。

4. gcForest對於資料量沒有要求,在小資料集上也能獲得很好的效能。

5.  gcForest訓練過程效率高且可擴充套件,適用於並行的部署,其效率高的優勢就更為明顯。

 

   
  

參考

Paper:https://arxiv.org/abs/1702.08835v3
Github:https://github.com/kingfengji/gcForest
Website:http://lamda.nju.edu.cn/code_gcForest.ashx

Deep Forest: Towards An Alternative to Deep Neural Networks