效果廣告點擊率預估實踐:在線學習
1.引言
技術鑽研如逆水行舟,不進則退。公司的廣告業務發展非常迅猛,有目共睹,激烈的外部競爭和客戶越來越高的期望,都要求我們的技術不斷進步;與此同時,我們也的確在生產實踐中遇到了不少的技術問題和挑戰,這些都促使我們在技術上不斷的嘗試突破。經過兩年多時間的技術鑽研和應用實踐,同發表上一篇KM文章時的技術狀態相比,團隊和項目在技術架構和一些關鍵技術點上都向前邁進了一大步。我們打算通過幾篇文章做一個簡單的經驗分享,這些文章會按照在線學習和深度學習兩個技術方向做一個大致的划分。筆者會以兩篇文章作為整個系列的開頭,團隊的同學會陸續有文章發表來不斷充實這個系列。作為開篇,筆者的文章會更偏向於問題分析和技術思路闡述,主要是文字內容,更多的技術細節會放在后續的文章中來介紹。
2. 從模型快速更新到在線學習
從某種意義上來說,本文是筆者前文[1]的后繼。在前文中,我們已經分析了類似效果廣告點擊率預估這種場景下的模型快速更新的需求,給出了在當時看來比較穩妥的一套技術方案。這套方案本質上仍然是離線訓練,其中訓練數據是流式生成的,以分鍾級延遲落地HDFS上;模型訓練的算法跑在Spark上,利用Spark的內存計算能力使離線模型訓練的速度提升一個數量級;待模型訓練結束后,立即將得到的模型推送到實時推薦引擎上,完成模型的部署。
如今,模型快速更新的需求仍在,這已經成為廣告精准推薦領域內的一個共識,感興趣的同學應該能夠在KM上找到不少推薦方面的文章或多或少的共享這一個觀點。在過去兩年中,我們從數據,算法和系統三個方面對上面這套方案做了持續的改進,在架構不變的情況下挖掘其潛力,持續地支持了產品效果的提升。但是我們也越來越深刻地感受到這套方案的局限性,簡單列舉如下:
-
數據先落地HDFS,然后再從HDFS加載,存儲開銷較大且隨着訓練數據量的增加而增加。
-
訓練數據需要加載到Spark集群各節點的內存中供模型訓練迭代使用,內存需求量大,且隨着訓練數據量的增加而增加。這不僅對集群機器型號的要求高,也在一定程度上限制了方案的伸縮性。
-
隨着訓練數據量和特征的增加,模型尺寸會越來越大,訓練過程中的通信開銷和計算開銷都會增加,這也限制了方案的伸縮性,使得模型的更新速度變得不那么迅速了。
上述局限性已經嚴重制約了點擊率預估模型的進一步優化,要求我們在技術上做出突破。
隨着人類積累的數據量越來越大,種類越來越多,蘊含的商業價值越來越高,大數據成為了一個很熱的技術和商業話題。大數據分析和挖掘是大數據變現的核心環節,因此也受到了很多的關注。若從大數據的視角來看,效果廣告是公認的典型的大數據應用之一,而效果廣告點擊率預估則是典型的大數據分析和挖掘,我們需要在遇到瓶頸時升級我們的方案來持續釋放大數據中蘊含的效果提升潛力。
近年來離線大規模機器學習技術在大模型訓練方面進展頗多。出現了像DistBelief[2]和Petuum[3]這樣的系統和平台,支持超大規模訓練數據集和超大模型訓練,它們部分地解決了上面提到的一些局限性。但是從使用角度來看,它們畢竟還都是離線訓練,如何在數據量持續增加的情況下做到快速乃至實時的模型更新,這並非它們的首要技術目標,因此也就無法完全解決我們面對的挑戰。
思慮至此,我們很自然地就會選擇走另一個方向——在線學習(online learning)。實際上,正如[1]末尾提到的那樣,我們在研發上一代方案之初便認識到,線上模型更新(online model update)是未來很有前途的模型快速更新方案,這方面的嘗試我們也一直在做,並在15年成功應用於線上生產系統,帶來了顯著的效果提升。
在線學習並不是一個新概念,相對於有限的存儲和計算資源來說,數據量太大的問題其實一直都存在,人們很早就在思考在線算法(Online Algorithms)和機器學習的結合[4],也就是在線學習。同傳統的離線批處理式的機器學習相比,在線學習的最大特點在於數據的到來和用於模型訓練都是在線進行的,模型訓練程序無法一次性拿到和存儲所有的訓練數據,對訓練數據的訪問只能是順序的。因此,在線訓練是一種流水線的處理方式,也就無需使用巨大的存儲空間,而且計算的延遲和通信的延遲可以彼此有效的掩蓋,天生具有良好的伸縮性,可以支持超大的數據量和模型。從某種意義上來說,如果我們可以用在線學習的方法來解一個機器學習問題,我們就大大抬高了處理問題規模的天花板,而這種天花板的升高帶來的好處是顯而易見的。
在線學習的理念雖然出現的較早,但是其受到廣泛關注並在較多的領域取得成功應用還是最近十年的事情,這其實也是得益於數據量和模型規模的增長,或者說,大數據的發展。一方面,面對前面列出的那些問題,大家不約而同地選擇了在線學習[5][6][7]的方案來應對,另一方面,大數據的無處不在也使得在線學習的優勢可以得到充分的發揮。
值得指出的是,在線學習只是一個機器學習的范式(paradigm),並不局限於特定的問題,模型或者算法。因為有實際的工業需求在,這個領域的研究發展很快,不斷有新的模型和算法被提出。對在線學習做完整的綜述顯然超出了本文乃至本系列文章的范圍。本文要分享的是我們在解決生產問題過程中所做的一些思考和經驗摘要。感興趣的同學可以繼續看我們的后續文章和參考文獻。
3. 技術方案和應用效果
圖1 在線學習技術方案架構簡圖
3.1 架構
讀到這里,其實在線學習的整個方案架構已經比較明確了,如圖1所示,類似的圖很多見[5]。流式訓練數據生成的環節還會繼續保留,原有的流式訓練數據生成拓撲后面會直接接一個流式模型更新的拓撲,訓練數據不是先落地HDFS然后再從HDFS加載,而是直接用於模型更新。架構中會有一個邏輯上的參數服務器用來存放模型,不同的在線學習模型和算法需要在參數服務器和流式訓練拓撲中編寫代碼來實現特定於該模型和算法的更新方法。隨着訓練數據生成拓撲和模型更新拓撲的運行,參數服務器中存放的模型會得到持續不斷的更新。與此同時,這樣的更新也會同步給實時推薦引擎,從而立即用於線上的推薦。
可以看到,從事件(點擊/曝光/轉化等等)發生,到形成一條日志,再到形成一條訓練數據,再到模型更新,再到用於線上推薦,整個過程都是流式的,從頭到尾的平均延遲可以做到秒級。與此同時,無論是訓練數據生成和模型更新兩個拓撲,還是參數服務器,都具有良好的伸縮性,可以支持大規模的模型和大數據流。
3.2 模型和算法考量
正如前面提到的,可以划到在線學習這個范式里面的模型和算法有很多,而且還在不斷增加。比較著名的有FTRL-Proximal[5]和AdPredictor[6],這兩個都是工業界有過大規模應用的,自然是被競相效仿的對象。關於它們的原理和實現的細節可以閱讀原始文獻,本系列的后續文章也會有介紹。
依個人淺見(僅供參考),這兩個模型和算法代表了兩大類實現在線學習的思路,這里我們粗糙地借用一下wikipedia的分類法[8]。一類是所謂的對抗學習模型(adversarial model),FTRL-Proximal可歸入此類,這類模型和算法的目標是在在線的場景下最小化“后悔(regret)”。這個思路也常被稱作是在線(隨機)優化(online stochastic optimization)。另一類是所謂的統計學習模型(statistical learning model),按照wikipedia的說法,這類模型和算法的目標是最小化期望“風險(risk)”。然而,個人認為這個思路放到貝葉斯推理(bayesian inference)的框架下才能釋放其最大價值。實際上,適用於各類概率圖模型(probabilistic graph model)的貝葉斯推理算法有很多,其中不乏適用於在線學習場景的,AdPredictor就是一個例子。無論是在線(隨機)優化,還是貝葉斯推理,背后都有比較完善的理論支持,且有大量的文獻。作為初窺門徑的實用主義者,筆者在這里斗膽提到它們,只是為了分享尋找,設計和選擇在線學習模型和算法時的一點思路。
3.3 系統考量
架構,模型和算法,最后還是要系統來承載。數據平台部經過多年的技術積累,手邊可堪一用的系統頗多,當我們着手實現上述架構的時候,更多的是從現有系統中挑選和改進,而不是從頭來。
先來看參數服務器,在線學習需要怎樣的參數服務器呢?第一,其存儲結構應該可以包容多種算法模型;第二,應該性能優異且支持平行擴展,從而能夠容納大模型並對其計算做負載均衡;第三,應該支持7x24小時不間斷運行,高度可靠,有充分的容錯機制;第四,應該可以方便地擴展接口,實現特定於算法的邏輯功能。目前開源社區有很多機器學習平台都有自己的參數服務器,然而完全滿足上述四條需求的並不多,特別是對高可靠運營的需求,蓋因社區的參數服務器大多針對離線模型訓練的場景,而非不間斷在線學習的場景。數平有一個經過多年大強度運營考驗的全內存分布式cache系統——TDE[9]完全滿足上面的四個要求,所以我們選擇在TDE的基礎之上來開發參數服務器,通過擴展TDE的功能來支持各種在線學習的模型和算法。
再來看前端模型更新所用的系統,如圖1所示,這是一個流式的處理過程,數平的實時計算平台TRC里面的TDP[9]就是干這個的,此外還有spark streaming可以實現同樣的處理功能,它們都是久經考驗的可靠系統。在實際生產中我們選擇了TDP,道理很簡單,因為上游的流式訓練數據生成一直用的是TDP,繼續使用TDP比較方便。我們在TDP上為每種模型和算法實現了專門的拓撲,支持從零訓練一個模型並且一直更新下去的全流程,以及從mini-batch尺寸、預熱歷史長度、特定於算法的參數,到模型質量實時監控的全套配置,系統的伸縮性和容錯也是久經考驗的。后續文章會有詳述。
最后來看在線學習與實時推薦引擎的對接。此前我們采用的是模型文件推送+模型動態加載的機制來將新訓練出來的模型推送到線上。當模型變成在線學習之后,這個推送的頻率可以更高。目前線上的生產系統仍然還是走這套機制。然而,最終的方案將是隨着模型更新實時地推送模型到推薦引擎,為此我們將引入可靠的消息中間件Hippo[10]來完成這最后一公里的推送,最終貫通全流程。這一實現將在不遠的將來用於線上生產系統。
值得在本節末尾再提一句的是,整個系統架構的升級不僅抬高了處理問題規模的天花板,也大大降低了模型訓練端到端的資源消耗。在數據量,特征量均有顯著增加的情況下,實際使用的機器資源有成倍的減少,省出來的資源可以拿來支持壓力越來越大的在線預測,可謂是雪中送炭。
3.4 生產運營考量
從離線模型訓練發展到在線學習,這個改變的影響是深遠的。天花板抬高了之后,模型會變得越來越復雜,越來越准,反應越來越敏捷,也就會越來越敏感。端到端流式處理的數據流中,任何一個環節的非正常波動或者故障,都有可能給模型訓練或模型預測造成干擾,進而導致點擊率預估效果的波動,甚至直接影響實時的現網收入。在廣告收入快速增長的今天,劇烈的波動是要盡力避免的。面對各種可能的波動原因,我們需要從全流程的各個環節着手應對。
首先來看模型和算法,實際上實用的在線學習模型和算法,不論歸屬於哪一類,一般都會在原理上提供一些手段來應對訓練數據中的波動的。例如,FTRL-Proximal支持自適應學習率和正則化,這都有助於抑制模型的劇烈波動。使用貝葉斯推理的概率模型更是可以利用適當的先驗設定和大數據量來抑制模型的劇烈波動。工業界有一些做法是通過引入較粗粒度的歷史統計量作為特征,或者直接將其用作平滑手段。這種方法我們使用的不多,一方面是因為我們用的模型的原始特征相對較多,交叉維度更多,計算歷史統計量的開銷也不低,而且不恰當的設定可能反而不利於發揮模型的擬合能力;另一方面是因為歷史統計量本身也面臨波動的影響,我們更希望依托模型和算法本身的能力。
再來看系統,正如前面提到的,無論是參數服務器、TDP還是實時推薦引擎,都提供了久經考驗的容錯和故障恢復機制。然而對於疊加其上的在線學習邏輯來說,上述機制只是基礎保障。我們規划並實現了一些應用層的容錯和故障恢復機制作為補充,后續文章會有介紹。
除此之外,我們也在全數據流監控上下了一番功夫。模型、算法和系統的耐受力畢竟是有限的,快速准確的捕捉到波動和故障的源頭對於控制和減少損失十分重要。目前,日志數據量、訓練數據量、各主要特征的分布指標、模型實時質量指標、線上效果指標等均在監控之列,關鍵指標還配置有NOC告警。
3.5 應用效果
截止2015年年末,在線學習的模型和算法已經覆蓋了廣點通超過一半的流量,在年末的pCTR效果放量中取得了CTR+CPM 8%+的提升,部分重點廣告位取得了15%以上的提升,有力地證明了在線學習用於效果廣告點擊率預估的實用價值。
4. 展望
從模型快速更新到模型在線學習,這是一個自然的發展過程。技術天花板抬高了,以前無法處理的大數據量、大特征量和大模型,現在都可以有效處理而不會導致模型更新變慢,這對pCTR效果提升的好處是顯而易見的。我們已經實現了這樣一套具有良好伸縮性和可靠性的在線學習系統,並且在生產實踐中取得成功應用。縱觀業界,不少公司也在生產中使用了各種在線學習的模型和算法。同在線學習的廣闊空間相比,目前我們的實踐還是很初級的,未來我們一方面會去繼續發揮在線學習的優勢,擁抱更多的數據和特征,另一方面還會嘗試更為復雜的模型和算法。
從業務需求和痛點出發尋找技術思路,這是我們一貫的做法。在線學習解決了我們遇到的一些痛點,還有其他的痛點,所以,本系列后續文章除了繼續介紹我們在在線學習方面的實踐細節之外,還會談一談我們把深度學習應用於效果廣告點擊率預估的工作[11]。
參考文獻
[1] "快速模型更新及其在騰訊精准推薦中的應用"
[2] Jeffrey Dean and Greg S. Corrado and Rajat Monga and Kai Chen and Matthieu Devin and Quoc V. Le and Mark Z. Mao and Marc’Aurelio Ranzato and Andrew Senior and Paul Tucker and Ke Yang and Andrew Y. Ng, Large Scale Distributed Deep Networks, NIPS 2012.
[3] Eric P. Xing, Qirong Ho, Wei Dai, Jin Kyu Kim, Jinliang Wei, Seunghak Lee, Xun Zheng, Pengtao Xie, Abhimanu Kumar, Yaoliang Yu, Petuum: A New Platform for Distributed Machine Learning on Big Data, KDD 2015.
[4] Avrim Blum, On-Line Algorithms in Machine Learning, In Proceedings of the Workshop on On-Line Algorithms, Dagstuhl, pages 306-325, 1996.
[5] H. Brendan McMahan, Gary Holt, D. Sculley, Michael Young, Dietmar Ebner, Julian Grady, Lan Nie, Todd Phillips, Eugene Davydov, Daniel Golovin, Sharat Chikkerur, Dan Liu, Martin Wattenberg, Arnar Mar Hrafnkelsson, Tom Boulos, Jeremy Kubica, Ad Click Prediction: a View from the Trenches, KDD 2013.
[6] Thore Graepel , Joaquin Quiñonero Candela , Thomas Borchert , Ralf Herbrich, Web-Scale Bayesian Click-Through Rate Prediction for Sponsored Search Advertising in Microsoft’s Bing Search Engine, ICML 2010.
[7] Cheng Li, Yue Lu, Qiaozhu Mei, Dong Wang and Sandeep Pandey. Click-Through Prediction for Advertising in Twitter Timeline, KDD 2015.
[8] Online machine learning, https://en.wikipedia.org/wiki/Online_machine_learning
[9] "騰訊實時計算平台(TRC)系列之一:初識TRC"
[10] "【Hippo系列-系統介紹】分布式高可靠消息中間件Hippo"
[11] "效果廣告點擊率預估近期實踐:深度學習"