写点什么

汽车之家推荐系统排序算法迭代之路

2020 年 3 月 04 日

汽车之家推荐系统排序算法迭代之路

导读:汽车之家的推荐系统紧随前沿技术,在支持内部多个推荐场景的同时,对外也有了一定的输出。未来我们期望汽车之家的推荐系统不只是前沿技术的应用者,更是推动者和创新者。本次分享的主题为汽车之家推荐系统排序算法迭代之路,主要包括:


  • 汽车之家推荐系统

  • 排序模型

  • 特征及训练样本

  • 未来计划的优化方向


01. 汽车之家推荐系统


1. 概述


汽车之家推荐系统上线已有近 5 年历史,主要给用户推荐个性化的汽车之家资源。推荐系统的上线是汽车之家 APP 生态内容以分类体系分发转变为个性化推荐的重要里程碑。汽车之家推荐的资源主要包括:专业编辑、汽车大 V、论坛用户生产的文章、视频、图片,以及车系物品等,总量上亿。


推荐的目标是给用户推荐他喜爱的内容,做好推荐可以拆解为三个子目标:


  • 一是对用户的理解

  • 二是对资源的刻画

  • 三是用户和资源的最佳匹配


再对上面三个目标进行拆解,用户理解包含用户属性、行为收集及行为的表示,资源的刻画包括自身的属性及外部赋给资源的特征,用户和资源的匹配有非常多的方法或模型,是推荐系统的核心工作,追求更好更优的匹配,是推荐系统不断演进的动力所在。



匹配又可以分为两部分,召回和排序,召回是尽可能多的找到用户喜欢的资源,排序是对找到的资源再做一次优选,召回和排序又可以进一步细分。


2. 架构


推荐系统要从海量的资源库里,快速找到用户潜在感兴趣的资源。主要有四个环节:


第一,收集资源;


第二,从所有资源中找到用户感兴趣的资源;


第三,对用户感兴趣的资源根据用户喜好程度进行排序;第四,输出给用户最感兴趣的 n 个资源。



基于以上四个环节对推荐系统架构进行设计,一般由如下模块组成。



其中:


  • 资源池:存储各种类型的海量资源,一般由数据库存储,如 mysql、hive、redis 等。

  • 标签生成:标签是对资源更多维度的结构化刻画。比如:分类标签、关键词、质量分等。

  • 索引:对资源的各类标签、关键词建立倒排索引,及相似向量检索引擎等。

  • 过滤:对用户的曝光历史、负反馈等进行过滤。

  • 召回:使用用户画像标签或用户 Embedding 到索引和向量库中获取相关的候选资源。

  • 用户画像:用户属性及根据用户的历史行为给用户打的标签。

  • 排序:通过模型对召回的每个候选资源进行预测打分。

  • 特征/模型:排序依赖的用户特征、资源特征及模型。

  • 运营:业务策略,包括提权、曝光占比控制、打散等业务策略。

  • 输出:将排序及运营后的 topN 个资源打包返回给客户端。


02. 排序模型


1. 模型介绍


汽车之家首页推荐排序模型主要经历了 LR、XGBoost、FM、DeepFM、DeepFM Online Learning 这几个主要的演进过程,在这个过程中还实验了如 Wide&Deep、DCN、LSTM、GRU 等模型。



LR 模型是 CTR 预估领域早期最成功的模型,大多早期的工业推荐排序系统采取 LR 这种 “线性模型+人工特征组合引入非线性” 的模式。LR 模型具有训练快、上线快、可解释性强、容易上规模等优点,目前仍然有不少实际系统采取这种模式。同时 LR 模型也是之家推荐排序系统初期的验证模型和中后期的 baseline 模型。


XGBoost 模型在使用和 LR 相同的特征,上线后就取得了比较明显的效果,之后又增加了 user 和 item 的实时特征,实验组 CTR 得到了进一步的提升,总体上相对提升 6%。在和对照组持续观察了 3 周后,XGBoost 的提升效果得到了验证,替换了 LR 成为线上的全量模型和 baseline 模型。之后还尝试了 XGBoost+LR,效果相比 XGBoost 没有明显提升。


