1. 程式人生 > >XGBoost 論文翻譯+個人註釋

XGBoost 論文翻譯+個人註釋

最近研究機器學習理論,學習了一下陳天奇博士的論文,做了一點簡單的翻譯和批註,在這裡記錄一下。

本文將按照論文的順序來介紹xgb,其中穿插我自己的理解和我對於論文原文的中文翻譯,以及一些公式的截圖。原文翻譯將使用紅色來標註,其餘的皆為我自己理解的內容,涉及引數調整的我會加粗。

===================================================

論文題目是 

XGBoost: A Scalable Tree Boosting System

從題目中就可以看出來,這篇文章重點講的是一個system,而不是algorithm,本文的重點大篇幅地介紹了xgb整個系統是如何搭建,如何實現的,在模型演算法的公式改進上只做了一點微小的工作。

摘要

樹的提升是一種非常有效且被廣泛使用的機器學習方法。 在本文中,我們描述了一個名為XGBoost的有延展性的端到端的樹提升系統,資料科學家們廣泛使用該系統來實現許多機器學習挑戰的最新成果。我們提出了一種新穎的稀疏資料感知演算法用於稀疏資料,一種帶權值的分位數略圖(weighted quantile sketch) 來近似實現樹的學習。更重要的是,我們提供有關快取訪問模式,資料壓縮和分片的見解,以構建有延展性的提升樹系統。通過結合這些見解,XGBoost可用比現系統少得多的資源來處理數十億規模的資料。

關鍵詞:大規模機器學習

摘要這段沒什麼好說的,後面都會詳細介紹,這段內容不多,我就翻譯了一下。

第一章 緒論

機器學習和資料驅動的方法在許多領域變得非常重要。智慧垃圾郵件分類器通過從大量的垃圾郵件資料和使用者反饋中學習來保護我們的郵箱;廣告系統學習將正確的廣告與正確的背景相匹配;欺詐檢測系統保護銀行免受惡意攻擊;異常事件檢測系統幫助實驗物理學家發現新的物理現象。有兩個重要因素可以推動這些成功的應用:使用能捕獲複雜資料依賴性的有效的(統計)模型,以及能從大型資料集裡學習出模型的可擴充套件的學習系統。

在實際應用的機器學習方法裡,GradientTree Boosting (GBDT)是一個在很多應用裡都很出彩的技術。提升樹方法在很多有標準分類基準的情況下表現很出色。LambdaMART這個提升樹的變種,用來排序的,也表現出了不錯的結果,它除了被用於單獨的預測器,還在實際生產中被用於廣告點選率預測。它是很多整合方法裡的實際選擇,此外還用於Netflix這樣的比賽。

本文描述的可擴充套件的提升樹機器學習系統已經開源了,它的影響力已經被許多機器學習和資料探勘的比賽所廣泛認可。拿機器學習大賽Kaggle舉例:2015年釋出的29個獲勝方法裡有17個用了XGBoost。在這些方案裡,有8個僅用了XGBoost,另外的大多數用它結合了神經網路。對比來看,第二流行的方法,深度神經網路,只被用了11次。這個系統的成功性也被KDDCup2015所見證了,前十的隊伍都用了XGBoost。此外,據勝出的隊伍說,很少有別的整合學習方法效果能超過調好參的XGBoost。

這一段的描述屬實,萬能的xgb時代

這些結果說明我們的系統能在很廣泛的問題裡獲得很好的結果。這些成功案例包括:網頁文字分類、顧客行為預測、情感挖掘、廣告點選率預測、惡意軟體分類、物品分類、風險評估、大規模線上課程退學率預測。雖然這些問題依賴於特定領域的資料分析和特徵工程,但選擇XGBoost是這些人的共識,這體現出了我們的系統的影響力和重要性。

