推荐系统———你的模型确定需要在线infer吗?

我:“我刚离线训练一个表现不错的排序模型,想上线做实时推理,大哥帮我部署一下”

大佬:“你模型用了哪些特征,有近线、实时特征吗?有用户短期行为特征吗?是否里面有地理位置、上下文呢?”

我:“enmmm,我都用的是一些离线特征,比如用户最近一个月的消费总额、是否周末,对了我还用了id类特征,来吧我这一上线保证有收益”

大佬:"出门右转,去找人事把这个月工资结一下"

我(盯着勺子把):“大佬说的是啥意思.....,这个月要涨工资了吗,嘿嘿嘿 中午加个鸡腿。”

大佬说的是什么意思呢?来让我们仔细分析一下:

2d35be9c6c3c489bca43358e927f6c72.png

        在一个推荐系统中(如图),当我们训练完模型后,我们肯定要在线为用户进行服务,帮助用户进行对物品的个性化选择,选择一些用户可能感兴趣的物品推出去。

        不是任何一种牛奶都叫特仑苏,也不是任何一个模型,都需要在线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的特征描述:

235429f05cdc72c7447840cb6e690b75.png

从原文中抽取出对的特征表:

  1. 用户侧画像:如年龄、性别等(静态特征)

  2. 用户行为特征:序列特征,每个用户一multi-hot出现如[i1,i4,i9,10](动态特征,比如用户十分钟点击序列,这个根据训练时候的划分序列的时间窗口决定)

  3. 物品特征:商品id、商铺id、品类id。(静态特征)

  4. 上下文特征:时间、地点等(动态特征)

我们先不要管模型的内如运转是如何的。只看特征,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。

c4b4318760e400372b1ca745265544bd.png

Bst( Behavior Sequence Transformer for E-commerce Recommendation in Alibaba 基于transformer的用户行为序列推荐)

依然先贴特征描述:

226074f77ef142ec44116e7ea59a4a17.png

b9d76f6ef7e24b87ab20f91b51fe2543.png

从模型框架中可以看出,其也是将物品的行为序列引入模型,只不过与target做了一个transformer而已。此处,我们主要是看特征,来发现模型是否需要线上infer。

写在最后:

    总的来说,排序模型大部分都需要线上服务的,这篇文章主要是从特征角度出发,帮助大家从另外一个角度理解,模型为什么要上线infer。是因为我们在对模型特征构造的时候,设计了在线上才能产生的特征,所以我们要在线infer。此处我们可以想想多路召回,为什么可以在离线做。为什么我们可以引入fm来整合离线召回的各个路。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值