FM 简洁优雅地实现了二阶特征组合。实现特征组合比较容易想到的是在 LR 的基础上加入二阶特征组合即可,即任意两个特征进行组合,将组合出的特征看作新特征,加到 LR 模型中。组合特征的权重在训练阶段学习获得。但这样对组合特征建模,泛化能力比较弱,尤其是在大规模稀疏特征存在的场景下。FM 模型也直接引入任意两个特征的二阶特征组合,但对于每个特征,学习一个大小为 k 的一维向量,两个特征 Xi和 Xj 的特征组合的权重值,通过特征对应的向量 Vi 和 Vj 的内积<Vi , Vj>来表示。这本质上是对特征进行 Embedding 化表征,和目前常见的各种实体 Embedding 本质思想是一样的。特征组合对于推荐排序是非常重要的,DNN 模型一样离不开特征组合这个特点,但 MLP 是种低效率地捕获特征组合的结构,所以排序相关的深度模型,基本都具有类似 FM 组合特征的部分。FM 模型实践阶段主要是增加了样本量由几千万到 3 亿,线上实验 CTR 对比 XGBoost 相对提升 2%,因为后续 DeepFM 很快上线,FM 并没有推全。


Wide&Deep 是推荐领域取得较大成功的最早期深度模型,由 Google 于 2016 年提出。Wide&Deep 模型包括 Wide 部分和 Deep 部分,Wide 部分为 LR,输入为 one-hot 后的离散型特征和等频分桶后的连续性特征,这部分可以对样本中特征与目标较为明显的关联进行记忆学习;Deep 部分为 MLP,输入为 Embedding 后的离散型特征和归一化后的连续型特征,可以泛化学习到样本中多个特征之间与目标看不到的潜在关联。使用 Wide&Deep 的另一个优势在于 Wide 部分的存在,可以沿用之前浅层学习的成果,尤其是特征工程部分。Wide&Deep 上线后 CTR 相对提升 3%,比同期上线的 DeepFM 低 0.5%,线上主要使用了 DeepFM 模型。


DeepFM 将 Wide&Deep 的 Wide 部分 LR 替换成 FM 来避免人工特征工程。DeepFM 相比 Wide&Deep 模型更能捕捉低阶特征信息。同时,Wide&Deep 部分的 Embedding 层需要针对 Deep 部分单独设计,而在 DeepFM 中,FM 和 Deep 部分共享 Embedding 层,FM 训练得到的参数既作为 wide 部分的输出,也作为 MLP 部分的输入。DeepFM 支持 end-end 训练,Embedding 和网络权重联合训练,无需预训练和单独训练。DeepFM 上线后 CTR 相对提升 3.49%,略好于同期上线的 Wide&Deep。在效果得到验证后推全了 DeepFM 模型,使其成为线上的全量模型和 baseline 模型。线上效果的提升带来的是推荐排序模型预测耗时的增加,为了保证不超过最大平响,在不明显提高模型 loss 的前提下,实验优化 Deep 部分的参数,包括减少 Embedding 的维度和隐藏层的神经元个数与层数等。通过部署模型上线后观察效果,模型预测的耗时随之减少,而且 CTR 也没有明显波动,依然明显高于对照组,说明深度学习的泛化能力较强,即便降低模型的神经网络配置,依然能较好地拟合样本。


与 Wide&Deep 和 DeepFM 类似,DCN 将 Wide 部分升级为 Cross 网络,Cross 网络一方面通过显式的高阶特征交叉,另一方面通过层与层之间拟合残差,能够更深入地挖掘出非线性特征组合与目标的关系,更快地达到稳定的拟合状态。在和 DeepFM 采用相同特征的情况下,实验 CTR 也和 DeepFM 持平。根据线上的迭代经验和业务特点,尝试优化了 DCN 的模型结构。在 DCN 原始的 Embedding and Stacking 层中,离散型特征在经过 Embedding 处理后,与连续型特征直接拼接在一起,统一输入进后面的网络,这样带来的不足是:虽然网络可以用显性和隐性的方式学习特征间的有效交叉,但缺少单个特征内部信息的挖掘,将这部分压力转移到了特征工程,从而增加了人工成本。基于充分利用每个特征,通过排序模型自适应学习到更多信息的考虑,尝试对所有特征分别进行扩展。在 DCN 的 Embedding and Stacking 层和网络层之间实验引入特征扩展层,将每个特征从原始的 1 维扩展到 n 维,与 Embedding 只对离散型特征处理不同,维度扩展也会处理连续性特征。扩展后的特征在伴随着维度增加的同时,会将更多自身信息输入到网络层参与高阶计算,与只使用原始特征相比,模型可以更深入利用已有特征,节约了特征工程的人工成本。通过离线实验,在采用相同特征的情况下,相较 DCN,基于特征扩展的 DCN 上线后实验 CTR 相对提升 1%。


