本文介绍的文章题目是:《Perceive Your Users in Depth: Learning Universal User Representations from Multiple E-commerce Tasks》
论文的下载地址为:https://arxiv.org/pdf/1805.10727.pdf
视频介绍:https://yq.aliyun.com/video/play/1377?do=login&accounttraceid=2a655d82-06ce-4c03-a7bf-9e7c8f36b76e
本文以淘宝搜索和推荐场景为背景,通过一个多任务模型来学习用户的通用表示,并对比了多任务模型和单任务模型的一些实验效果,并对多任务模型以及模型迁移等方面给出了一些经验介绍。咱们一起来看看。
我们为什么要使用多任务学习呢?或者说,多任务学习相比于单任务学习有哪几方面的优势呢?总结主要有两点: 1)使用一个多任务学习模型,可以共享一部分网络结构,相比于使用多个单任务学习模型,其总体的网络结构大小更小,在线CPU使用率更低,对于在线服务更加友好,可以保证线下服务性能的稳定性,支撑更大的QPS。同时,对于存储资源也会大大的节省,我们没必要为每一个任务保存一份embedding词表,而只需保存一份即可。 2)在淘宝中,使用多任务学习,可以学习到更通用的用户、商品的向量表示,这些向量可以更方便地迁移到其他任务中。
基于以上两点,接下来我们首先介绍本文的多任务学习模型,然后详细介绍下多任务模型和单任务模型的效果,以及模型的迁移能力,最后,介绍下一些多任务模型使用上的经验。
本文提出的模型称为DUPN网络( Deep User Perception Network),其整体的架构如下图所示:
可以看到,一共分为五层,行为序列层、Embedding层、LSTM层、Attention层、下游多任务层。接下来,我们分别介绍这几部分。
模型的输入是用户的行为序列x = {x1,x2,...,xN},行为序列中的每一个行为都有两部分组成,例如第i个行为xi被表示成<itemi,propertyi>,itemi表示这次行为对应的淘宝中的商品,不仅仅是商品本身,还包含商品的一些side-information,比如店铺ID、品牌、品类、标签等等。propertyi表示此次行为的一些属性,比如场景(scenario,如搜索、推荐、聚划算等等场景)时间、类型(点击、购买、加入购物车等等)。
在定义好模型的输入之后,输入大多是ID类特征,因此通过Embedding层转换为对应的Embedding:
用户的每个行为被表示为:
对item feature来说,包括商品id、店铺、品牌、品类、标签,这些在淘宝中词表的大小分别为1G、1M、10M、1M、100K,对应的embedding的长度分别为32、24、24、16和28。这些有的是multi-hot的,比如商品可能会有多个标签,应该会通过pooling操作进行转换。
而对于行为property来说,场景、时间和类型的embedding的长度均为16。因此最终每一个行为的Embedding长度为32 + 24 + 24 + 16 + 28 + 16 * 3 = 172。
得到了每一个行为的Embedding表示之后,首先通过一个LSTM层,把序列信息考虑进来,LSTM层的表示如下:
每个hidden state的计算如下:
输出的每个hidden state是128维的向量。
在LSTM层之后,通过Attention层来决定行为的重要程度。举个简单的例子来说明为什么要用Attention层。例如,某用户点击浏览一条连衣裙,然后购买了一个手机,浏览了一些扫地机器人、笔记本电脑等。如果此时该用户输入搜索query为iphone,那么用户行为中关于服饰的记录重要性明显降低,因为这些记录并不能反映该用户当前的兴趣,而之前关于手机的行为记录能更多的表达用户当前的兴趣。
那么Attention层的结构如下:
结合总体网络结构看看attention层:
图中粉色和蓝色以及黑色虚线为模型的输入,粉色线代表行为behavior相关的embedding、蓝色线代表LSTM层的hidden state输出、黑色为用户和query的embedding。通过多层全连接神经网络得到权重作为输出,然后权重和对应的hidden state进行加权平均,得到attention层的输出,同样是一个128维的向量。
经过attention层得到的128维的向量,拼接上128维的用户向量,最终得到一个256维向量作为用户的表达。用户信息包括用户年龄、性别、购买力、购买偏好等等。
下游任务这里介绍了4个,分别是CTR、L2R(Learning to Rank)、用户达人偏好FIFP、用户购买力度量PPP。感觉前两个是主要的任务,后两个任务主要用于使得学到的用户表示更加通用。除此之外,为了验证模型的迁移能力,还介绍了第五个任务,即来预测用户对某个店铺的偏好,该任务并非和上述四个任务同时学习,而是取上述四个任务学习之后的用户表达进行学习,验证其是否可以直接使用在新任务中。
这里输入有两部分,一是我们刚才得到的256维的用户向量表示,另一个是Item的feature对应的128维向量表示,item的向量表示,还是刚刚说到的5部分,分别是商品id、店铺、品牌、品类、标签,对应的embedding长度分别是32、24、24、16和28,这里和Embedding层的embedding是共享的。
CTR预估任务的loss是logloss:
这里想要学习的是一些用于排序的特征的权重,部分特征如下:
通过权重的学习,对不同的排序特征进行加权,来使得转化率最大化,网络结构如下:
这里的loss如下:
这里yi取值为1或-1,代表第i个样本的label,ni是基于不同的行为类型的样本权重,ri是m维的排序特征,weight(repi;θ)是上图结构中左边部分的输出。也是m维的。这里m为26。
这一部分的结构如下:
预测用户是否会follow某一些达人,输入分别是刚才得到的256维的用户表示以及一些达人的特征。这里的损失同样为logloss。
这里将用户的购买力分为7档,来预测用户的购买力属于哪一档。
该部分同样是一个二分类任务,结构如下:
这一部分在后面的实验结果中,咱们进一步介绍。
这一部分介绍模型的一些实验结果,主要分为四部分,首先对比了DUPN和一些Baselines的效果比较,随后对比了多任务学习和单任务学习效果,然后通过第五个任务验证了模型的迁移能力,最后对attention进行了简单的分析。
这里选取的Baselines有四种,分别是Wide、Wide & Deep、DSSM和CNN-max,而DUPN方面,又分了五种情形,分别计作DUPN-nobp/bplstm/bpatt/all/w2v。DUPN-nobp表示不使用behavior property;DUPN-bplstm表示只在lstm部分使用behavior property;DUPN-bpatt表示只在attention部分使用behavior property;DUPN-all即我们刚才所描述的整个模型框架。前面四种中,embedding都是通过end-2-end的方式进行训练的,即随机初始化embedding,然后根据模型一起进行训练,而DUPN-w2v对embedding进行预训练。
因此,一共9种模型,结果如下:
可一看到,所有任务上,都为DUPN-all的效果最好。
多任务学习模型和各个单任务学习模型在测试集上的效果对比如下:
可以看到,尽管在训练集上的误差多任务学习模型会偏大,但是在测试集上的效果,多任务学习模型反而更好,模型的泛化能力得到了提升。
接下来通过店铺偏好实验来验证一下模型的迁移能力。在训练完包含前4个任务的多任务模型之后,有下面几种方法应用于第5种任务上:
End-to-end Re-training with Single task (RS):使用DUPN的网络结构单独训练这一个新任务。 End-to-end Re-training with All tasks (RA):使用DUPN的网络结构重新训练5个任务 Representation Transfer (RT):将学习到的用户表示以及店铺属性作为输入,训练一个简单的网络,这里用户表示不会被更新 Network Fine Tuning (FT):将学习到的用户表示以及店铺属性作为输入,训练一个简单的网络,这里用户表示会随着网络训练而Fine Tuning。
上述四种方法的训练过程如下图所示:
上图中横坐标为训练轮次,纵坐标为AUC值。效果最佳的为绿色曲线FT,一方面FT收敛较快,另一方面其最终AUC值也最高,为0.675左右。这说明之前的网络已经达到了较好的训练效果,进行一些微调后便可以很快的得到最终结果。而黑色曲线RA虽然收敛速度较慢,最后仍然可以达到和FT同样高的AUC值。但显而易见FT的代价较低。
用户Attention分析从两方面进行,一是搜索关键词时和用户历史行为的相关性:
颜色越深表示相关性越高,可以看到,用户搜索laptop时, 那么attention更多的会集中在耳机、手机之类商品,而搜索连衣裙T恤之类,服饰相关的类目会起到比较大的作用。
第二个是不同行为类别的attention:
整体来说,用户的成交行为重要性最高,高于点击、加购物车和收藏行为。但比较有趣的一点是,用户越近的一些点击行为越能反映用户的兴趣,但是最近的成交行为并不能反映。这和大家的认知相同,当用户购买了某件商品后,近期可能不会再购买该类别商品,因此颜色较浅,相反,几个小时以前或者几天以前的购买行为能更反映用户兴趣。
将该模型应用于线上的实验,各种指标都有明显提升:
最后,论文还讲解了两点多任务模型的使用技巧,一是模型的更新,二是模型的拆分。
随着时间和用户兴趣的变化,ID特征的Embedding需要不断更新,但不能每次都重新训练模型,因为这大概需要耗费4天左右的时间。因此通常的做法是每天使用前一天的数据做增量学习,这样一方面能使训练时间大幅下降,能在一天内完成;另一方面可以让模型更贴近近期数据。
模型拆分的示意图如下:
由于CTR任务是point-wise的,如果有1w个物品的话,需要计算1w次结果,如果每次都调用整个模型的话,其耗费是十分巨大的。但其实,user Reprentation只用计算一次就好。因此我们会将模型进行一个拆解,使得红色部分只计算一次,而蓝色部分可以反复调用红色部分的结果进行多次计算。
这是论文中没有但是在视频中有所提及的。Batch normalization能很好的提升模型效果,使AUC显著提升。但需要注意的是,训练样本中BN记住的离线均值和方差和在线数据中一定要保持一致。举例来说,在训练样本中会做各种过滤和采样,例如把点击和成交样本采样,那么这样会导致某些维度的均值会远远高于实际线上的均值,虽然在测试集上的AUC也能提升,但这对在线效果非常不利。
这篇文章感觉非常有借鉴意义。不仅验证了多任务学习相对于单任务学习的优势,同时为建模用户行为提供了新的思路。除此之外,还介绍了阿里在模型应用上的一些经验,值得借鉴。
这篇文章发出时可能还没有Transformer,我觉得将LSTM层换成一层Transformer也许效果会有提升,感兴趣的同学可以试一试。