广告召回论文阅读笔记(1)-双塔模型

707 阅读3分钟

背景

效果类在线广告投放流程一般包含以下步骤:

  • 召回(Information Retrieval,IR),从海量(一般数十亿)广告全集中召回和当前请求相匹配的候选广告集,候选广告集的规模一般是数万;
  • 粗排(Approximate Rank,AR),对召回返回的候选广告集使用相对简单的模型预估每个广告的点击率pCTR\text{pCTR},并基于广告主在点击上的出价bidclickbid_{\text{click}}计算eCPM\text{eCPM}

eCPM=pCTRbidclick\text{eCPM}=\text{pCTR}\cdot bid_{\text{click}} 最后,再基于eCPM\text{eCPM}从大到小进行排序,选取排序靠前的数百个广告;

  • 精排(Full Rank,FR),对粗排返回的数百个广告,和粗排类似的方式、但选择相对复杂的模型预估点击率并计算eCPM\text{eCPM},再基于eCPM\text{eCPM}排序后,选取排序靠前的数十个广告。
  • 定价(Price),对精排返回的数十个广告按照一定的机制根据出价计算最后的定价,然后将胜出的广告返回给媒体侧进行展示,当用户点击广告时,广告平台获取相应的点击事件,并按照之前计算的定价计价,扣减广告主的账户余额。

效果类在线广告根据流量类型一般分为搜索广告和推荐广告。在搜索广告中,用户输入搜索词主动表达搜索意图,因此广告主会圈选一批和推广目标相关的关键词,设置出价和匹配方式,传统搜索广告引擎在召回阶段对用户搜索词进行纠错、改写、分词,然后对分词结果,根据精确匹配、短语匹配和宽泛匹配等多种匹配规则,召回相应的关键词,再根据关键词从倒排索引中召回圈选该关键词的广告主的广告,作为广告候选集输入后续流程,最终返回和搜索词相关的广告至用户。在推荐广告中,用户被动浏览系统推荐的内容,因此广告主会圈选一批和推广目标相关的定向条件(如设置目标用户的年龄、性别、地域、兴趣标签等或直接设置目标用户的ID),传统推荐广告引擎根据用户画像中的ID、年龄、性别、地域、兴趣标签等从倒排索引中召回圈选该定向条件的广告主的广告,作为广告候选集输入后续流程,最终返回和定向条件相关的广告至用户。

随着机器学习、特别是深度学习的不断发展,其广泛应用于广告投放流程的各个阶段。目前召回阶段一般采用多路召回方式,其中除上述传统召回方式外,还会同时引入深度学习进行召回。深度学习应用于召回的一种常用方式是双塔模型,即在搜索广告或推荐广告中,预先将关键词或广告通过广告塔转化为向量,并构建向量索引,将广告请求中的搜索词或用户画像通过用户塔也转化为向量,从向量索引中检索和搜索词或用户画像向量相关的关键词或广告向量,从而将相关的广告(若返回的是关键词,则进一步召回圈选该关键词的广告主的广告)作为广告候选集之一,和其他路召回的广告候选集合并,输入后续流程

本文是对双塔模型应用于搜索、推荐、广告等场景的相关论文的阅读笔记,如有不足之处,请指正。

双塔模型的起源-DSSM

微软于2013年发表的论文《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data 》提出了DSSM模型,首次将双塔模型的思想应用在搜索场景下的搜索词和关键词匹配中,后续该思想逐渐被广泛应用于搜索、推荐、广告等场景中

图1 DSSM结构

DSSM的目标是给定搜索词QQ时,从多个文档(D1,D2,,Dn)(D_1,D_2,\dots ,D_n)中召回语义相关的文档。DSSM使用文档的点击日志进行训练(某个文档在某个搜索词下被点击,则认为两者语义相关),并使用深度神经网络挖掘搜索词和文档的相关性。DSSM的结构如图1所示,从下到上分为以下几层:

  • 输入层。将搜索词和文档以BOW(Bag of Words)方式进行编码转化为向量,即对构成搜索词和文档的各单词分别进行One-Hot编码,再将各单词的One-Hot编码乘以其在搜索词和文档中出现的次数,最后将搜索词和文档中各单词的编码累加在一起,作为搜索词和文档编码后的向量。
  • Word Hashing层。由于BOW方式编码的向量为高维稀疏向量(维度等于单词总数),不利于模型训练,因此论文引入了Word Hashing层进行降维处理。而目前通常的做法是在输入层后,增加一个Embedding层进行降维处理。Word Hashing层的方案是先将各单词进行N-Gram编码,例如对于单词“good”,在3-Gram编码后,转为为词元向量(“go”,"goo","ood","od"),再对词元向量进行One-Hot编码。论文中列出了不同数目的单词在N-Gram编码后的词元数,例如单词数为50万(即原始向量维度为50万)时,采用3-Gram编码的词元数为30621,即降维后的向量维度为30621,只有原始向量维度的3/50。论文中也指出,不同的单词在N-Gram编码后的词元向量可能相同,例如单词数为50万时,采用3-Gram编码会存在22个冲突,但占比较小。每个单词的N-Gram编码固定,因此Word Hashing层的计算可以看作一个简单的线性变换,公式如下:l1=W1xl_1=W_1x

