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

最后一篇文章[从谷歌到阿里巴巴,谈论两种行业多目标估计范式发布后,它赢得了很多赞扬,但也让我知道小透明增加了一些粉末,非常高兴。

鱼罐头:从谷歌到阿里,我们来谈谈工业推荐系统多目标预测的两种范式

深度学习模型可以看作是乐高的模块(Attention/RNN/CNN/Transformer等等)是积木。面对具体问题,找到合适的积木,搭建适合某个问题的乐高是非常重要的。

用户行为序列建模是推荐系统中非常重要的话题。近年来,在深度召回中(Deep ** tch)、优化用户行为序列建模的一个非常重要的方向,优化用户行为序列建模的一个非常重要的方向。

本文可能包括两部分:一是谈谈我所理解的,推荐系统中的用户行为序列建模,为什么要进行用户行为序列建模;2、在进行用户行为序列建模时,算法的底部积木是什么,如何使用。

心有沟壑,遇事不慌。在建模用户行为序列时,要深入了解这些积木的作用,让创新变得巧妙。然而,如果你真的不知道该怎么办,暴力尝试也是一个不错的选择...

话不多说,进入正题。

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

目前工业界的推荐系统依旧沿用着Google 发表于16年《Deep Neural Networks for YouTube Recommendations》框架。

大概就是这样pipeline:

Matching:一般包括召回和粗排。召回部分负责从全库召回/检索材料(商品、内容、广告等)。),一般要求各种召回覆盖各个角度,所以数量级还是很大的(一般在万量级);粗排部分负责对各种召回的内容进行统一排序,取出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的方法,动态调整不同领域的融合权重。

写在最后

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

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

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

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

Copyright ©2021 All rights reserved | 粤ICP备2021138463号-3

扫码免费用

源码支持二开

申请免费使用

在线咨询