离线在线打通,有如下几种方案
方案一:结果传递
方案
典型的Item-cf离线推荐,即是离线挖掘的结果,完整写入Cache中提供给在线服务使用,算法在离线侧,算法结果在在线侧,整个算法对在线完全透明。痛点
- 不可以实时化(模型实时化,特征实时化均不可)
- 通常是天级别(最快小时级别)更新的
- 覆盖率痛点,无法覆盖全量用户(尤其是新用户)
方案二:枚举传递
第一期的时候,为了实现快速迭代,采用了简单的枚举的方案。枚举的字段是,场景+用户性别分段+用户年龄分段。
例子
- 场景1,男性,18-25岁:微信,陌陌,微博,今日头条等
- 场景2,女性,<18岁:天天爱消除,贪吃蛇大作战,王者荣耀等
- 场景有x个,场景1,场景2,场景3等
- 性别有3种:男,女,未知
- 年龄有6种:<18, 18-25, 26-35, 36-45, 45以上
- 枚举的行数有364=72个
- 将72个枚举导入Dcache进行在线的服务即可。
- 场景1,男性,18-25岁:微信,陌陌,微博,今日头条等
痛点
随着场景的增加特征的增加,逐渐的枚举量太大了,Dcache的容量有限。例如加入了30个软件类型0/1特征,2^30很容易撑爆Dcache.
参数打通
方案
- 为了解决枚举过多的痛点,可以将参数放到线上,每次线上实时去计算推荐列表。第一期采用LR的模型,把LR的权重参数传递到mysql中,如下图展示了top10权重的特征
- 并且把app特征也放到mysql db中。
- 在离线和在线定义同一套app feature和user feature交叉的特征工程方法,实现线上排序
- 为了解决枚举过多的痛点,可以将参数放到线上,每次线上实时去计算推荐列表。第一期采用LR的模型,把LR的权重参数传递到mysql中,如下图展示了top10权重的特征
痛点
当尝试更多的模型的时候(如GBDT, GBDT+LR等),模型过于复杂,通过暴露参数的方法已经不能在线上实现模型了。
原始特征+模型打通
- 方案
- 训练feature传递,单值返回
痛点:
离线侧和在线侧要实现两套同样的特征工程逻辑,每次都要对齐比较繁琐,是可以优化的点。 - 原始feature传递,单值返回
痛点
app推荐的多样性和新颖性非常的重要,往往在最顶层需要对多样性和新颖性进行排序,让列表更加整体,更新信息更丰富。 - 原始feature传递,列表返回
- 训练feature传递,单值返回
特征实时化
实时特征的获取,对用户的场景把控更准确。
模型实时化
在线训练,更快捕捉模型的变化