图2 不同数目的单词在N-Gram编码后的词元数和冲突数

  • 多层全连接神经网络。Word Hashing层作为输入层。多层神经网络包含两个隐层,维度均为300,其计算公式如下:li=f(Wili1+bi),i=2,3l_i=f(W_il_{i-1}+b_i),i=2,3。输出层维度为128,其计算公式为:y=f(WNlN1+bN)y=f(W_Nl_{N-1}+b_N)ff为神经元上的激活函数,采用tanh函数:f(x)=1e2x1+e2xf(x)=\frac{1-e^{-2x}}{1+e^{-2x}}。输出yy为128维向量,作为搜索词或文档的语义特征。
  • 相关性计算层。使用搜索词和文档语义特征的余弦相似度作为相关性:R(Q,D)=cosine(yQ,yD)=yQTyDyQyDR(Q,D)=\text{cosine}(y_Q,y_D)=\frac{y_Q^Ty_D}{||y_Q||||y_D||}
  • Softmax层。输入搜索词和各文档的相关性,通过Softmax函数输出各文档被点击的概率:P(DQ)=exp(γR(Q,D))DDexp(γR(Q,D))P(D|Q)=\frac{\text{exp}(\gamma R(Q,D))}{\sum_{D^{'} \in D}{\text{exp}(\gamma R(Q,D^{'}))}}。训练阶段的目标函数就是最小化以下负对数似然函数:L(Λ)=log(Q,D+)P(D+Q)L(\Lambda)=-\text{log}\prod_{(Q,D^{+})}P(D^{+}|Q),其中,D+D^+为被点击的文档。

而在推理阶段,由于各文档事前可知,可以离线通过模型提前计算出各文档的语义特征向量,并构建向量索引(比如采用Facebook开源的Faiss)。而当用户发起在线搜索请求时,只需对搜索词再次通过模型计算其语义特征向量,然后从向量索引召回余弦相似度相近的若干个文档从而实现文档的语义相关快速召回。

向量检索在YouTube视频推荐召回阶段的应用

2016年YouTube发表的论文《Deep Neural Networks for YouTube Recommendations》从工程、算法角度系统、全面地介绍了YouTube如何基于深度神经网络实现视频的召回和排序、向用户进行个性化推荐,其中召回阶段的深度神经网络如图3所示。

图3 YouTube用于视频召回的深度神经网络

论文将召回和用户相关的数百个视频转化为多分类问题,从上图可以看到,模型输出层是一个Softmax函数,通过该函数计算在给定用户和上下文时每个视频的点击率,函数如下所示:

P(wt=iU,C)=eviujVevjuP(w_t=i|U,C)=\frac{e^{v_iu}}{\sum_{j \in V}{e^{v_ju}}}

其中,VV表示全量视频集合,UU表示当前用户,CC表示当前上下文,uRNu \in \Bbb{R}^N表示用户的Embedding向量,vjRNv_j \in \Bbb{R}^N表示视频jj的Embedding向量。在模型中,uu对应到隐层最后一层的输出,因此该层神经元个数是NN。令全量视频数为MM,则模型输出层包含MM个节点,其中节点jj输出视频jj的预估点击率,输出层所有节点与隐层最后一层所有神经元输出之间的权重是一个N×MN \times M矩阵,其中,第jj列是隐层最后一层所有神经元输出到模型输出层节点jj的权重,即vjv_j。 模型的中间隐层为三层全连接网络,激活函数采用ReLU。

模型的输入层将各种特征进行拼接作为输入,这些特征包括但不限于:

  • 用户历史观看视频Id,论文参考连续词带模型(CBOW),通过Word2Vec将这些Id映射为Embedding向量,并通过平均池化将历史观看视频Id转化为用户历史观看视频Embedding向量;
  • 用户历史搜索词,论文也将这些搜索词分词后的一元词和二元词映射为Embedding向量,并通过平均池化将用户历史搜索词转化为Embedding向量;
  • 地理位置特征也转化为Embedding向量;
  • 视频上传距今时间和用户年龄特征直接作为特征输入,另外会通过平方计算作为新特征输入引入非线性。论文中特别提到新视频一般有较高的点击率,通过引入视频上传距今时间能够较好地拟合这种特性,实验结果如图4所示:

图4 视频上传距今时间对点击率有较大影响

在模型训练阶段,使用交叉熵损失函数,用于各特征Embedding计算(Table Lookup)的矩阵参数和其他网络参数,一并通过梯度反向传播进行训练、更新。由于输出层Softmax函数的输出维度等于全量视频数,值较大,导致训练计算量较大,因此,类似Word2Vec进行了负样本采样减少输出维度和相应计算量。

在在线服务阶段,为加快从百万级视频召回相关视频的速度,所有视频的Embedding向量(即vj,jVv_j, j\in V)会预先保存到至向量索引中。当用户访问YouTube、系统为其推荐时,将其最新的历史观看视频Id、用户历史搜索词、地理位置等特征输入模型,得到其最新的用户Embedding向量uu,并从索引中查找与uu向量距离最接近的数百个视频返回。

多目标优化的双塔模型-Mobius

