機(jī)器之心專欄
作者:湯斌
本文是美圖高級(jí)算法專家湯斌的一篇文章,重點(diǎn)介紹了社交網(wǎng)絡(luò)背景下推薦算法面臨的挑戰(zhàn),以及應(yīng)對(duì)的方法。
在美圖公司社交戰(zhàn)略部署下,推薦算法存在多方面的挑戰(zhàn),為了解決這些挑戰(zhàn),我們團(tuán)隊(duì)從工具和算法兩個(gè)方面分別開展了工作。
在工具上,我們開發(fā)了 MML 機(jī)器學(xué)習(xí)平臺(tái),提供從數(shù)據(jù)分析到模型在線服務(wù)的全流程開發(fā)及部署支持。基于 Tensorflow,我們內(nèi)部自研了 Bamboo 建模框架,提供了豐富的 SOTA 模型,常用 Layers 以及其它建模所需的組件,模型離線評(píng)估等,讓算法工程師專注網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)。
在算法上,我們將推薦排序的演進(jìn)劃分成四個(gè)階段,從線性模型+大規(guī)模人工組合特征,到非線性模型+少量人工特征,再到深度學(xué)習(xí)模型+用戶行為序列特征,最后是從單目標(biāo)優(yōu)化到多目標(biāo)優(yōu)化。推薦排序四個(gè)階段的演進(jìn),又可以歸納為三個(gè)方面的工作,分別是模型優(yōu)化、特征工程,以及多目標(biāo)優(yōu)化。
在過去的一年,我們?cè)诿琅模塾?jì)提升人均關(guān)注 65.06%,人均時(shí)長 56.07%。美圖秀秀,累計(jì)提升人均關(guān)注 14.93%,人均時(shí)長 10.33%。在這一年的實(shí)踐中,我們進(jìn)行了很多的嘗試,在這里也和大家分享我們過去的一些嘗試和踩過的一些坑,希望能讓大家有所收獲。
推薦算法的技術(shù)挑戰(zhàn)
目前,美圖公司旗下?lián)碛卸嗫钌缃划a(chǎn)品,比如美圖秀秀社區(qū)、美拍短視頻社區(qū)等。針對(duì)這幾款社交產(chǎn)品,不管在內(nèi)容上還是產(chǎn)品背景上都有著自己的特點(diǎn)。比如美圖秀秀從工具向社區(qū)轉(zhuǎn)型,如何讓用戶進(jìn)行內(nèi)容消費(fèi)并且產(chǎn)生持續(xù)消費(fèi)成了我們需要重點(diǎn)考慮的問題。而對(duì)于美拍,用戶本身有很強(qiáng)的內(nèi)容消費(fèi)屬性,在留存的基礎(chǔ)上如何吸引更多的用戶是當(dāng)前主要的考慮點(diǎn)。
針對(duì)多個(gè)不同形態(tài)的社交產(chǎn)品,推薦算法存在以下三個(gè)方面的挑戰(zhàn):
- 場(chǎng)景多,人力少:多款社交化產(chǎn)品合計(jì)十余個(gè)推薦場(chǎng)景,在當(dāng)前的人力下,工作量是比較艱巨的;
- 場(chǎng)景、用戶差異大:不同場(chǎng)景下,用戶的消費(fèi)習(xí)慣和使用意圖,以及內(nèi)容的屬性存在比較大的差異,比如,美圖秀秀社區(qū)以圖文為主,美拍以短視頻為主,導(dǎo)致不同場(chǎng)景下的模型不能簡單復(fù)用;
- 產(chǎn)品、目標(biāo)迭代快:用戶的生活習(xí)慣不是一成不變的,我們的社交產(chǎn)品也時(shí)刻處在不同的發(fā)展階段,需要根據(jù)用戶的訴求,以及我們產(chǎn)品的發(fā)展需求及時(shí)調(diào)整推薦算法的優(yōu)化目標(biāo)。
為了解決上述挑戰(zhàn),我們分別從工具和算法兩個(gè)方面入手。在工具上,去年我們開發(fā)了 MML 機(jī)器學(xué)習(xí)平臺(tái),提供從日志處理到模型在線服務(wù)的一站式解決方案。在算法上,我們?cè)诿缊D推薦場(chǎng)景上進(jìn)行了良好的實(shí)踐,針對(duì)目前存在的問題以及產(chǎn)品的需要,進(jìn)行了很多有益的嘗試,也獲取到了一些經(jīng)驗(yàn)。下面我將從工具和算法這兩方面和大家分享下。
工具篇:MML 機(jī)器學(xué)習(xí)平臺(tái)
MML,全稱 Meitu machine Learning Platform,是一站式機(jī)器學(xué)習(xí)服務(wù)平臺(tái),為用戶提供從數(shù)據(jù)預(yù)處理,特征與樣本生產(chǎn),模型構(gòu)建、訓(xùn)練與評(píng)估以及模型在線服務(wù)的全流程開發(fā)及部署支持。其平臺(tái)架構(gòu)圖見圖一。
圖一 平臺(tái)架構(gòu)圖
MML 機(jī)器學(xué)習(xí)平臺(tái)包括三個(gè)主要模塊:
- Spark Feature:負(fù)責(zé)數(shù)據(jù)分析、特征工程,以及樣本拼接。Spark Feature 基于 Spark SQL 進(jìn)行開發(fā),用戶通過編寫 SQL 以及配置樣本拼接 JSON,即可實(shí)現(xiàn)特征以及樣本生產(chǎn)的工作;
- Bamboo:基于 tensorflow 開發(fā),負(fù)責(zé)模型訓(xùn)練、離線效果評(píng)估。Bamboo 實(shí)現(xiàn)了推薦領(lǐng)域大量的 State of the Art 的模型,并且提供了豐富的 Layers,以簡化算法同學(xué)的建模工作。在訓(xùn)練方面支持多種并行訓(xùn)練方式,同時(shí)通過對(duì)代碼的優(yōu)化實(shí)現(xiàn)了較高的訓(xùn)練效率;
- MML Serving:負(fù)責(zé)模型的在線服務(wù)。底層通過 C++ 實(shí)現(xiàn),在內(nèi)存和并發(fā)上做了大量的優(yōu)化,支持同時(shí)請(qǐng)求多個(gè)模型,以及在線熱更。靈活的架構(gòu)讓我們能夠很方便地接入各種機(jī)器學(xué)習(xí)框架訓(xùn)練的模型。
Bamboo
如果說 Spark Feature 和 MML Serving 是 MML 機(jī)器學(xué)習(xí)平臺(tái)的手和腳,那么 Bamboo 就是 MML 機(jī)器學(xué)習(xí)平臺(tái)的大腦。Bamboo 負(fù)責(zé)機(jī)器學(xué)習(xí)模型的訓(xùn)練和效果評(píng)估。我們底層采用 tensorflow 開發(fā),對(duì)外提供封裝好的組件。總的來說,Bamboo 具有以下優(yōu)點(diǎn):
- 便捷:內(nèi)置了近幾年推薦領(lǐng)域的 SOTA 模型,以及建模常用的 Layers,并且內(nèi)置了部分公共數(shù)據(jù)集的訪問接口,能夠支持從本地磁盤,以及 HDFS 讀取訓(xùn)練數(shù)據(jù)。數(shù)據(jù)、訓(xùn)練、模型評(píng)估、模型導(dǎo)出通過配置化實(shí)現(xiàn),算法同學(xué)可以專注于模型的設(shè)計(jì);
- 高效:采用 tensorflow 底層 API 和 Estimator 來實(shí)現(xiàn),并遵循 tensorflow 官方性能優(yōu)化指南,最大限度提升模型訓(xùn)練效率,相比 Keras 以及內(nèi)部未優(yōu)化版本,單卡訓(xùn)練效率有數(shù)倍提升。同時(shí),能夠支持同步、異步等多種并行訓(xùn)練方案;
- 可擴(kuò)展:Bamboo 的最初的設(shè)計(jì)目標(biāo)是作為 tensorflow 的補(bǔ)充,因此在整個(gè)設(shè)計(jì)過程充分考慮了擴(kuò)展性,能夠支持采用 Bamboo 提供的 API 或者使用 tensorflow 原生 API。良好的分層設(shè)計(jì),方便使用方進(jìn)行模塊的復(fù)用和重構(gòu)。
MML Serving
MML Serving 決定了模型能否上線提供服務(wù)以及在線服務(wù)的效率。去年下半年,我們上線了采用 C++ 開發(fā)的新版 MML Serving,通過內(nèi)存和并發(fā)的優(yōu)化,讓我們整體預(yù)估耗時(shí)減少了 50%,服務(wù)初始化耗時(shí)減少了 50%,內(nèi)存使用量降低了 77%。通過壓測(cè)發(fā)現(xiàn),服務(wù)在高并發(fā)下,整體表現(xiàn)穩(wěn)定。另外良好的架構(gòu)設(shè)計(jì),可以很方便接入各種第三方機(jī)器學(xué)習(xí)庫,目前已經(jīng)內(nèi)置了對(duì) tensorflow 和 xgboost 模型的支持。
平臺(tái)收益
MML 機(jī)器學(xué)習(xí)平臺(tái)上線后,生產(chǎn)力得到了極大的釋放。可以簡單歸納為四個(gè)方面的收益:
- 開發(fā)效率的顯著提升:平臺(tái)上線前,算法同學(xué)需要同時(shí)開發(fā)樣本拼接、模型訓(xùn)練、在線服務(wù)等多個(gè)模塊的代碼,平臺(tái)上線后,算法同學(xué)可以專注于模型網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì);
- 模型迭代周期顯著降低,模型調(diào)研的范疇大幅擴(kuò)大:平臺(tái)上線前,算法同學(xué)需要花費(fèi)較多的精力在工程模塊的開發(fā)上面,而且只能在幾個(gè)固定的算法框架下進(jìn)行一些有限的嘗試。新框架不僅減少了算法同學(xué)的工程負(fù)擔(dān),同時(shí)因?yàn)榭蚣艿撵`活性,使得算法的調(diào)研不再局限于幾個(gè)固定的模式,模型迭代效率得到了極大的提升;
- 機(jī)器成本:新平臺(tái)效率上的提升,也同樣體現(xiàn)在機(jī)器資源的節(jié)約上面,在美拍熱門排序上,接入新平臺(tái)后,機(jī)器節(jié)約了一半;
- 經(jīng)驗(yàn)沉淀:此前各個(gè)業(yè)務(wù)維護(hù)自己的模型代碼,經(jīng)驗(yàn)很難進(jìn)行交流和復(fù)用。新平臺(tái)很好地解決了這部分問題。
算法篇:美圖推薦排序?qū)嵺`
工具的價(jià)值落地到業(yè)務(wù)中,需要通過算法來實(shí)現(xiàn)。美圖推薦排序算法大致可以分成四個(gè)階段:第一個(gè)階段是以 LR 為主的線性模型,組合大規(guī)模人工特征。第二個(gè)階段發(fā)展成了以深度學(xué)習(xí)為主的非線性模型,以及少量的人工特征。再然后,為了減少人工特征工程的工作,我們開始調(diào)研以用戶行為序列為主的原始特征,此時(shí)線上的主力模型是深度學(xué)習(xí)模型以及用戶行為序列特征。最后一個(gè)階段我們從單目標(biāo)模型演進(jìn)到了現(xiàn)在的多目標(biāo)模型。排序模型四個(gè)階段的演進(jìn)可以歸納為模型、特征、優(yōu)化目標(biāo)三個(gè)方面的工作,下面我將和大家一一進(jìn)行介紹。
美圖推薦排序?qū)嵺`——模型演進(jìn)
2018 年,我們上線了第一個(gè)基于何向南在 SIGIR 2017 發(fā)表的《Neural Factorization Machines for Sparse Predictive Analytics》改進(jìn)的模型——NFM-v4。相比原論文,我們的主要改進(jìn)點(diǎn)是通過一個(gè)線性變換,將變長稀疏的原始高維特征壓縮到一個(gè)定長稠密的低維實(shí)數(shù)空間,從而屏蔽了模型在輸入特征處理上的差異,可以將精力更多放在特征的挖掘上。
但是,將幾十萬維的高維空間直接壓縮到幾百維,存在一定的信息損失,因此,在 NFM-v4 的基礎(chǔ)上,我們通過將部分高維 id 特征單獨(dú)建模,比較好的解決了這個(gè)問題,在業(yè)務(wù)指標(biāo)上,也有不錯(cuò)的效果提升,美拍的人均播放時(shí)長增加了 4.75%,人均有效行為數(shù)增加了 3.45%。
不過,NFM 存在的一個(gè)問題是,bi-interaction pooling 認(rèn)為特征二階交叉的權(quán)重是相等的,這種假設(shè)在多數(shù)場(chǎng)景下并不符合數(shù)據(jù)的真實(shí)分布。因此,在 NFM 的基礎(chǔ)上,我們提出了 Neural Field weighted Factorization Machines(NFwFM)模型,通過引入一個(gè)權(quán)重向量,來建模二階交叉特征的權(quán)重。通過二階向量不等權(quán)相加,業(yè)務(wù)指標(biāo)整體提升較為明顯。其中美拍人均播放時(shí)長增加 3.78%,播放用戶數(shù)增加 1.74%,美圖秀秀點(diǎn)擊率提升了 5.689%,人均使用時(shí)長增加 2.53%,新用戶點(diǎn)擊率增加 2.701%。
美圖推薦排序?qū)嵺`——特征工程
從 LR 升級(jí)到 NFwFM,我們雖然減少了大量的特征組合上的工作,但是,如何從數(shù)據(jù)中挖掘?qū)Ξ?dāng)前業(yè)務(wù)有效的特征?如何進(jìn)行特征選擇?依舊占據(jù)了我們的主要精力。去年,工業(yè)界和學(xué)術(shù)界,都發(fā)表了大量關(guān)于 User Behaviors Sequence 建模的新工作,隨后,我們也開始跟進(jìn)這一方面的工作,并在我們的業(yè)務(wù)中進(jìn)行了嘗試,通過端到端的建模,減少我們?cè)谔卣鞴こ躺系墓ぷ鳌?/p>
目前,我們主要嘗試了三種用戶行為序列建模的方法,包括 Sum/Mean Pooling 、 RNN 、 Attention 等。在我們的業(yè)務(wù)場(chǎng)景下,RNN 的離線效果并不理想,原因推測(cè)是用戶點(diǎn)擊 feed 的先后順序并不存在某種固定的模式,而主要取決于用戶對(duì)所推薦 feed 的偏好,此外,RNN 的訓(xùn)練耗時(shí)也增加比較明顯。
Sum/Mean Pooling 的方式雖然簡單,但是在長行為序列建模上,效果相比其它兩種方式表現(xiàn)得更加優(yōu)異,因此是我們目前線上建模用戶長序列特征的主要手段。
我們也對(duì)比了基于 Attention 的方法,離線效果相比 Sum/Mean Pooling 有略微提升,但是考慮到計(jì)算復(fù)雜度,Attention 只適合于序列長度較短的場(chǎng)景。
在美拍,美圖秀秀社區(qū),以及 push 業(yè)務(wù)都嘗試了用戶行為序列特征建模,各項(xiàng)業(yè)務(wù)指標(biāo)均有較大幅度的提升,美拍人均時(shí)長提升了 12%,秀秀的點(diǎn)擊率提升了 5%,push 的到達(dá)點(diǎn)擊率提升了 10%。
隨著模型和特征的復(fù)雜度顯著增加,在線 inference 的耗時(shí)已經(jīng)無法滿足業(yè)務(wù)的要求。為了解決模型推理效率的問題,一方面我們通過 C++ 重寫了模型在線推理服務(wù)——MML Serving,并在內(nèi)存和并發(fā)上做了大量優(yōu)化,使得 QPS 和穩(wěn)定性有了大幅度提升。另一方面,我們實(shí)現(xiàn)了多塔網(wǎng)絡(luò)的模型框架,通過離線預(yù)計(jì)算 user 和 feed 子網(wǎng)絡(luò)的輸出,并存到 DB 中,在線通過檢索 DB 的方式,避免了實(shí)時(shí)計(jì)算 user 和 feed 子網(wǎng)絡(luò)的龐大計(jì)算量。收益也是很明顯,其中排序預(yù)估耗時(shí)從 100+ms 下降到了 7ms,秀秀社區(qū) push 服務(wù)預(yù)估耗時(shí)從單尾號(hào) 5 小時(shí)降低到了 3 分鐘,到達(dá)點(diǎn)擊率平均提升 23.9%。
美圖推薦排序?qū)嵺`——多目標(biāo)優(yōu)化
隨著產(chǎn)品優(yōu)化的深入,單一的模型優(yōu)化目標(biāo)已經(jīng)無法準(zhǔn)確刻畫產(chǎn)品的迭代方向,為了滿足多樣化的產(chǎn)品需求,我們開始探索多目標(biāo)優(yōu)化。整個(gè)多目標(biāo)優(yōu)化的路線,大概經(jīng)歷了四個(gè)階段:樣本 reweight,多目標(biāo)模型,多模型,多個(gè)多目標(biāo)模型。下面我將對(duì)這四個(gè)階段的工作分別進(jìn)行介紹。
多目標(biāo)優(yōu)化之樣本 reweight
樣本 reweight 是一種簡單輕量的可用于解決多目標(biāo)問題的做法,它借鑒了 imbalanced data 的典型做法,在保持模型優(yōu)化的主目標(biāo)不變的情況下,通過提高次要目標(biāo)的正樣本占比,來模擬多目標(biāo)的聯(lián)合概率分布。
我們?cè)诿琅暮兔缊D秀秀社區(qū)上,對(duì)增加關(guān)注目標(biāo)進(jìn)行了嘗試。美拍在播放時(shí)長略微上漲的情況下,實(shí)現(xiàn)了人均關(guān)注 10.06% 的提升。美圖秀秀社區(qū)關(guān)注轉(zhuǎn)化率提升了 12.03%,不過點(diǎn)擊率也有略微的下降。
多目標(biāo)優(yōu)化之多目標(biāo)模型
樣本 reweight 的方式改變了樣本的原始分布,導(dǎo)致主目標(biāo)存在比較大的預(yù)估偏差。同時(shí),因?yàn)榇我繕?biāo)是通過主目標(biāo)的網(wǎng)絡(luò)結(jié)構(gòu)來實(shí)現(xiàn),無法對(duì)各個(gè)目標(biāo)的模型分別進(jìn)行調(diào)優(yōu),模型結(jié)構(gòu)優(yōu)化存在比較大的局限性。因此,我們開始嘗試多目標(biāo)模型建模。
多目標(biāo)模型通過共享底層的網(wǎng)絡(luò)輸入,實(shí)現(xiàn)信息共享,再根據(jù)每個(gè)目標(biāo)的數(shù)據(jù)特點(diǎn),分別構(gòu)建各個(gè)目標(biāo)的輸出網(wǎng)絡(luò),得到每個(gè)目標(biāo)的輸出。
在美圖的多個(gè)社交場(chǎng)景中,我們進(jìn)行了嘗試,并取得了比較大的在線提升。其中,在美拍雙列 feed 流場(chǎng)景下,人均關(guān)注提升 11.43%,人均播放時(shí)長提升 12.45%。美圖秀秀首頁 feed 流,點(diǎn)擊率提升 1.93%,關(guān)注率提升 2.9%。美圖秀秀下滑 feed 流,關(guān)注率提升 9.3%,人均時(shí)長提升 10.33%。
多目標(biāo)優(yōu)化之多模型
雖然多目標(biāo)模型在業(yè)務(wù)上取得了比較大的提升,但是仍然存在一些問題。典型的問題包括:
- 當(dāng)不同任務(wù)的目標(biāo)相關(guān)性較弱,或者損失函數(shù)的輸出值范圍差異較大時(shí),多目標(biāo)模型的調(diào)優(yōu)存在比較大的困難;
- 使用多目標(biāo)模型,會(huì)導(dǎo)致不同目標(biāo)的優(yōu)化存在比較大的耦合,延遲整體優(yōu)化進(jìn)度,在產(chǎn)品要求快速迭代的場(chǎng)景下,這種技術(shù)手段不一定能夠很好的滿足業(yè)務(wù)需求。
為了解決多目標(biāo)模型存在的一些問題,我們通過拆分多目標(biāo)模型的各個(gè)目標(biāo),得到多個(gè)單目標(biāo)模型,并對(duì)每個(gè)單目標(biāo)模型分別進(jìn)行優(yōu)化。在美拍雙列 feed 流場(chǎng)景下,我們進(jìn)行了相應(yīng)的嘗試,在人均時(shí)長不變的情況下,人均關(guān)注提升了 2.98%。通過進(jìn)一步調(diào)整模型的優(yōu)化目標(biāo),人均時(shí)長再次提升了 19.37%,人均關(guān)注提升了 14.1%。
多目標(biāo)優(yōu)化之多個(gè)多目標(biāo)模型
當(dāng)推薦場(chǎng)景的優(yōu)化目標(biāo)增加,多模型的方案會(huì)存在維護(hù)成本高,線上資源開銷大,各個(gè)任務(wù)的模型無法利用其它任務(wù)的數(shù)據(jù)等問題。
綜合多模型和多目標(biāo)模型的優(yōu)點(diǎn),采用多個(gè)多目標(biāo)模型是解決多目標(biāo)任務(wù)的有效手段。在美拍場(chǎng)景下,通過同時(shí)優(yōu)化關(guān)注、時(shí)長、播放等目標(biāo),人均關(guān)注提升 12.18%,活躍留存提升 25.67%。
未來規(guī)劃
未來,我們將繼續(xù)完善 MML 機(jī)器學(xué)習(xí)平臺(tái)的建設(shè),并計(jì)劃對(duì) Bamboo 項(xiàng)目進(jìn)行開源。在算法上,我們開始了強(qiáng)化學(xué)習(xí)在推薦領(lǐng)域的調(diào)研,同時(shí),對(duì)多目標(biāo)建模、行為序列特征建模、以及 Embedding 技術(shù)等也將持續(xù)進(jìn)行跟進(jìn)和優(yōu)化。期待后續(xù)能和大家有更多地探討和交流。
作者簡介
湯斌,美圖高級(jí)算法專家,曾在騰訊任高級(jí)研究員,碩士畢業(yè)于哈爾濱工業(yè)大學(xué)。主要從事推薦算法,點(diǎn)擊率預(yù)估以及自然語言處理方面的相關(guān)研究。在工業(yè)界的大規(guī)模推薦與排序算法實(shí)踐上積累了豐富的經(jīng)驗(yàn)。






