最终成绩:12 / 10000+
比赛地址:https://algo.qq.com/index.html
源码:https://github.com/LogicJake/Tencent_Ads_Algo_2020_TOP12

今年腾讯赛一改往年机器学习为主流的状况,纯 id 数据导致特征工程的发力点弱化,整场比赛变成了一场深度学习比拼。不过感谢腾讯提供的机器(Tione真香),降低了参与门槛。

赛题背景

本届算法大赛的题目来源于一个重要且有趣的问题。众所周知,像用户年龄和性别这样的人口统计学特征是各类推荐系统的重要输入特征,其中自然也包括了广告平台。这背后的假设是,用户对广告的偏好会随着其年龄和性别的不同而有所区别。许多行业的实践者已经多次验证了这一假设。然而,大多数验证所采用的方式都是以人口统计学属性作为输入来产生推荐结果,然后离线或者在线地对比用与不用这些输入的情况下的推荐性能。本届大赛的题目尝试从另一个方向来验证这个假设,即以用户在广告系统中的交互行为作为输入来预测用户的人口统计学属性。我们认为这一赛题的“逆向思考”本身具有其研究价值和趣味性,此外也有实用价值和挑战性。例如,对于缺乏用户信息的实践者来说,基于其自有系统的数据来推断用户属性,可以帮助其在更广的人群上实现智能定向或者受众保护。与此同时,参赛者需要综合运用机器学习领域的各种技术来实现更准确的预估。

赛题内容

数据

在比赛期间,主办方将为参赛者提供一组用户在长度为 91 天(3 个月)的时间窗口内的广告点击历史记录作为训练数据集。每条记录中包含了日期(从 1 到 91)、用户信息(年龄,性别),被点击的广告的信息(素材 id、广告 id、产品 id、产品类目 id、广告主id、广告主行业 id 等),以及该用户当天点击该广告的次数。测试数据集将会是另一组用户的广告点击历史记录。

评价指标

大赛会根据参赛者提交的结果计算预测的准确率(accuracy)。年龄预测和性别预测将分别评估准确率,两者之和将被用作参赛者的打分。测试数据集会和训练数据集一起提供给参赛者。

建模

不管是平时赛题群交流,还是赛后的前排方案开源,核心解题思路基本一致:先利用 word2vec 对数据中的各列 id 进行表示学习,然后对用户的广告点击序列进行建模。在建模步骤,可以尝试 LSTM,Transformer,Bert 甚至 CNN。相较于鱼佬的巨无霸 Bert 模型,我们团队走的是小模型融合路线。我用 pytorch 进行建模,其他两个队友使用 Keras 建模并尝试传统的机器学习方案(特征工程+Lightgbm)。利用深度学习框架差异性,输出差异性,输入差异性甚至优化器的差异性来提高融合效果。

以产品 id 为例,将用户点击过的产品 id 按照点击日期排序,得到相对有序的产品 id 序列。将每个用户的点击产品 id 序列视为句子,输入到 word2vec 模型学习每个产品 id 的表示。用户的点击序列不定长,可以使用 keras 的 pad_sequences,对长截断对短补全,使得同一 id 下的用户序列长度相等。至此完成数据预处理,后面就是搭建一个序列分类模型,整体网络结构如图1所示。

其中各个 id 的 embedding 层使用 word2vec 得到的预训练向量填充,并在模型训练过程中冻结。剩下的主要任务就是调参,自己本身也是个深度学习入门选手,所以也是边学习边尝试,以下是总结的从腾讯赛学到的调参思路和 trick:

通用

  • Embedding 维度
  • 序列截取的最大长度的选择
  • 预训练模型 Word2Vec 的参数选择:window,min_count…
  • 序列处理时是否需要筛掉低频 id
  • 优化器 optimizer 的选择,可以尝试一些最新的,比如 ranger
  • 激活函数的选择:mish…
  • 学习率衰减,比如:ReduceLROnPlateau

LSTM

  • units 的大小
  • 堆叠多少层 LSTM layer

CNN

  • filter_size 除了 3,4,5 还可以更大吗
  • num_filters 大小

Transformer

  • 学习率小一点
  • head_num 大小
  • 堆叠层数

融合

stacking

使用了两种 stacking 方式:

纯概率特征 stacking:将各个模型跑出来的概率分层进入 DNN (如 keras 产生的概率与 keras 产生的概率合并,torch 概率与 torch 概率合并, keras 概率先进入, torch 在 keras 概率经过了几层全连接之后再 concat, 实验证明这种做法可以避免相关性较高的概率带来的融合不利影响), 五折线上分数大概为 0.525

混合特征 stacking: 在采用了两 id 序列输入的 transformers 模型基础上,在最后经过全连接层之前跟上面的九个相关性较低的模型进行 concat, 起到类似于残差的作用,避免过拟合, 五折线上分数为 0.523

blending

Age

比赛结束前一周我们使用了 huggingface transformers 重新实现了 transformer + LSTM 模型, 五折分数为 0.519, 而且相关度与之前实现的 keras 和 torch 都较低, 只有 0.93,0.94 左右 (相比 keras 之间的相似度高达 0.98, torch 之间相似度 0.96), 所有我们单独将这个模型与上面所生成的两个 stacking 模型进行融合,取得 0.52780 线上分数:

0.50 * DNN_stacking + 0.15 * transformer_stacking + 0.35 * age_m13

Gender

Gender 主要是三个 transformer 模型进行基本均等的融合:线上分数 0.95048

0.35 * gender_m1 + 0.35 * gender_m2 + 0.30 * gender_m3

总结

第一名方案使用了 Bert 预训练模型,而与这次腾讯赛建模思路比较相似的另外一场比赛——零基础入门NLP - 新闻文本分类,第四名方法也使用了 Bert 模型,后面要自己尝试一下,对比一下实验效果。

时间太久了,好多细节都记不清楚了,以后还是比赛结束就写总结比较好。

参考资料