1. 程式人生 > 其它 >Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 論文解讀(VLDB 2021)

Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 論文解讀(VLDB 2021)

Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 論文解讀(VLDB 2021)

  • 本篇部落格是對Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 論文的解讀。原文連結為p1950-liu.pdf (vldb.org)
  • 本文設計一種基於整合深度神經網路的基於查詢的選擇度估計器,文章的主要貢獻有:
    • 第一次設計實現了一種可以反映估計結果的不確定性的技術估計器。
    • 介紹了一種新的查詢特徵化的方法,利用了資料庫的連線模式捕獲表列間的真是相關性。
    • 在數學上定義了估計不確定性的含義,並通過設計實現整合深度神經網路實現了對估計結果的不確定性的評估。
    • 通過不確定性管理模組可以通過增量學習進一步提高模型的準確性。

轉化為迴歸問題

因為查詢的基數均為實數,因此我們可以建立一個迴歸模型\(M\)。對於任意範圍的查詢語句,模型\(M\)可以產生匹配或接近實際基數值的迴歸結果。
模型\(M\)作為一個迴歸模型,其輸入應為一個實值向量。因此我們必須將給定的查詢語句轉化為一個對應的實值向量,這個過程稱為查詢特徵化。本文的查詢特徵化方法將在後文介紹。總之\(M\)將特徵化向量作為模型的輸入,實際的基數值作為標籤進行訓練以期望產生一個可以很好擬合query-cardinality對映關係的函式。

查詢特徵化

在訓練\(M\)預測基數前,我們必須將查詢語句轉換成滿足模型輸入形式的實值向量。一個SQL查詢語句可以表示成\(<Tables><Joins><Columns><Values>\)在本文中,它們中的每一個都用一個向量表示,這四個向量組合在一起就是一個查詢語句的特徵化向量,將其直接插入模型用於模型的訓練和推理。下面我們介紹每一部分的嵌入方法。

Tables encoding

  • 本文不同於其他方法中的one-hot或二進位制編碼而是使用圖嵌入的方法對資料庫表進行編碼。我們將資料庫的連線模式看做無向圖,其中頂點是表,每條邊連線兩個可以相連的表。我們將資料庫連線模式圖作為某種圖嵌入方法的輸入,輸出為每個頂點的嵌入編碼,每個輸出的向量都是對應表的編碼。若查詢中不涉及表,我們就用0向量來代替。與二進位制編碼類似,我們將圖嵌入的長度固定為\(log^{m+1}\)
    維,其中m表示資料庫中表的個數。

Joins encoding

\(<Joins>\)是基於連線圖得到的,連線圖是是從資料庫的連線模式中派生出來的。具體來說連線圖就是資料庫連線模式派生出的所有子圖。\(<Joins>\)的嵌入過程大致分為兩個步驟:
1.找出所有可能的連線圖
2.對所有的連線圖做嵌入處理
下面介紹Joins encoding演算法:

  • 總體流程:

  • 給定一個根節點t,連線圖深度d,尋找滿足條件的連線圖:

  • 首先根據連線模式找出所有的連線圖。(Algothm 1-4;Algothm 2)其次為每個連線圖尋找上下文資訊,本文中認為一個根節點為\(t\)長度為\(d\) 的連線圖的context為以\(t\)的鄰居節點為根節點,長度為 \(\{d-1,d,d+1\}\) 的連線圖。(Algothm 11-14)接著利用上下文資訊對每個連線圖進行編碼,具體思想類似詞嵌入和圖嵌入,利用當前的連線圖試圖去預測其上下文中的連線圖。將隱藏層的結果當做embedding。(Algothm1 15-17)

Columns encoding

列之間的相關性關係可以作為一種有用的資訊應用於列編碼中。本文利用圖嵌入針對資料庫不同列之間的真實相關性對每一列進行編碼。該編碼方法分為三步:
1.構造單表內關係依賴圖
2.構造全域性關係依賴圖
3.根據全域性關係依賴圖進行圖嵌入
我們通過計算隨機相關係數(RDC)和一個閾值\(t\)來判斷不同列之間是否存在依賴關係。

Values encoding

  • 在一個有共有n列的資料庫中,所有的連線查詢語句的過濾子句的條件都可以表示為
    \(({lb}_1^1\leq {Col}_1^1\leq{ub}_1^1)\cap{...}\cap({lb}_m^{cm}\leq {Col}_m^{cm}\leq{ub}_m^{cm})\) 的形式,其中 \({Col}_i^{j}\) 表示資料庫中第\(i\)個表的第\(j\)列屬性,\(lb_i^j\)\(ub_i^j\) 分別是查詢中的 \({Col}_i^{j}\) 值的上限和下限。我們將表 \(Ti\)的第j列屬性的值域表示為\([min_i^j,max_i^j]\) ,如果查詢中沒有對某一列進行約束,我們就用它的值域範圍表示。
  • 舉個例子:一個數據庫有兩個列屬性 \(Col_i^j\)\(Col_m^n\) 且它們的值域均為 \((0,100)\),有一個查詢的過濾條件為 \((20\leq Col_i^j\leq 50)\),我們就可以將這個查詢語句的過濾條件表示為 \((20\leq Col_i^j\leq 50)\cap (0\leq Col_i^j\leq 100)\).
  • 假設一個數據庫存在 \(CM\) 列屬性,我們就可以用 \(CM\)\((lb,ub)\) 來表示一個查詢語句的過濾子句,即我們可以用 \(2CM\) 維的向量對過濾子句進行編碼。

