广告行业中那些趣事系列25:腾讯2020广告大赛冠军解决方案带来的思考

2022-05-05 13:28:04 浏览数 (1)

导读:本文是“数据拾光者”专栏的第二十五篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇从理论到实践学习了腾讯2020广告大赛冠军鱼佬团队提供的解决方案,对于希望将BERT应用到广告领域的小伙伴们可能有所帮助。

摘要:本篇从理论到实践学习了腾讯2020广告大赛冠军鱼佬团队提供的解决方案。首先是比赛介绍及理解;然后重点介绍了冠军方案,主要包括特征工程、模型介绍以及比赛复盘结果分析;接着实践了冠军开源的代码;最后重点思考了冠军方案对我们线上业务有什么帮助,主要包括冠军方案的创新、给我的思考以及对实际业务的思考,认为可以将该方案应用到我们付费用户的预测、app推荐场景以及CTR预估场景。对于希望将BERT应用到广告领域的小伙伴们可能有所帮助。

下面主要按照如下思维导图进行学习分享:

01 比赛介绍及理解

我一直以为机器学习一个不错的途径是参加一些高质量的比赛,比如kaggle或者一些大厂不定期组织的比赛,好处在于可以把自己平时积累的经验尝试一下,最最重要的是可以学习行业里面牛人的经验分享(很多大佬会在比赛结束后分享自己的算法理论和实践)。这些牛人的经验是经过千锤百炼打磨出来的知识,如果能很好的融会贯通相当于走了捷径。正好之前关注了一波腾讯2020广告大赛,感觉里面的场景可以很好的应用到我们的业务中,刚好冠军鱼佬团队又分享了他们的算法经验和实践,那就学习一波整理下笔记。

这里也郑重说明下,本篇主要是学习鱼佬团队的比赛分享和开源代码,我会在最后放上鱼佬团队的冠军方案讲解和开源代码,有兴趣的小伙伴可以了解下。

1.1 赛题介绍

在广告领域用户画像是非常重要的基础定向条件,尤其是用户的年龄和性别。广告因为自身的产品特点会有不同的年龄和性别趋向性,比如之前的文章中经常讲的对传奇游戏比较感兴趣的一般是中年男性,原因很简单,因为这批中年男性在青少年的时候(也就是2001年传奇游戏大火的时候)痴迷于战法道三职业和一起攻打沙巴克的热情,那是他们逝去的青春。所以尽管传奇游戏相比于现在的游戏比如农药之类可以说非常无聊了,但还是有那么多中年男性愿意下载玩玩,感受一把。最重要的是对于游戏这一类广告主来说付费是广告转化最重要的指标,也就是说广告主会根据付费情况来支付广告费,这批经济条件相对成熟的中年男性恰恰会为了逝去的青春买单。

通过上面这个例子我们应该能感受到精准的用户年龄和性别数据对于投放广告是多么重要的定向条件了吧。也就是说通常情况下我们会将年龄和性别等用户画像条件作为输入去完成推荐。但是随着人们隐私保护意识越来越强,获取精准的用户年龄和性别也越来越难了。腾讯2020广告大赛的题目就是通过逆向思维,之前的做法是根据用户的年龄和性别来推荐广告,现在我们需要根据用户在日常生活中点击广告的序列来反推用户的年龄和性别,因为用户点击广告行为的序列会一定程度上反应他们的年龄和性别。也就是说用户不愿意告诉平台他们的年龄和性别,那么作为平台的我们就根据用户点击广告的行为序列来预测用户的年龄和性别。这就是比赛的题目。

1.2 比赛的数据和目标

明白了这个比赛其实就是根据用户点击广告的序列来反向推测用户的年龄和性别,那么就能很好的理解比赛的数据了。官方提供了一些用户3个月的广告点击历史数据作为训练集,每条数据包含1-91的日期、用户的年龄和性别、点击广告的信息数据(这里包括素材id、广告id、广告主id、产品id、产品类目id等等)以及用户对当前的广告点击次数。测试集是另一些用户的广告点击信息。