在上述模型迭代的同时,还实验了 LSTM、GRU 等模型,LSTM 和 GRU 都是基于序列的 next click 模型,模型的结构很简单,对于一个 Session 中的点击序列 X=[X1,X2,X3…Xn-1,Xn],依次将 X1,X2,…,Xn-1 输入到模型中,预测下一个被点击的是哪一个 Item。首先,序列中的每一个物品 Xt 被转换为 one-hot,随后转换成其对应的 embedding,经过 N 层隐含单元后,再经过一个全联接层得到下一次每个物品被点击的概率。这些模型的 CTR 都暂未明显好于 DeepFM,所以都还在实验阶段,没有成为线上主要模型。


在 DeepFM 和其他深度模型的实践中,比较容易犯的错误是不考虑特征组成和样本数量,直接暴力增加模型复杂度,从而导致训练时间骤增、模型文件变大和线上的预测时间更久,最终引起推荐系统服务超时。如果特征数量少、特征工程完善和样本选取合理,使用简单的深度学习模型反而能够达到更好的效果。


2. 在线学习


在线学习利用实时收集的用户反馈,实时更新模型参数进行预测,实时反馈用户行为变化带来的影响。在线学习相对离线学习可以理解为数据集无限大,时间序列无限长,利用样本数据流逐条更新模型,在线学习是 DeepFM 上线后在模型更新方面做的优化。之前的模型更新从一周到一天,为了模型能更快的学习到用户的实时行为,我们将模型的更新周期做到了分钟级。


这里主要有两部分工作,一是 Label 及特征的实时获取,二是模型的实时更新。


对于 Label 及特征的实时获取是通过每次请求的唯一标识 id 使用服务端 dump 的特征和客户端的 Label ( 曝光、点击 ) 进行 join 生成,这里要注意的是 Label 必须和当次请求的特征 join,如果特征数据在 Label 之后有更新,则会产生特征穿越的问题。


模型的实时更新是将实时获取的样本累积到一个 batch 后,就进行迭代更新,更新后的模型每隔 10 分钟往线上推一次。累计 10 分钟在保证捕获用户实时行为实效性的前提下,既可以降低工程实现难度,又可以降低样本的抖动影响,对样本不均衡的情况可以采取采样策略进行处理。



3. 排序服务


排序服务是以 API 的形式提供,其中:


输入


Deviceid:用户唯一标识,在服务内部通过此 id 获取用户的属性及行为特征。


Itemid:这是对用户待排序的资源 id,在服务内部会获取到这些资源属性、热度、标签等信息。


Pvid:当次请求的唯一标识,用于关联客户端和服务端的日志。


Model-name:模型名称,指定选用哪个模型进行排序,排序服务提供了多个模型供选择。


Model-version:模型版本,和 Model-name 搭配使用,指定同一个模型的哪个版本,这个参数主要用来进行模型迭代优化。


Debug:此参数用来输出排序过程中的一些中间结果。


输出:Itemid 及其打分。


排序服务中的多个模型有不同的更新策略,更新周期可配置。排序服务还依赖于特征服务获取用户和资源的特征,对应到不同模型还有不同的特征工程处理。



4. 模型更新


实验的小流量排序模型经过离线验证,线上可以定时直接热更新。线上的全量排序模型更新除了离线验证外,还要在推全之前有一个预上线实验验证,确保在预上线实验组上 CTR 等数据没问题,再将模型全部更新。



5. AB 实验


在机器学习领域中,AB 实验是验证模型最终效果的主要手段。进行 AB 实验的主要手段是进行用户分桶,即将用户分成实验组和对照组,对实验组的用户施以新模型,对照组的用户施以旧模型。在分桶的过程中,要注意样本的独立性和采样方式的无偏性,确保同一个用户每次只能分到同一个桶中,在分桶过程中选取 DeviceId 必须是完全随机的,这样才能保证桶中的样本是无偏的。实验组和对照组的划分必须是在相同的约束条件下随机选取 DeviceId。如下图 a、b、c 的划分都不正确,其中 a 中实际划分的用户超出了实验约束的用户群,b 中实验组用户正确,但是把剩余的所有用户作为对照组是不对的,c 中实验用户正确,对照组用户有所扩大也是不对的,只有 d 是正确的。



线上的 AB 主要有三部分,一是实验及其分桶的配置,二是分桶对应的代码逻辑,三是实验及分桶的效果数据。实验之间的流量是正交的,每个实验中多个分桶的流量是互斥的。如我们的排序模型设置了一个实验,多个分桶,有 2%、5%、10%流量的三个对照组,模型上线时从 2%开始逐步扩量进行效果对比验证。



6. 模型训练


推荐排序模型的训练主要基于之家机器学习平台 AutoPAI。汽车之家 AutoPAI 是一个支持可视化拖曳组件建模,支持上百种机器学习算法组件,支持多个深度学习框架,和 Hadoop、Spark 打通,支持分布式 GPU 训练深度学习模型的平台,并且支持在线开发、自动部署等功能。


