GK Summay算法(ϵ−approximate ϕ−quantile)


0.前言

  XGBoost不僅在單機上通過OMP實現高度並行化,還通過MPI接口與近似分位點算法(論文中是weighted quantiles sketch)實現高效的分佈式並行。其中weighted quantiles sketch框架基於ϵ -approximate quantile近似分位點算法。不得不說分位點算法在分佈式系統、流式系統中使用是個很天才的想法,很多分佈式算法的基石。早在2001年,M.Greenwald和S. Khanna提出了GK Summay分位點近似算法(ϵ−approximate ϕ−quantile),直到到2007年被Q. Zhang和W. Wang提出的多層level的merge與compress/prune框架進行高度優化,而被稱爲A fast algorithm for approximate quantiles,目前XGBoost框架套用A fast algorithm算法結構。

  本文主要介紹GK Summay算法,後續博客會持續更新分佈式GK Summay算法以及A fast algorithm for approximate quantiles算法,最後還會分析XGBoost中使用的weighted quantiles sketch算法,博客內容來源主要是原始論文與Emory大學的流式數據庫的課程內容,本文僅提取出關鍵內容加入筆者的個人理解,有錯誤還望諒解與告知。

1.背景

  ϕquantile 分位點概念:排序爲rank=ϕN 的元素,其中N 爲序列中元素的個數。考慮以下例子數據:

11 , 21 , 24 , 61 , 81 , 39 , 89 , 56 , 12 , 51

  查詢ϕquantile 分位點所在數據前,需要對無序數據進行排序:
input:sort:rank:111112112224213612448139539516895675661812819518910

  排序後很容得到:0.5quantile 對應rank=5 ,值爲39。 此外還有,0.1quantile 對應rank=1 ,值爲11。

  ϵapproximate ϕquantile 分位點概念:考慮誤差近似,即給定誤差ϵ 和分位點ϕ ,只需要給定排序區間r[(ϕε)N, (ϕ+ε)N] 內任意元素即可。類似地,給定ε=0.1,ϕ=0.5 ,可得rank值在區間{4,5,6} 。給定區間內任意元素,都滿足排序誤差ϵN 要求。

  爲了滿足對數據近似分位點的頻繁查詢,考慮以下幾種場景:

  1. 固定不變的數據集
  2. 流式數據,數據長度不斷增加
  3. 數據源分佈存儲,但數據長度固定
  4. 數據源分佈存儲+流式數據,數據長度不斷增加

  對於場景1,可以對數據進行預排序,每次查詢採用二分法精確查找,時間複雜度爲O(logN) 。考慮排序誤差ϵN , 我們可以對數據進行分桶,分桶長度爲ϵN 來保證誤差,即分1/ϵ 個桶,時間複雜度降低爲O(log(1/ϵ)) ,簡單的離線排序和分桶都屬於offline算法,無法滿足場景2、3、4場景,這就需要本文介紹online算法來構建查詢summary。

2. GK Summary算法

2.1 GK Summary定義

  GK Summary原本是針對流式系統分位點查詢設計的,基於上述場景2。對於ϵapproximate 分位點查詢,可以構建查詢summary結構,包含m 個summary tuple的集合:

{(v1,min1,max1),(v2,min2,max2,...,(vm,minm,maxm)}

  定義:vi 爲命中第i 個summary的代表值,簡單起見,vi 定義爲rank=mini 對應值,summary的rank 區間爲[mini,maxi]
  約束:爲了滿足給定誤差ϵNmaximiniϵN 。證明:顯而易見。

  流式數據是不斷更新,這種summary結構存在缺點:每次插入中間值,需要更新插入位置後面的summary,更新複雜度高。流式數據插入更新頻率比查詢頻率要更高,必須優先解決數據插入構建summary的複雜度。

  對此,Greenwald與Khanna提出對數據插入更新友好的GK Summary結構,相對於存絕對值,GK Summary採用相對值的結構,類似地,包含m 個summary tuple的集合:

(v0,g0,Δ0),(v1,g1,Δ1),...,(vs1,gs1,Δs1)

  定義:vi 爲命中第i 個summary的代表值,rmin(v)v 所在summary的下界, rmax(v)v 所在summary的上界,則giΔi 定義如下:
gi={rmin(vi)rmin(vi1)1, i>0, i=0

Δi={rmax(vi)rmin(vi)0, i<s1, i=s1

  爲了便於理解,giΔi 關係如下圖:

這裏寫圖片描述

  邊界條件:v0 爲數據中最小值,vs1 爲數據中最大值。等價於第一種定義的summary,排序相對值轉化爲絕對值,滿足以下性質:

  性質1:rmin(vi)=ij=0gi , 由gi 定義,可以證明:

rmin(vi)=gi+rmin(vi1)=gi+gi1+rmin(vi2)=gi+gi1+gi2...+rmin(v0)

  此外,邊界設定rmin(v0)=g0=1,得證

  性質2:rmax(vi)=ij=0gi+Δi , 由性質1定義Δi=rmax(vi)rmin(vi) 可得
  性質3:s1j=0gi=N , 由性質2邊界設定Δs1=0 可得。

  約束:爲了滿足給定誤差ϵNmaxi(gi+Δi)2ϵN證明如下:
  設最大誤差爲e=maxi(gi+Δi)/2 , 則 gi+Δi2e2ϵN
  1) 首先考慮邊界情況:r>Ne , 直接返回vs1 ,對應rank=N ,此時誤差爲Nr<e
  2) 一般情況:rNe , 找到最小的j ,使得rmax(vj)>r+e ,必有rmax(vj1)r+e

 gi+Δi2ermin(vj1)=rmax(vj)(gi+Δi)>re

  因此,查詢返回爲vj1 , 其代表區間在[re,r+e] 內,滿足誤差ϵN 要求,得證。更直觀的圖示如下:

這裏寫圖片描述

  Summary查詢過程:上述證明揭示了對於任意分位點ϕ ,計算出排序位置r :1)找到最小j ,使得rmax(vj)>r+e ,則返回vj1 值,2)如果找不到則返回vs1
  只要流式系統中每個時刻都維持這種summary結構,每次查詢都能滿足精度要求,但是流式數據實時更新,需要解決新增數據的summary更新問題。

2.2 GK Summary插入insert

  流式系統數據實時更新,不斷產生新數據,數據量不斷增加,儘管查詢近似度ϵ 不變,隨着數據量增加,ϵN 不斷變大。爲了保證誤差,任何時刻都要保證滿足約束maxi(gi+Δi)2ϵN 。首先考慮數據v插入情況的summary更新:
  1) 最小值邊界情況:v<v0 ,則插入summary爲(v,1,0)
  2) 最大值邊界情況:v>vs1 , 則插入summary爲(v,1,0)
  3) 一般情況:vi1v<vi ,則插入summary爲(v,1,gi+Δi1)

  證明:對於情況1)與2),顯而易見的。對於情況3):

  summary內部tuple按照對應的v 排序,新增summary是插入到第i1 個summary後面,前i1 個summary不受影響,對於後面的is1 的summary來說,對應rank 值均增加,rmaxrmin 均需加1,因此gΔ 均不需要改變,也就滿足了誤差約束條件。這裏可以看出:與前文提到的summary相比,GK Summary對於新增數據無需更新其他summary
  新增summary必須滿足g1g+Δgi+Δi ,如果不滿足則沒有必要插入,因爲前後2個summary可以覆蓋新增的summary,選擇g=1 的主要原因是有利於後期summary的delete,後續會談到,設置Δ=gi+Δi1 能使得g+Δ2ϵN ,原則上Δ2ϵN1 任意值即可,後續可以看到新增非邊界的summary tuple的Δ=2ϵN1

2.3 GK Summary刪除delete與compress

  每次數據插入都需要新增summary,summary不能持續增加而不刪除,因此到達一定程度需要對summary進行delete。爲了時刻滿足maxi(gi+Δi)2ϵN ,GK Summary 的delete操作
  如果存在:gj+...gi+gi+1+Δi+12ϵN
  則可以用(vi+1,gj+...+gi+gi+1,Δi+1) 來替代{(vj,gj,Δj)...(vi,gi,Δi),(vi+1,gi+1,Δi+1)}
  換句話說:
  1)刪除summary集合:{(vj,gj,Δj)...(vi,gi,Δi)}
  2)更新(vi+1,gi+1,Δi+1)(vi+1,gj+...+gi+gi+1,Δi+1)

  delete操作特性:只改變vi+1 所在summary的gi+1 , 並不改變Δi+1 。也就是說Δ 越小,在滿足誤差約束下,具有合併更多summary的潛力。

  爲了追求效率,根據delete性質,GK提出compress操作,首先說明論文的概念:
  1. Fullness: 如果gi+Δi=2ϵN ,則說明該summary tuple是full的
  2. Capacity:由於delete操作Δ 不變性,因此summary達到full,g 最終爲2ϵN - Δ ,因此Δ 決定了summary tuple的capacity。
  3. Bands:compress操作主要是減少summary總數,每個summary的元素覆蓋數coverage取決於g , 因此需要保持g 值儘量大,對應Δ 儘量少,也就是說Δ 值小的summary應該越多,引入bands 主要是對summary 進行分級,對於給定Δp=2ϵN ,可以計算band 值爲:

capactity=pΔband=log2(capactity)

  對於band=αcapactity 區間爲[2α,2α+1)Δ 對應區間(p2α+1,p2α] ,注意開閉區間。band 值越大,Δ 越小,capacity能力越大。考慮合併策略:對於相連summaryi , summaryi+1 合併,合併更新到band 值較小的summary 上,由於delete的Δ 不變性,保留band 值大的,有更大的capacity ,後期能夠容納更多的summary。對每個summary都包含Δ ,可以組織成$bands¥樹結構,如下圖所示:


這裏寫圖片描述

  band 樹結構特性:對於節點V ,其所有子節點與Vsummary 中是連續相連的。

  summary 更新過程中如何保證這一性質?

  1)每次新數據會插入新summaryΔ=2ϵN1 , 對應band=0 ,爲最小值,除非單獨節點,否則一定爲右邊節點的子節點。
  2)合併策略:對於summaryi , summaryi+1 合併,合併更新到band 值較小的summary 上。

  因此,上述操作會維持這種band 樹結構性質。此外,滿足上述條件,論文中給出基於bandcompress算法


這裏寫圖片描述

  算法從右往左掃描,其中g 爲當前節點與其所有子節點g 總和,如果遇到:BAND(Δi,2ϵn)BAND(Δi+1,2ϵn)gi+gi+1+Δi+1<2ϵn , 刪除i 節點與其子節點對應summary tuple。

2.4 GK Summary算法

  此外,需要明確compress操作執行時機:有時候原來的summary是不可合併的,但是隨着數據量N 增加,p=2ϵN 相應增大,bandcapacity 值是會隨着階段性不斷變大的,而出現可合併的情況. 論文給出數據每增量1/2ϵ 時,會執行compress操作。因爲這種情況下誤差值絕對值增量爲2ϵ×1/2ϵ=1 ,原本不滿足誤差約束條件的情況會發生改變,否則正常插入數據到summary,算法如下:


這裏寫圖片描述

  論文還證明了以下性質和結論,由於章節內容過多,下面僅放置結論,首先繼續說個概念:
  Coverage:每個summary tuple會cover新增數據,對於summaryi ,cover數據來源:1)直接cover:即單個數據插入生成的summary直接merge到summaryi ;2)間接cover:即該數據原本被merge到summaryj , 而summaryj 又merge到summaryi 。每個數據初始插入都爲(v,1,2ϵN1) ,開始階段Δ =0,其中g 爲summary數據覆蓋量。

  性質1:任何時刻,band=α 的summary覆蓋的數據點不可能來源於band=β 的summary,其中β>α
  性質2:任何時刻,所有band[0,α] 構成的summary集合,覆蓋數據總和數上界爲2α/ϵ
  性質3:任何時刻,給定band=α ,最多3/(2ϵ) 個父節點
  性質4:任何時刻,給定band=α ,最多4/ϵ 個右側兄弟節點是full的summary
  性質5:任何時刻,band=α 的summary總數上界爲11/(2ϵ)
  結論:任何時刻,summary的總個數上界爲:11/(2ϵ)log2(2ϵN) 。性質5直接可得該結論。


參考文獻

  1. GK Summary算法論文:http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf
  2. Emory大學Stream DB System課程關於ϵ-approximate ϕ-quantile材料:http://www.mathcs.emory.edu/~cheung/Courses/584-StreamDB/Syllabus/08-Quantile/Greenwald.html
  3. Emory大學Stream DB System課程關於GK Summary算法材料:
    http://www.mathcs.emory.edu/~cheung/Courses/584-StreamDB/Syllabus/08-Quantile/Greenwald2.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章