比赛的目标就是根据用户的广告点击序列数据来推断用户的年龄和性别。具体如何评估最后的结果,主要是计算预测数据的准确率,这里主要分成年龄预测的准确率和性别预测的准确率,性别没啥好说的就分成男女,年龄分成十段,两者准确率的和作为最终的结果。

02 冠军方案介绍

介绍鱼佬团队的冠军方案主要从特征工程、模型介绍以及最终比赛结果复盘分析三块来介绍。

2.1 特征工程

首先是特征工程。因为咱们可以拿到的数据主要是用户点击广告的序列,所以作者主要基于用户点击广告序列使用了两类特征:用户点击广告的统计类特征和广告受众人群的年龄、性别的概率分布特征。下面对这两类特征进行详细说明:

2.1.1 用户点击广告的统计类特征

统计类特征主要包括:

  • 用户出现的总次数和总天数。这里主要统计的维度是用户维度,比如一共91天,用户A总共出现在了32天,那么用户A出现的总天数就是32天,出现的总次数可能是200次(可能一天里面会点击多次广告);
  • 用户点击广告的总次数。这里统计的维度是用户和广告维度,比如一共91天里用户A点击了广告1总共50次,同时用户A点击了广告2总共32次等等;
  • 用户点击不同的广告、产品、类别、素材、广告主的总数。因为广告本身是有多种属性的,一个广告有对应的广告id,同时这个广告属于不同的产品、素材,并且归属于不同的广告主。这里统计的维度就是用户和其他不同的广告属性的维度,比如用户和广告id维度下的总数,用户和广告主id维度下的总数,用户和产品维度下的总数等等;
  • 用户每天每条广告点击的均值和方差。这里主要统计用户和广告在日粒度下维度的均值和方差。

用户点击广告的统计类特征主要是从统计层面来获取广告被用户点击的信息,主要是连续性特征。

2.1.2 广告受众人群的年龄、性别的概率分布特征

广告受众人群的年龄、性别的概率分布特征简单的理解就是根据用户点击广告的序列信息来计算广告维度下各性别以及各年龄段的分布。举个例子,比如现在有个传奇游戏的广告,我们会得到这个传奇游戏的广告中男生的概率可能是90%,对应的女生概率就是10%,同样的从年龄维度也可以得到这个传奇游戏的广告在各个年龄段的概率分布。那么具体是如何得到广告在年龄和性别的概率分布呢?通过下图来说明:

图1 广告受众人群的年龄、性别的概率分布特征

根据上图所示,作者将人群随机划分为五组,假如用户A来自第一组,点击了广告1、广告3、广告4和广告5,那么我们会将其他四组的人群作为种子人群并统计对应的广告1、广告3、广告4和广告5在性别和年龄上的概率分布。通过这种方式每个组里所有的广告都通过其他四组来求出,如果两个组之间有重合的广告还可以相互验证。通过这种方式咱们可以拿到广告维度下每个广告受众人群的性别和年龄分布了。拿到每个广告受众人群的性别和年龄分布之后,然后从用户的维度根据用户点击广告的序列就可以拿到用户的性别和年龄分布了。

可能有点绕,那么举个例子来说明吧,比如用户A点击了广告1、广告3、广告4和广告5。这里咱们已经拿到了广告维度下每个广告的受众人群的性别和年龄分布,对于广告1来说男性的概率值为80%,广告3的男性的概率值为60%,广告4的男性的概率值为80%,广告5的男性的概率值为20%,那么用户A是男性的概率就是(80% 60% 80% 20%)/4=60%。通过这种方式就可以得到用户在性别和年龄的概率分布了。

上面就是实际比赛中鱼佬团队使用的两组特征,但是在比赛的过程中进行了大量的特征工程尝试,比如Word2vec、DeepWalk、TfIdf Stacking以及各类聚合特征。这些方法可能在不同的应用场景下会有用,作者给出了一些思路,感兴趣的小伙伴可以自行尝试下。

2.2 模型介绍

上面介绍了特征工程的工作,下面就是重中之重的模型部分了。模型整体框架如下图所示:

图2 模型整体框架

模型整体分成三块:BERT部分、融合层Fusion Layer部分和最后的输出层部分。下面分别进行详细说明:

2.2.1 BERT部分

