Transformer一下摘走50万!2020腾讯广告算法比赛冠军(附代码方案)

2020 年 8 月 7 日 专知

在2020腾讯广告算法大赛中,DYG站队以Transformer为核心的 BERT模型框架摘得冠军,摘走50万!



本届比赛的冠军团队 DYG 战队最终捧走了 7 万美金(近 50 万人民币)的高额大奖。团队成员包括武汉大学计算机科学硕士、算法工程师王贺,中山大学 - 微软亚洲研究院联合培养博士生郭达雅,以及多次荣获国内 NLP 和数据挖掘比赛 TOP 名次的梁少强。值得一提的是,前两位选手同时也是 2019 年腾讯广告算法大赛的冠军得主,某种程度上,该战队也算是卫冕成功。


在 BERT 部分,假设每个广告为一个单词,将用户点击序列看作一句话,这样就可以将问题转为 NLP 文本分类问题。「我们使用 BERT 作为 Encoder 进行编码,在这里使用 12 层 Transformer。每层 Transformer 将上一层的隐变量作为输入,经过 Multi-Head Self Attention 和 Layer Norm 等,最后输出交互更高的隐变量。」王贺介绍道。

不过,预训练方虽然在 NLP 领域里获得成功,但在广告任务中词表高达七八百万的场景下,存在因数据稀疏而存在参数量过大且难以训练的问题。针对这些挑战,DYG 团队使用了两阶段预训练的方法对 BERT 进行训练,其中第一阶段使用 word2vec 预训练广告的 embedding,目标是将类似的广告进行聚类。在第二阶段,这一团队采取了很关键的策略:把词表缩小到 10 万(提取 top10w,其余为 unk),从而使得 BERT 可以在四块 Tesla V100 上运行起来。

最后,DYG 战队把点击广告的受众人群性别年龄分布融入到网络之中:通过将训练集分成五个部分(其中四个部分有标签),假设用户点击 n 个广告并来自第一个人群,那么就可以把剩下的作为种子人群,计算出每个广告点击者的性别年龄分布,用四层 transformer 进行融合。


方案代码

https://github.com/guoday/Tencent2020_Rank1st

赛题介绍-广告受众基础属性预估

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

1. 环境配置

  • Pytorch

  • Linux Ubuntu 16.04, 256G内存,4*p100

  • pip install transformers==2.8.0 pandas gensim scikit-learn filelock gdown

2. 模型介绍


3. 低配置资源建议

1)内存不足或者只是想简单跑下完整代码,请只使用初赛数据:

去掉src/prepocess.py的8, 15, 22行

2)如果显存不足,请下载10中的bert-small模型,并调整batch size

4. 运行完整过程

可运行以下脚本,运行整个过程并生成结果。或按照3-7节的说明依次运行。

bash run.sh

5. 数据下载

通过该网站下载数据集到data目录,或运行下面的命令进行下载

gdown https://drive.google.com/uc?id=15onAobxlim_uRUNWSMQuK6VxDsmGTtp4
unzip data.zip
rm data.zip

6. 数据预处理

合并所有文件,并分为点击记录文件(click.pkl),用户文件(train_user.pkl/test_user.pkl)

python src/preprocess.py

7. 特征提取

python src/extract_features.py

8. 预训练 Word2Vector 与 BERT

这里提供两种方式获得预训练权重: 重新预训练或下载预训练好的权重

注: Word2Vector和BERT权重必须一致,即要么全部重新预训练,要么全部下载

1) 预训练Word2Vector

预训练word2vector

python src/w2v.py

或下载预训练好的W2V

