推荐算法注意点和DeepFM工程化实现

©PaperWeekly 原创 · 作者|贲忠奇

学校|混沌大学推荐算法工程师

研究方向|推荐算法、反作弊


缘起

今年疫情期间开始优化公司的推荐系统,因为 DeepFM 具有使用线性特征、低阶交叉特征和高阶特征的优点,决定采用此算法试试能否提高线下的 auc 和线上的 CTR 预估。

DeepFM 算法介绍详见 [1],在 DeepFM 工程化的时候,遇到了特征稀疏、一列多值和共享权重的情况,主要参考石塔西的实现。那我为什么要继续炒冷饭呢?因为石塔西实现的 TensorFlow 框架用的是高阶 api,显得灵活性低一些。

主要存在两个问题,在实际过程中,无法保存 auc 最优的模型,early stopping 也不能保证停在效果最好的阶段;在线上预测阶段是不能按照文件的方式去读取。主要是针对以上两个问题,进行改造,实现了工程化上线。

效果方面:点击率 PV 提升了 2.67%;点击率 UV 提升了 3.64%;平均点击数提升了 4.53%。推荐系统实际工程中需要注意样本、特征、算法等方方面面的问题,下面开始介绍整个项目。


项目背景

混沌大学 APP(以下简称 APP)是一个提供哲科思维和创新商业的课程在线学习软件,在线视频学习是 APP 提供的最重要的业务功能。APP 内提供上百门十几分钟至几小时不等的长视频课程,为了用户更快的发现合适自己的课程,以及拥有更好的学习体验,APP 提供了课程推荐的功能。

▲ 算法页面

推荐模式

由于 app 推荐的物品通常是十几分钟到几小时的长视频课程学习,且课程数量相对较少,学员存在断续观看、重复观看的需求;并且几百门课如果采用 feed 流方式(推荐视频不重复)很容易就把所有课程内容刷没了。因此没有使用 feed 流的推荐模式,而是使用了 topN 推荐。


算法架构

由于推荐的物品课程总量仅为百级,因此没有做召回而实现了排序+重排序。为了解决有限的计算资源与实效性之间的矛盾,采用了实时异步的架构,即在用户有行为时去为用户预测一个新的课程列表并缓存,在用户请求时,才将这个缓存列表发给用户,即拉模式(pull),整体架构如下:

▲ 工程架构

下面从样本、特征工程、算法改造、重排序、探索位介绍整个项目流程。

样本

模型学习的内容是样本,模型效果的上限在样本,所以样本的设计和选择非常重要。如何选择正负样本?样本冲突了怎么办?如何使得样本表达的内容丰富,受到噪声干扰比较小?在线系统的特征获取比离线训练某些特征数据有延迟怎么办?

面对以上问题,整个样本的生成采取宁缺毋滥的原则,对于不确定是否正确的数据,均不采纳。例如简单的样本时间错误(数据生成时间早于动作时间或数据生成时间与动作时间相差太远等),这种数据剔除掉。下面重点讲正负样本的选择、样本冲突、样本下采样和数据穿透问题。

4.1 正负样本选择

正样本的选择相对比较容易,点击即为正。负样本的选择相对复杂一点:课程曝光,并不代表用户注意到了。因此选择用户在推荐列表最下面的一个点击位置以上的曝光作为负样本区域。

例如以下展示列表和点击动作情况(最下一个点击位为7),使用 3、7 为正样本,1、2、4、5、6 为负样本。而 8、9、10 等位置虽然曝光但用户可能并未看到,丢弃该数据。正负样本的比例一般设置为 1:1 或者 2:3。

▲ 一条请求数据返回的样本列表点击情况

4.2 样本冲突

课程可以重复推荐,这样就存在用户选择前后矛盾的情况,即对于同一个课程上次用户选择点击,而这次选择不点击,或者反过来上次选择不点击,这次选择点击。

对于一个时效性要求较高的系统,将这两种情况的数据都作为样本加入系统,可以增加模型对时效性特征的理解。由于用户可能某个时间段未关注、或者被其他课程干扰、或者某个时刻的心理状态等等问题存在。

在宁缺毋滥的原则下,选择了一刀切去掉负样本的方式,即 24 小时之内,存在正负样本冲突的,仅保留正样本。同时如果 24 小时之内有多个负样本,仅保留最后也就是最新的负样本。

4.3 样本下采样

由于用户不同天以及天内对推荐系统的使用频率不同,会导致整个样本数据就会倾向于样本时间段内使用频率加高的那些样本用户,这对其他的用户是不公平的。同理,不同的课程的每天曝光量也有很大差别。因此分别以用户和课程为单位对整体样本进行下采样,使得样本数量的比例更加平滑一些。

4.4 数据穿透问题

推荐系统需要考虑数据穿透的问题,即特征数据一定要选取样本发生时刻之前的,如果选取了样本时刻之后的特征,相当于在学习阶段,让模型知道了标准答案,使得模型

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值