社交數據那麼多,看Facebook如何實時用貝葉斯優化後端

面對每天海量更新的在線數據,Facebook 必須尋求快速的參數優化方法來不斷完善後端系統,而網格搜索和手工調參顯然不是合適的選擇。

選自Facebook,作者:Ben Letham、Brian Karrer、Guilherme Ottoni、Eytan Bakshy,機器之心編譯,參與:劉曉坤、張倩、思源。

Facebook 每天依賴一套大型後端系統服務於數十億人。這些系統中大部分都具有大量內部參數,如支持 Facebook 的 web 服務器使用 HipHop 虛擬機(HHVM)來滿足請求,HHVM 有幾十個參數來控制實時編譯器。另一方面,機器學習系統可用來執行很多預測任務。這些系統通常包含預測模型的多個層,其中有大量參數,用於決定模型如何連接以輸出最終推薦。這些參數必須通過使用實時的隨機實驗來仔細調整,也就是所謂的 A/B 測試。每個實驗可能花費一週或更長時間,因此難點在於用盡可能少的實驗優化一套參數。

A/B 測試通常被用作改進產品的一次性實驗。在論文《Constrained Bayesian Optimization with Noisy Experiments》(現已刊登在《Bayesian Analysis》雜誌)中,Facebook 描述瞭如何使用一種名為「貝葉斯優化」的 AI 技術,根據先前測試的結果自適應地設計一輪 A/B 測試。與網格搜索或手工調參相比,貝葉斯優化可以用更少的實驗聯合調整更多的參數,並找到更好的值。Facebook 已經使用該技術在一大批後端系統中進行了數十次調參實驗,發現該技術在機器學習系統調參方面非常有效。

針對 A/B 測試的貝葉斯優化

在線系統調參的典型方法是手動運行小規模網格搜索來分別優化每個參數。貝葉斯優化構建了參數和興趣在線結果之間的統計模型,並使用該模型來決定進行哪些實驗。這種基於模型的方法有幾個關鍵優勢,尤其是在優化在線機器學習系統方面:

更好地利用參數維度進行縮放:由於運行在線實驗存在數量限制,網格搜索或手工調參不能用於同時調整多個參數。模型的使用使得貝葉斯優化可以擴展到更多的參數,通常聯合優化的參數可以達到 20 個。這對機器學習系統至關重要,因為在這些系統中,參數之間經常存在相互作用,需要聯合優化。

實驗次數減少:貝葉斯優化使得我們可以從多輪實驗中獲得信息:連續空間中的一次參數值的測試不僅可以提供有關該測試結果的信息,還能提供周圍點的信息。因此,探索空間所需的實驗次數可以大大減少。

實驗結果更好:模型可以識別空間中可能無法提供良好結果的部分,避免在那些參數值上運行測試。這種做法改進了實驗組內的經驗。

理解參數空間:模型幫助我們可視化並更好地理解參數如何影響感興趣的結果。下圖顯示了一個 8 參數實驗的二維切片,是為了更好地理解參數空間而進行的可視化的典型例子:


社交數據那麼多,看Facebook如何實時用貝葉斯優化後端

下文將提供貝葉斯優化的深入介紹,並討論來自論文的工作及其中的一些實驗結果。

貝葉斯優化

貝葉斯優化是一種解決最優化問題的技術,其中未知形式的目標函數(即在線度量)不會有解析解,且它只能通過一些耗時的運算(即隨機試驗)評估出來。通過有限的試驗數高效探索多維空間的關鍵是建模:真實的目標函數是未知的,但是我們能令模型擬合已有的觀察樣本,並使用模型預測參數空間中更好的部分,而這一部分應該需要運行更多的試驗。

高斯過程(GP)是一種非參數的貝葉斯模型,因為它能提供優秀的不確定性估計和簡便的分析,所以高斯過程非常適用於貝葉斯優化。高斯過程為目標函數提供了一種估計,它用來判斷隨著參數的變化在線度量到底會怎麼變化:


社交數據那麼多,看Facebook如何實時用貝葉斯優化後端

上圖中每一個數據標記對應於該參數值的 A/B 測試結果。通過平衡探索(很大的不確定性)和利用(良好的模型估計),我們能使用高斯過程來決定接下來要測試的參數。這一過程可以通過計算採集函數(Acquisition Function)完成,該函數用任何給定的參數值來估計執行試驗後的觀察值。

假設我們正嘗試決定是否應該使用參數配置 x 執行一次實驗,那麼在 x 的情況下觀察值有多大的價值?這個問題的答案依賴於效用函數。現在假設在觀察到 x 後就結束優化,那麼這些參數的效用就僅僅只是它所找到的最優解的值。在這種情況下,觀察到 x 的效用就是 f(x),相當於當前最優的改進程度,我們可以稱為 x*(假設我們在做最大化):I(x) = max(0, f(x) – f(x*))。