綜上,我們完成了對 \(<Tables><Joins><Columns><Values>\) 的編碼,將它們連線在一起形成向量 \(q\) 就完成了查詢特徵化工作得到能作為模型輸入的特徵化向量。設Joins編碼長度為n,Columns編碼長度為C,一個query語句中涉及m個表,那麼我們得到的一個查詢特徵化向量的長度為 \(mlog^m+n+c+2c\) 維。

訓練資料處理

基數變換

模型 \(M\) 的訓練資料為大量的\(<query,real_card>\)我們用S來表示。S作為訓練集會很大,這會導致不同的查詢基數差距可能會非常大,而且標籤的分佈可能會比較傾斜,這都會對訓練過程造成很大的影響,為了避免這些影響到訓練的結果,我們對標籤做了一些標準化變換:

  • log Transformation:利用取對操作可以緩解資料分佈傾斜的情況。
  • min-max scaling : 對標籤進行放縮操作,使之分佈在 \((0,1)\)區間內,可以避免標籤差距過大影響訓練過程。\(card'= \frac{card-min\_card}{max\_card-min\_card}\)

訓練資料生成

  • 由於查詢的基數分佈很容易發生偏差,因此從所有查詢的空間進行簡單取樣可能會產生不均勻的訓練資料集和次優的基數估計值。為了生成統一的訓練資料集,我們基於以下兩種規則生成訓練資料:
    • 通用性:查詢應該來自從資料庫連線模式中派生出的多種連線圖。
    • 多樣性:查詢的訓練資料在過濾屬性和基數上應該是不同的。
  • 基於以上兩種規則,我們可以通過以下方式生成訓練資料:我們將查詢語句均勻的劃分到每個不同的連線圖。(通用性)為了生成對連線圖的查詢,我們先從連線圖內部隨機取樣出一個元組並獲得該元組的非空列數記為 \(N\),接著我們從\((1,N)\)中隨機的選擇一個過濾謂詞個數 \(np\) 接著我們隨機抽取np個列並根據其支援的運算子生成過濾條件。(多樣性)

模型的選擇

  • 我們使用深層神經網路的集合(DNN Ensembles)來估計基數。選擇DNN,因為查詢的分佈非常複雜,DNN是強大的模型,在許多工中都取得了令人印象深刻的準確性。此外,之前的工作已經顯示了使用系綜技術提高基數估計的優勢。
  • Ensembles。Deep ensembles是一種學習正規化,其中為同一任務訓練有限數量的DNN集合。一般來說,深度集合的構建分為兩步:
    (1)在沒有任何互動的情況下並行訓練多個DNN;
    (2)計算每個DNN的估計結果的加權平均值,作為深度集合的最終輸出

量化不確定性

  • 在資料庫中使用基數估計是基於一個預設的假設,即估計的結果是安全的。然而這種假設並不是有效的。若是估計器產出了一個錯誤的基數估計值傳遞給優化器,就會生成一個錯誤的執行計劃。為了解決這個問題,一種更好的方案是基數估計模型同時生成基數估計結果和相應的不確定程度來度量這個基數估計是否可信。基於不確定性,DBMS可以評估是否可以相信這個估計結果並將其用於查詢計劃生成中。
  • 在該文中,我們運用的是整合的深度神經網路進行訓練就是為了能夠量化估計的不確定性。注意這裡的整合指的並不是神經網路的深度,而是指一系列獨立的神經網路。我們訓練了很多個相同的網路,雖然它們的訓練集都一樣但是因為深度神經網路的獨特結構,其內部權重肯定有所不同。在推理階段,我們根據這一系列神經網路的輸出的方差來衡量不確定性。思路類似於隨機森林。當方差很小時,證明大家都認為基數是這麼多,我們可以認為此時估計結果可以信任,當方差過大時,證明大家分歧很大,此時基數估計的結果不是很可信。
  • 在本文中,我們有兩種模型的輸出,一是在進行查詢特徵化時,輸入一個query語句要得到對應的特徵化向量;二是在進行基數估計時,輸入一個查詢特徵化向量輸出一個基數估計的值。因此這裡將不確定性分為兩種:資料不確定性和模型不確定性。分別定量為查詢特徵化輸出的方差和基數估計輸出的方差。
  • 在處理不確定性時,我們給兩種不確定性設定兩個閾值,認為超過這個閾值就不可信。這樣我們可以得到四種情況:
    • 資料可信,模型可信
    • 資料不可信,模型可信
    • 資料可信,模型不可信
    • 資料不可信,模型不可信
      又因為我們的任務只關注基數估計的結果,所以當模型可信時我們就可認為結果可信。因此實際只有三種情況:
    • 模型可信:接受估計結果。
    • 資料可信,模型不可信:我們將query存入緩衝區,在DBMS中返回真實的cardinaliy並進行增量訓練。
    • 資料不可信,模型不可信:除了要講query存入緩衝區後續進行增量訓練外,在訓練資料生成階段擴大訓練資料規模。

Work Flow







覺得有幫助的話給筆者點個贊吧!歡迎評論區互相交流!O(∩_∩)O