可以说BERT部分是本项目最重要的创新点,也是对我影响最大的部分。BERT是自然语言处理领域的一颗明星,我之前也写过很多关于BERT以及BERT应用在文本分类的文章。可以说在这个方案出现之前我一直傻傻的以为BERT就只能应用到自言语言处理领域呀。然后当我看到鱼佬团队将BERT应用到用户性别和年龄预测之后,感觉对BERT的理解又更深了一层。用户点击广告序列和文本很类似,都是序列类的信息,那么这一类的序列信息其实也都可以用自然语言处理领域中的方法去处理,比如BERT。之前是根据一句文本来进行分类,那么现在这句文本变成了一条用户点击广告的序列,每个字变成了某个广告而已,其他都是通用的。将BERT作为编码器进行编码,然后使用12层的Transformer得到交互更高的隐变量。下图是用户点击广告序列经过BERT部分:

图3 用户点击广告序列经过BERT部分

因为BERT是典型的预训练 微调两阶段模型,其中预训练是BERT能在NLP领域取得巨大成功的主要原因,所以鱼佬团队也尝试了很多种预训练的方法。相比于NLP领域来说,广告具有稀疏性。咱们来看一组数据,谷歌提供的基础版本的BERT权重里英文版词表长度是30522,中文版词表长度是21128,而广告可能动不动就几百万级别,比如这次比赛中广告就达到七八百万,词表太大会让预训练过程存在问题:超大词表很难放到GPU中。如果勉强可以放到CPU中也会因为参数太大很难训练。针对这个问题,鱼佬团队使用了两阶段的预训练方法对BERT进行训练。

(1) 预训练阶段一:Word2vec

预训练阶段一是使用Word2vec模型去训练广告的embedding,具体做法是将用户点击广告的序列输入到Embedding Layer层去预测广告id,这里使用的窗口是2,所以其实是用一个广告去预测另一个广告的embedding,主要目标是将类似的广告进行聚类。这里需要说明的是使用Word2vec模型预训练的目的主要是解决输入端词表过大导致模型难以收敛的问题。因为词表过大会导致词表很难存放到显存,就算把词表放到显存里模型也很难收敛。使用Word2vec预训练图如下所示:

图4 使用Word2vec预训练图

(2) 预训练阶段二:基于掩码的语言模型Masked Language Model(MLM)

上面使用Word2vec预训练去预测广告id会存在两个问题:第一个问题是因为使用的窗口是2,所以其实是用一个广告去预测另一个广告,没有使用更多的广告去预测,这样会缺失很多用户点击广告序列的上下文信息;第二个问题是没有利用更细粒度的广告本身属性的信息。因为广告本身的维度信息是很丰富的,比如有广告id、题材、类别、广告主等等,而Word2vec预训练阶段并没有考虑这些广告更细粒度的信息。

针对上面的两个问题,鱼佬团队进一步使用预训练阶段二基于MLM模型进行训练并进行了一定程度的改进。BERT原始的MLM模型是将一段文本中按字符比例进行掩码操作,比如随机掩码20%,这里的每个字符是一个整体,对应咱们用户点击广告序列中的一个广告,也就是说原始的MLM模型会直接掩码掉某个完整的广告。但是这里鱼佬团队只会掩码掉某个广告的一部分,可以是广告id、素材或者其他广告属性,掩码的比例都是20%。这样做的原因是不仅可以从广告的上下文去预测,而且可以从更细粒度的广告属性去预测,这样可以让不同属性的embedding在语义空间上对齐。

针对预训练阶段二基于MLM模型鱼佬团队还采用了一个关键的策略,就是把MLM模型输出的词表取top缩小到10W,其他的设置为unk。通过控制MLM模型输出词表长度为10W可以让BERT跑起来。这里缩小MLM模型输出端的词表长度主要是解决输出端词表太大容易造成显存溢出的问题。举例说明,如果输出端词表的长度是700W,batch size是64,序列的长度是128,那么预测token的时候需要存放[64,128,700W]大小的矩阵,显存是放不下的。如果这里设置取top10W的词表,那么就变成了[64,128,10W]大小的矩阵,这样显存就可以放下了。下面是使用MLM预训练图:

图5 使用MLM预训练图

