美团点评联盟广告场景化定向排序机制
在美團點評的聯盟廣告投放系統(DSP)中,廣告從召回到曝光的過程需要經歷粗排、精排和競價及反作弊等階段。其中精排是使用CTR預估模型進行排序,由于召回的候選集合較多,出于工程性能上的考慮,不能一次性在精排過程中完成候選集的全排序,因此在精排之前,需要對候選廣告進行粗排,來過濾、篩選出相關性較高的廣告集合,供精排使用。
本文首先會對美團點評的廣告粗排機制進行概要介紹,之后會詳細闡述基于用戶、天氣、關鍵詞等場景特征的廣告粗排策略。
廣告粗排框架對引擎端召回的若干廣告進行排序,并將排序的結果進行截斷,截斷后的候選集會被傳遞給廣告精排模塊處理。
粗排是為了盡可能在候選廣告集合里找到與流量相關性較高的廣告,一般以有效轉化(通常包括點擊后發生后續行為、電話、預約、購買等)為目標。流量因素通常包含媒體、用戶(用戶包含用戶畫像、歷史搜索、歷史點擊等各類用戶行為)因素。此外,還可包含流量外因素,如LBS、當前實時天氣特征等。
考慮到不同流量所覆蓋的特征不盡相同:如有的流量包含大量豐富的用戶畫像,而有的流量無用戶畫像,但有標識性較為明顯的媒體特征,如P2P、母嬰類媒體等,因此對于不同流量,會使用不同的粗排策略,以更好地應用流量特征。
下面將根據不同場景詳細介紹各類粗排機制的離線模型,以及線上應用方案。
用戶興趣對于廣告轉化有著顯著影響。在用戶畫像基礎上,向不同興趣的用戶推薦不同類型的廣告,對廣告的點擊和轉化皆能帶來較大提升。下面先對用戶畫像進行簡要介紹,之后闡述我們是如何應用用戶畫像完成廣告定向的。
用戶畫像
用戶畫像也稱用戶標簽。美團點評的用戶畫像與用戶的站內行為息息相關。用戶的原始行為多為用戶對店鋪的瀏覽、點擊、購買、點評、收藏等,用戶畫像主要是基于這些用戶行為產出的統計型畫像。除了原始行為,我們還整合了其他團隊的數據,包含通過頻繁集挖掘出的用戶預估標簽,以及一些產品上自定義標簽等。此外,聯盟廣告獨有的ADX數據源也被使用進來,ADX日均約數十億次請求,涵蓋了文學、金融、教育、母嬰等各類媒體,我們將媒體帶來的部分用戶信息進行清洗,并整合到用戶畫像,從而提升用戶畫像的覆蓋率和豐富性。融合以上所有數據源信息,我們產出了針對聯盟廣告的用戶畫像。
在策略應用的同時,考慮到產品投放,用戶標簽體系的設計采用了樹狀結構,以便于投放選擇。
標簽體系分為五大類:
在工程方面,用戶畫像工程每日例行化運行一次,離線處理各數據源,并進行合并,產出設備ID粒度(IMEI或IDFA)的標準化用戶標簽。用戶標簽結果會從Hive表導入Redis緩存,以供線上加載使用。
離線建模
用戶定向包含了兩層含義:
本文所述的用戶定向,僅指策略應用。
在用戶定向上,我們使用了頻繁集挖掘方案,因為用戶標簽與商戶分類較為相似,直觀上講,規則的收益可能好于模型。使用頻繁集方案,一方面可以挖掘出規則考慮不到的關聯關系;另一方面,它的可解釋性較強,且后期可以方便地進行人工干預。
我們抽取一段時間的用戶點擊歷史數據,來挖掘用戶興趣與廣告商戶分類的關聯關系。同時,考慮到轉化(包含電話、預約、購買等種種行為)是一種強行為,我們將其等同于多次點擊行為,進行升采樣(如一次電話等于兩次點擊,等等)。之后使用Spark的ML庫來進行頻繁集挖掘。數據處理上,每條點擊紀錄會將廣告商戶的一級、二級、三級分類分別與用戶標簽關聯,即一條記錄會拆分成多份,分別使用不同級別的分類與用戶標簽關聯,這樣保證在計算頻繁集的時候,各個層級分類都不會被遺漏。通過Spark的ML庫找出大量頻繁集后,剔除掉僅包含廣告分類或僅包含用戶標簽的,僅保留兩者共存集合。同時我們限制了用戶標簽在頻繁項中的數量,使其不超過兩個,以保證規則可以覆蓋較多線上用戶。接著,我們對標簽與廣告分類的關系進行打分,廣告分類A與興趣標簽B的打分為:\(\frac{\sum(A \bigcap B)}{A}\)。
舉例見下表:
“美食/火鍋”更為大眾化,因此訪問量遠大于“親子/兒童樂園”,上列訪問量雖為虛構,但與實際認知相符。上列表格想要說明的是,像“美食/火鍋”這樣的廣告分類,可能與很多用戶標簽的共生次數都很高,但由于它本身是大眾化的分類,因此分母取值也很大,則實際關聯打分就會很小(除非是強相關興趣)。用這種方式打分,可以篩選出指定標簽下關聯度較高的廣告二級分類。
得到全部的頻繁集及相應打分后,可線下進行人工篩選,剔除掉明顯不符合認知的頻繁項集。最終結果作為離線模型產出,寫入MySQL。
檢索端加載
檢索端每天定時加載一次離線結果到內存中。對于實時廣告請求,先從Redis讀取當前用戶設備的用戶畫像,然后根據用戶實時位置等條件召回幾百條廣告后,對于當前流量中有用戶畫像的,根據離線訓練結果,對廣告進行打分及排序,排序后會根據線上的設置進行截斷。用戶定向的整體應用框架如下:
在業務引擎端,我們會進行A/B分流實驗,隨機劃分一定百分比的流量作為實驗流量,用于進行用戶定向實驗。之后,分析一段時間的累積實驗結果,與base分流作對比,以檢測用戶定向策略帶來的轉化率提升,同時反饋給上游頻繁集模型,用于干預調整離線產出模型。
實時天氣情況對用戶有一定影響。直觀上來說,炎熱的天氣下,用戶會更傾向于點擊游泳館的廣告;而寒冷的天氣下,飄著熱氣的星巴克廣告會更受歡迎。有些廣告行業則跟天氣的關系不大,如非實時消費的結婚、攝影、親子類廣告。下面將介紹我們基于天氣場景的離線模型及在線打分方案。
數據準備
天氣基礎數據包括溫度、雨量、雪量、天氣現象(大雨、霧霾等)、風力等級等。我們需要的天氣數據,并不需要實時更新,原因如下:
① 從應用角度講,由于天氣情況在短時間內比較穩定,并不需要每時每刻都抓取天氣數據; ② 第三方媒體對DSP(Demand-Side Platform)的響應時間有嚴格限制,如果每次廣告請求都去請求天氣數據,對廣告引擎的性能將造成較大影響。因此我們以小時粒度來保存天氣數據,即在確定的某個城市、某個小時內,天氣情況是固定的。
天氣數據包含兩種: ① 線下模型使用的歷史天氣數據; ② 線上檢索使用的當前天氣數據。
兩者在相同特征上的數據取值涵義要保證一致,即特征的一致性。美團配送團隊對基礎天氣數據進行清洗和加工,每日提供未來72小時內的天氣預報數據,同時保存了穩定的歷史數據,與我們的需求完全吻合,因為我們使用了該數據。
離線建模
天氣特征的離線模型選用了AdaBoost模型,該模型可使用若干簡單的弱分類器訓練出一個強大的分類器,且較少出現過擬合現象。考慮到要在線上檢索端加載弱分類器進行計算,基礎的弱分類器不能太過復雜(以免影響線上性能),基于以上考慮我們選用了AdaBoost常用的樹樁模型(即深度為1的決策樹)。
選定模型后,首先需要對原始數據進行處理,將其處理成適合決策樹分類的特征。我們選定溫度、濕度、降水量、降雪量、天氣情況等特征。以溫度舉例,將其作為連續變量處理,對于特征為溫度的決策樹,訓練合適的分割點,將溫度歸類到合適的葉子節點上;而對于天氣情況icon-code,由于其僅有幾個取值(正常、一般惡劣、非常惡劣等),因此當做離散值對待,進行one-hot編碼,散列到有限的幾個數值上(如1、2、3)。在樹樁模型中,左右葉子節點分別對離散值進行排列組合(如左子樹取1、3,右子樹取2等),直到左右子樹的均方誤差值之和為最小。當然,對于離散值較多的情況,出于性能上考慮,多以連續值對待,并訓練合適的分割點分離左右子樹。
對特征進行處理后,可以應用模型對特征進行迭代處理。我們以轉化為目標,搜集一段時間的歷史點擊數據,對數據進行特征化處理,最終訓練出合適的離線模型。直觀上來講,天氣對不同行業的轉化影響有顯著差異。某些行業對天氣更為敏感,如餐飲、運動等,而有些行業則對天氣不敏感,如親子、結婚(因為轉化一般不發生在當下)等,因此我們對不同的廣告分類分別做訓練,每個行業訓練一個模型。考慮到在檢索端需要對廣告和天氣的特征關系進行打分,因此分類模型不能完全滿足我們的需求。最終我們選取了AdaBoost的改進版Gentle AdaBoost,有關該模型的論述網上有很多(根據文獻1,在采用樹樁模型時,該模型效果好于傳統的離散AdaBoost),本文不再對其進行數學說明。算法大致流程如下圖所示:
另外說明一下我們對該模型的一些工程處理,我們去掉了最后的感知器模型,直接使用回歸函數的和作為打分。在每次迭代過程中,我們會保留當前錯誤率,當迭代達到一定次數,而錯誤率仍大于給定閾值時,則直接舍棄對該行業的訓練,即在天氣場景定向中,不對該行業的廣告打分。
工程上,我們使用Spark進行特征處理和模型訓練,并將最終結果寫入在線緩存Tair中。其中key為一級及二級行業,value即為AdaBoost模型的多輪迭代結果,同時保留了最后一輪迭代的錯誤率。保留錯誤率的原因是在線上檢索端加載模型時,可以動態配置錯誤率閾值,根據模型的錯誤率超過閾值與否來決定是否對廣告打分。另外,考慮到線上加載迭代模型會犧牲性能,我們將迭代輪次控制在100次以內。
天氣場景的離線數據和線上數據模型如下圖所示:
經過Gentle AdaBoost訓練出的多棵樹模型,以JSON格式寫入Tair中;線上在獲取ADX請求后,根據Tair中已經寫好的天氣預報信息,加載當前小時當前城市的天氣情況,檢索端根據當前天氣和模型,對廣告進行打分和排序。
線上優化
廣告檢索端需要從Tair讀取離線模型,來完成廣告打分。由于第三方媒體對DSP響應時間要求較高,在線上做迭代模型的加載,是一個較為耗時的操作,因此需要做一些優化處理。我們一共做了三層優化處理:
模型緩存:對于檢索端召回的幾百條廣告,對廣告一級/二級分類進行緩存處理,對某條廣告打分后,其對應的二級分類及相應模型加入緩存,而后續遇到來自同樣二級行業的廣告,將直接使用緩存模型。
打分緩存:由于我們使用了小時級的天氣數據,因此對于指定的城市,在指定的小時內,天氣狀況完全一致,當廣告一級/二級行業確定后,模型對于該廣告的打分是確定的。因此我們對廣告行業+城市的打分進行緩存處理,且每個整點清空一次緩存。對于已經打分過的城市+廣告行業,可以直接從緩存中讀取并使用打分結果。
性能與打分的折中:使用了前面兩種緩存方案后,性能仍無法得到足夠保證,此時我們需要考慮一個折中方案,犧牲一部分廣告打分,以換取性能的提升。即我們使用動態配置的閾值來控制每次檢索請求中模型迭代的輪次。舉個例子,閾值設為200次,在整點時刻,前五個召回的廣告的行業各不相同,且使用的模型分別迭代80、90、60、60、30次結束,則本次請求中我們只對前三個廣告打分(80+90+60<200),并將廣告打分進行緩存。后續召回廣告,其二級分類若能命中緩存,則打分,否則不打分。在第二次廣告請求過來時,同樣沿用這個策略,對已經緩存的廣告打分直接加載,否則迭代模型進行打分,直到達到迭代閾值200為止。通過打分緩存機制,可以保證前面犧牲掉的廣告行業被逐步打分。使用該優化策略,可以完全確保上線后的性能,通過調整迭代輪次的閾值,控制打分與性能的折中關系。
通過以上三層優化處理機制,保證了AdaBoost這樣的迭代模型可以在線上被加載使用。另外,我們還會考察離線模型中的錯誤率,通過線上動態調整閾值,舍棄一些錯誤率較高的模型,以達到效果的最優化。模型上線后,我們進行A/B testing,以檢測使用天氣場景模型帶來的轉化率提升。
用戶在美團點評站內搜索的關鍵詞,強烈地表達了用戶的短期偏好。基于關鍵詞定向(Query Targeting)是許多廣告精準定向的利器。尤其對于閉環條件下的應用,如百度鳳巢,淘寶的直通車,當用戶在站內進行搜索,可以直接根據搜索詞展示相關廣告,引導用戶在站內轉化。一般來說,關鍵詞定向的效果都非常出色。聯盟的關鍵詞定向,是通過對用戶近期搜索詞的分析,識別出用戶感興趣的店鋪及店鋪分類,進而在站外App為用戶投放相關廣告。下面將介紹聯盟廣告基于關鍵詞特征的廣告排序機制。
離線模型
離線模型需要根據用戶搜索詞分析出用戶的偏好,對于大多數搜索引擎來說,需要使用NLP的相關技術和復雜的基礎特征建設工作。對于美團點評的關鍵詞搜索場景,由于大部分搜索詞與美團點評店鋪及店鋪分類強相關(大部分搜索詞甚至直接是店鋪名稱),且新詞搜索量增長幅度不大,同時考慮到開發成本,我們的關鍵詞定向舍棄了基礎特征構建的方案,而是直接采用一套合理的離線分析模型,來構建搜索詞和店鋪分類的關系。
我們選用了TF/IDF模型,來構建關鍵詞和用戶偏好的關系。用這個方案原因是文章-詞模型與詞-店鋪模型非常相似。該方案主要用于計算店鋪分類(或商圈)與關鍵詞的相關程度,也是對其打分的依據。該模型相關資料很多,不再做原理性闡述,此處僅舉一例如下:
用戶搜索詞為“潮汕火鍋”,計算“美食/火鍋”的商家分類與該關鍵詞的相似程度。
假設: c1 = 搜索“潮汕火鍋”后的全部點擊數, c2 = 搜索“潮汕火鍋”后點擊“美食/火鍋”類目店鋪的全部點擊數, c3 = 搜索詞總數, c4 = 搜索點擊“美食/火鍋”類目的詞總數。則 $$tfidf = (c2 / c1) × log(c3 / (c4 + 1))$$由此計算出店鋪分類與關鍵詞的關系,取topN(根據存儲大小及不同店鋪對同一詞的TF-IDF差距擬定)個店鋪分類。
單店及商圈計算方法與此類似,它們的計算值會同時與店鋪分類的TF-IDF進行比較,不作區分。(此處有一點需注意:如果用戶搜索“中山公園 火鍋”,可以預見店鋪分類與商圈會同等重要,則最終產出兩條獨立打分規則,分別掛在店鋪分類和商圈下面)。
我們使用Spark來構建離線模型,提取用戶的搜索詞和搜索后點擊的店鋪及店鋪分類,運用上述方案來計算每個搜索詞的關聯店鋪及店鋪分類,設置閾值,保留分數較大的分類結果。
為了提升線上命中率,我們使用了點評分詞系統,對長度較長的搜索詞進行分詞,同時保存原始詞和切分后基礎詞的TF-IDF結果。為了方便線上快速檢索,結果同樣保存在Tair中。以檢索詞為key,關聯店鋪分類和店鋪的TF-IDF打分作為value進行保存。
實時流計算
對于關鍵詞定向,與用戶定向的一個區別在于前者時效性要求很高,因此需要使用實時計算系統來處理用戶行為,并將最后的結果保存在Tair集群。首先通過Kafka訂閱用戶行為實時流,以五分鐘為時間片處理用戶行為,查找用戶ID和搜索詞,如果搜索詞過長,則進行分詞,接著從Tair中查找出與該搜索詞相關的店鋪及店鋪分類和打分(離線模型給出)。接下來會Tair中查找該用戶ID是否有歷史結果,若有,則讀出,對之前的打分進行衰減(衰減方案見下文),并與當前新的打分進行合并;否則,將新的數據及時間戳寫入Tair。該方案的流程圖如下:
比較重要的部分是合并新來的數據與Tair里的老數據,合并時,如果新數據包含老數據中某些店鋪(店鋪分類),就直接使用新數據中的店鋪(店鋪分類)權重;否則,對老數據中的店鋪(店鋪分類)權重進行衰減,若衰減后權重小于給定的閾值,則直接將這個店鋪(店鋪分類)從合并數據中剔除。
衰減方案根據時間進行衰減。默認半衰期(即衰減權重從1衰減到0.5的時間長度)為72小時(不同的店鋪分類給予不同的半衰期),使用牛頓冷卻定律,參數計算公式為: 0.5 = 1 × e-α*時間間隔 ,解出α,并帶入下面公式得到實際權重為:$$ w’ = w × e ^{-\alpha × 時間間隔} $$ 其中,w為老權重,w’為新權重。
檢索端排序
檢索端接收到廣告請求,根據當前獲取的用戶ID,從Tair中讀取用戶偏好的店鋪分類,與召回的廣告進行匹配,當廣告分類與召回廣告匹配成功,則可將Tair讀出的分數進行時間衰減后,作為該廣告的最終打分。檢索端采用與實時流同樣的時間衰減方案,以保證一致性。舉例如下:
用戶A在早上8:30有火鍋類搜索行為,Spark Streaming處理后進入Redis,假設此時最新時間戳為8:30,而該用戶在11:00搜索親子類商鋪,Spark Streaming處理該條記錄后,之前的火鍋權重需要衰減,同時時間戳更新為11:00,假設此時立即有廣告檢索請求命中該用戶,則此時用戶火鍋類偏好權重為11:00時權重;假設下午16:00有ADX請求命中該用戶,則用戶火鍋類權重需要根據16:00到11:00的時間間隔繼續衰減。
除了上述三種定向策略,還有其他基于上下文的定向,重定向等,它們方案各異,但大致思路與前述方案類似,本文不再詳述。
在經過上述各類定向場景分別打分之后,需要對每個場景打分進行綜合,因為不同的廣告行業在不同場景下的重要性是不同的。如餐飲行業更注重距離和天氣,而麗人、親子等行業較注重媒體和用戶畫像。因此,不同行業下,各個定向打分的權重是不同的。我們使用模型的方式對各個場景打分進行權重的訓練和預測。
綜合打分我們采用了LR模型,分不同廣告行業,以點擊為樣本,轉化為模型,以各個場景下的前期打分為特征,進行混合打分權重的離線建模。 公式如下:$$h_\theta=g(\theta^{T})=\frac{1}{1+e^{-\theta^{T}x}}$$
其中θ是向量,θ0x0 + θ1x1 + …, + θnxn = \(\sum_{i=0}^n \theta _ix _i={\theta}^Tx\),其中,\(x _1\),…,\(x _n\)是各個場景定向下的具體打分,打分分布在[0,1]之間。
冷啟動時,對每個場景打分給予一個默認權重,積累一定量數據后,使用離線模型訓練出各個廣告行業下的θ向量,并在引擎端加載使用。引擎端加載各個場景的廣告打分,并根據廣告行業加載打分權重,最終完成每個廣告與當前的流量綜合打分。
場景化定向綜合考慮了當前流量的種種場景因素(用戶、天氣、媒體等),分別根據業務需求設計了不同的模型來構建廣告打分機制,并對單個場景的廣告打分進行綜合。通過這種場景化的廣告粗排機制,對召回的廣告進行排序和篩選,可以保留相關性較強的廣告,以用于后續的CTR排序和處理。從實際的A/B testing來看,使用了場景化排序機制的流量,其點擊率和轉化率的提升效果都較為顯著。
展望未來,如何豐富各類場景特征(如天氣、媒體的更多特征),引入更多的場景因素(如所處環境周邊店鋪、當前時間用戶行為等),嘗試不同的模型方案,都是下一步的可探索方向。
- Friedman J, Hastie T, Tibshirani R.(2000), Additive Logistic Regression: A Statistical View of Boosting, Annals of Statistics, 28, 337-307.
美團點評廣告聯盟團隊招聘各類數據挖掘、算法,以及Java后臺開發的技術人才,有興趣的同學可以發送簡歷到suxin03#meituan.com。
馬瑩,美團點評高級算法工程師,2012年畢業于浙江大學,同年加入百度聯盟研發部。2016年加入美團點評聯盟廣告部門,長期從事廣告行業策略算法研究開發工作。專注于計算廣告、用戶畫像、數據挖掘等方向。
一凡,美團點評高級算法工程師,現負責美團點評廣告平臺聯盟廣告網盟方向。2011年畢業于華中科技大學,畢業后先后就職于百度、騰訊,2014年加入點評平臺,2016年加入美團點評聯盟廣告部,長期致力于計算廣告算法優化、推薦算法、大數據挖掘等方向。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的美团点评联盟广告场景化定向排序机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty堆外内存泄露排查盛宴
- 下一篇: LsLoader——通用移动端Web A