竞赛 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的朋友,扫描下方二维码识别关注吧。有什么建议也可以后台留言哦!