2019年百度搜索广告团队发表的论文《MOBIUS: Towards the Next Generation of Query-Ad Matching in Baidu’s Sponsored Search》规划了新一代的搜索词和广告召回系统——Mobius,并实现了它的第一个版本Mobius V1。论文指出,在搜索广告中,用户输入搜索词,广告系统分两步处理广告请求,如图5左侧所示,第一步是召回(Match),使用相对简单的模型,对于用户输入的搜索词,从数十亿广告集合中查找出数千和搜索词相关的广告,第二步是排序(Rank),进一步划分为粗排和精排,排序对上一步返回的数千广告,使用相对复杂的模型,预测用户的行为,比如点击率(CTR),并计算商业化指标,例如CPM(CPM=CTR×Bid)和ROI,并基于商业化指标对广告进行排序,选取指标最高的若干个广告返回给用户进行展示。

图5 传统搜索广告系统处理流程和Mobius的对比

论文指出,将广告系统划分为相互独立的两步,存在两者目标不一致的问题,召回的目标是相关性最高:

OMatching=max1ni=1nRelevance(queryi,adi)O_{Matching}=\max{\frac{1}{n}\sum_{i=1}^n{\text{Relevance}(query_i,ad_i)}}

排序的目标是商业化指标最大化,因此可能召回时选出的高相关性广告在排序时商业化指标很低。因此,论文提出了Mobius-V1算法框架,在召回时,引入多目标,在保证低延时的前提下,同时考虑搜索词和广告的相关性,以及商业化指标

OMobiusV1=maxi=1nCTR(useri,queryi,adi)×Bidis.t.1ni=1nRelevance(queryi,adi)threshold\begin{align} &O_{Mobius-V1}=\max{\sum_{i=1}^n{\text{CTR}(user_i,query_i,ad_i)\times Bid_i}}\\ &s.t.\frac{1}{n}\sum_{i=1}^n{\text{Relevance}(query_i,ad_i)}\ge threshold \end{align}

从上述公式可以看出,Mobius-V1需要在召回时,快速、准确地对数十亿广告和搜索词的配对预测点击率,存在如下两个挑战:

  • 历史点击数据不足和有偏,热点、高频的广告和搜索词往往有比较多的历史点击数据,排序时点击率预测模型基于上述数据训练而成,因此,对于热点、高频的广告和搜索词配对,即使两者相关性较低,也会被模型预测较高的点击率。例如图6中的搜索词“White Rose”和广告“Mercedes-Benz”,“Mercedes-Benz”作为热点、高频广告,有较多的历史点击数据,因此,即使搜索词“White Rose”和广告“Mercedes-Benz”不相关,直接用排序时点击率预测模型,会给出较高的点击率;

图6 热点、高频的广告和搜索词配对即使不相关、但预测点击率偏高的bad case

  • 同时,召回时需要对数十亿广告和搜索词的配对预测点击率,需要消耗大量的计算资源,并难以保证低延时。

召回点击率预测模型的训练

因此,论文设计了“Teacher-Student”框架对训练数据进行调整,使得排序时的点击率预测模型能够应用于召回时。首先使用一个数据生成器生成搜索词和广告配对,然后使用原有的召回模块作为teacher,判断搜索词和广告的相关性,从而发现bad case,例如高点击率、低相关性的配对。原先排序时的点击率预测模型,作为student,对bad case进行学习,从而能够具备识别相关性的能力。图7和图8分别描述了算法框架和训练流程。

图7 “Teacher-Student”算法框架

图8 “Teacher-Sudent”训练流程

训练的每个批次被划分两个阶段,第一阶段为数据增强,第二阶段为模型训练。每个阶段有包含多个步骤。对于数据增强。

第一步,从查询日志中加载历史点击数据,构造以下数据集合:

data={(useri,queryi,adi,(un)clicki),i=1,2,,n}data=\{(user_i,query_i,ad_i,(un)click_i),i=1,2,\dots,n\}

其中,每行数据表示一条用户搜索词和广告的配对,以及用户是否点击广告的标记。

第二步,基于第一步的数据分别构造搜索词集合和广告集合:

querySet=Set(List(queryi))adSet=Set(List(adi))\begin{align} querySet&=\text{Set}(\text{List}(query_i))\\ adSet&=\text{Set}(\text{List}(ad_i)) \end{align}

第三步,对搜索词集合和广告集合进行笛卡尔积生成所有搜索词和广告配对作为增强数据:

augData=querySetadSetaugData=querySet\otimes adSet

第四步,使用原有的召回模块对第三步生成的所有搜索词和广告配对,识别其中相关性低于阈值的配对:

lowRelAugData=Relevance_Judger(augData)lowRelAugData=\text{Relevance\_Judger}(augData)

第五步,使用点击率预测模型对低相关性的配对进行点击率预测:

(lowRelAugData,pCTRs)=Neural_Click_Model(lowRelAugData)(lowRelAugData,pCTRs)=\text{Neural\_Click\_Model}(lowRelAugData)

第六步,对高点击率、低相关性的配对进行采样,在点击、未点击标记的基础上,增加第三种标记——bad,并将采样出的配对标记为bad,论文指出这里不直接设置点击率的阈值、并将点击率低于阈值的配对全部标记为bad、而是采用采样的原因是,通过采样来平衡增强数据的探索和利用:

