理解《Deep Forest: Towards An Alternative to Deep Neural Network》
轉自女朋友的csdn: 理解《Deep Forest: Towards An Alternative to Deep Neural Network》
Deep Forest 優點
1. 性能高度接近深度神經網路2. gcForest 的參數數量較少,訓練更簡單,森林層次自適應
3. 訓練速度更快4. gcForest能在小數據集上表現良好5. 樹結構在理論上更容易分析和理解Deep Learning 缺點
1. 需要更大的訓練數據才能有更好的結果2. DNN結構複雜,需要的計算量大(為了要利用大的訓練數據,學習模型需要更大的容量,會更複雜)3. DNN有大量參數,且訓練性能嚴重依賴於 hyper parametor 的微調Deep Forest 結構
說明:本文中插圖全部來自原論文 」Deep Forest: Towards An Alternative to Deep Neural Network」
Deep Forest 的結構分為兩個大部分,其中第一個部分是Multi-Grained Scanning,作用類似於卷積神經網路,即將多個相鄰特徵進行分組處理,考慮了特徵之間的相互關係,示例中將一個400維的特徵擴展到了3618維。第二個部分是Cascade Forest,這部分是演算法的核心,通過將若干個弱分類器(決策樹)集成得到的森林再次集成,形成森林瀑布的層次,每一層中都由四個森林組成,最終結果層是取森林瀑布頂層的四個森林結果的均值作為最終判定結果。Cascade Forest 整體演算法如下:
1. Deep Forest 是由多層森林組成的瀑布型結構,每一層的輸入是前一層森林輸出的特徵信息,且該層森林的輸出作為下一層森林的輸入特徵的一部分
2. 瀑布是由多個森林串成的,而森林又是由多棵決策樹集成的。為了保證模型的多樣性,採用了多種不同種類的森林
3. 為了簡單起見,文中在每層中只選用了兩種森林:two complete random forests 與 two random forests。即每層只有四個森林
4. complete random forest 是由1000棵 complete random trees 組成的,complete random tree 中每個節點都隨機的選擇一個特徵作為分裂特徵,不斷增長整棵樹,直到剩餘所有樣本屬於同一類,或樣本數量少於10
5. random forest 是由1000棵 random trees 組成的, random tree 中的每個節點都隨機的選擇 sqrt(d) 個特徵(其中d是輸入特徵總數),然後選擇最佳基尼係數的特徵作為該節點的分裂特徵,同樣增長整棵樹,直到剩餘所有樣本屬於同一類或樣本數量少於 10
輸出過程分析:
森林對每個輸入樣本都有一個輸出,該輸出是以類別佔比的形式給出的,如上圖中,此時存在三個類別(方形,三角形,橢圓形),森林中每棵樹的葉子節點記錄了建立該決策樹時,落在該葉子節點中的樣本集合中各個類別的樣本所佔的比例,如第一棵樹中給出的葉子節點的例子,落在該節點上的一共有9個樣本,其中有2個方塊樣本,4個橢圓樣本,和3個三角形樣本。因此該葉子節點記錄的 class vector 為 [ 0.2, 0.5, 0.3]。
一個樣例 x 進入森林中,在第一棵樹中按決策樹規則走,最後落在的葉子的 class vector 為[0.2, 0.5, 0.3],在第二棵樹中得到的 class vector 為 [0.3, 0.4, 0.3], 在第三棵樹中得到的 class vector 為 [1.0, 0 , 0 ],所以最終整個森林得到的 class vector 為各棵樹上得到的 class vector 的平均值,即【0.5,0.3,0.2】。
四個森林得到的結果串聯起來,同時原始輸入的特徵也串聯在這四棵樹的特徵後,將這些特徵傳入下一層
在瀑布層次後,用一個總的驗證集衡量瀑布的性能,不斷增加瀑布的層次,直到驗證集上的性能不再提升,這也是文中說的自適應的森林層次的實現方式。
注意:為了避免過擬合,每個森林中 class vector 的產生採用了 k 折交叉驗證的方法,具體來說,假設樣本有 k 個, 觀察針對第k個樣本的class vector 的生成, 先把第一個樣本扔出訓練集,用剩下的 k - 1 個樣本訓練整個森林(其中包含第k個樣本),此時得到的森林對第k個樣本輸出一個 class vector。然後將第二個樣本扔出訓練集,用剩下的 k - 1個樣本訓練森林,此時得到的森林對第 k 個樣本仍然輸出一個 class vector,。。。依次,每個樣本被用作訓練集中樣本的數量為(k - 1)次,產生 k - 1 個 class vector,取這些 class vector 的平均值作為該森林對該樣本最終輸出的 class vector。(這個部分 我還沒理解透!!!!)
Multi-Grained Scanning 演算法說明:
如上圖所示,其中假設原始輸入樣本的特徵維度為400維,通過定義一個大小為100的滑動窗口,將滑動窗口從原始輸入特徵上滑過,每次移動一個特徵大小,每次窗口滑動獲取的100個特徵作為一個新的實例,等效於在400維特徵上每相鄰100維的特徵摘出來作為一個特徵實例,得到301個新的特徵實例(400 - 300 + 1),每個特徵實例的維度為100維。同理,假設窗口大小為200,則400維的特徵將得到201個特徵新實例。注意:這裡的301個特徵實例是屬於同一個樣本的多維特徵生成的,屬於同一個樣本,而不是通常理解的實例即樣本的概念。得到301個 100維的特徵實例後,將其通過兩個隨機森林A與B,分別是complete random forest 和 random forest,由之前對這兩個森林的描述可知,每個森林對每個輸入樣例將輸出一個 class vector(假設此時分類任務為分為3類,則此時每個class vector 大小為3)。因此301個特徵實例通過一個森林後將生成301個class vector, 每個 class vector 的大小為3。將兩個森林生成的各個特徵實例的class vector 級聯起來,得到的總特徵數量為(301 * 3 * 2)1806個特徵。注意:每個樣本對應的label 就是該樣本對應的301個特徵樣本的 label。 同時輸入m 個樣本,這m個樣本映射為301 * m 個特徵樣本輸入此時的 Forest A 與 Forest B,構建了各個樹,並得到各個樣本對應的高維映射結果。該演算法通過這樣的思路,將同一個樣本的特徵之間按照相鄰關係分組,分組後輸入隨機森林,將特徵映射到更高維度,其中原始特徵之間的關係構成了 其中一部分新的特徵。將映射後的高維特徵輸入森林瀑布中,繼續完成整個流程。整體流程:
分析一下整個流程圖,輸入是一個樣本原始的400維特徵,通過設置三個不同大小的滑動窗口,100維的滑動窗口得到 301 個特徵實例(維度為100), 200維的滑動窗口得到201個特徵實例,300維的滑動窗口得到101個特徵實例,每個特徵實例通過一個森林後映射為1個維度為3的 class vector,因此301個特徵實例經過兩個 forest 後得到的特徵維度為:301 *3(class vector) * 2(2個森林)=1806。201個特徵實例經過兩個 forest 後得到的特徵維度為:201 * 3 * 2 = 1206。101個特徵實例對應維度為 606,最終將所有特徵集成起來,每個樣本得到的總特徵數為:1806 + 1206 + 606 = 3618。將3618作為森林瀑布的輸入,除了第一層森林外的各層森林的輸入為:森林的輸出結果(4*3)+原始特徵(3818)=3830個特徵。最後一層森林的結果取均值後取其中佔比最大的類作為該樣本的預測結果。推薦閱讀:
※論文導讀 | TFX:基於TensorFlow可大規模擴展的機器學習平台
※Andrew Ng對 Geoffrey Hinton 的採訪:致敬老爺子的一路堅持!
※揭開機器學習的面紗
※李宏毅機器學習2016 第三講 梯度下降
TAG:机器学习 | 深度学习DeepLearning |