XGBoost成功背後的最重要因素是其在所有情況下的可擴充套件性。該系統在單臺機器上的執行速度比現有流行解決方案快十倍以上,並可在分散式或記憶體有限的環境中擴充套件到數十億個示例。XGBoost的可擴充套件性是由於幾個重要的系統和演算法優化。這些創新包括:一種新穎的樹學習演算法,用於處理稀疏資料;理論上合理的加權分位數略圖程式能夠在近似樹學習中處理例項權重。並行和分散式計算使得學習速度更快,從而加快了模型的探索。更重要的是,XGBoost利用外核計算,使資料科學家能夠在桌面上處理數百萬個示例。最後,將這些技術結合起來,使用最少的叢集資源擴充套件到更大的資料的端到端系統更為令人興奮。本文主要貢獻如下:

這四個方面就是論文的主要創新點了

•我們設計和構建高度可擴充套件的端到端提升樹系統。 

•我們提出了一個理論上合理的加權分位數略圖。 這個東西就是推薦分割點的時候用,能不用遍歷所有的點,只用部分點就行,近似地表示,省時間。

•我們引入了一種新穎的稀疏感知演算法用於並行樹學習。 令缺失值有預設方向。

•我們提出了一個有效的用於核外樹形學習的快取感知塊結構。 用快取加速尋找排序後被打亂的索引的列資料的過程。

雖然在並行樹推廣方面有一些已有的工作,但諸如核外計算,快取感知和稀疏感知學習等方向尚未被探索。更重要的是,結合所有這些方面的端到端系統為實際使用情況提供了一種新穎的解決方案。這使得資料科學家和研究人員能夠構建提升樹演算法的強大變種。除了這些主要的貢獻之外,我們還提出了一個改進正則化學習的方法。

在本文的其餘部分安排如下。我們將在第二章節首先回顧一下提升樹,並介紹一個正則化的目標。然後,我們在第三部分介紹拆分查詢方法,第四部分是系統設計,包括相關的實驗結果,為我們提到的每個優化方法提供量化支援。相關工作在第五節討論。詳細的端到端評估在第六部分。最後,我們在第七部分總結這篇論文。

Introduction 也沒啥好說的,我就簡單翻譯了一下,後面的就不大篇幅翻譯了,只講思想,因為有的細節我也扣不清楚。

第二章 簡言提升樹

這一章就是提升方法的公式了,以及正則項的公式。基本思想和GBDT是一樣的,都是按照損失函式的負梯度方向提升,其實就是gbdt,只是進行了泰勒二次展開,加了一些正則項。xgb的損失函式如下所示

把經驗誤差二階泰勒展開

去掉常數項:

最後展開正則項,我們得到了

正則項裡的T是葉子節點的個數,gamma是這一項的係數,lambda是所有葉子節點的權值的l2正則之和的係數當正則項係數為0時,整體的目標就退化為了GBDT。陳天奇在他的slide裡還提到這個詭異的目標函數了,他說:這個目標函式有一個很明顯的特點,那就是隻依賴於每個資料點的在目標函式上的一階和二階導數,有人可能會問,這個材料似乎比我們之前學過的決策樹學習難懂。為什麼要花這麼多力氣來做推導呢?因為這樣做使得我們可以很清楚地理解整個目標是什麼,並且一步一步推匯出如何進行樹的學習。這一個抽象的形式對於實現機器學習工具也是非常有幫助的。傳統的GBDT可能大家可以理解如優化平法殘差,但是這樣一個形式包含可所有可以求導的目標函式。也就是說有了這個形式,我們寫出來的程式碼可以用來求解包括迴歸,分類和排序的各種問題,正式的推導可以使得機器學習的工具更加一般。

啊為什麼要泰勒展開?據說能使工具的學習更加一般?這裡傳統的GBDT用一階導就已經令工具就有一般化了,這裡又求了一個二階導,好吧,我也不懂為什麼要這樣。這裡並不明白為何要用二階泰勒展開作為損失函式,anyway,如果有人能理解還希望指點一二。

第二章裡還提到了shrinkage 和 column subsampling,就是相當於學習速率和對於列的取樣騷操作。調低eta能減少個體的影響,給後續的模型更多學習空間。對於列的重取樣,根據一些使用者反饋,列的subsampling比行的subsampling效果好,列的subsampling也加速了並行化的特徵篩選。這裡就跟RF差不多吧,不過論文沒說具體怎麼column subsampling,API裡有個引數能控制subsampe的比例

第三章 尋找分割點演算法