badCases=Sampling(lowRelAugData) s.t. pCTRsbadCases=\text{Sampling}(lowRelAugData)\space s.t.\space pCTRs

第二阶段是模型训练。

第一步,将上阶段采样生成的bad case,和历史点击数据合并,作为训练数据:

trainBuffer=[data,badCases]trainBuffer=[data,badCases]

第二步,使用训练数据训练点击率预测模型,更新模型参数:

Updating(Neural_Click_Model) s.t. trainBuffer\text{Updating}(\text{Neural\_Click\_Model})\space s.t.\space trainBuffer

从图7可以看出,点击率预测模型是一个典型的双塔模型,包含用户(搜索词)和广告两个子塔,两个子塔均输出96维的Embedding向量,进一步将用户塔和广告塔输出的Embedding向量分别划分为3个32维的子Embedding向量,并将用户塔和广告塔相对应的子Embedding向量进行内积(即计算向量余弦相似度),得到3个标量,这3个标量再通过Softmax函数得到3个概率值,分别表示点击概率(笔者理解实际含义应是点击且相关的概率)、未点击概率和bad case概率(笔者理解实际含义应是点击且不相关的概率)。

快速的广告召回

在线服务时需要对数十亿广告和搜索词的配对预测点击率,为保证快速实时召回,无法暴力穷举数十亿广告集合中的每个广告,预测其和搜索词配对的点击率,因此论文引入向量检索技术实现广告的快速召回。从点击率预测模型网络结构可以看出,用户(搜索词)向量和广告向量进行内积(即余弦相似度)后,再由Softmax函数输出点击率预测,因此,用户(搜索词)向量和广告向量的内积(即余弦相似度)和点击率单调相关,可以将召回时查找当前用户(搜索词)下点击率最高的若干个广告,转化为查找当前用户(搜索词)下内积(即余弦相似度)最高的若干个广告。

图9 快速的广告召回

查找的具体实现方案有两种,如图9所示,其中一种方案基于近似最近邻(Approximate Nearest Neighbor,ANN)算法,ANN算法在损失一定查全率的代价下,能够保证大数据量下的快速响应,而常见的ANN算法有基于树的算法(例如ANNOY)、基于图的算法(例如HNSW)、基于哈希的算法(例如LSH)等,论文中采用了基于树的算法——ANNOY。ANNOY将所有向量构造成一个二叉树,其中每个叶子节点对应到一个向量,整个二叉树的构造过程是从根节点逐层向下,在根节点,将所有向量基于聚类算法分成两类,作为根节点的左右子节点,然后对左右子节点中的向量,再分别基于聚类算法分成两类,如此递归划分,直至最后的叶子节点中只有一个向量。通过ANNOY查找向量的时间复杂度是O(logN)O(\log N)

对于广告的Embedding向量,可以进行压缩以减少存储空间,从而能够将所有广告的Embedding向量存入内存以加快召回速度。论文采用的压缩方法是基于K均值算法将广告的Embedding向量划分为多个聚类,当使用搜索词召回广告时,则查找和该搜索词相关的聚类,该聚类下的广告即召回的结果。而更进一步,可以使用乘积量化(Product Quantization)算法,其由2011年的论文《Product Quantization for Nearest Neighbor Search》提出,原理如图10所示,对于原始向量,该算法将其分为多个子向量,对每个子向量进行聚类,每个子向量可以由其聚类中心的ID表示,这样原始高维向量可以压缩至由其子向量聚类中心ID组合而成的低维向量。

图10 乘积量化(Product Quantization)算法原理

引入用户行为序列的双塔模型-SDM

2019年阿里巴巴推荐团队发表的论文《SDM: Sequential Deep Matching Model for Online Large-scale Recommender System》提出了SDM(Sequential Deep Matching Model)算法,其在双塔模型的基础上,引入用户行为序列,挖掘其中长、短期兴趣信息,并融合得到用户兴趣表征,从而能够通过用户历史行为进行更加个性化的推荐。

问题建模

图11 SDM问题建模和处理流程

U\mathcal{U}表示用户集合,I\mathcal{I}表示商品集合,模型需要判断在时间t+1t+1,用户uUu\in\mathcal{U}是否对商品iIi\in\mathcal{I}感兴趣。令Su=[i1u,,itu,,imu]\mathcal{S}^u=[i_1^u,\dots,i_t^u,\dots,i_m^u]表示用户uu的短期行为序列,其中包含了用户最近有交互的mm个商品。令Lu\mathcal{L}^u表示用户uu的长期行为序列,其中包含了用户最近7天内除Su\mathcal{S}^u外有交互的多个商品。令stus_t^upup^u分别表示用户uu在时间tt的短期行为序列的表征和长期行为序列的表征,这两种表征通过一个图11中的门控神经网络得到用户行为序列的表征otuRd×1o_t^u\in\mathbb{R}^{d\times1}。令VRd×IV\in\mathbb{R}^{d\times|\mathcal{I}|}表示商品集合I\mathcal{I}中所有商品的Embedding向量。将用户uu的行为序列表征otuo_t^u和商品ii的Embedding向量viv_i的内积作为两者相关性得分:

zi=score(otu,vi)=otuTviz_i=\text{score}(o_t^u,v_i)={o_t^u}^Tv_i

在时间t+1t+1,查询和用户相关性得分靠前的NN个商品作为召回的商品集合,输入推荐的后续环节。

训练和在线服务

训练阶段的正样本即在时间t+1t+1和用户有交互的商品it+1ui_{t+1}^u,负样本是从商品集合I\mathcal{I}中排除商品it+1ui_{t+1}^u后进行采样的商品。令用户uu的正负样本集合为K\mathcal{K},用户和每个样本的相关性得分集合为z=[z1,,zK]z=[z_1,\dots,z_{|\mathcal{K}|}],将相关性得分集合通过Softmax函数得到用户和每个样本在时间t+1t+1进行交互的预估概率集合y^=[y^1,,y^K]\hat{y}=[\hat{y}_1,\dots,\hat{y}_{|\mathcal{K}|}]

y^=softmax(z)\hat{y}=\text{softmax}(z)

损失函数使用交叉熵损失函数:

L(y^)=iKyilog(y^i)L(\hat{y})=-\sum_{i\in\mathcal{K}}{y_i\log(\hat{y}_i)}

推理阶段的整体架构和YouTube的视频推荐类似,商品集合I\mathcal{I}中所有商品的Embedding向量被保存至向量检索引擎——FAISS中,另外,系统实时收集用户行为日志,并转化为结构化的数据,在时间tt,用户短期行为序列Su\mathcal{S}_u和长期行为序列Lu\mathcal{L}_u被输入SDM,输出用户行为序列表征otuo_t^u,再从FASIS中查询和用户行为序列表征最相关的NN个商品。

用户短期行为序列表征和长期行为序列表征如何计算,以及如何融合得到最终的用户行为序列表征,如图12所示,下面详细介绍。

图12 SDM网络结构

Embedding

论文指出,商品特征包括ID、品类、品牌和商家。对于用户行为序列中的每个商品ituSui_t^u\in\mathcal{S}^u,将其转化为Embedding向量eituRd×1e_{i_t^u}\in\mathbb{R}^{d\times 1},而该Embedding向量由商品各特征的Embedding向量拼接而成:

eitu=concat({eiffF})e_{i_t^u}=\text{concat}(\{e_i^f|f\in\mathcal{F}\})

其中,eif=WfxifRdf×1e_i^f=W^fx_i^f\in\mathbb{R}^{d_f\times 1},表示商品特征ff的Embedding向量,而xifx_i^f是商品特征ff的独热编码,WfW^f是特征ff的Embedding字典。

相似地,用户特征包括年龄、性别等。用户的Embedding向量也是由用户各特征的Embedding向量拼接而成:

eu=concat({euppP})e_u=\text{concat}(\{e_u^p|p\in\mathcal{P}\})

其中,eupe_u^p表示用户特征pp的Embedding向量。

RNN

使用了LSTM/RNN对短期行为序列[ei1u,,eitu][e_{i_1}^u,\dots,e_{i_t}^u]进行建模。LSTM的网络结构如图13所示,引用自《动手学深度学习》的“现代循环神经网络”章节

图13 LSTM网络结构

其中,在时间ttht1uh_{t-1}^u表示上一个时间的隐状态,输入门可表示为:

intu=σ(Win1eitu+Win2ht1u+bin)in_t^u=\sigma(W_{in}^1e_{i_t^u}+W_{in}^2h_{t-1}^u+b_{in})

遗忘门可表示为:

ftu=σ(Wf1eitu+Wf2ht1u+bf)f_t^u=\sigma(W_f^1e_{i_t^u}+W_f^2h_{t-1}^u+b_f)

输出门可表示为:

otu=σ(Wo1eitu+Wo2ht1u+bo)o_t^u=\sigma(W_o^1e_{i_t^u}+W_o^2h_{t-1}^u+b_o)

候选隐状态ctuc_t^u可表示为:

ctu=ftct1u+intutanh(Wc1eitu+Wc2ht1u+bc)c_t^u=f_tc_{t-1}^u+in_t^u\tanh(W_c^1e_{i_t^u}+W_c^2h_{t-1}^u+b_c)

最终,隐状态可表示为:

htu=otutanh(ctu)h_t^u=o_t^u\tanh(c_t^u)

注意力

通过RNN对短期行为序列建模得到隐状态序列Xu=[h1u,,htu]X^u=[h_1^u,\dots,h_t^u]后,再通过自注意力机制对不相关的行为进行降权(用户可能会浏览一些不相关的商品)。

多头自注意力

图14 多头注意力和其中的缩放点积注意力

具体使用了Transformer中的多头注意力层。多头注意力层的计算可表示为:

X^u=MultiHead(Xu)=WOconcat(head1u,,headhu)\hat{X}^u=\text{MultiHead}(X^u)=W^O\text{concat}(\text{head}_1^u,\dots,\text{head}_h^u)

