競賽 KDD Cup:Multimodalities Recall Baseline (0.554)
- 2020 年 4 月 25 日
- AI
Hi,大家吼呀!這裡是糖葫蘆喵喵~!
萬眾矚目一年一度的KDD Cup又開賽辣,今天給大家帶來的是KDD Cup 2020 Challenges for Modern E-Commerce Platform: Multimodalities Recall賽道的Baseline思路與開源方案。文末有獲取開源程式碼地址的方法(將於4月25日發布)。
比賽傳送門:
Multimodalities Recall-天池大賽-阿里雲天池
Part 1 任務描述
隨著全球電商的快速發展,越來越多的電子商務和零售公司都通過利用搜索和推薦系統來提高其銷售目標。消費者在電商品台進行消費時,最關注的莫過於商品的圖片和文本資訊。如果能夠對商品的影像和文本進行準確的檢索與召回,消費者在消費時將能夠做出更好的決策。
本賽題給出淘寶網站上大量搜索文本(query)和其對應商品圖片(image)作為訓練數據,選手通過訓練數據構建模型,判斷測試數據中的搜索文本(query)和商品圖片(image)是否對應。本質是一個跨模態檢索(cross-modal retrieval)問題。

賽題採用nDCG@5作為評測指標,nDCG即歸一化折損累計增益(Normalized Discounted Cummulative Gain),是推薦系統中的一個常用指標,具體原理見梁勇:推薦系統遇上深度學習(十六)–詳解推薦系統中的常用評測指標,這裡不再贅述。指標計算請參考:
Part 2 數據分析
賽題給了整整3M的訓練數據(均為正樣例),解壓後大約300G。因此數據無法全部讀入,我們採用指定chunksize,這時讀入變成了一個生成器,便於後續處理:
train = pd.read_csv(TRAIN_PATH,sep='\t', chunksize=100000, quoting=csv.QUOTE_NONE)
為了節省空間部分欄位是base64編碼,需要重新轉換:
def convertBoxes(num_boxes, boxes):
return np.frombuffer(base64.b64decode(boxes), dtype=np.float32).reshape(num_boxes, 4)
def convertFeature(num_boxes, features,):
return np.frombuffer(base64.b64decode(features), dtype=np.float32).reshape(num_boxes, 2048)
def convertLabel(num_boxes, label):
return np.frombuffer(base64.b64decode(label), dtype=np.int64).reshape(num_boxes)
轉換後數據格式如圖:

每條數據代表一個查詢query,以及對應的image,image給出其寬w高h,以及通過目標檢測演算法獲得的box位置及其2048維特徵,並且每個box有一個label指明這個box所屬類別。
3M訓練集均為正樣例,也就是說我們要自行構造負樣例。
驗證集約500條query共14720條數據,valid_answer給出每個驗證集query的候選5個商品id。測試集約1000條query共17428條數據,我們需要計算出每個query的候選5個商品id進行提交。
我們統計了下訓練集中query長度與box個數,如下圖:

可以看到query大部分在5個左右,最長21。box的數量也大部分在5個左右。
Part 3 Baseline模型思路
跨模態檢索通常有兩種思路:
- 將不同模態數據映射到同一特徵空間,從而計算不同模態數據之間的可解釋距離(相似度)
- 將不同模態數據映射到不同特徵空間,然後通過隱層交互這些特徵學習到一個不可解釋的距離函數
通常來講,第一個方法無需構造負樣本,計算量小,適合在線使用;而第二種方法交互了特徵,效果較好,但需構造負樣本,計算開銷很大。這裡我們採用第二種方法來構造baseline:

這裡我們一共構造了四個輸入:
- query:(None, Max_Q_Len)文本
- box feature:(None, Num_Box, 2048) box特徵
- box label:(None, Num_Box,Max_L_Len) label對應的文本
- box pos:(None, Num_Box, 5)box坐標轉化的位置特徵(x1/w, y1/h, x2/w, y2/h, (x2-x1)(y1-y2)/(w*h))
整體流程如下:
- 文本部分為query通過bert和自定義embedding後拼接,形成query的表示;
- 影像部分我們首先將多個Box的label轉化為單詞表示,這樣構造了label序列,通過共享參數的embedding形成label序列的表示;
- 針對影像特徵,我們同樣的將多個box視為一條序列,這樣可以用類似NLP的方法進行統一處理:將box feature序列與box pos序列映射到同一緯度後相加,得到box序列的表示;
- box序列的表示和label序列的表示拼接構成image的表示;
- query的表示與image的表示進行交互,最後二分類。
在構造序列表示的時候,我們有多種選擇,如BiLSTM、Conv1D等,請大家自行嘗試。
同樣,最後兩種表示進行相互交互的方式也有很多種,拼接、求和、Attention等。
負樣本構造:我們簡單的在每一個batch中隨機取樣等量的負樣本。
更多模型與訓練細節請參考開源程式碼。
該方案目前線上能得到0.554左右的分數(僅使用了1/4的訓練數據)。
組隊邀請:
由於本賽題非常吃伺服器性能,歡迎有512G記憶體 P100以上配置的大佬來一起組隊!!!
(開源程式碼將於4月25日發布)
關注微信公眾號AILIGHT並回復:AILIGHT-KDD Cup Multimodalities Recall 獲取開源程式碼地址鏈接。
還沒有關注AILIGHT的朋友,掃描下方二維碼識別關注吧。有什麼建議也可以後台留言哦!
