美团搜索广告排序推荐,从机器学习到深度学习的模型实践
向AI轉型的程序員都關注了這個號👇👇👇
機器學習AI算法工程? 公眾號:datayx
前言:深度學習驅動的 CTR 預估技術演化
0. 淺層模型時代:以 MLR 為例
2005-2015 這十年間,大規模機器學習模型 (特指淺層模型) 一度統治著 CTR 預估領域,以 G/B 兩家為代表的”大規模離散特征 + 特征工程 + 分布式線性 LR 模型”解法幾乎成為了那個時代的標準解。相關的工作相信讀者們耳熟能詳,甚至據我所知今天業界的不少團隊依然采用這樣的技術。
阿里在 2011-2012 年左右由 @蓋坤同學創新性地提出了 MLR(Mixed Logistic Regression) 模型并實際部署到線上系統,同時期也有如 FM 模型等工作出現。這些模型試圖打破線性 LR 模型的局限性,向非線性方向推進了一大步。
我在 2014 年加入阿里定向廣告團隊,不久負責了 Ranking 方向,推進 CTR 技術的持續迭代是我工作的主航道之一。作為 MLR 模型的誕生團隊,顯然我們對它有著強烈的偏愛。最初 MLR 模型的主要使用方式是”低維統計反饋特征 +MLR”,這是受阿里技術發展初期的軌道限制,讀者不用太驚訝。
我們做的第一個工作,就是試圖將 MLR 模型推向大規模離散特征體系,核心思考是細粒度的特征刻畫攜帶的信息量要遠比統計平均特征的分辨率高,這種特征體系至今在整個業界都是最先進的。要完成這樣一個升級,背后有巨大的挑戰 (在 DL 時代啟動初期,我們也遇到了類似的挑戰),具體包括:
從數百維統計特征到數十億離散特征,訓練程序要做重大升級,從數據并行模式要升級到模型并行方式,且非線性模型復雜度高,需要充分利用數據的結構化特點進行加速;
”大規模離散特征 + 分布式非線性 MLR 模型”解法直接從原始離散特征端到端地進行數據模式學習,至少在初期時我們沒有做任何的特征組合,完全依賴模型的非線性能力。在這種互聯網尺度 (百億參數 & 樣本) 的數據上,模型能不能學習到兼具擬合能力與泛化能力的范式?
這種超大規模數據上的非凸優化 (MLR 加入正則后進一步變成非光滑) 學術界鮮有先例。它的收斂性是一個巨大的問號。
當然,結果是我們成功了。15 年初的時候成為了新的技術架構,在定向廣告的所有場景都生產化落地,取得了巨大的成功。但是我們不得不承認,”大規模離散特征 + 分布式非線性 MLR 模型”的解法在業界并沒有大規模地被采納,有多種原因,技術上來講 MLR 模型的實現細節我們直到 17 年才正式地寫了一篇論文掛在了 arxiv 上,代碼也沒有開源,大家想要快速嘗試 MLR 也不太方便;其次 LR+ 特征工程的解法深深影響了很多技術團隊的思考方式和組織結構,我們后面會談到,這種對特征工程的依賴直到 DL 時代還大量保留著,一個重要的因素也是因為特征工程比較符合人的直觀認知,可以靠快速試錯并行迭代,MLR 這類非線性端到端的解法需要比較強的模型信仰和建模能力。
1. 技術拐點:端到端深度學習網絡的突破
15 年的時候,基于 MLR 的算法迭代進入瓶頸。當時認識到,要想進一步發揮 MLR 模型的非線性能力,需要提高模型的分片數——模型的參數相應地會線性增長,需要的訓練樣本量同樣要大幅度增加,這不太現實。期間我們做了些妥協,從特征的角度進行優化,比如設計了一些直觀的復合特征,典型的如”hit 類特征”:用戶歷史瀏覽過商品 A/B/C,要預估的廣告是商品 C,通過集合的”與”操作獲得”用戶歷史上瀏覽過廣告商品”這個特征。
細心的讀者應該很容易聯想到后來我們進一步發展出來的 DIN 模型,通過類似 attention 的技巧拓展了這一方法。后來進一步引入一些高階泛化特征,如 user-item 的 PLSA 分解向量、w2v embedding 等。但這些特征引入的代價大、收益低、工程架構復雜。
15 年底 16 年初的時候我們開始認真地思考突破 MLR 算法架構的限制,向 DL 方向邁進。這個時間在業界不算最早的,原因如前所述,MLR 是 DL 之前我們對大規模非線性建模思路的一個可行解,它助力了業務巨大的騰飛,因此當時夠用了——能解決實際問題就是好武器,這很重要。
在那個時間點,業界已經有了一些零散的 DL 建模思路出現,最典型的是 B 家早期的兩階段建模解法——先用 LR/FM 等把高維離散特征投影為數千規模的稠密向量,然后再訓練一個 MLP 模型。我們最初也做過類似的嘗試如 w2v+MLR/DNN,但是效果不太顯著,看不到打敗 MLR 的希望 (不少團隊從 LR 發展過來,這種兩階段建模打敗 LR 應該是可行的)。這里面關鍵點我們認為是端到端的建模范式。
實踐和思考不久催生了突破。16 年 5-6 月份我構思出了第一代端到端深度 CTR 模型網絡架構 (內部代號 GwEN, group-wise embedding network),如圖 1 所示。對于這個網絡有多種解釋,它也幾乎成為了目前業界各個團隊使用深度 CTR 模型最基礎和內核的版本。
圖 1 給出了思考過程,應該說 GwEN 網絡脫胎換骨于 MLR 模型,是我們對互聯網尺度離散數據上端到端進行非線性建模的第二次算法嘗試。當然跟大規模 MLR 時期一樣,我們再一次遭遇了那三個關鍵挑戰,這里不再贅述。
有個真實的段子: 16 年 6 月份我們啟動了研發項目組,大約 7 月份的時候有同學發現 G 在 arxiv 上掛出了 WDL(wide and deep) 那篇文章,網絡主體結構與 GwEN 如出一轍,一下子澆滅了我們當時想搞個大新聞的幻想。客觀地講當時技術圈普遍蔓延著核心技術保密的氛圍,因此很多工作都在重復造輪子。16 年 8 月份左右我們驗證了 GwEN 模型大幅度超越線上重度優化的 MLR,后來成為了我們第一代生產化 deep CTR model。
因為 WDL 的出現我們沒對外主推 GwEN 模型,只作為 DIN 論文里的 base model 亮了相。不過我在多次分享時強調,GwEN 模型雖看起來簡單直接,但是背后對于 group-wise embedding 的思考非常重要,去年我受邀的一個公開直播中對這一點講得比較透,感興趣的同學可以翻閱 GwEN 分享資料:https://zhuanlan.zhihu.com/p/34940250
2. 技術拐點:模型工程奠基
GwEN 引爆了我們在互聯網場景探索 DL 技術的浪潮,并進而催生了這個領域全新的技術方法論。以阿里定向廣告為例,16-17 年我們大刀闊斧地完成了全面 DL 化的變革,取得了巨大的技術和業務收益。如果給這個變革的起點加一個注腳,我認為用“模型工程”比較貼切。這個詞是我 17 年在內部分享時提出來的 (不確定是不是業界第一個這么提的人),后來我看大家都普遍接受了這個觀點。
如果說大規模淺層機器學習時代的特征工程 (feature engineering, FE) 是經驗驅動,那么大規模深度學習時代的模型工程 (model engineering, ME) 則是數據驅動,這是一次飛躍。當然 ME 時代不代表不關注特征,大家熟悉的 FE 依然可以進行,WDL 式模型本來就有著調和 feature 派和 model 派的潛臺詞 (聽過不同渠道的朋友類似表述,G 家的同學可以證實下) 不過我要強調的是,傳統 FE 大都是在幫助模型人工預設一些特征交叉關系先驗,ME 時代特征有更重要的迭代方式:給模型喂更多的、以前淺層模型難以端到端建模的 signal(下一節細說),DL model 自帶復雜模式學習的能力。
說到這,先交代下 GwEN/WDL 端到端 deep CTR model 成功后業界的情況:很多技術團隊奉 WDL 為寶典,畢竟 G 背書的威力非常大。隨后沿著“把特征工程的經驗搬上 DL 模型”這個視角相繼出了多個工作,如 PNN/DeepFM/DCN/xDeepFM 等。
這些模型可以總結為一脈相承的思路:用人工構造的代數式先驗來幫助模型建立對某種認知模式的預設,如 LR 模型時代對原始離散特征的交叉組合 (笛卡爾乘積),今天的 DL 時代演變為在 embedding 后的投影空間用內積、外積甚至多項式乘積等方式組合。理論上這比 MLP 直接學習特征的任意組合關系是有效的——"No Free Lunch" 定理。但我經常看到業界有團隊把這些模型逐個試一遍然后報告說難有明顯收益,本質是沒有真正理解這些模型的作用點。
16 年底的時候,在第一代 GwEN 模型研發成功后我們啟動了另一條模型創新的道路。業界絕大部分技術團隊都已跨入了個性化時代,尤其在以推薦為主的信息獲取方式逐漸超越了以搜索為主的信息獲取方式時更是明顯,因此在互聯網尺度數據上對用戶的個性化行為偏好進行研究、建模、預測,變成了這個時期建模技術的主旋律之一。
具體來說,我們關注的問題是:定向廣告 / 推薦及個性化行為豐富的搜索場景中,共性的建模挑戰都是互聯網尺度個性化用戶行為理解,那么適合這種數據的網絡結構單元是什么?圖像 / 語音領域有 CNN/RNN 等基礎單元,這種蘊含著高度非線性的大規模離散用戶行為數據上該設計什么樣的網絡結構?顯然特征工程式的人工代數先驗是無法給出滿意的解答的,這種先驗太底層太低效。這個問題我們還沒有徹底的認知,探索還在繼續進行中,但至少在這條路上我們目前已經給出了兩個階段性成果:
DIN 模型 (Deep Interest Network,KDD’18),知乎 @王喆同學有一篇實踐性較強的解讀,推薦參閱《DIN 解讀》:https://zhuanlan.zhihu.com/p/51623339
DIEN 模型 (Deep Interest Evolution Network,AAAI’19),知乎 @楊鎰銘同學寫過詳細的解讀,推薦閱讀《DIEN 解讀》:https://zhuanlan.zhihu.com/p/50758485
DIN/DIEN 都是圍繞著用戶興趣建模進行的探索,切入點是從我們在阿里電商場景觀察到的數據特點并針對性地進行了網絡結構設計,這是比人工代數先驗更高階的學習范式:DIN 捕捉了用戶興趣的多樣性以及與預測目標的局部相關性;DIEN 進一步強化了興趣的演化性以及興趣在不同域之間的投影關系。DIN/DIEN 是我們團隊生產使用的兩代主力模型,至今依然服務著很大一部分流量。這方面我們還在繼續探索,后續進展會進一步跟大家分享。
當然,模型工程除了上述”套路派”之外,還興起了大一堆”DL 調結構工程師”。可以想象很多人開始結合著各種論文里面的基本模塊 FM、Product、Attention 等組合嘗試,昏天暗地堆結構 + 調參。效果肯定會有,但是這種沒有方法論的盲目嘗試,建議大家做一做掙點快錢就好,莫要上癮。
3. 技術拐點:超越單體模型的建模套路
模型工程還有另外一個重要延伸,我稱之為”超越單體模型”的建模思路,這里統一來介紹下。事實上前面關于模型工程的描述里面已經提到,因為 DL 模型強大的刻畫能力,我們可以真正端到端地引入很多在大規模淺層模型時代很難引入的信號,比如淘寶用戶每一個行為對應的商品原圖 / 詳情介紹等。
圖 3 給出了我們團隊建模算法的整體視圖。主模型結構在上一節已經介紹,與其正交的是一個全新的建模套路:跳出上一時代固化的建模信號域,開辟新的賽道——引入多模態 / 多目標 / 多場景 / 多模塊信號,端到端地聯合建模。注意這里面關鍵詞依然是端到端。兩篇工作我們正式對外發表了,包括:
ESMM 模型 (Entire-Space Multi-task Model, SIGIR’18),知乎 @楊旭東同學寫過詳細的解讀并給出了代碼實現,推薦參閱《ESMM 解讀》:https://zhuanlan.zhihu.com/p/37562283
CrossMedia 模型 (論文里面叫 DICM, Deep Image CTR Model, CIKM’18),這個工作結合了離散 ID 特征與用戶行為圖像兩種模態聯合學習,模型主體采用的是 DIN 結構。最大的挑戰是工程架構,因此論文詳細剖析了我們剛剛開源的 X-DeepLearning 框架中,超越 PS 的 AMS 組件設計。不過目前好像沒看到有人解讀過,感興趣的同學可以讀一讀寫個分析。
關于 ESMM 模型多說兩句,我們展示了對同態的 CTR 和 CVR 任務聯合建模,幫助 CVR 子任務解決樣本偏差與稀疏兩個挑戰。事實上這篇文章是我們總結 DL 時代 Multi-Task Learning 建模方法的一個具體示例。圖 4 給出了更為一般的網絡架構。
據我所知這個工作在這個領域是最早的一批,但不唯一。今天很多團隊都吸收了 MTL 的思路來進行建模優化,不過大部分都集中在傳統的 MTL 體系,如研究怎么對參數進行共享、多個 Loss 之間怎么加權或者自動學習、哪些 Task 可以用來聯合學習等等。ESMM 模型的特別之處在于我們額外關注了任務的 Label 域信息,通過展現 > 點擊 > 購買所構成的行為鏈,巧妙地構建了 multi-target 概率連乘通路。
傳統 MTL 中多個 task 大都是隱式地共享信息、任務本身獨立建模,ESMM 細膩地捕捉了契合領域問題的任務間顯式關系,從 feature 到 label 全面利用起來。這個角度對互聯網行為建模是一個比較有效的模式,后續我們還會有進一步的工作來推進。
應該要指出 MTL 的應用范圍極廣,如圖 3 中我們的過往工作。它尤其適合多場景、多模塊的聯動,典型的例子是數據量較大的場景可以極大地幫助小場景優化。此外 MTL 這類模型工程解法與上一節介紹的單模型結構設計可以互補和疊加,兩者的發展沒有先后關系、可以并行推進。
4. 技術拐點:嵌入工程系統的算法設計
實際的工業系統,除了上面抽象出來的 CTR 預估問題,還有很多獨立的話題。介紹下我們在既有系統架構中算法層面的一些實踐。以廣告系統為例,從算法視角來看至少包括以下環節:匹配 > 召回 > 海選 > 粗排 > 精排 > 策略調控,這些算法散落在各個工程模塊中。
現在讓我們保持聚焦在 CTR 相關任務,看看在系統中不同的階段都可以有哪些新的變化。幾個典型的系統瓶頸:海選 / 粗排所在的檢索引擎,精排所在的在線預估引擎,以及這些算法離線所依賴的模型生產鏈路。在 DL 時代以前,技術已經迭代形成了一些既有的共識,如檢索引擎性能關鍵不宜涉及復雜的模型計算。但是跨入 DL 時代后,既有的共識可以被打破、新的共識逐漸形成。
4.1 海選 / 粗排的復雜模型化升級
在我們原有的系統中,檢索過程中涉及到的排序是用一個靜態的、非個性化的質量分來完成,可以簡單理解為廣告粒度的一個統計分數,顯然跟精排里面我們采用的各種各樣復雜精細的模型技術 (前幾節的內容) 相比它很粗糙。據我了解業界也有團隊用了一些簡化版的模型,如低配版 LR 模型來完成這個過程。背后的核心問題是檢索時候選集太大,計算必須精簡否則延遲太長。圖 5 給出了我們升級后的深度個性化質量分模型,約束最終的輸出是最簡單的向量內積。這種設計既迎合了檢索引擎的性能約束,同時實測跟不受限 DL 模型 (如 DIN) 在離線 auc 指標上差距不太顯著,但比靜態模型提升巨大。
這里有兩個延伸: 1) 海選 / 粗排 DQM 模型只幫助縮減候選集規模,不作為最終廣告的排序分,因此它的精度可以不像精排模型那樣追求極致,相應地多考慮系統性能和數據循環擾動;
DQM 模型對于檢索匹配召回等模塊同樣適用,例如現在很多團隊已經普通接受的向量化召回架構,跟 DQM 在模型架構上完全吻合。只不過作用在召回模塊,其建模信號和訓練樣本有很大的不同,更多地要考慮用戶興趣泛化。提到向量化高效計算,F/M 兩家都開源了優秀的架構,推薦大家參閱《faiss 和 SPTAG》:https://github.com/Microsoft/SPTAG
4.2 面向在線預估引擎的模型壓縮
在 LR/MLR 時代在線預估引擎的計算相對簡單、壓力不大。但當復雜的 DL 模型層出不窮后,在線引擎的算力瓶頸凸顯。為了緩解這個問題,我們在 17 年試水了一個工作:輕量級模型壓縮算法 (Rocket Training, AAAI’18),形象地稱之為無極調速模式。知乎上沒看到到位的解讀,這里放出一作 @周國瑞同學自己的文章《Rocket Training 解讀》:https://zhuanlan.zhihu.com/p/28625922
DL 模型的 over-parameterization 使得我們可以通過不同的優化方法尋找更好的解路徑,Rocket 只是一條,未來在這個方向上我們還會有更多的工作。但有可以肯定模型 DL 化帶來的在線預估引擎的算力瓶頸是一個新常態,這個方向上會引起更大的關注并演化成新一代系統架構。
4.3 打破資源依賴的增量 / 實時化算法架構
DL 模型的復雜化除了帶來在線預估引擎的性能挑戰外,對離線生產鏈路的資源挑戰也急劇放大。容易理解的是全量模型的訓練時間及占用機器規模肯定會逐步增加,同時模型的并行研發規模也會大增,即:”模型個數 x 模型時長 x 機器規模”全面膨脹。在這種情況下增量 / 實時模型訓練架構就成為了勝負手。
雖然業界很多時效性強的場景 (如信息流)online 模型的效果收益是巨大和關鍵的,但這里我不想過多地強調效果層面的收益,而更愿意從資源架構層面做探討。雖然 DL 模型采用了 sgd-based 優化算法,直覺來看 batch 訓練和 incremental 或 online 訓練應該同構。然而 ODL(Online Deep Learning) 所存在的問題和挑戰絕不止于此,且它跟 LR 時代的 Online Learning 有很多的差異性。目前同時完成了全面 DL 并進而 ODL 化的團隊不太多。
當然也有團隊是從 OL 系統直接向 ODL 升級的,這個路徑固然看似更快捷,但也許錯過了 DL 模型盛宴的不少美妙菜肴——batch 訓練是純模型探索的更優土壤。我們從 17 年底開始從 DL 到 ODL 升級,18 年初落地、經歷了 18 年雙十一大促,我認為只是剛剛走完了 ODL 的最基礎階段,這方面我們還在持續推進。
在計算廣告場景中,需要平衡和優化三個參與方——用戶、廣告主、平臺的關鍵指標,而預估點擊率CTR(Click-through Rate)和轉化率CVR(Conversion Rate)是其中非常重要的一環,準確地預估CTR和CVR對于提高流量變現效率,提升廣告主ROI(Return on Investment),保證用戶體驗等都有重要的指導作用。
傳統的CTR/CVR預估,典型的機器學習方法包括:
①人工特征工程 + LR(Logistic Regression)[1]
②GBDT(Gradient Boosting Decision Tree)[2] + LR
③FM(Factorization Machine)[3]和FFM(Field-aware Factorization Machine)[4]等模型。
相比于傳統機器學習方法,深度學習模型近幾年在多領域多任務(圖像識別、物體檢測、翻譯系統等)的突出表現,印證了神經網絡的強大表達能力,以及端到端模型有效的特征構造能力。同時各種開源深度學習框架層出不窮,美團集團數據平臺中心也迅速地搭建了GPU計算平臺,提供GPU集群,支持TensorFlow、MXNet、Caffe等框架,提供數據預處理、模型訓練、離線預測、模型部署等功能,為集團各部門的策略算法迭代提供了強有力的支持。
美團海量的用戶與商家數據,廣告復雜的場景下眾多的影響因素,為深度學習方法的應用落地提供了豐富的場景。本文將結合廣告特殊的業務場景,介紹美團搜索廣告場景下深度學習的應用和探索。主要包括以下兩大部分:
CTR/CVR預估由機器學習向深度學習遷移的模型探索
CTR/CVR預估基于深度學習模型的線下訓練/線上預估的工程優化
二、從機器學習到深度學習的模型探索
2.1 場景與特征
美團搜索廣告業務囊括了關鍵詞搜索、頻道篩選等業務,覆蓋了美食、休娛、酒店、麗人、結婚、親子等200多種應用場景,用戶需求具有多樣性。同時O2O模式下存在地理位置、時間等獨特的限制。
結合上述場景,我們抽取了以下幾大類特征:
用戶特征
人口屬性:用戶年齡,性別,職業等。
行為特征:對商戶/商圈/品類的偏好(實時、歷史),外賣偏好,活躍度等。
建模特征:基于用戶的行為序列建模產生的特征等。
商戶特征
屬性特征:品類,城市,商圈,品牌,價格,促銷,星級,評論等。
統計特征:不同維度/時間粒度的統計特征等。
圖像特征:類別,建模特征等。
業務特征:酒店房型等。
Query特征
分詞,意圖,與商戶相似度,業務特征等。
上下文特征
時間,距離,地理位置,請求品類,競爭情況等。
廣告曝光位次。
結合美團多品類的業務特點及O2O模式獨特的需求,著重介紹幾個業務場景以及如何刻畫:
用戶的消費場景
“附近”請求:美團和大眾點評App中,大部分用戶發起請求為“附近”請求,即尋找附近的美食、酒店、休閑娛樂場所等。因此給用戶返回就近的商戶可以起到事半功倍的效果。“請求到商戶的距離”特征可以很好地刻畫這一需求。
“指定區域(商圈)”請求:尋找指定區域的商戶,這個區域的屬性可作為該流量的信息表征。
“位置”請求:用戶搜索詞為某個位置,比如“五道口”,和指定區域類似,識別位置坐標,計算商戶到該坐標的距離。
“家/公司”:用戶部分的消費場所為“家” 或 “公司”,比如尋找“家”附近的美食,在“公司”附近點餐等,根據用戶畫像得到的用戶“家”和“公司”的位置來識別這種場景。
多品類
針對美食、酒店、休娛、麗人、結婚、親子等眾多品類的消費習慣以及服務方式,將數據拆分成三大部分,包括美食、酒店、綜合(休娛、麗人、結婚、親子等)。其中美食表達用戶的餐飲需求,酒店表達用戶的旅游及住宿需求,綜合表達用戶的其他生活需求。
用戶的行為軌跡
實驗中發現用戶的實時行為對表達用戶需求起到很重要的作用。比如用戶想找個餐館聚餐,先篩選了美食,發現附近有火鍋、韓餐、日料等店,大家對火鍋比較感興趣,又去搜索特定火鍋等等。用戶點擊過的商戶、品類、位置,以及行為序列等都對用戶下一刻的決策起到很大作用。
2.2 模型
搜索廣告CTR/CVR預估經歷了從傳統機器學習模型到深度學習模型的過渡。下面先簡單介紹下傳統機器學習模型(GBDT、LR、FM & FFM)及應用,然后再詳細介紹在深度學習模型的迭代。
GBDT
GBDT又叫MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法。它由多棵決策樹組成,所有樹的結論累加起來作為最終答案。它能自動發現多種有區分性的特征以及特征組合,并省去了復雜的特征預處理邏輯。Facebook實現GBDT + LR[5]的方案,并取得了一定的成果。
LR
LR可以視作單層單節點的“DNN”, 是一種寬而不深的結構,所有的特征直接作用在最后的輸出結果上。模型優點是簡單、可控性好,但是效果的好壞直接取決于特征工程的程度,需要非常精細的連續型、離散型、時間型等特征處理及特征組合。通常通過正則化等方式控制過擬合。
FM & FFM
從神經網絡的角度考慮,可以看做下圖的簡單網絡搭建方式:
模型覆蓋了LR的寬模型結構,同時也引入了交叉特征,增加模型的非線性,提升模型容量,能捕捉更多的信息,對于廣告CTR預估等復雜場景有更好的捕捉。
在使用DNN模型之前,搜索廣告CTR預估使用了FFM模型,FFM模型中引入field概念,把( n )個特征歸屬到( f )個field里,得到( nf)個隱向量的二次項,擬合公式如下:
上式中,( f_j ) 表示第( j) 個特征所屬的field。設定隱向量長度( k ),那么相比于FM的( nk)個二次項參數,FFM有( nkf )個二次項參數,學習和表達能力也更強。
例如,在搜索廣告場景中,假設將特征劃分到8個Field,分別是用戶、廣告、Query、上下文、用戶-廣告、上下文-廣告、用戶-上下文及其他,相對于FM能更好地捕捉每個Field的信息以及交叉信息,每個特征構建的隱向量長度8*( k ), 整個模型參數空間為8 ( k ) ( n ) +( n ) + 1。
Yu-Chin Juan實現了一個C++版的FFM模型工具包,但是該工具包只能在單機訓練,難以支持大規模的訓練數據及特征集合;并且它省略了常數項和一次項,只包含了特征交叉項,對于某些特征的優化需求難以滿足,因此我們開發了基于PS-Lite的分布式FFM訓練工具(支持億級別樣本,千萬級別特征,分鐘級完成訓練,目前已經在公司內部普遍使用),主要添加了以下新的特性:
支持FFM模型的分布式訓練。
支持一次項和常數項參數學習,支持部分特征只學習一次項參數(不需要和其他特征做交叉運算),例如廣告位次特征等。擬合公式如下:
從GBDT模型切到FFM模型,積累的效果如下所示,主要的提升來源于對大規模離散特征的刻畫及使用更充分的訓練數據:
DNN
從上面的介紹大家可以看到,美團場景具有多樣性和很高的復雜度,而實驗表明從線性的LR到具備非線性交叉的FM,到具備Field信息交叉的FFM,模型復雜度(模型容量)的提升,帶來的都是結果的提升。而LR和FM/FFM可以視作簡單的淺層神經網絡模型,基于下面一些考慮,我們在搜索廣告的場景下把CTR模型切換到深度學習神經網絡模型:
通過改進模型結構,加入深度結構,利用端到端的結構挖掘高階非線性特征,以及淺層模型無法捕捉的潛在模式。
對于某些ID類特別稀疏的特征,可以在模型中學習到保持分布關系的稠密表達(embedding)。
充分利用圖片和文本等在簡單模型中不好利用的信息。
我們主要嘗試了以下網絡結構和超參調優的實驗。
Wide & Deep
首先嘗試的是Google提出的經典模型Wide & Deep Model[6],模型包含Wide和Deep兩個部分,其中Wide部分可以很好地學習樣本中的高頻部分,在LR中使用到的特征可以直接在這個部分使用,但對于沒有見過的ID類特征,模型學習能力較差,同時合理的人工特征工程對于這個部分的表達有幫助。Deep部分可以補充學習樣本中的長尾部分,同時提高模型的泛化能力。Wide和Deep部分在這個端到端的模型里會聯合訓練。
在完成場景與特征部分介紹的特征工程后,我們基于Wide & Deep模型進行結構調整,搭建了以下網絡:
在搜索廣告的場景中,上圖的Part_1包含離散型特征及部分連續型特征離散化后的結果 (例如用戶ID、廣告ID、商圈ID、品類ID、GEO、各種統計類特征離散化結果等等)。離散化方式主要采用等頻劃分或MDLP[7]。每個域構建自己的embedding向量 (缺失特征和按照一定閾值過濾后的低頻特征在這里統一視作Rare特征),得到特征的Representation,然后通過Pooling層做采樣,并拼接在一起進行信息融合。
右側的Part_2部分主要包含我們場景下的統計類特征及部分其他途徑建模表示后輸入的特征 (例如圖片特征、文本特征等),和Part_1的最后一層拼接在一起做信息融合。
深度學習模型在圖像語音等數據上有顯著作用的原因之一是,我們在這類數據上不太方便產出能很好刻畫場景的特征,人工特征+傳統機器學習模型并不能學習出來全面合理的數據分布表示,而深度學習end-to-end的方式,直接結合Label去學習如何從原始數據抽取合適的表達(representation)。但是在美團等電商的業務場景下,輸入的數據形態非常豐富,有很多業務數據有明確的物理含義,因此一部分人工特征工程也是必要的,提前對信息做一個合理的抽取表示,再通過神經網絡學習進行更好的信息融合和表達。
在美團搜索廣告的場景下,用戶的實時行為有非常強的指代性,但是以原始形態直接送入神經網絡,會損失掉很多信息,因此我們對它進行了不同方式描述和表示,再送入神經網絡之中進行信息融合和學習。另一類很有作用的信息是圖像信息,這部分信息的一種處理方式是,可以通過end-to-end的方式,用卷積神經網絡和DNN進行拼接做信息融合,但是可能會有網絡的復雜度過高,以及訓練的收斂速度等問題,也可以選擇用CNN預先抽取特征,再進行信息融合。
下面以這兩類數據特征為例,介紹在Wide & Deep模型中的使用方式。
用戶實時行為
a) 行為實體 用戶的實時行為包括點擊商戶(C_P)、下單商戶(O_P)、搜索(Q)、篩選品類(S)等。商戶的上層屬性包括品類(Type: C_Type, O_Type)、位置(Loc: C_Loc, O_Loc)等。
使用更充分的數據,單獨對用戶行為序列建模。例如LSTM模型,基于用戶當前的行為序列,來預測用戶下一時刻的行為,從中得到當前時刻的“Memory信息”,作為對用戶的embedding表示;或Word2Vec模型,生成行為實體的embedding表示,Doc2Vec模型,得到用戶的embedding表示。實驗發現,將用戶的embedding表示加入到模型Part_2部分,特征覆蓋率增加,離線效果有了明顯提升,而且由于模型參數空間增加很小,模型訓練的時間基本不變。
c) 計數特征 即對不同行為實體發生的頻次,它是對行為實體更上一層的抽象。
d)Pattern特征 用戶最近期的幾個行為實體序列(例如A-B-C)作為Pattern特征,它表示了行為實體之間的順序關系,也更細粒度地描述了用戶的行為軌跡。
圖片
i) 描述 商戶的頭圖在App商品展示中占據著很重要的位置,而圖片也非常吸引用戶的注意力。
ii) 圖片分類特征 使用VGG16、Inception V4等訓練圖片分類模型,提取圖片特征,然后加入到CTR模型中。
iii) E2E model 將Wide & Deep模型和圖片分類模型結合起來,訓練端到端的網絡。
從FFM模型切到Wide & Deep模型,積累到目前的效果如下所示,主要的提升來源于模型的非線性表達及對更多特征的更充分刻畫。
比起Wide & Deep的LR部分,DeepFM采用FM作為Wide部分的輸出,在訓練過程中共享了對不同Field特征的embedding信息。
我們在部分業務上嘗試了DeepFM模型,并進行了超參的重新調優,取得了一定的效果。其他業務也在嘗試中。具體效果如下:
Multi-Task
廣告預估場景中存在多個訓練任務,比如CTR、CVR、交易額等。既考慮到多個任務之間的聯系,又考慮到任務之間的差別,我們利用Multi-Task Learning的思想,同時預估點擊率、下單率,模型結構如下圖所示:
1 由于CTR、CVR兩個任務非常類似,所以采用“Hard Parameter Sharing”的結構,完全共享網絡層的參數,只在輸出層區分不同的任務。
2 由于下單行為受展現位次的影響非常小,所以下單率的輸出層不考慮位次偏差的因素。
3 輸出層在不同任務上單獨增加所需特征。
4 離線訓練和線上預估流程減半,性能提升;效果上相對于單模型,效果基本持平:
近期,阿里發表論文“Entire Space Multi-Task Model”[9],提出目前CVR預估主要存在Sample Selection Bias(SSB)和Data Sparsity(DS)兩個問題,并提出在全局空間建模(以pCTCVR和pCTR來優化CVR)和特征Transform的方法來解決。具體的Loss Function是:
網絡結構是:
超參調優
除了以上對網絡結構的嘗試,我們也進行了多組超參的調優。神經網絡最常用的超參設置有:隱層層數及節點數、學習率、正則化、Dropout Ratio、優化器、激活函數、Batch Normalization、Batch Size等。不同的參數對神經網絡的影響不同,神經網絡常見的一些問題也可以通過超參的設置來解決:
過擬合
網絡寬度深度適當調小,正則化參數適當調大,Dropout Ratio適當調大等。
欠擬合
網絡寬度深度適當調大,正則化參數調小,學習率減小等。
梯度消失/爆炸問題
合適的激活函數,添加Batch Normalization,網絡寬度深度變小等。
局部最優解
調大Learning Rate,合適的優化器,減小Batch Size等。
Covariate Shift
增加Batch Normalization,網絡寬度深度變小等。
影響神經網絡的超參數非常多,神經網絡調參也是一件非常重要的事情。工業界比較實用的調參方法包括:
①網格搜索/Grid Search:這是在機器學習模型調參時最常用到的方法,對每個超參數都敲定幾個要嘗試的候選值,形成一個網格,把所有超參數網格中的組合遍歷一下嘗試效果。簡單暴力,如果能全部遍歷的話,結果比較可靠。但是時間開銷比較大,神經網絡的場景下一般嘗試不了太多的參數組合。
②隨機搜索/Random Search:Bengio在“Random Search for Hyper-Parameter Optimization”[10]中指出,Random Search比Grid Search更有效。實際操作的時候,可以先用Grid Search的方法,得到所有候選參數,然后每次從中隨機選擇進行訓練。這種方式的優點是因為采樣,時間開銷變小,但另一方面,也有可能會錯過較優的超參數組合。
③分階段調參:先進行初步范圍搜索,然后根據好結果出現的地方,再縮小范圍進行更精細的搜索。或者根據經驗值固定住其他的超參數,有針對地實驗其中一個超參數,逐次迭代直至完成所有超參數的選擇。這個方式的優點是可以在優先嘗試次數中,拿到效果較好的結果。
我們在實際調參過程中,使用的是第3種方式,在根據經驗參數初始化超參數之后,按照隱層大小->學習率->Batch Size->Drop out/L1/L2的順序進行參數調優。
在搜索廣告數據集上,不同超參的實驗結果如下:
2.3 小結
搜索廣告排序模型經歷了從GBDT –> FFM –> DNN的迭代,同時構建了更加完善的特征體系,線下AUC累積提升13%+,線上CTR累積提升15%+。
三、基于深度學習模型的工程優化
3.1 線下訓練
TensorFlow程序如果單機運行中出現性能問題,一般會有以下幾種問題:
a)復雜的預處理邏輯耦合在訓練過程中。
b)選擇正確的IO方式。
剝離預處理流程
i)在模型的試驗階段,為了快速試驗,數據預處理邏輯與模型訓練部分都耦合在一起,而數據預處理包含大量IO類型操作,所以很適合用HadoopMR或者Spark處理。具體流程如下:
ii)在預處理階段將查表、join字典等操作都做完,并且將查詢結果與原始數據merge在一起。
將libfm格式的數據轉為易于TensorFlow操作的SparseTensor方式:
選擇正確的IO方式
TensorFlow讀取數據的方式主要有2種,一般選擇錯誤會造成性能問題,兩種方式為:
①Feed_dict 通過feed_dict將數據喂給session.run函數,這種方式的好處是思路很清晰,易于理解。缺點是性能差,性能差的原因是feed給session的數據需要在session.run之前準備好,如果之前這個數據沒有進入內存,那么就需要等待數據進入內存,而在實際場景中,這不僅僅是等待數據從磁盤或者網絡進入內存的事情,還可能包括很多前期預處理的工作也在這里做,所以相當于一個串行過程。而數據進入內存后,還要串行的調用PyArrayToTF_Tensor,將其copy成tensorflow的tensorValue。此時,GPU顯存處于等待狀態,同時,由于tf的Graph中的input為空,所以CPU也處于等待狀態,無法運算。
②RecordReader 這種方式是tf在Graph中將讀取數據這個操作看做圖中一個operation節點,減少了一個copy的過程。同時,在tf中還有batch與threads的概念,可以異步的讀取數據,保證在GPU或者CPU進行計算的時候,讀取數據這個操作也可以多線程異步執行。靜態圖中各個節點間的阻塞:在一個復雜的DAG計算圖中,如果有一個點計算比較慢時,會造成阻塞,下游節點不得不等待。此時,首先要考慮的問題是圖中節點參數所存儲的位置是否正確。比如如果某個計算節點是在GPU上運算,那么如果這個節點所有依賴的variable對象聲明在CPU上,那么就要做一次memcpy,將其從內存中copy到GPU上。因為GPU計算的很快,所以大部分時間花在拷貝上了。總之,如果網絡模型比較簡單,那么這種操作就會非常致命;如果網絡結構復雜,比如網絡層次非常深,那么這個問題倒不是太大的問題了。
在這個Case中,因為需要提升吞吐,而不僅僅是在試驗階段。所以需要用RecordReader方式處理數據。
優化過程
1將整體程序中的預處理部分從代碼中去除,直接用Map-Reduce批處理去做(因為批處理可以將數據分散去做,所以性能非常好,2億的數據分散到4900多個map中,大概處理了15分鐘左右)。
2 MR輸出為TensorFlow Record格式,避免使用Feed_dict。
3 數據預讀,也就是用多進程的方式,將HDFS上預處理好的數據拉取到本地磁盤(使用joblib庫+shell將HDFS數據用多進程的方式拉取到本地,基本可以打滿節點帶寬2.4GB/s,所以,拉取數據也可以在10分鐘內完成)。
4 程序通過TensorFlow提供的TFrecordReader的方式讀取本地磁盤上的數據,這部分的性能提升是最為明顯的。原有的程序處理數據的性能大概是1000條/秒,而通過TFrecordReader讀取數據并且處理,性能大概是18000條/秒,性能大概提升了18倍。
5 由于每次run的時候計算都要等待TFrecordReader讀出數據,而沒用利用batch的方式。如果用多線程batch可以在計算期間異步讀取數據。在TensorFlow所有例子中都是使用TFRecordReader的read接口去讀取數據,再用batch將數據多線程抓過來。但是,其實這樣做加速很慢。需要使用TFRecordReader的read_up_to的方法配合batch的equeue_many=True的參數,才可以做到最大的加速比。使用tf.train.batch的API后,性能提升了38倍。
此時,性能已經基本達到我們的預期了。例如整體數據量是2億,按照以前的性能計算1000條/秒,大概需要運行55個小時。而現在大概需要運行87分鐘,再加上預處理(15分鐘)與預拉取數據(10分鐘)的時間,在不增加任何計算資源的情況下大概需要2個小時以內。而如果是并行處理,則可以在分鐘級完成訓練。
3.2 線上預估
線上流量是模型效果的試金石。離線訓練好的模型只有參與到線上真實流量預估,才能發揮其價值。在演化的過程中,我們開發了一套穩定可靠的線上預估體系,提高了模型迭代的效率。
模型同步
我們開發了一個高可用的同步組件:用戶只需要提供線下訓練好的模型的HDFS路徑,該組件會自動同步到線上服務機器上。該組件基于HTTPFS實現,它是美團離線計算組提供的HDFS的HTTP方式訪問接口。同步過程如下:
同步前,檢查模型md5文件,只有該文件更新了,才需要同步。
同步時,隨機鏈接HTTPFS機器并限制下載速度。
同步后,校驗模型文件md5值并備份舊模型。
同步過程中,如果發生錯誤或者超時,都會觸發報警并重試。依賴這一組件,我們實現了在2min內可靠的將模型文件同步到線上。
模型計算
當前我們線上有兩套并行的預估計算服務。
一、基于TF Serving的模型服務
TF Serving是TensorFlow官方提供的一套用于在線實時預估的框架。它的突出優點是:和TensorFlow無縫鏈接,具有很好的擴展性。使用TF serving可以快速支持RNN、LSTM、GAN等多種網絡結構,而不需要額外開發代碼。這非常有利于我們模型快速實驗和迭代。
使用這種方式,線上服務需要將特征發送給TF Serving,這不可避免引入了網絡IO,給帶寬和預估時延帶來壓力。我們嘗試了以下優化,效果顯著。
并發請求。一個請求會召回很多符合條件的廣告。在客戶端多個廣告并發請求TF Serving,可以有效降低整體預估時延。
特征ID化。通過將字符串類型的特征名哈希到64位整型空間,可以有效減少傳輸的數據量,降低使用的帶寬。
TF Serving服務端的性能差強人意。在典型的五層網絡(512*256*256*256*128)下,單個廣告的預估時延約4800μs,具體見下圖:
二、定制的模型計算實現
由于廣告線上服務需要極高的性能,對于主流深度學習模型,我們也定制開發了具體計算實現。這種方式可以針對性的優化,并避免TF Serving不必要的特征轉換和線程同步,從而提高服務性能。
例如全連接DNN模型中使用Relu作為激活函數時,我們可以使用滾動數組、剪枝、寄存器和CPU Cache等優化技巧,具體如下:
// 滾動數組
int nextLayerIndex = currentLayerIndex ^ 1 ;
System.arraycopy(bias, bOff, data[nextLayerIndex], 0, nextLayerSize);
for (int i = 0; i < currentLayerSize; i ++) {
float value = data[currentLayerIndex][i];
// 剪枝
if (value > 0.0) {
// 寄存器
int index = wOff + i * nextLayerSize;
// CPU 緩存友好
for (int j = 0; j < nextLayerSize; j++) {
data[nextLayerIndex][j] += value * weights[index + j];
}
}
}
for (int i = 0; i < nextLayerSize; k++) {
data[nextArrayIndex][i] = ReLu(data[nextArrayIndex][i]);
}
arrayIndex = nextArrayIndex;
優化后的單個廣告預估時延約650μs,見下圖:
綜上,當前線上預估采取“兩條腿走路”的策略。利用TF Serving快速實驗新的模型結構,以保證迭代效率;一旦模型成熟切換主流量,我們會開發定制實現,以保證線上性能。
模型效果
借助于我們的分層實驗平臺,我們可以方便的分配流量,完成模型的小流量實驗上線。該分層實驗平臺同時提供了分鐘粒度的小流量實時效果數據,便于模型評估和效果監控。
四、總結與展望
經過一段時間的摸索與實踐,搜索廣告業務在深度學習模型排序上有了一定的成果與積累。接下來,我們將繼續在特征、模型、工程角度迭代優化。特征上,更深度挖掘用戶意圖,刻畫上下文場景,并結合DNN模型強大的表達能力充分發揮特征的作用。模型上,探索新的網絡結構,并結合CNN、RNN、Attention機制等發揮深度學習模型的優勢。持續跟進業界動態,并結合實際場景,應用到業務中。工程上,跟進TensorFlow的新特性,并對目前實際應用中遇到的問題針對性優化,以達到性能與效果的提升。我們在持續探索中。
原文地址https://blog.csdn.net/MeituanTech/article/details/80618755
閱讀過本文的人還看了以下:
不斷更新資源
深度學習、機器學習、數據分析、python
?搜索公眾號添加:?datayx??
長按圖片,識別二維碼,點關注
訪問AI圖譜 ??
https://loveai.tech
總結
以上是生活随笔為你收集整理的美团搜索广告排序推荐,从机器学习到深度学习的模型实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间序列--平稳性介绍及检验方法
- 下一篇: python电力系统暂态分析_电力系统暂