其中,WORd×hdkW^O\in\mathbb{R}^{d\times hd_k}hh表示多头注意力层的头数,即缩放点积注意力层的个数,而每个缩放点积注意力层的输出维度dk=1hdd_k=\frac{1}{h}d。多头注意力层将每个缩放点积注意力层的输出headiuRdk×t\text{head}_i^u\in\mathbb{R}^{d_k\times t}拼接在一起,再进行线性映射。因为采用自注意力机制,所以输入多头注意力层的VVKKQQ均为XuX^u,对于每个缩放点积注意力层,先对VVKKQQ进行线性映射,由维度dd转化为维度dkd_k,再输入缩放点积注意力层,对于缩放点积注意力层headiu\text{head}_i^u,令其线性映射后的VVKKQQQiu=WiQXuQ_i^u=W_i^QX^uKiu=WiKXuK_i^u=W_i^KX^uViu=WiVXuV_i^u=W_i^VX^u,其中,WiQ,WiK,WiVRdk×dW_i^Q,W_i^K,W_i^V\in\mathbb{R}^{d_k\times d}Qiu,Kiu,ViuRdk×tQ_i^u,K_i^u,V_i^u\in\mathbb{R}^{d_k\times t}。每个缩放点积注意力层的计算可表示为:

headiu=Attention(Qiu,Kiu,Viu)=Viu(softmax(QiuTKiu))T\text{head}_i^u=\text{Attention}(Q_i^u,K_i^u,V_i^u)=V_i^u(\text{softmax}({Q_i^u}^TK_i^u))^T

用户注意力

对于多头注意力输出的短期行为隐状态序列X^u=[h^1u,,h^tu]\hat{X}^u=[\hat{h}_1^u,\dots,\hat{h}_t^u],计算每个隐状态和用户特征的注意力得分:

αk=exp(h^kuTeu)k=1texp(h^kuTeu)\alpha_k=\frac{{\exp(\hat{h}_k^u}^Te_u)}{\sum_{k=1}^t{\exp({\hat{h}_k^u}^Te_u)}}

基于注意力得分对用户短期行为隐状态序列中的各隐状态进行加权求和得到用户短期行为序列表征:

stu=k=1tαkh^kus_t^u=\sum_{k=1}^t{\alpha_k\hat{h}_k^u}

融合长期行为序列表征

用户长期行为序列Lu\mathcal{L}^u也是由多个商品构成,其可分为多个子序列:Lu={LfufF}\mathcal{L}^u=\{\mathcal{L}_f^u|f\in\mathcal{F}\},每个子序列由商品的一种特征ff构成,商品特征包括ID、类别、品牌和商家。对用户长期行为序列的商品特征ff的子序列Lfu\mathcal{L}_f^u,其中每个商品的特征fkuLfuf_k^u\in\mathcal{L}_f^u,和短期行为序列中的处理相同,被转化为Embedding向量gkuRd×1g_k^u\in\mathbb{R}^{d\times 1},并计算商品特征ff的Embedding向量和用户特征的注意力得分:

αk=exp(gkuTeu)k=1Lfuexp(gkuTeu)\alpha_k=\frac{\exp({g_k^u}^Te_u)}{\sum_{k=1}^{|\mathcal{L}_f^u|}{\exp({g_k^u}^Te_u)}}

基于注意力得分对用户长期行为序列的商品特征ff的子序列Lfu\mathcal{L}_f^u中的各Embedding向量进行加权求和,得到子序列Lfu\mathcal{L}_f^u的表征:

zfu=k=1Lfuαkgkuz_f^u=\sum_{k=1}^{|\mathcal{L}_f^u|}{\alpha_kg_k^u}

将用户长期行为序列的多个子序列的表征拼接在一起:

zu=concat({zfufF})z^u=\text{concat}(\{z_f^u|f\in\mathcal{F}\})

再将拼接后的Embedding向量通过一层全连接网络得到dd维的用户长期行为序列表征puRd×1p^u\in\mathbb{R}^{d\times 1}

pu=tanh(Wpzu+b)p^u=\tanh(W^pz^u+b)

对于如何融合用户特征eue^u、用户短期行为序列表征stus_t^u和用户长期行为序列表征pup^u,论文设计了一个门控网络,将上述三个表征分别线性映射并求和,再通过一个Sigmoid函数输出门控向量GtuRd×1G_t^u\in\mathbb{R}^{d\times 1}

Gtu=sigmoid(W1eu+W2stu+W3pu+b)G_t^u=\text{sigmoid}(W^1e_u+W^2s_t^u+W^3p^u+b)

最后,通过门控向量GtuG_t^u对用户长、短期行为序列表征进行加权求和得到用户行为表征otuRd×1o_t^u\in\mathbb{R}^{d\times 1}

otu=(1Gtu)pu+Gtustuo_t^u=(1-G_t^u)\odot p^u+G_t^u\odot s_t^u

多用户向量的双塔模型-MIND

2019年阿里巴巴天猫团队发表的论文《Multi-Interest Network with Dynamic Routing for Recommendation at Tmall》提出了MIND(Multi-Interest Network with Dynamic routing)算法,设计了多兴趣抽取层(Multi-Interest Extractor Layer),通过动态路由(Dynamic Routing),自适应地聚合用户历史行为生成用户兴趣表征,将用户历史行为划分为多个聚类,每类的用户历史行为被转化为表征用于表示用户的某一类兴趣,因此,对于一个用户,MIND会输出多个用户表征,用于表达用户多样化的兴趣。

