2020騰訊廣告演算法大賽方案分享(冠軍)
本文轉載自知乎,作者:魚遇雨欲語與余
2019年冠軍選手成功衛冕!!!
程式碼地址://github.com/guoday/Tencent2020_Rank1st
從初賽冠軍、複賽冠軍,然後到最佳答辯,一路披荊斬棘,再次感謝隊友(中山大學微軟亞洲研究院聯合培養博士生郭達雅、多次榮獲中國NLP和數據挖掘比賽top名次選手梁少強,賽圈id「大白」)。
本文將給出冠軍核心方案,全文內容架構將依託於答辯PPT,希望這篇分享能夠給予你更多的啟發。
下面就讓跟隨我一起探索這榮獲最高嘉獎的方案 !
賽題介紹
本屆演算法大賽的題目來源於一個重要且有趣的問題。眾所周知,像用戶年齡和性別這樣的人口統計學特徵是各類推薦系統的重要輸入特徵,其中自然也包括了廣告平台。這背後的假設是,用戶對廣告的偏好會隨著其年齡和性別的不同而有所區別。許多行業的實踐者已經多次驗證了這一假設。然而,大多數驗證所採用的方式都是以人口統計學屬性作為輸入來產生推薦結果,然後離線或者在線地對比用與不用這些輸入的情況下的推薦性能。本屆大賽的題目嘗試從另一個方向來驗證這個假設,即以用戶在廣告系統中的交互行為作為輸入來預測用戶的人口統計學屬性。我們認為這一賽題的「逆向思考」本身具有其研究價值和趣味性,此外也有實用價值和挑戰性。例如,對於缺乏用戶資訊的實踐者來說,基於其自有系統的數據來推斷用戶屬性,可以幫助其在更廣的人群上實現智慧定向或者受眾保護。與此同時,參賽者需要綜合運用機器學習領域的各種技術來實現更準確的預估。
賽題理解
1.數據
在比賽期間,主辦方將為參賽者提供一組用戶在長度為 91 天(3 個月)的時間窗口內的廣告點擊歷史記錄作為訓練數據集。每條記錄中包含了日期(從 1 到 91)、用戶資訊(年齡,性別),被點擊的廣告的資訊(素材 id、廣告 id、產品 id、產品類目 id、廣告主id、廣告主行業 id 等),以及該用戶當天點擊該廣告的次數。測試數據集將會是另一組用戶的廣告點擊歷史記錄。
2.目標
提供給參賽者的測試數據集中不會包含這些用戶的年齡和性別資訊。本賽題要求參賽者預測測試數據集中出現的用戶的年齡和性別,並以約定的格式提交預測結果。
3.評價指標
大賽會根據參賽者提交的結果計算預測的準確率(accuracy)。年齡預測和性別預測將分別評估準確率,兩者之和將被用作參賽者的打分。測試數據集會和訓練數據集一起提供給參賽者。大賽會將測試數據集中出現的用戶劃分為兩組,具體的劃分方式對參賽者不可見。其中一組用戶將被用於初賽和複賽階段除最後一天之外的排行榜打分計算,另一組則用於初賽和複賽階段最後一天的排行榜打分計算,以及最後的勝出隊伍選擇。
特徵工程
1.統計特徵
-
用戶出現的總次數和天數
-
用戶點擊廣告的總次數
-
用戶點擊不同廣告、產品、類別、素材、廣告主的總數
-
用戶每天每條廣告點擊的平均次數,均值和方差
2.概率分布特徵
簡單的理解就是五折交叉的target encoding 得到每個該廣告實體對應的性別年齡資訊,按用戶點擊廣告實體進行聚合統計。在此次比賽中我們僅使用了這兩組特徵,但在比賽過程中我們也進行了大量的特徵工程嘗試,比如tfidf+stacking、word2vec、deepwalk等特徵,或者各類聚合統計。
模型介紹
先來看下模型框架部分,主要分為三個部分。
BERT—Bidirectional Encoder Representation From Transformer
首先是bert部分,假設每個廣告為一個單詞,將用戶點擊序列看作一句話,這樣就將問題轉為了NLP的文本分類問題。我們使用bert作為我們的encoder進行編碼,這裡我們使用了12層transformer。每層transoformer將上一層的隱變數作為輸入,經過Multi-Head Self Attention和Layer Norm等,最後輸出交互更高的隱變數。我們知道bert在NLP取得巨大成功的原因主要是預訓練,所以在比賽初期不斷嘗試將預訓練運用到本賽題中。但與NLP不同,廣告具有稀疏性,使其詞表達到七八百萬,這裡會造成兩個問題。第一個問題是這麼大的詞表很難放入GPU中,第二個問題是即使放到CPU,由於參數過大,也難於訓練。針對這些問題,我們使用了兩階段的預訓練方法對BERT進行訓練。
預訓練—Word2Vector
第一階段是使用word2vec去預訓練廣告的embedding,目標是將類似的廣告進行聚類,具體操作如下圖所示,將用戶點擊廣告序列輸入到embedding層,然後預測廣告id。但這裡會存在兩個問題,首先是我們只使用了一個廣告去預測另一個廣告,並沒有使用更多的廣告進行預測,因此缺失了更多的上下文資訊。其次是沒有利用廣告本身的屬性進行預測,比如類別資訊,或者年齡性別資訊。比如給定該廣告是一個遊戲類型的廣告,那麼就更容易預測出當前廣告,同時也鼓勵模型結合最近點擊的廣告和當前廣告的屬性進行預測,從而對齊廣告id及其屬性的embedding。
預訓練—Masked Language Modeling (MLM)
鑒於以上問題,我們對Masked Language Modeling(MLM)進行改進,原始的MLM是直接mask掉整個廣告包括屬性,但我們只mask廣告的一部分(廣告id或者屬性)。具體地,我們隨機mask掉20%的token,mask後的位置使用0向量來代替,或者取樣一個屬性id來替換。使用改進的MLM預測這些廣告的時候,不僅可以使用最近點擊的廣告,也可以用它的屬性去預測,使得不同屬性的embedding能夠在語義空間上對齊。同時,我們也採用了一個很關鍵的策略,我們把詞表縮小到10萬(提取top10w,其餘為unk),這樣使得bert能跑起來。對於原始的MLM,我們也嘗試過,雖然有提高但提高不是很大。
最後預測這些id的時候,不僅可以使用之前之後點擊的廣告,也可以用它的屬性去預測。
融合層—Fusion Layer
把點擊廣告的受眾人群性別年齡分布融入到網路之中,具體的做法是把人群分為五個部分,假設用戶點擊n個廣告並來自第一個人群,那麼可以把剩下的作為種子人群,計算出每個廣告的性別年齡概率分布,用四層的transformer進行融合。
輸出層
結果與分析
初賽階段
2020-5-21: 使用BERT
2020-5-27: 調整BERT的參數,鎖定A榜冠軍
2020-6-03: 調整學習策略,使用warmup調整學習率,學習率先增後減
2020-6-12: 模型融合
2020-6-22: 切換B榜
複賽階段
2020-6-26: 復現初賽模型
2020-6-30: 引入Fusion Layer, 鎖定A榜冠軍
2020-7-21: 模型融合
2020-7-22: 切換B榜
思考與總結
主要創新
-
改進BERT並運用到人口屬性預測場景
分階段預訓練,緩解廣告稀疏性問題並加快預訓練速度 (4*V100 預訓練12個小時)
改進MLM預訓練目標,並從多維度學習廣告及其屬性的語義表示
將BERT運用到人口屬性預測的場景,從性能上驗證了預訓練在廣告領域的潛力
• 提出融合概率分布的方法及模型
利用受眾人群求出每個廣告的概率分布
利用多層Transformer融合概率分布及BERT的語義表示,能有效提升性能
問題思考
-
預訓練模型越大越好?
-
如何進一步改善預訓練模型?
預訓練目標支援圖輸入的預訓練模型廣告稀疏性問題,例如在未脫敏的情況下使用BPE演算法
總結
歷時兩個半月的騰訊廣告大賽,非常感謝工作人員辛苦的答疑。感謝主辦方提供真實的業務場景與數據,讓我們能在比賽中學習到更多知識,在廣告業務中做更多嘗試。