由於 f(x) 是一個隨機變量,I(x) 同樣也為隨機變量,但是 f(x) 的後驗是從高斯過程模型中分析得出的。基於期望改進(EI)的採集函數會選擇參數點 x 以最大化 I(x) 的期望值,這一過程會基於高斯過程後驗。EI 是一種流行的採集函數,因為這種期望具有易計算的分析形式,且在實踐中也有非常好的表現。下圖展示了上述模型的 EI:


社交數據那麼多,看Facebook如何實時用貝葉斯優化後端

最大化 EI(紅色虛線)的參數在下一個實驗中會進行測試。模型隨後用該實驗的結果進行更新,並重新計算 EI 以選擇新的候選參數。這一循環會持續到搜索結束,上圖展示了幾次迭代的結果。

高斯過程假設響應表面是平滑的,這將允許我們參考參數空間的近鄰觀察值,從而確定可能的下一組參數是怎麼樣的。高斯過程使我們相信已經徹底探索了空間,因此不需要如網格搜索那樣實際測試每個可能的參數值。

將貝葉斯優化應用到在線實驗

貝葉斯優化方法應用於調整在線系統時需要面對幾項挑戰,在 Facebook 的論文中對此進行了描述。

噪聲:通過隨機化實驗獲取的觀察結果通常有很高的噪聲等級,特別是相對於貝葉斯優化的典型機器學習應用而言,例如超參數調整。

約束:除了需要優化的指標,還有必須要滿足的約束。這些約束通常本身是帶噪聲的指標,因此我們必須考慮它們的可行的後驗分佈。

批量實驗:由於在線實驗相當耗時間,它們通常不是按線性序列運行,如上動圖所示,它們是以大批量在並行測試中運行。在我們的實驗中,我們每次頻繁地評估 50 個配置,因此需要可以返回大批量可評估點的貝葉斯優化過程。

EI 擁有可以解決這些問題的擴展,然而當噪聲等級達到 A/B 測試的典型等級時,使用啟發式方法處理噪聲的結果很糟糕。由於觀察結果中的噪聲,不僅對 f(x) 值存在不確定,而且對哪個 x*和 f(x*) 是目前最佳的觀察結果也存在不確定。處理觀察結果噪聲的常用方法是忽略它,並通過插件式的估計器替換 f(x*) 的高斯過程均值估計。

在論文中,Facebook 描述了一種貝葉斯方法來處理觀察噪聲,其中包括了 EI 期望值噪聲引入的後驗不確定性。即,我們在 f(x) 和 f(x*) 的聯合後驗下計算 I(x) 的期望值,而不是在 f(x) 的後驗下計算它。這個期望值不再擁有相近 EI 的形式,然而我們可以輕易地從 GP 後驗中採樣過去觀察 f(x_1), …, f(x_n) 的值,並且條件分佈 f(x) | f(x_1), …, f(x_n) 有相近的形式。因此該期望值服從蒙特卡羅近似,其中我們採樣 f(x_1), …, f(x_n) 然後以相近的形式求條件期望 E[I(x) | f(x_1), …, f(x_n)]。論文中展示了擬蒙特卡羅方法(quasi-Monte Carlo)的結合如何為該期望提供了很好的估計,並可以高效地對其進行優化。

Facebook 利用貝葉斯優化得到的結果

研究者使用論文中描述的方法來優化 Facebook 中的數個系統,並在論文中描述了兩種優化案例。第一個案例是優化 Facebook 一個排序系統的 6 個參數。這些特定參數和索引器相關,該索引器聚集了要被髮送到預測模型的內容。第二個案例是為 HHVM 優化 7 個數值編譯器 flag。優化的目標是減少網頁服務器的 CPU 佔用,並滿足不增加峰值內存佔用的約束。下面這張來自論文中的圖展示了每個測試配置的 CPU 佔用(總共 100 個配置)隨迭代次數的變化,以及每個點滿足內存約束的概率。


社交數據那麼多,看Facebook如何實時用貝葉斯優化後端

前面 30 次迭代(綠線之前的部分)是隨機生成的配置,之後使用了貝葉斯優化來識別用於評估的參數配置。在這項以及很多其它的實驗中,研究者發現貝葉斯優化可以找到更好的且更容易滿足約束的配置。該優化中找到的編譯器 flag 設置在開源 HHVM 中已被設定成了新的默認值。

研究者發現,結合論文中的方法,貝葉斯優化在隨機實驗優化中是一種高效、魯棒的工具。通過取代多維空間的手工探索,它能讓工程師的工作變得更加高效,並提升後端系統和機器學習基礎建設的在線性能。

相關推薦

推薦中...