问题建模

图15 MIND网络结构

令商品集合为I\mathcal{I},用户集合为U\mathcal{U},召回的目标就是对于用户uUu\in\mathcal{U},从数十亿的商品集合中召回数千个用户感兴趣的商品,且召回的每个目标商品可由三元组(Iu,Pu,Fi)(\mathcal{I}_u,\mathcal{P}_u,\mathcal{F}_i)表示,其中,Iu\mathcal{I}_u表示用户已交互的商品集合(即用户行为序列),Pu\mathcal{P}_u表示用户画像(年龄、性别等),Fi\mathcal{F}_i表示召回的目标商品的特征(ID、类别等),MIND的任务之一是将用户行为序列和画像通过用户塔转化为用户多兴趣表征:

Vu=fuser(Iu,Pu)V_u=f_{user}(\mathcal{I}_u,\mathcal{P}_u)

其中,Vu=(vu1,,vuK)Rd×KV_u=(\overrightarrow{v}_u^1,\dots,\overrightarrow{v}_u^K)\in\mathbb{R}^{d\times K}表示用户多兴趣表征,共有KK列不同的兴趣,每列兴趣的维度为dd

MIND的任务之二是将召回的目标商品的特征通过商品塔转化为商品表征:

ei=fitem(Fi)\overrightarrow{e}_i=f_{item}(\mathcal{F}_i)

其中,eiRd×1\overrightarrow{e}_i\in\mathbb{R}^{d\times 1}表示商品表征。

最后,计算用户每个兴趣额表征和商品表征的余弦相似度,取其中最大值作为用户和商品的相关性得分:

fscore(Vu,ei)=max1kKeiTvukf_{score}(V_u,\overrightarrow{e}_i)=\max_{1\le k\le K}\overrightarrow{e}_i^T\overrightarrow{v}_u^k

然后取用户和商品相关性得分最高的NN个商品作为召回的商品。

Embedding和池化层

MIND的输入是三元组(Iu,Pu,Fi)(\mathcal{I}_u,\mathcal{P}_u,\mathcal{F}_i),其中包含了高维稀疏的特征(如各类ID),因此,通过Embedding层将各类特征转化为低维稠密的Embedding向量,若某类特征包含多个值(如商品的多个类别),则将多个值的Embedding向量进行平均池化,最终,得到三元组(Iu,Pu,Fi)(\mathcal{I}_u,\mathcal{P}_u,\mathcal{F}_i)的Embedding向量特征。

多兴趣抽取层

经过Embedding和池化层后,用户行为序列被表示为已交互的多个商品的Embedding向量。论文通过多兴趣抽取层,将上述多个商品的Embedding向量进行聚类,划分为多个兴趣表征向量,每个兴趣表征表示用户的一类兴趣。多兴趣抽取层的实现论文采用了胶囊网络(Capsule Network)。先简单介绍一下胶囊网络。胶囊网络于2011年在论文《Transforming auto-encoders》中被提出。胶囊网络提出了一种新的“vector in vector out”的传递方案,其中每个特征都是用一个向量(即Capsule,胶囊)来表示,如图16所示,神经元的输入是多个向量,输出也是向量。

图16 胶囊网络的每个特征都是向量,并且通过聚类来递进

令胶囊网络为两层,下层有mm个向量,cilRNl×1,i{1,,m}\overrightarrow{c}_i^l\in\mathbb{R}^{N_l\times 1},i\in\{1,\dots,m\},上层有nn个向量,cjhRNh×1,j{1,,n}\overrightarrow{c}_j^h\in\mathbb{R}^{N_h\times 1},j\in\{1,\dots,n\},下层第ii个向量到上层第jj个向量的路由权重bijb_{ij}可由下式计算:

bij=(cjh)TSijcilb_{ij}=(\overrightarrow{c}_j^h)^TS_{ij}\overrightarrow{c}_i^l

其中,SijRNh×NlS_{ij}\in\mathbb{R}^{N_h\times N_l}表示需要学习的双线性映射矩阵。

对路由权重进行归一化:

wij=expbijk=1mexpbikw_{ij}=\frac{\exp b_{ij}}{\sum_{k=1}^m{\exp b_{ik}}}

基于归一化的路由权重,对下层向量线性映射并全权求和得到上层第jj个向量的输入:

zjh=i=1mwijSijcil\overrightarrow{z}_j^h=\sum_{i=1}^m{w_{ij}S_{ij}\overrightarrow{c}_i^l}

最终,通过一个非线性激活函数对上层第jj个向量的输入进行压缩得到第jj个向量:

cjh=squash(zjh)=zjh21+zjh2zjhzjh\overrightarrow{c}_j^h=squash(\overrightarrow{z}_j^h)=\frac{\parallel\overrightarrow{z}_j^h\parallel^2}{1+\parallel\overrightarrow{z}_j^h\parallel^2}\frac{\overrightarrow{z}_j^h}{\parallel\overrightarrow{z}_j^h\parallel}