我们的简单模型如 LR、XGBoost 可以直接在界面上拖动数据源、特征处理组件、模型组件、验证组件进行训练并保存模型,之后进行一键部署线上服务。深度模型支持在线开发、调试,之后将调试好的代码通过深度学习组件进行提交,选择 GPU 卡数进行训练,训练完成后可一键部署服务。



7. 可视化 Debug


对模型或策略单次请求效果的验证,一般上线后通过白名单进行验证,但这还是要进行代码或配置的上线,上线一方面是有风险,另一方面一般上线是多个实验多个功能一起上线,即使一个实验添加了白名单也有可能受到其他实验的影响。对此,我们基于代码 Debug 的思想,把调试放在程序正式发布前,我们做了推荐 Debug 系统,在实验上线前就可以通过 Debug 系统进行效果验证及中间环节验证。


我们的 Debug 平台最主要的推荐效果验证输入有两部分,一是推荐接口,二是实验配置。通过更改这两部分的参数,就可以模拟线上真实返回渲染,并可以输出这次请求整个链路的中间结果。Debug 平台还支持对索引、召回、排序等子模块的直接验证,可以查询资源特征、用户画像,用户曝光点击行为等。Debug 平台的上线极大的提高了我们的上线效率。



03. 特征及训练样本


1. 特征介绍



模型的输入一般包括:用户画像特征、item 特征,上下文特征,交叉特征、位置特征和序列 item 特征,其中:


用户画像特征有:用户自身属性,如性别、年龄、职业、地域等;用户行为,如不同时间窗口的浏览时长、点击、搜索、发贴、收藏、点赞等行为;基于行为所产生的兴趣偏好,如车系、标签偏好等;基于行为的衍生统计指标,如用户 ctr、活跃度等。


Item 特征有:item 自身属性,如标题、正文字数、图片个数等;基于 item 挖掘的特征,如内容分类、关键词、情感、内容专业度、内容丰富度、作者影响力等;item 被用户赋予的行为,如 uv、pv、ctr、收藏、点赞、回复等。


交叉特征有:item 标签与用户标签的匹配度。


2. 特征处理


直接使用原始特征不易于模型拟合,所以传入模型后还需要进一步处理,具体包括:异常值处理、归一化和等频分桶。


异常值处理


训练样本中的特征一般都存在异常值,对于离散型特征,可以将其单独分配到 one-hot 的一个位置,不会存在全为 0 的情况,但对于连续型特征,通常会对其赋默认值,如果为 0 则该特征不会参与到结果计算,如果为平均值则可能不符合各个特征的物理含义。为了得到合理的默认值,排序模型通过在特征处理阶段,对每个连续型特征引入不为 0 的 weight 和 bias,默认值的计算方式为:weight x featurevalue + bias,weight 和 bias 通过模型训练学到,当出现异常值时,特征值默认等于 bias。通过离线实验,测试集的 loss 有明显下降,上线后的 CTR 也优于默认取 0 值或取平均值。


归一化


连续型特征的值分布一般不统一,例如曝光量和 CTR,曝光量取值都大于 1,且最大值可能会是几百万,而 CTR 的取值区间为 0 到 1,如果直接输入到排序模型,分布不均的统计特征会导致训练波动,不但影响收敛速度,而且最终可能会无法拟合。常规的归一化方法包括:min-max、log 和 standard 等,通过离线实验观察测试集的 loss,其中 min-max 的效果最好。


等频分桶


对于连续型特征,当线上的特征值出现异常变化的时候,可能会存在泛化性不好或者鲁棒性不足的问题。为此引入了等频分桶,即按样本特征的分布频率,为每个特征规定好多个取值分界线,根据原始特征值分到不同的桶中,再根据桶的编号进行 one-hot 处理。深度模型的 NN 部分使用连续特征时因为长尾分布对最大值做了限制,后来实验 NN 部分使用离散特征效果更好,也使用了离散特征。


3. 特征表达


我们的排序模型不仅引入了大规模的稀疏特征,而且实现了多种形式的向量表达。


如基于 item 内容分类的 Bert embedding,基于 item 图像和视频的 embedding,基于行为的 Graph embedding、LSTM embedding 等。



4. 特征生产


用户和资源的特征做到了离线加实时,离线特征存储了用户和资源最近三个月的行为,实时特征做到了秒级别的更新。特征生产系统架构如下:



5. 特征服务


特征服务是支持排序服务的基础服务,主要输出用户和资源的离线及实时特征。