gdown https://drive.google.com/uc?id=1SUpukAeXR5Ymyf3wH3SRNdQ3Hl2HazQa
unzip w2v.zip
cp w2v/* data/
rm -r w2v*

2) 预训练BERT

预训练BERT (如果GPU是v100,可以安装apex并在参数上加--fp16进行加速)

cd BERT
mkdir saved_models
python run.py \
--output_dir saved_models \
--model_type roberta \
--config_name roberta-base \
--mlm \
--block_size 128 \
--per_gpu_train_batch_size 64 \
--per_gpu_eval_batch_size 64 \
--gradient_accumulation_steps 1 \
--learning_rate 5e-5 \
--weight_decay 0.01 \
--adam_epsilon 1e-6 \
--max_grad_norm 1.0 \
--max_steps 100000 \
--mlm_probability 0.2 \
--warmup_steps 10000 \
--logging_steps 50 \
--save_steps 10000 \
--evaluate_during_training \
--save_total_limit 500 \
--seed 123456 \
--tensorboard_dir saved_models/tensorboard_logs
rm -r saved_models/bert-base
cp -r saved_models/checkpoint-last saved_models/bert-base
rm saved_models/bert-base/optimizer.pt
cp saved_models/vocab.pkl saved_models/bert-base/vocab.pkl
cd ..

或下载预训练好的BERT-base

gdown https://drive.google.com/uc?id=1ToAJwl_oRAeRNyYF_FK0B2APVXlPFTlq
unzip bert-base.zip
mv bert-base BERT/
rm bert-base.zip

9. 训练模型

mkdir saved_models
mkdir saved_models/log
for((i=0;i<5;i++));
do
python run.py \
--kfold=5 \
--index=$i \
--train_batch_size=256 \
--eval_steps=5000 \
--max_len_text=128 \
--epoch=5 \
--lr=1e-4 \
--output_path=saved_models \
--pretrained_model_path=BERT/bert-base \
--eval_batch_size=512 2>&1 | tee saved_models/log/$i.txt
done

合并结果,结果为submission.csv

python src/merge_submission.py

10. 不同规模的预训练模型

由于此次比赛融合了不同规模大小的预训练模型,在此也提供不同规模的预训练模型:

BERT-small, BERT-base, BERT-large, BERT-xl

其中bert-base效果最好

#bert-small
gdown https://drive.google.com/uc?id=1bDneO-YhBs5dx-9qC-WrBf3jUc_QCIYn
#bert-base
gdown https://drive.google.com/uc?id=1ToAJwl_oRAeRNyYF_FK0B2APVXlPFTlq
#bert-large
gdown https://drive.google.com/uc?id=1yQeh3O6E_98srPqTVwAnVbr1v-X0A7R-
#bert-xl
gdown https://drive.google.com/uc?id=1jViHtyljOJxxeOBmxn9tOZg_hmWOj0L2


参考链接:

https://mp.weixin.qq.com/s/VubpANA35eBJmcgE58Hehg


专知便捷查看

便捷下载,请关注专知公众号(点击上方蓝色专知关注)

  • 后台回复“TB50” 可以获取《2020腾讯广告算法比赛冠军方案》专知下载链接索引

专 · 知
专知,专业可信的人工智能知识分发,让认知协作更快更好!欢迎注册登录专知www.zhuanzhi.ai,获取5000+AI主题干货知识资料!
欢迎微信扫一扫加入专知人工智能知识星球群,获取最新AI专业干货知识教程视频资料和与专家交流咨询
点击“阅读原文”,了解使用专知,查看5000+AI主题知识资料
登录查看更多
0

相关内容

【ACMMM2020】小规模行人检测的自模拟学习
专知会员服务
9+阅读 · 2020年9月25日
【KDD2020-UCLA-微软】GPT-GNN:图神经网络的预训练
专知会员服务
61+阅读 · 2020年8月19日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
NLP基础任务:文本分类近年发展汇总,68页超详细解析
专知会员服务
57+阅读 · 2020年1月3日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
2019腾讯广告算法大赛方案分享(冠军)
大数据技术
12+阅读 · 2019年8月26日
字节跳动 2019 ICME 双赛道冠军团队方案分享
PaperWeekly
50+阅读 · 2019年8月12日
干货 | 各大数据竞赛 Top 解决方案汇总
AI科技评论
12+阅读 · 2018年11月12日
搜狐图文匹配算法大赛_方案分享
数据挖掘入门与实战
7+阅读 · 2018年2月23日
干货:手把手教你在音频分类DCASE2017比赛中夺冠
全球人工智能
15+阅读 · 2017年9月22日
Arxiv
15+阅读 · 2020年2月5日
SlowFast Networks for Video Recognition
Arxiv
4+阅读 · 2019年4月18日
Universal Transformers
Arxiv
5+阅读 · 2019年3月5日
VIP会员
相关VIP内容
【ACMMM2020】小规模行人检测的自模拟学习
专知会员服务
9+阅读 · 2020年9月25日
【KDD2020-UCLA-微软】GPT-GNN:图神经网络的预训练
专知会员服务
61+阅读 · 2020年8月19日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
NLP基础任务:文本分类近年发展汇总,68页超详细解析
专知会员服务
57+阅读 · 2020年1月3日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
相关资讯
2019腾讯广告算法大赛方案分享(冠军)
大数据技术
12+阅读 · 2019年8月26日
字节跳动 2019 ICME 双赛道冠军团队方案分享
PaperWeekly
50+阅读 · 2019年8月12日
干货 | 各大数据竞赛 Top 解决方案汇总
AI科技评论
12+阅读 · 2018年11月12日
搜狐图文匹配算法大赛_方案分享
数据挖掘入门与实战
7+阅读 · 2018年2月23日
干货:手把手教你在音频分类DCASE2017比赛中夺冠
全球人工智能
15+阅读 · 2017年9月22日
相关论文
Top
微信扫码咨询专知VIP会员