通过上面两个预训练阶段我们不仅可以从广告的上下文去预测,而且可以用广告本身的属性去预测广告的embedding了。原始的MLM模型只能通过上下文预测,而这里相当于结合咱们广告场景进行微创新使用更细粒度的广告属性去预测广告的embedding了。这里针对咱们的app推荐场景中目前主要使用用户使用app序列信息,使用app2vec模型通过app上下文信息来获取app对应的embedding信息。使用该方案不仅可以从上下文来获取app的embedding信息,还可以加入app本身维度的信息,相当于从更丰富的维度来获取app的embedding信息。

2.2.2 融合层Fusion Layer部分

融合层Fusion Layer前面讲过,将用户随机分成五组,类似K折交叉训练,如果用户来自第一个组,那么就把剩下四组作为种子人群去计算第一组每个广告的性别和年龄的概率分布,然后会经过4层Transformer后进行融合。这里会用到前面说的统计类的特征。融合层如下图所示:

图6 融合层图

2.2.3 输出层部分

经过BERT部分和融合层部分之后就是最后的输出层。输出层会先经过Max Pooling和Mean pooing后进行拼接,然后会经过Batch Norm层,最后会用一个全连接层进行分类,因为性别有两类,年龄分成10类,总共就是20个分类。输出层如下图所示:

图7 输出层图

2.3 比赛复盘结果分析

因为比赛分成初赛和复赛,所以比赛的结果分析也分别从初赛和复赛来看。

初赛阶段各模型部分对比赛的得分如下图所示:

图8 初赛阶段得分提升图

可以看出使用BERT并且调整参数之后基本已经锁定了A榜的冠军。从这也可以看出鱼佬团队选择BERT是正确的方向。后面调整学习策略,使用warmup来调整学习率进一步提升了比赛得分。最后经过模型融合也提升了比赛的得分。

复赛阶段各模型部分对比赛的得分如下图所示:

图9 复赛阶段得分提升图

复赛阶段直接复现初赛模型并且引入融合层之后也已经锁定A榜冠军。这里引入融合层对模型的得分提升还是非常明显的,可以看出这个策略还是很不错的。最后再次进行模型融合提升得分夺得冠军。

整体来看初赛和复赛里有很多对于线上模型可能有效的手段,这些都属于我们重点学习的知识。

03 冠军开源代码实践

上面主要从理论的角度讲了鱼佬团队的冠军解决方案,更令人兴奋的是这些大佬直接把代码开源了,相当于我们可以直接从理论到实践来近距离的学习大佬。可以毫不夸张地讲,花点时间学习下大佬的代码,然后基本可以原封不动的移植到我们线上的业务场景中,更好更快的带来业务收益。下面是鱼佬团队开源的项目地址,有兴趣的小伙伴可以跑一下试试:

https://github.com/guoday/Tencent2020_Rank1st

我这边也花了很多时间研究源码,这里做一下简单的说明。源码目录结构如下图所示:

图10 源码目录结构图

下面详细讲下源码跑通流程:

3.1 安装对应的python包

图11 安装对应的python包

3.2 下载数据

通过如下命令下载数据:

图12 下载数据

这里貌似需要使用谷歌网盘进行数据下载,有需要的小伙伴直接私信我。

3.2 数据预处理流程

数据预处理是合并所有的文件,这里会得到点击记录文件(click.pkl)和用户文件(train_user.pkl/test_user.pkl),直接执行如下命令:pythonsrc/preprocess.py

3.3 特征提取流程

直接执行如下命令:python src/extract_features.py

3.4 预训练阶段一Word2vec

使用Word2vec模型进行预训练非常简单,直接执行如下命令:python src/w2v.py。源码也非常简单,这里有点疑问的是PPT中使用的窗口window是2,但是源码中的window是8。这里小伙伴们需要注意下,下面是Word2vec预训练源码:

图13 Word2vec预训练源码

3.5 预训练阶段二BERT

经过Word2vec预训练之后就是预训练BERT了,下面是预训练的指令:

图14 BERT预训练命令

BERT预训练阶段是源码的重头戏,这里我也花了很对时间研究。也建议感兴趣的小伙伴们好好看看:

图15 BERT预训练部分源码

3.6 模型训练