6. 训练样本生成


排序服务在用户每次请求时调用特征服务,获取实时和历史特征,输入模型,并输入到一个 dump 队列再与客户端的曝光点击进行 join 生成模型实时训练更新的样本,流程如上图。


04. 未来计划的优化方向


模型目标:后续的优化目标不仅仅限于 CTR,而是综合点击、互动、时长等多个目标同时优化,这是未来目标优化的趋势。多目标模型的实现既可以每个目标独立建模优化然后进行融合,也可以通过共享参数的多目标网络实现。


模型表达能力:也就是网络结构的升级,如使用 Transformer 进行更好的特征抽取,自动化特征工程,AutoML 自动设计更好的网络模型,和推荐场景很吻合的强化学习等。


特征扩充及信息融合:主要有用户长短期兴趣更精准的 Embedding 表达,文本、图片、视频、互动行为等多模态信息的融合表达等。


汽车之家的推荐系统紧随前沿技术,在支持内部多个推荐场景的同时,对外也有了一定的输出。未来我们期望汽车之家的推荐系统不只是前沿技术的应用者,更是推动者和创新者。


作者介绍


李晨旭,汽车之家高级算法工程师。2014 年加入汽车之家,先后从事搜索意图分析、文本挖掘、推荐排序等工作。在汽车之家海量资源和几亿用户这个平台上,积极尝试并落地最新的算法研究成果,也积极尝试在此基础上创新,并取得了一定的效果。


本文来自 DataFunTalk


原文链接


https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247497757&idx=1&sn=fe521ea5a746be9ba0aa208506d716b8&chksm=fbd74a71cca0c3676f2681bb7917a12e77562d2c5b3d1e5def4a3eac3fc40bd57e12ef2548e5&scene=27#wechat_redirect


2020 年 3 月 04 日 14:002115

评论

发布
暂无评论
发现更多内容

这场大数据+AI Meetup,一次性安排了大数据当下热门话题

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

Server Queue 提高 QPS

风含叶

Python kafka 后端 队列

kudmp介绍和安装

唯爱

神经网络中为什么不能将权重初始值设置为一样的值

王坤祥

神经网络 学习

你有信息焦虑症吗?

Neco.W

学习 创业 知识体系

幂等问题及解决方案

Joker

幂等 解决方案

“Plus Token”传销主犯被公诉!警惕,区块链不是“取款链”!

CECBC区块链专委会

1024讲话 CECBC 区块链技术 人才发展 培训

2020智源-京东多模态对话挑战赛开战 产学研联合推动AI技术发展

DT极客

关于软件测试的三点思考

卓然

软件测试 测试 测试的价值 联现技术咖

游戏夜读 | 改写图形API的意义

game1night

卧槽,接到一个阎王的需求

码农神说

程序员

Nginx 基础原理和命令行的真相

子杨

nginx 运维

Mysql常用删除方式比较

云也退

MySQL

“新基建”方兴未艾,Smartbi Mining如何为产业数字化转型赋能?

infoq小陈

架构师训练营0期开营

刁架构

架构师

奈学干货分享:分布式CAP实践分析

奈学教育

分布式

一个在游戏行业摸爬滚打了十几年的人,为何我对这本书情有独钟

图灵社区

游戏开发 游戏制作 世嘉培训教材

Android 通过opencv实现人脸识别,追踪

sar

android OpenCV 人脸识别

「首度揭秘」大规模HPC生产环境 IO 特征

焱融科技

sds io 高性能 存储 焱融科技

Nginx 入门及命令行操作

子杨

nginx 运维

如何设计数据中台

数据社

大数据 数据中台 数据仓库

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十一)JUnit概述

编程道与术

Java 编程 软件测试 TDD 单元测试

写代码没几天,遇到一堆报错,我该怎么办

刘早起😶

Python 程序人生 程序员成长

10分钟了解Flink

代码诗人

Weex开发:页面跳转以及Android端多应用选择窗口的处理

brave heart

android Vue 大前端 跨平台 Weex

券商也“网红”,证券行业IT服务运维发展按下“快进键”

BonreeAPM

运维 APM 证券 券商 行情

探索 Go 语言数据类型的内部实现

TuringTuring

golang 内存模型 高效

用户故事为什么要关联开发数据?

Worktile

敏捷开发 开发数据

GrowingIO 大数据多维分析自动化测试实践

GrowingIO技术专栏

大数据 自动化测试 parewise

从位图到布隆过滤器

王坤祥

位图 布隆过滤器

工厂模式(三)泛型工厂的概念以及示例代码

LSJ

汽车之家推荐系统排序算法迭代之路-InfoQ