在美圖公司社交戰略部署下,推薦算法存在多方面的挑戰,為了解決這些挑戰,我們團隊從工具和算法兩個方面分别開展了工作。
在工具上,我們開發了 MML 機器學習平台,提供從資料分析到模型線上服務的全流程開發及部署支援。基于 Tensorflow,我們内部自研了 Bamboo 模組化架構,提供了豐富的 SOTA 模型,常用 Layers 以及其它模組化所需的元件,模型離線評估等,讓算法工程師專注網絡結構的設計。
在算法上,我們将推薦排序的演進劃分成四個階段,從線性模型+大規模人工組合特征,到非線性模型+少量人工特征,再到深度學習模型+使用者行為序列特征,最後是從單目标優化到多目标優化。推薦排序四個階段的演進,又可以歸納為三個方面的工作,分别是模型優化、特征工程,以及多目标優化。
在過去的一年,我們在美拍,累計提升人均關注 65.06%,人均時長 56.07%。美圖秀秀,累計提升人均關注 14.93%,人均時長 10.33%。在這一年的實踐中,我們進行了很多的嘗試,在這裡也和大家分享我們過去的一些嘗試和踩過的一些坑,希望能讓大家有所收獲。
推薦算法的技術挑戰
目前,美圖公司旗下擁有多款社交産品,比如美圖秀秀社群、美拍短視訊社群等。針對這幾款社交産品,不管在内容上還是産品背景上都有着自己的特點。比如美圖秀秀從工具向社群轉型,如何讓使用者進行内容消費并且産生持續消費成了我們需要重點考慮的問題。而對于美拍,使用者本身有很強的内容消費屬性,在留存的基礎上如何吸引更多的使用者是目前主要的考慮點。
針對多個不同形态的社交産品,推薦算法存在以下三個方面的挑戰:
- 場景多,人力少:多款社交化産品合計十餘個推薦場景,在目前的人力下,工作量是比較艱巨的;
- 場景、使用者差異大:不同場景下,使用者的消費習慣和使用意圖,以及内容的屬性存在比較大的差異,比如,美圖秀秀社群以圖文為主,美拍以短視訊為主,導緻不同場景下的模型不能簡單複用;
- 産品、目标疊代快:使用者的生活習慣不是一成不變的,我們的社交産品也時刻處在不同的發展階段,需要根據使用者的訴求,以及我們産品的發展需求及時調整推薦算法的優化目标。
為了解決上述挑戰,我們分别從工具和算法兩個方面入手。在工具上,去年我們開發了 MML 機器學習平台,提供從日志處理到模型線上服務的一站式解決方案。在算法上,我們在美圖推薦場景上進行了良好的實踐,針對目前存在的問題以及産品的需要,進行了很多有益的嘗試,也擷取到了一些經驗。下面我将從工具和算法這兩方面和大家分享下。
工具篇:MML 機器學習平台
MML,全稱 Meitu Machine Learning Platform,是一站式機器學習服務平台,為使用者提供從資料預處理,特征與樣本生産,模型建構、訓練與評估以及模型線上服務的全流程開發及部署支援。其平台架構圖見圖一。
圖一 平台架構圖
MML 機器學習平台包括三個主要子產品:
- Spark Feature:負責資料分析、特征工程,以及樣本拼接。Spark Feature 基于 Spark SQL 進行開發,使用者通過編寫 SQL 以及配置樣本拼接 JSON,即可實作特征以及樣本生産的工作;
- Bamboo:基于 tensorflow 開發,負責模型訓練、離線效果評估。Bamboo 實作了推薦領域大量的 State of the Art 的模型,并且提供了豐富的 Layers,以簡化算法同學的模組化工作。在訓練方面支援多種并行訓練方式,同時通過對代碼的優化實作了較高的訓練效率;
- MML Serving:負責模型的線上服務。底層通過 C++ 實作,在記憶體和并發上做了大量的優化,支援同時請求多個模型,以及線上熱更。靈活的架構讓我們能夠很友善地接入各種機器學習架構訓練的模型。
Bamboo
如果說 Spark Feature 和 MML Serving 是 MML 機器學習平台的手和腳,那麼 Bamboo 就是 MML 機器學習平台的大腦。Bamboo 負責機器學習模型的訓練和效果評估。我們底層采用 tensorflow 開發,對外提供封裝好的元件。總的來說,Bamboo 具有以下優點:
- 便捷:内置了近幾年推薦領域的 SOTA 模型,以及模組化常用的 Layers,并且内置了部分公共資料集的通路接口,能夠支援從本地磁盤,以及 HDFS 讀取訓練資料。資料、訓練、模型評估、模型導出通過配置化實作,算法同學可以專注于模型的設計;
- 高效:采用 tensorflow 底層 API 和 Estimator 來實作,并遵循 tensorflow 官方性能優化指南,最大限度提升模型訓練效率,相比 Keras 以及内部未優化版本,單卡訓練效率有數倍提升。同時,能夠支援同步、異步等多種并行訓練方案;
- 可擴充:Bamboo 的最初的設計目标是作為 tensorflow 的補充,是以在整個設計過程充分考慮了擴充性,能夠支援采用 Bamboo 提供的 API 或者使用 tensorflow 原生 API。良好的分層設計,友善使用方進行子產品的複用和重構。
MML Serving
MML Serving 決定了模型能否上線提供服務以及線上服務的效率。去年下半年,我們上線了采用 C++ 開發的新版 MML Serving,通過記憶體和并發的優化,讓我們整體預估耗時減少了 50%,服務初始化耗時減少了 50%,記憶體使用量降低了 77%。通過壓測發現,服務在高并發下,整體表現穩定。另外良好的架構設計,可以很友善接入各種第三方機器學習庫,目前已經内置了對 tensorflow 和 xgboost 模型的支援。
平台收益
MML 機器學習平台上線後,生産力得到了極大的釋放。可以簡單歸納為四個方面的收益:
- 開發效率的顯著提升:平台上線前,算法同學需要同時開發樣本拼接、模型訓練、線上服務等多個子產品的代碼,平台上線後,算法同學可以專注于模型網絡結構的設計;
- 模型疊代周期顯著降低,模型調研的範疇大幅擴大:平台上線前,算法同學需要花費較多的精力在工程子產品的開發上面,而且隻能在幾個固定的算法架構下進行一些有限的嘗試。新架構不僅減少了算法同學的工程負擔,同時因為架構的靈活性,使得算法的調研不再局限于幾個固定的模式,模型疊代效率得到了極大的提升;
- 機器成本:新平台效率上的提升,也同樣展現在機器資源的節約上面,在美拍熱門排序上,接入新平台後,機器節約了一半;
- 經驗沉澱:此前各個業務維護自己的模型代碼,經驗很難進行交流和複用。新平台很好地解決了這部分問題。
算法篇:美圖推薦排序實踐
工具的價值落地到業務中,需要通過算法來實作。美圖推薦排序算法大緻可以分成四個階段:第一個階段是以 LR 為主的線性模型,組合大規模人工特征。第二個階段發展成了以深度學習為主的非線性模型,以及少量的人工特征。再然後,為了減少人工特征工程的工作,我們開始調研以使用者行為序列為主的原始特征,此時線上的主力模型是深度學習模型以及使用者行為序列特征。最後一個階段我們從單目标模型演進到了現在的多目标模型。排序模型四個階段的演進可以歸納為模型、特征、優化目标三個方面的工作,下面我将和大家一一進行介紹。
美圖推薦排序實踐——模型演進
2018 年,我們上線了第一個基于何向南在 SIGIR 2017 發表的《Neural Factorization Machines for Sparse Predictive Analytics》改進的模型——NFM-v4。相比原論文,我們的主要改進點是通過一個線性變換,将變長稀疏的原始高維特征壓縮到一個定長稠密的低維實數空間,進而屏蔽了模型在輸入特征處理上的差異,可以将精力更多放在特征的挖掘上。
但是,将幾十萬維的高維空間直接壓縮到幾百維,存在一定的資訊損失,是以,在 NFM-v4 的基礎上,我們通過将部分高維 id 特征單獨模組化,比較好的解決了這個問題,在業務名額上,也有不錯的效果提升,美拍的人均播放時長增加了 4.75%,人均有效行為數增加了 3.45%。
不過,NFM 存在的一個問題是,bi-interaction pooling 認為特征二階交叉的權重是相等的,這種假設在多數場景下并不符合資料的真實分布。是以,在 NFM 的基礎上,我們提出了 Neural Field weighted Factorization Machines(NFwFM)模型,通過引入一個權重向量,來模組化二階交叉特征的權重。通過二階向量不等權相加,業務名額整體提升較為明顯。其中美拍人均播放時長增加 3.78%,播放使用者數增加 1.74%,美圖秀秀點選率提升了 5.689%,人均使用時長增加 2.53%,新使用者點選率增加 2.701%。
美圖推薦排序實踐——特征工程
從 LR 更新到 NFwFM,我們雖然減少了大量的特征組合上的工作,但是,如何從資料中挖掘對目前業務有效的特征?如何進行特征選擇?依舊占據了我們的主要精力。去年,工業界和學術界,都發表了大量關于 User Behaviors Sequence 模組化的新工作,随後,我們也開始跟進這一方面的工作,并在我們的業務中進行了嘗試,通過端到端的模組化,減少我們在特征工程上的工作。
目前,我們主要嘗試了三種使用者行為序列模組化的方法,包括 Sum/Mean Pooling 、 RNN 、 Attention 等。在我們的業務場景下,RNN 的離線效果并不理想,原因推測是使用者點選 feed 的先後順序并不存在某種固定的模式,而主要取決于使用者對所推薦 feed 的偏好,此外,RNN 的訓練耗時也增加比較明顯。
Sum/Mean Pooling 的方式雖然簡單,但是在長行為序列模組化上,效果相比其它兩種方式表現得更加優異,是以是我們目前線上模組化使用者長序列特征的主要手段。
我們也對比了基于 Attention 的方法,離線效果相比 Sum/Mean Pooling 有略微提升,但是考慮到計算複雜度,Attention 隻适合于序列長度較短的場景。
在美拍,美圖秀秀社群,以及 push 業務都嘗試了使用者行為序列特征模組化,各項業務名額均有較大幅度的提升,美拍人均時長提升了 12%,秀秀的點選率提升了 5%,push 的到達點選率提升了 10%。
随着模型和特征的複雜度顯著增加,線上 inference 的耗時已經無法滿足業務的要求。為了解決模型推理效率的問題,一方面我們通過 C++ 重寫了模型線上推理服務——MML Serving,并在記憶體和并發上做了大量優化,使得 QPS 和穩定性有了大幅度提升。另一方面,我們實作了多塔網絡的模型架構,通過離線預計算 user 和 feed 子網絡的輸出,并存到 DB 中,線上通過檢索 DB 的方式,避免了實時計算 user 和 feed 子網絡的龐大計算量。收益也是很明顯,其中排序預估耗時從 100+ms 下降到了 7ms,秀秀社群 push 服務預估耗時從單尾号 5 小時降低到了 3 分鐘,到達點選率平均提升 23.9%。
美圖推薦排序實踐——多目标優化
随着産品優化的深入,單一的模型優化目标已經無法準确刻畫産品的疊代方向,為了滿足多樣化的産品需求,我們開始探索多目标優化。整個多目标優化的路線,大概經曆了四個階段:樣本 reweight,多目标模型,多模型,多個多目标模型。下面我将對這四個階段的工作分别進行介紹。
多目标優化之樣本 reweight
樣本 reweight 是一種簡單輕量的可用于解決多目标問題的做法,它借鑒了 imbalanced data 的典型做法,在保持模型優化的主目标不變的情況下,通過提高次要目标的正樣本占比,來模拟多目标的聯合機率分布。
我們在美拍和美圖秀秀社群上,對增加關注目标進行了嘗試。美拍在播放時長略微上漲的情況下,實作了人均關注 10.06% 的提升。美圖秀秀社群關注轉化率提升了 12.03%,不過點選率也有略微的下降。
多目标優化之多目标模型
樣本 reweight 的方式改變了樣本的原始分布,導緻主目标存在比較大的預估偏差。同時,因為次要目标是通過主目标的網絡結構來實作,無法對各個目标的模型分别進行調優,模型結構優化存在比較大的局限性。是以,我們開始嘗試多目标模型模組化。
多目标模型通過共享底層的網絡輸入,實作資訊共享,再根據每個目标的資料特點,分别建構各個目标的輸出網絡,得到每個目标的輸出。
在美圖的多個社交場景中,我們進行了嘗試,并取得了比較大的線上提升。其中,在美拍雙列 feed 流場景下,人均關注提升 11.43%,人均播放時長提升 12.45%。美圖秀秀首頁 feed 流,點選率提升 1.93%,關注率提升 2.9%。美圖秀秀下滑 feed 流,關注率提升 9.3%,人均時長提升 10.33%。
多目标優化之多模型
雖然多目标模型在業務上取得了比較大的提升,但是仍然存在一些問題。典型的問題包括:
- 當不同任務的目标相關性較弱,或者損失函數的輸出值範圍差異較大時,多目标模型的調優存在比較大的困難;
- 使用多目标模型,會導緻不同目标的優化存在比較大的耦合,延遲整體優化進度,在産品要求快速疊代的場景下,這種技術手段不一定能夠很好的滿足業務需求。
為了解決多目标模型存在的一些問題,我們通過拆分多目标模型的各個目标,得到多個單目标模型,并對每個單目标模型分别進行優化。在美拍雙列 feed 流場景下,我們進行了相應的嘗試,在人均時長不變的情況下,人均關注提升了 2.98%。通過進一步調整模型的優化目标,人均時長再次提升了 19.37%,人均關注提升了 14.1%。
多目标優化之多個多目标模型
當推薦場景的優化目标增加,多模型的方案會存在維護成本高,線上資源開銷大,各個任務的模型無法利用其它任務的資料等問題。綜合多模型和多目标模型的優點,采用多個多目标模型是解決多目标任務的有效手段。在美拍場景下,通過同時優化關注、時長、播放等目标,人均關注提升 12.18%,活躍留存提升 25.67%。
未來規劃
未來,我們将繼續完善 MML 機器學習平台的建設,并計劃對 Bamboo 項目進行開源。在算法上,我們開始了強化學習在推薦領域的調研,同時,對多目标模組化、行為序列特征模組化、以及 Embedding 技術等也将持續進行跟進和優化。期待後續能和大家有更多地探讨和交流。
作者簡介
湯斌,美圖進階算法專家,曾在騰訊任進階研究員,碩士畢業于哈爾濱工業大學。主要從事推薦算法,點選率預估以及自然語言處理方面的相關研究。在工業界的大規模推薦與排序算法實踐上積累了豐富的經驗。