2021-05-12 14:32:11
數十億使用者的Facebook如何進行貝葉斯系統調優?
AI前線導讀:貝葉斯優化其實就是在函數方程不知的情況下根據已有的取樣點預估函數最大值的一個演算法。貝葉斯優化的主要目的是與大部分機器學習演算法類似,學習模型的表達形式,在一定範圍內求一個函數的最大(小)值。針對機器學習的高斯過程(Gaussian Processes,GP)是一個通用的監督學習方法,主要被設計用來解決回歸問題。Facebook是全球最大的社群網站,如此龐大體量的線上系統要如何有效地調優呢?讓我們看看貝葉斯優化在這方面是如何應用的。
Facebook依靠龐大的後端系統,每天為數十億人提供服務。在這些後端系統中,許多都有大量的內部引數。例如,支援Facebook的Web伺服器使用HipHop虛擬機器(HHVM)來處理服務請求,而HHVM有幾十個引數用於控制即時編譯器。另一個例子是,用於各種預測任務的機器學習。這些系統通常都會涉及多層預測模型,具有大量引數,用於確定模型如何連線在一起,從而產生最終建議。這些引數必須通過使用實時隨機實驗仔細地進行調優,也稱為A/B測試。這些實驗中,每一項都可能需要一週或更長時間,因此挑戰在於:用盡可能少的實驗來優化一組引數。
A/B測試通常用作改進產品的一次性實驗。我們的論文《Constrained Bayesian Optimization with Noisy Experiments》,現已在Bayesian Analysis期刊上發表。在這篇論文中,我們描述了如何使用一種被稱為貝葉斯優化(Bayesian optimization)的人工智慧技術,根據先前測試的結果自適應地設計一輪A/B測試。與網格搜尋或手動調優相比,貝葉斯優化可以讓我們用更少的實驗共同調優更多的引數,並找到更好的值。我們已經在一系列後端系統中使用這些技術進行了數十次引數調優實驗,發現它在機器學習系統調優方面特別有效。
AI前線注:論文《Constrained Bayesian Optimization with Noisy Experiments》見:https://projecteuclid.org/euclid.ba/1533866666
A/B測試的貝葉斯優化
線上系統引數調優的一種典型方法是手動執行小型網格搜尋,分別對每個引數進行優化。貝葉斯優化構建了引數與感興趣的線上結果之間關係的統計模型,並使用該模型來決定執行哪些實驗。這種基於模型的方法具備幾個關鍵的優勢,特別是優化線上機器學習系統的方面。
使用引數維度進行更好地擴充套件:考慮到可執行的線上實驗數量的限制,網格搜尋或手動調優不能用於同時進行多個引數調優。模型的使用允許貝葉斯優化擴充套件到更多的引數;我們通常會共同優化多達20個引數。這對於機器學習系統而言很重要,因為在這些系統中,引數之間的互動經常需要進行聯合優化(joint optimization)。
減少實驗次數:貝葉斯優化允許我們在多輪實驗中借用資訊:對連續空間中的引數值進行測試不僅可獲得有關其結果的資訊,還可以獲得有關附近點的資訊。這使得我們能夠大大減少探索空間所需的實驗數量。
更好的實驗結果:該模型能夠識別不太可能產生良好結果的部分空間,並避免對這些引數值進行測試。這改善了實驗組內的體驗。
理解引數空間:建模允許我們視覺化並更好地理解引數如何影響感興趣的結果。如下圖所示,顯示了8引數實驗的二維切片,這張視覺化的典型圖是為我們更好地理解引數空間而繪製的:
我們將在本文中介紹貝葉斯優化的高階描述,然後闡述本論文的工作和一些實驗結果。
貝葉斯優化
貝葉斯優化是一種解決優化問題的技術,其中目標函數(即感興趣的線上指標)沒有分析表示式,而是只能通過一些耗時的操作(即隨機實驗)來評估。通過數量有限的實驗來有效地探索多維空間的關鍵是建模:真正的目標函數是未知的,但我們可以將模型擬合到目前為止的觀察值,並使用該模型來預測引數空間的良好部分,我們應該進行額外的實驗。
高斯過程(Gaussian process,GP)是一種非引數貝葉斯模型。因為高斯過程提供了很好的不確定性估計(uncertainty estimates),並且易於分析處理,因此它在貝葉斯優化中工作得很好。它提供了線上指標如何隨感興趣的引數變化的估計值,如下圖所示:
AI前線注:高斯過程可參閱https://en.wikipedia.org/wiki/Gaussian_process
上圖中的每個資料標記對應於該引數值的A/B測試額度結果。通過平衡探索(高不確定性)和開發(良好的模型估計),我們可以使用GP來決定接下來要測試的引數。這是通過計算採集函數(acquisition function)來完成的,該函數使用任何給定引數值估計進行實驗的值。
假設我們要嘗試決定是否應該使用引數設定x進行實驗。在x處的觀察值是多少?這個問題的答案取決於效用函數(utility function)。假設我們計劃在觀察x之後結束優化,優化的效用就是它找到的最佳點的值。在這種情況下,觀察x的效用就是它的f(x)值比當前最佳值提高了多少,我們稱之為x*(假設我們正在最大化):
I(x) = max(0, f(x) – f(x*)).
I(x)是一個隨機變數,因為f(x)是一個隨機變數,但f(x)的後驗由GP模型解析可知。期望增量(expected improvement,EI)獲取函數選擇在GP後驗下使I(x)的期望值最大化的點x。EI是一種常用的採集函數,因為這種期望具有易於計算的解析形式,在實踐中表現良好。如下圖所示,圖上為模型擬合的EI值:
將EI最大化的引數(紅色虛線)在下次實驗中進行測試。然後根據該實驗結果更新模型,並重新計算EI以選擇新的候選項。迴圈重複執行上述操作,直到搜尋完成,如上面的動畫中多次迭代所示。
高斯過程假設響應面是平滑的,這使我們能夠從引數空間中的附近觀測中借用資訊。它使我們確信已徹底探索了這個空間,而無需實際測試每個可能的引數值。
線上實驗中我們採用的貝葉斯優化方法
使用貝葉斯優化對線上系統進行調優有幾個挑戰,這些線上系統優化催生了本文中描述的工作。
噪聲:通過隨機實驗觀察到的噪聲水平通常相當高,特別是與典型的貝葉斯優化(如超引數調優)的機器學習應用相比。
約束:除了要優化的指標之外,還必須始終滿足約束條件。這些約束通常是噪聲指標本身,因此我們必須考慮他們的可行性的後驗分布。
批次實驗:因為線上實驗非常耗時,所以它們通常不以線性順序執行,而是在大批次的並行測試中執行,如上面的動畫所示。在我們的實驗中,我們經常一次評估多達50種設定,因此需要貝葉斯優化過程,它可以返回大批待評估的點。
對EI的擴充套件可以處理這些問題,但是噪聲通常是通過啟發式方法處理的,當噪聲水平達到典型的A/B測試時,我們發現這種方法的效能很差。對於觀測噪聲,我們現在不僅在f(x)的值上存在不確定性,而且我們也有其他不確定性:其中觀測是當前最好的,x*及它的值f(x*)。處理觀測噪聲的一種常見方法是忽略它,並使用嵌入式估計量(plug-in estimator),通過替換GP的均值估計f(x*)。
在本文中,我們闡述了一種處理觀測噪聲的貝葉斯方法,其中包含了EI所期望的由噪聲引起的後驗不確定性。也就是說,我們不計算I(x)在f(x)後端的期望,而是計算在f(x)和f(x*)的聯合後驗下計算它。這種期望不再具有EI這樣的封閉形式,但我們可以很容易地從GP後驗中得到過去觀測值f(x_1),...,f(x_n)繪製樣本,並且條件分布f(x)|f(x_1),...,f(x_n)具有封閉形式。因此,期望值服從蒙特-卡洛近似值(Monte Carlo approximation),其中我們對f(x_1),...,f(x_n)進行取樣,然後採用條件期望E[I(x) | f(x_1), …, f(x_n)]的封閉性是的f(x_1),...,f(x_n)]。我們在論文中證明了擬蒙特卡洛積分(quasi-Monte Carlo integration)能夠很好地估計這種期望並能有效地進行優化。
Facebook的貝葉斯優化結果
我們使用了本文中描述的方法來優化Facebook上的多個系統,並在文中描述了兩個這樣的優化。首先是優化Facebook排名系統之一中的6個引數。索引器中涉及到這些特定的引數,這些引數將聚集要傳送到預測模型的內容。第二個範例是優化HHVM的7個數位編譯器標誌。此優化的目標是降低Web伺服器上的CPU使用率,同時限制不增加峰值記憶體使用率。下圖顯示了測試的每個設定的CPU使用率(總計100),以及每個點滿足記憶體約束的概率:
前30次疊代是隨機生成的設定(直到綠線),然後使用貝葉斯優化來確定要評估的引數設定。在這個實驗以及我們執行過的其他實驗中,我們發現貝葉斯優化能夠找到更好的設定,更有可能滿足約束條件。在此優化中發現的編譯器標誌設定是在開源HHVM中設定的新預設值。
我們發現,利用本文描述的方法,貝葉斯優化是一種通過噪聲實驗進行優化的有效且強大的工具。它取代了手動探索多維空間的方式,讓工程師的生活變得更加輕鬆,並改善了後端系統和機器學習基礎設施的線上效能。
原文連結: Efficient tuning of online systems using Bayesian optimization
相關文章