這一章算是這篇文章的核心章節,也是xgb之所以能跑的這麼快的原因之一(最重要的原因在第四章),我覺得比第二章的公式都要重要。

傳統演算法就是暴力地遍歷所有可能的分割點,xgb也支援這種做法:

當資料量過大,傳統演算法就不好用了,因為要遍歷每個分割點,甚至記憶體都放不下,所以,xgb提出了額外一種近似演算法能加快執行時間:

這個演算法根據特徵的分佈情況,然後做個proposal,然後這一列的分割點就從這幾個proposed candidate points裡選,能大大提高效率。這裡有兩種proposal的方式,一種是global的,一種是local的,global的是在建樹之前就做proposal然後之後每次分割都要更新一下proposal,local的方法是在每次split之後更新proposal。通常發現local的方法需要更少的candidate,而global的方法在有足夠的candidate的時候效果跟local差不多。我們的系統能充分支援exact greedy跑在單臺機器或多臺機器上,也支援這個proposal的近似演算法,並且都能設定global還是local的proposal方式(這個演算法的引數我沒有在一般的API裡看到,可能做超大型資料的時候才會用這個吧,因為前者雖然費時間但是更準確,通常我們跑的小資料用exact greedy就行)

這裡演算法在研究特徵分佈然後做proposal的時候,用到了加權分位數略圖(weighted quantile sketch),原文說不加權的分位數略圖有不少了,但是支援加權的以前沒人做,我對這個東西不太瞭解,百度了一下相關的關鍵詞:

構造略圖(sketching)是指使用隨機對映(Random projections)將資料流投射在一個小的儲存空間內作為整個資料流的概要,這個小空間儲存的概要資料稱為略圖,可用於近似回答特定的查詢。不同的略圖可用於對資料流的不同Lp範數的估算,進而這些Lp範數可用於回答其它型別的查詢。如L0範數可用於估算資料流的不同值(distinct count);L1範數可用於計算分位數(quantile)和頻繁項(frequent items);L2範數可用於估算自連線的長度等等。

另外,在分割的時候,這個系統還能感知稀疏值,我們給每個樹的結點都加了一個預設方向,當一個值是缺失值時,我們就把他分類到預設方向,每個分支有兩個選擇,具體應該選哪個?這裡提出一個演算法,列舉向左和向右的情況,哪個gain大選哪個:

第四章 系統設計

這是本文的重中之重,也是最核心的部分,終於開始介紹整個系統了。這一章原文太多,我提煉出來的都是要點

這裡XGB將所有的列資料都預先排了序。

以壓縮形式分別存到block裡,不同的block可以分散式儲存,甚至存到硬盤裡。在特徵選擇的時候,可以並行的處理這些列資料,XGB就是在這實現的並行化,用多執行緒來實現加速。同時這裡陳博士還用cache加了一個底層優化:

當資料排序後,索引值是亂序的,可能指向了不同的記憶體地址,找的時候資料是不連續的,這裡加了個快取,讓以後找的時候能找到小批量的連續地址,以實現加速!這裡是在每個執行緒裡申請了一個internal buffer來實現的!這個優化在小資料下看不出來,資料越多越明顯。

第五章 相關工作

這一章把前面的東西又總結了一遍,這裡不寫了。

第六章 端到端的評估

這一章都是一些實驗資料,就是各種圖表來證明xgb比別的優秀,這裡也沒必要展開講了,我就講幾個我關注的點。

實驗資料裡提到column subsampling表現不太穩定,有時候sub比不sub要好,有時候sub要好,什麼時候該用subsampling呢?當沒有重要的特徵要選,每個特徵值的重要性都很平均的時候,對列的subsampling效果就比較差了。

這裡他們還做了分散式的實驗,在Amazon的雲服務平臺上用了32臺m3.2xlarge搭建了一個YARN叢集,資料沒有放在HDFS裡,放在了Amazon的S3 storage上(這是為了公平起見,不讓訪問本地資料),每臺機器的配置是8核30G記憶體,160G的ssd,然後跑出來的實驗結果,xgb虐了spark MLLib。

然後我手賤去查了一下這個instance多少錢,額400$/month,一下子開32臺,一個月就是一萬多美刀啊。