执行如下命令来训练模型:

图16 模型训练命令

3.7 合并结果数据

最后就是合并结果数据,通过命令pythonsrc/merge_submission.py就能得到最终的结果数据submission.csv。

04 对我们线上问题的思考

4.1 冠军方案的创新

鱼佬团队的方案主要有以下创新之处:

4.1.1 将NLP中的BERT模型很好的运用到人口属性预测的场景

基于BERT模型利用用户点击广告的序列信息来预测用户的年龄和性别,将BERT模型应用到跨领域任务当中。通过Word2vec和MLM的两阶段预训练模型可以很好的缓解广告稀疏的问题,同时可以有效提升模型的训练速度;改进了MLM预训练目标,原始的MLM只能根据上下文来预测,改进之后的MLM不仅可以根据上下文,而且可以根据广告自身的属性来预测,相当于结合当前领域进行改造,可以从多维度来学习广告和属性的embedding表示;这个方案不仅仅是将BERT应用到人口属性的预测,从性能上验证了预训练模型在广告领域的巨大潜力,而且告诉我们可以用BERT做的更多。

4.1.2 提出了一种融合概率分布的方法和模型

通过融合层来计算每个广告的受众人群的年龄和性别分布,然后利用多层Transformer模型来融合概率分布和BERT的语义表示可以有效的提升模型的性能。

4.2 给我的思考

这个冠军方案给我带来了很大的影响。原来思维比较局限,感觉BERT只能用来做自然语言出处理任务。现在好了,鱼佬团队将BERT应用到广告领域。现在想来广告领域中很多业务都是根据用户的广告行为序列来做文章,那么这种BERT式的方案基本是可以通用的。通过预训练的方式可以得到不同数据源的embedding表示,然后再应用到下游的任务中。精通一个模型,可以随心所欲的应用到下游各式各样的任务,还能得到不错的效果,对于我们这些靠技术吃饭的人来说真的是福音。这里又想起了那个大一统的想把各种任务都转换成Text2Text的T5模型,一个模型就能轻松搞定下游各式各样的任务。

4.3 对于实际业务的思考

花了很多时间学习鱼佬团队的冠军方案,受益匪浅。真正能产生实际效益的是思考如何把这套方案应用到我们线上实际的业务场景中来。针对我们现有的业务场景,我觉得可以应用到如下场景中:

  • 首先是预测用户画像类属性,比如付费用户的识别。目前我们服务的广告主中游戏是能带来广告收益的大头,而评估游戏行业广告的转化指标主要是付费相关的,比如付费率或者首日ROI等。这里就需要预测付费用户。冠军方案已经验证了可以通过用户点击广告序列来预测用户的年龄和性别,那么用来预测用户是否会付费应该也是可以的。不仅仅是付费,其他用户画像类特征我们都可以用这套方案来进行扩展;
  • 然后是app推荐。目前我们主要是根据app2vec模型利用用户使用app的序列信息来获得app的embedding信息,那么用BERT这套方案应该也是没问题的,这套经过改造的BERT方案不仅可以根据上下文来获取app的embedding信息,还可以通过app本身的属性信息来预测;
  • 最后是广告领域中涉及用户使用各种数据源的序列信息都可以尝试用这套方案来产生embedding来应用到下游任务中。

上面是一点个人的思考,感觉BERT应该能帮我们做更多的任务。而鱼佬团队的方案相当于给我们提供了一整套的流程,使用Word2vec和MLM的两阶段预训练流程,还有概率分布的融合层以及最终输出层设计,咱们完全可以复用这一整套设计去做更多的事情。

总结

本篇从理论到实践学习了腾讯2020广告大赛冠军鱼佬团队提供的解决方案。首先是比赛介绍及理解;然后重点介绍了冠军方案,主要包括特征工程、模型介绍以及比赛复盘结果分析;接着实践了冠军开源的代码;最后重点思考了冠军方案对我们线上业务有什么帮助,主要包括冠军方案的创新、给我的思考以及对实际业务的思考,认为可以将该方案应用到我们付费用户的预测、app推荐场景以及CTR预估场景。对于希望将BERT应用到广告领域的小伙伴们可能有所帮助。

0 人点赞