我:“我刚离线训练一个表现不错的排序模型,想上线做实时推理,大哥帮我部署一下”
大佬:“你模型用了哪些特征,有近线、实时特征吗?有用户短期行为特征吗?是否里面有地理位置、上下文呢?”
我:“enmmm,我都用的是一些离线特征,比如用户最近一个月的消费总额、是否周末,对了我还用了id类特征,来吧我这一上线保证有收益”
大佬:"出门右转,去找人事把这个月工资结一下"
我(盯着勺子把):“大佬说的是啥意思.....,这个月要涨工资了吗,嘿嘿嘿 中午加个鸡腿。”
大佬说的是什么意思呢?来让我们仔细分析一下:
在一个推荐系统中(如图),当我们训练完模型后,我们肯定要在线为用户进行服务,帮助用户进行对物品的个性化选择,选择一些用户可能感兴趣的物品推出去。
不是任何一种牛奶都叫特仑苏,也不是任何一个模型,都需要在线infer(推理),模型做不做线上推理跟效果有关,但是也跟你选择的特征有很大关系。想想如果我们的模型中是这样一些特征,如:用户性别、用户所属兴趣标签、用户最近7天查看最多的物品集合,用户id,物品id,物品属性,这种静态特征(可以理解为不轻易改变的特征,如年龄、性别等)我们还需要在线推理吗?答案是:不用。
为什么不用呢?举个简单的例子:比如有一个模型我们离线训练好了,对于用户A,我们引入用户id、用户性别、用户年龄、物品id、物品属性、物品描述。我们将模型进行线上实时推理。
那我们知道推荐系统的最终目的是给用户生成一个推荐列表(默认排在越前越先给用户推荐):
[airpods、香蕉、2080ti、eva初号机.....]
基于这个推荐列表,我们决定给用户的一个展示位中该展示的物品排序。比如上面展示排序,第一个给用户首推airpods。
那对于上述的特征我们如果在线上推理的话会产生什么样的效果呢:
f(用户id、用户性别、用户年龄、物品id、物品属性、物品描述)
在2020/8/21 9:00-9:05给用户推荐的列表为:
[airpods、香蕉、2080ti、eva初号机.....]
在2020/8/21 9:05-9:10给用户推荐的列表为:
[airpods、香蕉、2080ti、eva初号机.....]
在2020/8/21 9:10-9:15给用户推荐的列表为::
[airpods、香蕉、2080ti、eva初号机.....]
(ps,此处还没有rerank,模型对于物品的排序顺序在21号当天没有丝毫改变)
那对于用户来说,线上实时推理和离线推理排序到线上的效果是完全一样的,那么为什么我们要将推理过程放在线上呢?每次用户请求,发生一次一摸一样的排序,发生大量计算荣誉。
总结:当排序模型没有所谓的不易改变的静态特征,那么我们是否可以头一天晚上,做好推理结果,直接将结果放在线上redis(或者其他内存数据库)中直接排出去。所以说一个模型是不是需要近线、在线提供infer服务,是靠特征判断的。当然也存在一些实时召回的物品,这些不在考虑范围内,文章只是从特征角度分析,为什么模型需要在线服务。
那么哪些模型设计出来就是需要线上infer的呢?
Din(深度兴趣网络 Deep Interest Network)
本文不详细介绍模型,后续我们会更加细致介绍模型的各种结构,以及如何上线服务等一系列trick。来看看Din的特征描述:
从原文中抽取出对的特征表:
用户侧画像:如年龄、性别等(静态特征)
用户行为特征:序列特征,每个用户一multi-hot出现如[i1,i4,i9,10](动态特征,比如用户十分钟点击序列,这个根据训练时候的划分序列的时间窗口决定)
物品特征:商品id、商铺id、品类id。(静态特征)
上下文特征:时间、地点等(动态特征)
我们先不要管模型的内如运转是如何的。只看特征,din就是为可以捕捉用户更加细致的兴趣,最能体会的就是用户点击行为特征,那么我们在线上infer的时候,极端的来说,每发生一个用户点击,最终用户推荐列表都会改变,当然线上有一定的延迟,比如五分钟做一次排序。整个过程可以解释为如下过程:
Din模型离线已经训练好了
对与用户a来说
在2020/8/21 9:00-9:05,点击的用户序列为
[airpods、香蕉、2080ti、eva初号机.....]
那么将这个用户序列输入din模型:
Din(uid(a),[airpods、香蕉、2080ti、eva初号机], 大黄蜂手办)=0.87
Din(uid(a),[airpods、香蕉、2080ti、eva初号机], nike球鞋)=0.84
Din(uid(a),[airpods、香蕉、2080ti、eva初号机], 乒乓球)=0.64
..
产生排序推荐给用户:
[大黄蜂手办,nike球鞋, 乒乓球]
在2020/8/21 9:05-9:10,点击的用户序列为
[大黄蜂手办,机器学习,spark,啤酒]
那么将这个用户序列输入din模型:
Din(uid(a),[大黄蜂手办,机器学习,spark,啤酒], 葡萄酒)=0.97
Din(uid(a),[大黄蜂手办,机器学习,spark,啤酒], hadoop)=0.84
Din(uid(a),[大黄蜂手办,机器学习,spark,啤酒], 高达seed)=0.64
..
产生下一阶段排序推荐给用户:
[葡萄酒办,hadoop, 高达seed]
贴一个din模型结构图,后期我们会细致讲解魔改din。
Bst( Behavior Sequence Transformer for E-commerce Recommendation in Alibaba 基于transformer的用户行为序列推荐)
依然先贴特征描述:
从模型框架中可以看出,其也是将物品的行为序列引入模型,只不过与target做了一个transformer而已。此处,我们主要是看特征,来发现模型是否需要线上infer。
写在最后:
总的来说,排序模型大部分都需要线上服务的,这篇文章主要是从特征角度出发,帮助大家从另外一个角度理解,模型为什么要上线infer。是因为我们在对模型特征构造的时候,设计了在线上才能产生的特征,所以我们要在线infer。此处我们可以想想多路召回,为什么可以在离线做。为什么我们可以引入fm来整合离线召回的各个路。