从上述计算过程可以看出,路由权重bijb_{ij}的计算需要上层向量cjh\overrightarrow{c}_j^h,而上层向量cjh\overrightarrow{c}_j^h的计算又需要路由权重bijb_{ij},相互依赖,因此实际计算时,一般先将bijb_{ij}初始化为0,然后重复迭代上述计算过程3次,选取最后一次计算所得的cjh\overrightarrow{c}_j^h作为后续网络层的输入。

论文将用户行为序列中的多个商品的Embedding向量作为输入胶囊网络的下层向量,通过胶囊网络对向量进行聚类,将胶囊网络输出的上层向量作为用户的多个兴趣表征向量,并对原始的胶囊网络进行多处改进。

第一处改进,原始的胶囊网络中每一个下层向量和上层向量的配对有独立的路由矩阵SijS_{ij},而论文令所有下层向量和上层向量的配对共享一个路由矩阵SRd×dS\in\mathbb{R}^{d\times d}

bij=ujTSei,iIu,j{1,,K}b_{ij}=\overrightarrow{u}_j^TS\overrightarrow{e}_i,i\in\mathcal{I}_u,j\in\{1,\dots,K\}

其中,eiRd\overrightarrow{e}_i\in\mathbb{R}^d是用户行为序列中第ii个商品的Embedding向量,ujTRd\overrightarrow{u}_j^T\in\mathbb{R}^d是用户第jj类兴趣表征。

第二处改进,原始的胶囊网络中路由权重bijb_{ij}被初始化为0,而论文中共享一个路由矩阵,这就会导致上层的多个向量完全一致,因此,论文从正态分布N(0,σ2)\mathcal{N}(0,\sigma^2)中进行采样,对路由权重bijb_{ij}进行初始化,避免出现上层的多个向量完全一致的问题。

第三处改进,不同的用户其兴趣类别的数目不同,因此,论文对不同的用户动态调整胶囊网络输出的兴趣表征个数,并采用启发式的规则计算用户兴趣表征的个数:

Ku=max(1,min(K,log2(Iu)))K_u'=\max(1,\min(K,\log_2(|\mathcal{I}_u|)))

即用户行为序列中的商品越多,则用户兴趣类别越多。

改进后胶囊网络的迭代计算过程如图17所示。

图17 改进后胶囊网络迭代计算过程

注意力层

经过多兴趣抽取层和MLP层后,输出用户多兴趣表征Vu=(vu1,,vuK)Rd×KV_u=(\overrightarrow{v}_u^1,\dots,\overrightarrow{v}_u^K)\in\mathbb{R}^{d\times K}。论文提出,在训练阶段,采用类似Transformer中点积注意力的计算方法,计算用户的各个兴趣表征和目标商品的注意力得分,并基于注意力得分将各个兴趣表征加权求和得到用户和目标商品相关的兴趣表征:

vu=Attention(ei,Vu,Vu)=Vusoftmax(pow(VuTei,p))\begin{align} \overrightarrow{v}_u&=\text{Attention}(\overrightarrow{e}_i,V_u,V_u)\\ &=V_u\text{softmax}(\text{pow}(V_u^T\overrightarrow{e}_i,p)) \end{align}

其中,若参数pp接近0,则用户各个兴趣表征的注意力得分基本相等,若参数pp接近无穷大,则经过注意力层后输出的基本就是用户和目标商品点积最大、最相关的那个兴趣表征,是一种Hard Attention。论文指出,训练时,若采用Hard Attention,则模型会更快收敛。

离线训练和在线服务

得到用户表征vu\overrightarrow{v}_u和目标商品Embedding向量ei\overrightarrow{e}_i后,对两者进行点积计算,再通过Softmax函数得到用户与该商品交互的概率:

Pr(iu)=Pr(eivu)=exp(vuTei)jIexp(vuTej)\text{Pr}(i|u)=\text{Pr}(\overrightarrow{e}_i|\overrightarrow{v}_u)=\frac{\exp(\overrightarrow{v}_u^T\overrightarrow{e}_i)}{\sum_{j\in\mathcal{I}}{\exp(\overrightarrow{v}_u^T\overrightarrow{e}_j)}}

离线训练的目标就是对于训练数据中所有的用户与商品发生交互的记录D\mathcal{D},最大化以下对数似然函数:

L=(u,i)DlogPr(iu)L=\sum_{(u,i)\in\mathcal{D}}{\log{\text{Pr}(i|u)}}

而上述函数中,概率的分母需对商品集合中的所有商品进行计算,计算量太大,因此,论文采用了Sampled Softmax技术,对商品集合进行采样得到商品子集合(包含训练数据中的商品),从而减少计算量。

所有商品的Embedding向量会被预先计算、并被存入向量检索引擎——FASIS中。在线服务时,通过用户塔得到用户多兴趣表征Vu=(vu1,,vuK)V_u=(\overrightarrow{v}_u^1,\dots,\overrightarrow{v}_u^K)后,不再通过注意力层对多兴趣表征进行加权求和,而是直接对每个兴趣表征、从向量索引中查找最相关的若干个商品,最终返回全局最相关的NN个商品作为召回的候选集合进入后续的排序阶段。

参考文献