谈谈推荐系统中的用户行为序列建模

上一篇[《从谷歌到阿里,谈谈工业界多目标预估的两种范式》公布后,得到了许多赞,也要我这一知乎问答小萌新涨了一些粉,十分高兴。

鱼罐头啊:从Google到阿里巴巴,谈一谈工业领域推荐系统多总体目标预计的二种现代性

深度神经网络实体模型可以看作是在搭“lego”,最底层应用的这些控制模块(Attention/RNN/CNN/Transformer等)便是乐高积木。当遭遇一个主要的问题时,寻找适宜的乐高积木,构建好合适某一问题的lego就变得十分关键。

在推荐系统中,用户个人行为序列建模是一个十分关键的话题讨论。近几年来,在深层召回(Deep ** tch)、深度排序(精排和重新排列)等行业发布的工作中,一个很重要的角度便是提升用户个人行为序列建模的方法。

文中大约会包括两部份內容:一、大概谈一谈我了解的,推荐系统中的用户个人行为序列建模,为什么要开展用户个人行为序列建模;二、谈一谈做用户个人行为序列建模时,优化算法最底层乐高积木有什么,大约如何使用。

心存丘壑,遇事不慌,在做用户个人行为序列建模时,深层次了解这种乐高积木的功效,信手沾来以至恰当不断创新坠好的,但要是确实不清楚咋搞,暴力行为试着也无疑是一个好挑选...

话不多说,进到主题。

推荐系统、召回、排序和用户个人行为序列建模

现阶段工业领域的推荐系统依然沿用着Google 16年刊登的 《Deep Neural Networks for YouTube Recommendations》架构。

大约是那样一个pipeline:

Matching:一般包含召回和粗排2个一部分。召回部分承担从全库召回/查找原材料(产品、內容、广告宣传等),一般规定各界召回遮盖每个视角,因而量级依然很极大(一般在万数量级);粗排一部分承担将各界召回的具体内容开展统一的排序,取下top的內容送进到排序控制模块中。为什么不立即送至排序控制模块中呢?排序实体模型一般比较复杂,而一般强烈推荐对rt拥有非常高的规定,因而排不了全部的原材料。粗排一般应用一些不那麼繁杂的实体模型,例如gbdt,lr,fm等,最近也是有一些工作中应用知识蒸馏的方式 做粗排,觉得也很有趣,还有机会实践活动得话还可以来共享下~Ranking:一般包含精排和重新排列等一部分。精排部分关键涉及的工艺为点击量预计(CTR预估),应用point-wise的方式 对<user,item,context>三元组搞出一个分,随后开展排序。一般推荐系统的商业服务总体目标都比较复杂,拆卸到推荐系统也不仅包括一个总体目标,因而也会牵涉到多总体目标预计的问题;精排实体模型一般全是point-wise的,排序出的top內容很有可能全是类似的,立即呈现实际效果和感观都是有一定损害,而重新排列实体模型承担对全部强烈推荐目录开展提升;若强烈推荐目录中涉及多种多样不通过的原材料,还牵涉到原材料中间的分栏。

此外,一般推荐系统也包括一个标准控制模块,适用打撒、白/信用黑名单、调权等领域模型。

详细介绍完推荐系统,再介绍下深层召回(Deep ** tch)和排序的不同点,及其为什么用户个人行为序列建模很重要。

通常而言,Deep ** tch的问题界定是:预测分析用户下一个会点一下的原材料。而排序解决的问题是:预测分析用户对某一产品的点击量。两者都可以运用的信息内容为:用户的静态数据profile(包含统计分析特点)、用户的个人行为序列(包含前后文信息内容)、內容的静态数据特点(包含统计分析特点)。

二者的首要区别为:Deep ** tch中没有目标原材料(target item)的定义,而排序中可以应用总体目标原材料,与此同时还可以根据总体目标原材料做一些交叉式特点。

形象化的思索是,如果不应用用户个人行为序列建模,只应用用户静态数据的profile和內容静态数据特点做强烈推荐行吗?毫无疑问是可以的,事实上,一些小总流量的强烈推荐情景,缺乏用户历史时间的行为信息,大部分也是运用这种信息内容开展强烈推荐。可是一旦用户个人行为充足,大部分大伙儿都是会紧紧围绕用户个人行为序列做一些事儿。

想了下大约有下列几类原因。第一,推荐系统实质上也是一种"信息内容的运用",提高它有这两种方法,一种是引进新的信息内容,一种是更合理的运用现有的信息内容,引进用户个人行为序列特点毫无疑问归属于引进新的信息内容。第二,推荐系统中的用户兴趣爱好转变十分强烈,例如电子商务强烈推荐中,用户一会看一下服装,一会看一下电子设备,若只应用静态数据特点开展强烈推荐,每一次强烈推荐的內容是一样的,这显然是无法达到用户要求。

因而用户个人行为序列的建模十分关键,且越即时越好。

探讨用户个人行为序列建模

大概而言,用户个人行为序列建模包括下列多种方法:

pooling-based architecture现代性,特性是将用户历史时间个人行为看作一个混乱 ** ,方式有sum/ ** x pooling,和各种各样attention等sequential-modeling architecture现代性,将用户个人行为看作一个具备時间特性的序列,方式是有RNN/LSTN/GRU等一种提取/聚类分析出用户多峰兴趣爱好,方式有Capsule等此外依据业务场景的独特,也会牵涉到一些其它的方式

有意思的是,不一样的方式中间可以开展组成/累加,是否愈来愈像在积木游戏了呢^^。

下边各自开展详细介绍。

各种各样pooling方式

又要提及Google那篇《Deep Neural Networks for YouTube Recommendations》了。这篇文章明确提出的Deep ** tch和Deep ranking model构造中,将用户收看过的视频序列得到embedding后,干了一个mean pooling做为用户历史时间兴趣爱好的表述。

这类方法非常简单,可是简约实用。一般来说可以当作一个baseline。

target/user/context attention方式

以上将用户个人行为序列中的每个item取embeddding,随后做pooling的方式,实质上把用户点一下过的每个item作为同样关键。

事实上,用户点过的item对每日任务的贡献是不一样的。举例说明,在排序每日任务中,预测分析user点一下某一target item的几率,user在历史上点过的和target item同一类目地item显著会具有更为关键的功效。

实际上,紧紧围绕这一点设计方案一种品类hit特点,一般都十分合理。

是否有更为高贵的办法呢?阿里巴巴17年明确提出了DIN实体模型第一次将attention观念引进ctr预计实体模型。将target item和个人行为序列中的item做一个attention,获得一个weight,随后开展加权求和后,再和user profile features、candidate items、context features concat后,添加几层mlp。

DIN是CTR预计行业十分关键的一篇文章,但其牵涉到target item和个人行为序列item的attention,而召回中是沒有target item的。那麼能不能也更新改造下Google明确提出的Deep ** tch方式,让它也用上attention呢?

实际上,target attention的观念略微延伸下,就可以变为user attention、context attention等。例如,将user profile获得的embedding,和用户序列中的item做一个attention,便是user attention。将个人行为序列item相匹配的context特点(个人行为序列部位、滞留时间等)embedding化时和别的side info做一个attention,便是context attention。

上边提及的各类数据可以随意搭配做attention,及其attention的方法还可以变一变,Bagdanau attention/Luong attention等都能够试一试,很合乎大家积木游戏的服务宗旨嘛。

transformer大名鼎鼎,早已有许多很好文章详细介绍,写其内部结构关键点,这儿并不准备当装卸工。如果有同学们沒有看了得话,除开全文外,首先推荐Jay Alam ** r的这一篇《The Illustrated Transformer》,十分清晰。

此外,为什么不把self attention放到上一节一起讲,反而是独立拆下来,是由于尽管一样叫做attention,在用户个人行为序列建模,二者的功能是不一样的。

在target/user/context attention中的作用是,引进target/user/context信息内容对个人行为序列中的item做一个加权求和。而self attention的可以并行执行的建模长序列依靠,功效是除去用户个人行为序列中的噪音。

应用transformer/multi-head attnention/self attention建模用户个人行为序列的工作中如今还有许多,强烈推荐《Behavior Sequence Transformer for E-commerce Recommendation in Alibaba》,这篇文章有一个小福利是附加了许多调参方法。

此外,美团外卖近些天释放了《Transformer 在美团外卖检索排序中的实践活动》,里边贴出了美团外卖在运用transformer时要的方式、遇到的艰难、得到提高的方法。十分强烈推荐(我想到了我就用transformer没实际效果的那阵子...)。

插句话,这大约便是做推荐系统真正的模样了。各界paper只能对你说她们作出了不错的实际效果,各种各样SOTA。可是到你自己使用过的情况下,通常是没实际效果,不清除业务流程/数据信息/调参差别会造成实际效果不一样,也是有很绝大多数是这种paper在胡扯,压根不可以发布。

这个时候不必开始怀疑人生,由于人生道路确实就这样荒谬...多了解一些乐高积木,招数换一换或许就会有作用了^^。

RNN/LSTM/GRU方式

下边详细介绍RNN/LSTM/GRU类方法,这类方法将用户个人行为看作一个序列,套入NLP行业常见的RNN/LSTM/GRU方式来开展建模。

可以参照的毕业论文有GRU4REC,将seesion中点一下item的个人行为看作一个序列,应用GRU开展描绘。知乎上有创作者的亲自讲解,这儿不会再反复。

白婷:强烈推荐中的序列化建模:Session-based neural recommendation

此外一篇应用RNN类方法建模用户个人行为序列的文章内容是《Perceive Your Users in Depth: Learning Universal User Representations from Multiple E-commerce Tasks》,荣誉出品于阿里搜索。较为有趣的是这篇paper明确提出了一种Property Gated LSTM方式。

其根据多任务学习的方法学得一个比较常用的用户表现。从总体上,实体模型将用户个人行为序列中的每一个个人行为xi分为产品信息item_i(item id、shop id、brand id)和个人行为特性property_i(情景、時间等前后文),通过embedding层获得embedding后,通过一个Property Gated LSTM层后,获得每一个个人行为连接点的隐情况,应用attention网络对隐情况开展权重计算,随后和user profile feature concat后做为輸出。

Property Gated LSTM相对性一般LSTM有哪些修改呢?针对键入门、忘却门和輸出门,将产品信息和语义信息内容都做为键入,可是针对cell情况的升级,只应用产品信息而不应用前后文信息内容。也就是创作者觉得,用户个人行为的前后文信息内容不应该添加到cell情况的刷新中,而只用以门的升级。

用户多兴趣爱好表述

在前面的方式 中,大部分都遵循着那样的现代性:将用户个人行为序列通过pooling/attention/rnn的解决,汇聚成一个用户个人行为序列的embedding,随后添加其他的特点embedding concat后,再通过几层的mlp后做为接sigmode(排序每日任务)或是soft ** x/sampled soft ** x(召回每日任务)。

实际上,用户个人行为序列里,通常包括着用户的多峰兴趣爱好。每一个用户的历史时间个人行为长短不一样,用户的爱好总数也不一样,能否将用户个人行为提取/汇聚成好几个中兴趣爱好,而且表明为不一样的embeding呢?

阿里巴巴首猜强烈推荐精英团队在2019年明确提出的MIND方式,恰当的应用胶囊网络中的动态路由优化算法,将最底层的用户个人行为序列做为”vector in",顶层“vector out”的胶襄做为用户多峰兴趣爱好。

动态路由实际优化算法见上图。路由器指数 的测算必须应用到顶层胶襄的輸出 ,而 的测算相反又必须 ,因而这里通过迭代的方式,首先初始化路由系数 ,一步步迭代得到 ,最终得到上层胶囊的输出 。

关于胶囊网络的背景知识,可以看下苏剑林的三篇博客,揭开迷雾,来一顿美味的Capsule盛宴,再来一顿贺岁宴:从K-Means到Capsule,三味Capsule:矩阵Capsule与EM路由。知乎上也有比较多的讨论,大家有兴趣可以看一下。

这里稍微提一下,MIND中比较有意思的一些点,是不管用什么方式抽取多兴趣都可以借鉴的。第一是MIND中的兴趣数量是自适应的,作者设置了K个兴趣上限,然根据用户行为数量 来调整实际抽取出的兴趣数量。

第二点,是作者使用了Label-aware Attention Layer,训练时,将用户下一个点击的item作为query,而不同的用户兴趣作为key和value,做一个attention,并且可以通过超参p来对attention分布进行控制。而在线上,每个用户兴趣向量分开进行召回。

辅助损失函数

在DIN的基础上,2018年阿里妈妈发表了DIEN,它将网络分为兴趣提取层和兴趣演化层。其用户行为特征在得到embedding后,首先经过一个兴趣提取层(GRU),得到兴趣表达 ,然后将兴趣表达经过一个兴趣演化层,具体操作为将兴趣表达 和target item进行一个attention操作后,将attention score代入到第二层GRU的更新门中,控制门的更新,以最后一个hidden state作为用户兴趣表达。

其实,大家可以看到,DIEN中同样涉及到了GRU和attention操作,甚至使用了两层的gru,为什么拿到辅助损失函数这一块来讲呢?因为用RNN/GRU/LSTM建模用户行为序列的论文还挺好找的,辅助损失函数的相对少一些..

在兴趣提取模块,作者在每个time stap引入了辅助loss来刻画每个兴趣的隐状态 ,要求 ,其中 是 对应的embedding, 是i+1时刻随机采样未发生行为对应的embedding。f(x)可以是一个全连接函数,然后加入到辅助函数中进行优化。

至于为什么要加辅助函数,以及辅助函数为什么有效。作者的表述为若没有辅助loss,GRU的各个隐变量完全受限于最终的点击label,加入辅助loss,能够更好的约束GRU每个隐状态表示好其本身的兴趣。

其他

上文提到了用户行为序列建模中常用到的一些积木,像attention、gru/lstm基本上已经成为标配,暴力尝试组合就常常会有效果,我将之称为通用的积木。

但另一方面,我们在做推荐系统时,面临不同业务场景,不同优化的阶段,常常面临不同的问题,这时候也有一些有趣的解法。

例如,在电商推荐中,我们看用户行为序列的case时,发现用户的兴趣常常可以按照session来进行切割,DSIN这篇论文发现了这一点,将用户行为序列按照30分钟的间隔进行切割。

例如,阿里妈妈定向广告团队发现仅仅提升用户序列的长度,就可以带来可观的auc提升,为了建模超长行为序列,提出MIMN,设计了UIC(User Interest Center)模块,将用户兴趣表达模块单独进行拆分而不是每次请求进行计算。

例如,微信看一看召回中,存在多种异构行为序列的信息可以利用(比如可以用腾讯新闻、电商购物行为等等)。作者得到特征域的用户行为序列表达后,使用attention的方法替换concat的方法,动态调整不同领域的融合权重。

写在最后

呼...又是一篇长文,贴图贴公式还是蛮累的。

本文尝试将用户行为建模中的常见的“积木”进行区分,形成一个大致的框架,便于自由组建“乐高”。但限于水平有限,表达能力有限,错漏之处难免,请大家交流指正。

觉得写得好的话,也希望点个赞点个关注^^

想尝试下阿里工作机会的话,可以私信勾搭^^

扫码免费用

源码支持二开

申请免费使用

在线咨询