1 正式赛题——文本点击率预估
搜索中一个重要的任务是根据query和title预测query下doc点击率,本次大赛参赛队伍需要根据脱敏后的数据预测指定doc的点击率,结果按照指定的评价指标使用在线评测数据进行评测和排名,得分最优者获胜。
比赛链接:
https://www.kesci.com/home/competition/5cc51043f71088002c5b8840
1.1 比赛数据
sample数据(右键保存下载)
sample样本:query以及对应网页数据的的明文数据,并已经分词为term,term之间空格分割,样本行数3000;这份样本供参赛队伍了解基本的参数数据模式。
说明:所有数据按列分割,分隔符为”,",为不带表头的CSV数据格式。
sample样本格式:
training样本:脱敏后的query和网页文本数据,并已经分词为term并脱敏,term之间空格分割,样本规模初赛1亿,复赛增加到10亿;这份数据主要用于参赛队伍训练模型,制定预估策略。
training 样本示例 : 正赛赛题数据规模比较大,线上运行调试比较慢。为了提高效率,现提供一个 2 万行训练数据样本文件提供给选手在线下进行模型搭建,该文件格式中为线上训练集的前 2 万行数据,与线上训练数据文件格式完全相同。线下的 Notebook 可以导入到 K-Lab 中,利用完整训练集数据进行模型的训练。具体操作如下:
training样本格式:
test样本:脱敏后的query和网页文本数据,并已经分词为term并脱敏,term之间空格分割,样本规模初赛5百万,复赛2千万(与初赛不重复);这份数据用于参赛队伍比赛中模型评估和排名,初赛队伍根据初赛队伍根据初赛排名择优进入复赛;复赛test数据数据仅用于复赛排名,不计入复赛最终成绩。
test样本格式:
最终成绩test****样本:脱敏后的query和网页文本数据,样本规模1亿,样本数据格式与test样本格式相同;这份数据用于复赛队伍的最终成绩评比和排名,不参与比赛过程的排名;数据放出日期为复赛结束前一周。
1.2 选手提交结果
代码语言:javascript复制 对于测试数据“query_id, query, query_title_id, title”,选手提交数据是“query_id, query_title_id, prediction”,提交格式说明如下:
- 对于测试数据:1, 1 2 3, 4,1 4 9
- 提交样例如下(其中第一列为query_id,二列为query_title_id,三列为prediction):
1,1,1 1,2,0.5 1,3,0.49 1,4,0 1,5,0 1,6,0 2,1,1 ...
- 说明:提交数据需要与test样本顺序一致,格式为无表头CSV数据,列之间仅有逗号分隔,没有空格,表中没有任何空行。
- 提交样例下载(右键保存下载)
1.3 评估标准
选手提交结果的评估指标是qAUC,qAUC为不同query下AUC的平均值,计算如下:
其中AUCi为同一个query_id下的AUC(Area Under Curve)。最终使用qAUC作为参赛选手得分,qAUC越大,排名越靠前。
非常感谢国内大佬无私的分享,我们愉快的学习吧~
2 冠军-Progressing 冠军方案
分享链接:
https://www.kesci.com/mw/project/5d9ef1fc037db3002d3f75a3
2.1 解题思路之机器学习
- 机器学习
- 如果将这个题目可以看作:(文本)点击率预估的问题,则可以直接使用机器学习或者数据挖掘的方法来求解,即进行 特征工程 模型优化 的方法
- 另外,由于这是一个中文文本相关的赛题,因此特征工程方面有很多是提取文本相关的特征,因此需要了解一些自然语言处理和中文文本处理的前置知识(比如对句子进行分词的统计、TF-IDF 技术、词的表征方法等,都可以在网上找到相关的资料来学习)
- 特征工程
我们团队主要提取了以下几部分特征:
- 统计特征 query/title 的长度/重复出现的数量,公共词的数量及在 query/title 中的占比和多项式特征,每组 title 长度的最大值最小值和平均值、不同粒度下的 CTR 特征 …
- 距离特征 基于词向量:canberra 距离,曼哈顿距离,欧几里得距离,braycurtis 距离,相关系数 … 基于离散的词:曼哈顿距离,欧几里得距离,jaccard 距离,levenshtein 距离,levenshtein_jaro 距离,汉明距离 …
- 相似度特征 基于词向量:余弦相似度、levenshtein 相似度 … 基于离散的词:余弦相似度、共现词的数量及占比 …
- 语义特征 N-Gram 特征、TF-IDF 特征、首词/末词/词的顺序以及出现位置 …
- 特征选择
- 在这里我们主要使用了过滤法(filter)和包裹法(wrapper),以及结合 LightGBM 的特征重要度(feature_importance)来进行筛选
- 模型建立
- 考虑到本赛题的样本量比较大,因此使用 LightGBM 来建立模型,它计算速度比 XGBoost 更快,而且科赛平台的技术人员已经为我们安装了 GPU 版本的 LightGBM,因此可以使用 GPU 进行加速计算(为科赛的小哥哥小姐姐点赞?)
- 方法小结
- 机器学习模型的上限不高,因为它无法完全利用文本的信息,也许做更加精细的关于文本的特征可能会有更好的效果,但是这种特征是比较难以想到或者不存在的
后面在决赛答辩的时候,了解到其他队伍利用了 BM25 相关度特征和一些自定义的 CTR 特征来提升模型结果
推荐一些文本处理工具库:Levenshtein、Textdistance、Difflib、Fuzzywuzzy 等
下图是部分重要特征分析:
2.2 解题思路之深度学习
- 深度学习
- 将这个题目可以看作:短文本匹配 点击率预估 的问题。使用深度学习的方法可以更好的捕捉到词/句子/段落/文本之间的关系,关键的一点就是找到对每个 term(本赛题是将每个词划分为term)的表示(比如词向量),再搭建深度神经网络来训练样本,从而得到不同文本之间(query和title)的相关程度
- 而且本次比赛的数据量比较大,达到了上亿级别,因此也特别适合使用深度学习方法来进行建模
- 词的表征方法
- 词的表示方法有很多,主要是要考虑到不同词向量的适用场景和训练效率。fasttext 的训练速度很快、效果也不错,但由于这是一个脱敏的文本,因此其 subword 机制会受到一定影响;而目前很火的 BERT 预训练模型也无法使用,因为需要重新对这些脱敏后的 term 进行训练,而 BERT 的参数量太大,GPU 资源又有限,因此重新训练 BERT 是不可行的 …
- 于是我们队伍最终使用了经典的 word2vec 来训练词向量(有一些文本是重复的,因此可以考虑去重后加速训练速度),这是一种静态的词向量表示方法,但对于这个比赛来说已经足够了。训练使用是 gensim 库的 word2vec。其中,数据量是训练集的全部数据(使用迭代方式来训练,否则可能会因为内存不够而导致训练失败),词向量维度:300,滑动窗口大小:5,最小词频数:3,训练轮数:5,训练方式:skip-gram
- 其实,对词的表征方法还可以使用不同词向量来组合表示,比如将 word2vec 和 fasttext 训练出的词向量进行加权求和,或者直接将这两种词向量进行横向拼接,来形成一个维度更大的词向量。这种操作方式,在某些任务上可能会取得更好的效果
- 深度神经网络
- 在深度学习方面,我们最先直接使用深度学习模型来进行训练,但发现模型训练时 loss 比较高,无论是调节学习率、更换优化器还是增加数据量等,loss 都无法明显降低。直到后面在讨论区受到一些大佬的指点,发现在深度神经网络中融合其他特征,可以使得模型训练的 loss 进一步降低,从而学习到更多的信息
- 主要尝试了 伪孪生网络 和 ESIM 模型。(伪)孪生网络的训练速度比较快,效果也还不错。而 ESIM 由于采用了 attention 机制将句子对齐,可以更好的学习到句子之间的语义关系,从而可以很好地进行匹配,效果相比于孪生网络的效果提升不少,但训练的时间开销也更大。然后,我们团队也对 ESIM 做了一些定制化的改进,在提升模型效果的同时减少时间开销
- 模型训练的一些细节:batch size 为 512(考虑到显存大小),学习率随着 epoch 增加递减,优化器为 Adam,以及对句子使用了动态padding的操作等
Image Name
- 模型集成
- 为了尽可能地利用数据量,我们以每 1 亿或 2 亿数据来训练一个模型,挑选出每1亿或2亿中训练效果最好的模型来进行模型融合,最终使用了约 8 亿数据,使用效果最好的几个模型,并根据线上的结果来进行线性加权融合,以尽可能来降低模型在最终测试集上的泛化误差
- 下图是深度学习模型效果与数据利用率一种可能的关系
Image Name
2.3 比赛总结
- 需要注重细节:对比赛赛题有清晰的认识,将会直接关系到最后的成绩。像这种数据集比较大的比赛,更需要合理安排资源(比如内存、显存资源)和时间(可以使用一些多进程等其他技术来提高设备的利用率),如果有需要可以列一个详细的计划安排表,还可以另外建立一个文档来记录团队已完成和待完成的事项
- 比赛过后,发现机器学习、深度学习的基础知识以及对一些框架地熟练使用对于做比赛是至关重要的,还有对一些最新前沿技术的了解与应用很多时候就是提升比赛成绩的关键
- 在这个比赛学习到了很多关于深度学习和自然语言处理的知识,也结交了一些朋友,一个团队良好的沟通对于比赛成绩的提高是至关重要的
3 亚军方案- 第2名-蜗牛本牛
分享链接:
https://github.com/srtianxia/BDC2019_Rank2
4 季军方案-鸡你太美
分享链接:
https://github.com/ShusenTang/BDC2019
5 总结与发现
- 我们可以看到前排的算法尝试了GBDT与NN模型,并且融合之后分数提升很大
- 作为LightGBM的模型的输入可以与序列表示一块作为NN模型的输入,提升较大
- 大家应该对短文本匹配的利器 ESIM很熟悉吧,不熟悉的同学可以阅读下论文: Enhanced LSTM for Natural Language Inference
https://arxiv.org/pdf/1609.06038.pdf
- 延伸阅读:DSSM 深度语义匹配模型
微软论文:https://www.microsoft.com/en-us/research/project/dssm/
代码和PPT回复公众号“ChallengeHub”关键字:文本点击率
获取