【複賽前排分享(三)】高手上場第一招,這些賽事技巧你掌握了嗎?
- 2020 年 12 月 16 日
- AI
2020騰訊廣告演算法大賽複賽已經落幕,決賽答辯終極一戰即將在8月3日14:00深圳騰訊濱海大廈舉行,了解決賽詳情並預約直播觀賽,請點擊:
外部賽場戰況激烈,騰訊公司也聯合碼客開啟了面向員工的內部賽道。在這次複賽前排分享會,我們邀請到了名列複賽內部榜第三的Embedding團隊。在破解本次賽題的過程中,他們不僅實現了自己的解決方案,還解鎖了許多賽事技巧。接下來,就讓Embedding的思路引領我們走向破題的關鍵吧!
01 賽題解讀
本屆騰訊廣告演算法大賽的複賽題目是用戶畫像,即根據用戶點擊廣告的序列預測用戶的年齡和性別。
02 答題概況&技巧
本次比賽我們組使用了純Transformer架構,另外訓練了基於聯合ID的詞向量嵌入方案,在複賽A榜中,基於Skip Gram的詞向量6輸入20折模型可獲得1.474的分數,加上聯合ID詞向量後能達到1.476,在B榜中為1.478。
再給大家分享一些我們總結的本次賽事技巧:
1) transformer學習率要小,並且隨著epoch的增加,可適當降低學習率。
2) 模型中間層的結果可以concat的方式拼接到一起,供最後全連接層使用。
3) creative_id關聯起來的多個屬性ID可以通過聯合學習的方式生成詞向量,能進一步提升模型性能。
4) transformer結構多折融合收益顯著。
03 數據準備&預處理
將初賽訓練集、測試集和複賽訓練集解壓縮到input文件夾,生成的詞向量和合併後的數據文件也都存儲在input文件夾中,model文件夾為存儲訓練過程中保存的模型文件。
之後對數據進行預處理:
- ad.csv: product_id, industry中的\\N替換成0,然後所有值+1。
- ad.csv, click_log.csv連接:以creative_id為基礎將兩張表合併,將初賽數據集、複賽數據集合併,並按照'user_id', 'time'排序。
- hdf文件保存:
train_click_log
test_click_log
train_user
- 生成訓練、測試jsonl數據集:對每個user,生成:
{'user_id': user_id, 'labels': [age, gender], 'time': [], 'creative_id': [], 'click_times': [], 'ad_id': [], 'product_id': [], 'product_category': [], 'advertiser_id': [], 'industry': []}
- 生成skip gram詞向量訓練數據集:對於每個用戶的以下序列,寫入到文件中:
'creative_id'
'ad_id'
'product_id'
'product_category'
'advertiser_id'
'industry'
- 生成joint id詞向量訓練數據集:將jsonl中的'user_id','labels','time','click_times'刪除後,形成joint id數據集。
04 訓練詞向量
- skip gram詞向量:使用gensim,參數為:
`gensim.models.Word2Vec(sentences, size=128, window=20, min_count=1, workers=24, iter=10, sg=1, negative=20, sample=1e-3)。`
- joint id 詞向量:模仿KDD18論文——
//arxiv.org/pdf/1712.08289.pdf
對creative_id生成128維詞向量,訓練分為兩個階段:第一階段以0.004的學習率訓練5輪,第二階段以0.001的學習率學習3輪。
05 Transformer模型
1)特徵
共使用了6個ID類特徵:
creative_id
ad_id
product_id
advertiser_id
industry
product_category
其中creative_id、ad_id在輸入階段已經轉化成了詞向量embedding特徵。creative_id轉換的特徵有兩個:
joint_in_creative_emb
creative_id_emb
ad_id轉化的特徵為ad_id_emb。以下四個ID使用pytorch預先載入權重:
product_id
advertiser_id
industry
product_category
並且Embedding層也參與訓練。
2)模型結構
每個ID單獨Embedding後使用一層稀疏Transformer模型SinkhornTransformer進行Encoder編碼,形成7個BatchSize * MaxLength * EmbbedingSize的序列。
然後在Embbeding維度Concat到一起,使用兩個新的SinkhornTransformer依次進行Encoder編碼。
最後將Embedding層、3個SinkhornTransformer層分別進行MaxPooling,形成BatchSize * (EmbbedingSize * 28)的矩陣,然後分別接一個2分類和10分類的全連接層。
3)運行參數
- 嵌入維度:128
- 最大序列長度:128
- 批大小:128
- Epoch:3
- 學習率:每個Epoch的學習率分別是1e-4, 6e-5, 1e-5。
- 模型保存:每個Epoch分別每隔10000,8000,4000步保存一次,20折交叉驗證時可取48000步的模型作為最終模型使用。
06 多折結果融合
對20折產生的模型,依次進行預測,將分類結果softmax後,將20個結果相加,取值最大的所在索引,+1後得到最終提交文件。
感謝Embedding團隊的分享。緊張的實戰中技巧常常是取勝的關鍵,這也是Embedding的取勝法寶之一。希望選手們在決賽答辯時也能善於找到自己的優勢,展現出自己的最佳狀態!
8月3日14:00騰訊廣告演算法大賽決賽即將啟幕,演算法王者巔峰對決,為你帶來演算法與技術激烈碰撞的盛筵。快點擊【文末鏈接】,掃描報名頁面底部二維碼,預約線上直播觀賽吧!
同時,歡迎選手們到「官網---個人資訊」頁面上傳簡歷。加入騰訊,就趁現在!
掃碼加入大賽官方QQ群
或搜索群號:1094257162
和小夥伴一起解鎖更多內容

點擊下方鏈接,預約直播觀賽:
2020騰訊廣告演算法大賽