程序员如何与时俱进?


推荐流程大致上能够分为 3 个部分,召回、排序、推荐结果生成,总体的架构以下图所示。前端

640?wx_fmt=png

召回阶段,主要是利用数据工程和算法的方式,从千万级的产品中锁定特定的候选集合,完成对产品的初步筛选,其在必定程度上决定了排序阶段的效率和推荐结果的优劣。业内比较传统的算法,主要是 CF[1][2]、基于统计的 Contextual 推荐和 LBS,但近期来深度学习被普遍引入,算法性取得较大的提高,如:2015 年 Netflix 和 Gravity R&D Inc 提出的利用 RNN 的 Session-based 推荐 [5],2016 年 Recsys 上提出的结合 CNN 和 PMF 应用于 Context-aware 推荐 [10],2016 年 Google 提出的将 DNN 做为 MF 的推广,能够很容易地将任意连续和分类特征添加到模型中 [9],2017 年 IJCAI 会议中提出的利用 LSTM 进行序列推荐 [6]。2017 年携程个性化团队在 AAAI 会议上提出的深度模型 aSDAE,经过将附加的 side information 集成到输入中,能够改善数据稀疏和冷启动问题 [4]。算法

对于召回阶段获得的候选集,会对其进行更加复杂和精确的打分与重排序,进而获得一个更小的用户可能感兴趣的产品列表。携程的推荐排序并不单纯追求点击率或者转化率,还须要考虑距离控制,产品质量控制等因素。相比适用于搜索排序,文本相关性检索等领域的 pairwise 和 listwise 方法,pointwise 方法能够经过叠加其余控制项进行干预,适用于多目标优化问题。工业界的推荐方法经历从线性模型+大量人工特征工程 [11] -> 复杂非线性模型 -> 深度学习的发展。Microsoft 首先于 2007 年提出采用 Logistic Regression 来预估搜索广告的点击率 [12],并于同年提出 OWLQN 优化算法用于求解带 L1 正则的 LR 问题 [13],以后于 2010 年提出基于 L2 正则的在线学习版本 Ad Predictor[14]。Google 在 2013 年提出基于 L1 正则化的 LR 优化算法 FTRL-Proximal[15]。2010 年提出的 Factorization Machine 算法 [17] 和进一步 2014 年提出的 Filed-aware Factorization Machine[18] 旨在解决稀疏数据下的特征组合问题,从而避免采用 LR 时须要的大量人工特征组合工做。阿里于 2011 年提出 Mixture of Logistic Regression 直接在原始空间学习特征之间的非线性关系 [19]。Facebook 于 2014 年提出采用 GBDT 作自动特征组合,同时融合 Logistic Regression[20]。近年来,深度学习也被成功应用于推荐排序领域。Google 在 2016 年提出 wide and deep learning 方法 [21],综合模型的记忆和泛化能力。进一步华为提出 DeepFM[15] 模型用于替换 wdl 中的人工特征组合部分。阿里在 2017 年将 attention 机制引入,提出 Deep Interest Network[23]。携程在实践相应的模型中积累了必定的经验,不管是最经常使用的逻辑回归模型(Logistic Regression),树模型(GBDT,Random Forest)[16],因子分解机(Factorization Machine),以及近期提出的 wdl 模型。同时,咱们认为即便在深度学习大行其道的今下,精细化的特征工程仍然是不可或缺的。api

基于排序后的列表,在综合考虑多样性、新颖性、Exploit & Explore 等因素后,生成最终的推荐结果。本文以后将着重介绍召回与排序相关的工做与实践。架构

数据 机器学习=数据+特征+模型

在介绍召回和排序以前,先简单的了解一下所用到的数据。携程做为大型 OTA 企业,天天都有海量用户来访问,积累了大量的产品数据以及用户行为相关的数据。实际在召回和排序的过程当中大体使用到了如下这些数据:dom


  • 产品属性:产品的一些固有属性,如酒店的位置,星级,房型等。机器学习

  • 产品统计:好比产品一段时间内的订单量,浏览量,搜索量,点击率等。分布式

  • 用户画像:用户基础属性,好比年纪,性别,偏好等等。ide

  • 用户行为:用户的评论,评分,浏览,搜索,下单等行为。学习

值得注意的是,针对统计类信息,可能须要进行一些平滑。例如针对历史 CTR 反馈,利用贝叶斯平滑来预处理。优化

召回

召回阶段是推荐流程基础的一步,从成千上万的 Item 中生成数量有限的候选集,在必定程度上决定了排序阶段的效率和推荐结果的优劣。而由 OTA 的属性决定,用户的访问行为大可能是低频的。这就使得 user-item 的交互数据是极其稀疏的,这对召回提出了很大的挑战。在业务实践中,咱们结合现有的通用推荐方法和业务场景,筛选和摸索出了几种行之有效的方法:

Real-time Intention

咱们的实时意图系统能够根据用户最近浏览下单等行为,基于马尔科夫预测模型推荐或者交叉推荐出的产品。这些候选产品能够比较精准的反应出用户最近最新的意愿。

Business Rules

业务规则是认为设定的规则,用来限定推荐的内容范围等。例如机票推酒店的场景,须要经过业务规则来限定推荐的产品只能是酒店,而不会推荐其余旅游产品。

Context-Based

基于 Context 的推荐场景和 Context 自己密切相关,例如与季候相关的旅游产品(冬季滑雪、元旦跨年等)。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

LBS

基于用户的当前位置信息,筛选出的周边酒店,景点,美食等等,比较适用于行中场景的推荐。地理位置距离经过 GeoHash 算法计算,将区域递归划分为规则矩形,并对每一个矩形进行编码,筛选 GeoHash 编码类似的 POI,而后进行实际距离计算。

Collaborative Filtering

协同过滤算法是推荐系统普遍使用的一种解决实际问题的方法。携程个性化团队在深度学习与推荐系统结合的领域进行了相关的研究与应用,经过改进现有的深度模型,提出了一种深度模型 aSDAE。该混合协同过滤模型是 SDAE 的一种变体,经过将附加的 side information 集成到输入中,能够改善数据稀疏和冷启动问题,详情能够参见文献 [4]。

Sequential Model

现有的矩阵分解 (Matrix Factorization) 方法基于历史的 user-item 交互学习用户的长期兴趣偏好,Markov chain 经过学习 item 间的 transition graph 对用户的序列行为建模 [3]。事实上,在旅游场景下,加入用户行为的前后顺序,从而能更好的反映用户的决策过程。咱们结合 Matrix Factorization 和 Markov chain 为每一个用户构建个性化转移矩阵,从而基于用户的历史行为来预测用户的下一行为。在旅游场景中,能够用来预测用户下一个目的地或者 POI。

除此以外,也可使用 RNN 来进行序列推荐,好比基于 Session 的推荐 [5],使用考虑时间间隔信息的 LSTM 来作下一个 item 的推荐等 [6]。

此外,一些常见的深度模型 (DNN, AE, CNN 等)[7][8][9][10] 均可以应用于推荐系统中,可是针对不一样领域的推荐,须要更多的高效的模型。随着深度学习技术的发展,相信深度学习将会成为推荐系统领域中一项很是重要的技术手段。以上几种类型的召回方法各有优点,在实践中,针对不一样场景,结合使用多种方法,提供给用户最佳的推荐,以此提高用户体验,增长用户粘性。

排序

以工业界在广告、搜索、推荐等领域的实践经验,在数据给定的条件下,经历了从简单线性模型+大量人工特征工程到复杂非线性模型+自动特征学习的演变。在构建携程个性化推荐系统的实践过程当中,对于推荐排序这个特定问题有一些本身的思考和总结,并将从特征和模型这两方面展开。

Model

个性化排序模型旨在利用每一个用户的历史行为数据集创建其各自的排序模型,本质上能够看做多任务学习 (multi-task learning)。事实上,经过加入 conjunction features,也就是加入 user 和 product 的交叉特征,能够将特定的 multi-task 任务简化为单任务模型。梳理工业界应用的排序模型,大体经历三个阶段,以下图所示:

640?wx_fmt=jpeg

本文并不许备详细介绍上图中的算法细节,感兴趣的读者能够查看相关论文,如下几点是咱们的一些实践经验和体会。


  • 在实践中选用以 LR 为主的模型,经过对数据离散化、分布转换等非线性处理后使用 LR。通常的,采用 L1 正则保证模型权重的稀疏性。在优化算法的选择上,使用 OWL-QN 作 batch learning,FTRL 作 online learning。

  • 实践中利用因子分解机(Factorization Machine)获得的特征交叉系数来选择喂入 LR 模型的交叉特征组合,从而避免了繁杂的特征选择工做。通常的受限于模型复杂度只进行二阶展开。对于三阶以上的特征组合能够利用基于 mutual information 等方法处理。已有针对高阶因子分解机(High Order FM)的研究,参见文献 [24]。

  • 对于 Wide and Deep Learning,将 wide 部分替换 gbdt 组合特征,在实验中取得了较好的效果,并将在近期上线。后续的工做将针对如何进行 wide 部分和 deep 部分的 alternating training 展开。

Feature Engineering

事实上,虽然深度学习等方法必定程度上减小了繁杂的特征工程工做,但咱们认为精心设计的特征工程仍旧是不可或缺的, 其中如何进行特征组合是咱们在实践中着重考虑的问题。通常的,能够分为显式特征组合和半显式特征组合。

显式特征组合

对特征进行离散化后而后进行叉乘,采用笛卡尔积 (cartesian product)、内积 (inner product) 等方式。

在构造交叉特征的过程当中,须要进行特征离散化;针对不一样的特征类型,有不一样的处理方式。

 numerical feature


  • 无监督离散化:根据简单统计量进行等频、等宽、分位点等划分区间

  • 有监督离散化:1R 方法,Entropy-Based Discretization (e.g. D2,MDLP)

 ordinal feature(有序特征)

编码表示值之间的顺序关系。好比对于卫生条件这一特征,分别有差,中,好三档,那么能够分别编码为 (1,0,0),(1,1,0),(1,1,1)。

 categorical feature (无序特征)


640?wx_fmt=jpeg


  • 离散化为哑变量,将一维信息嵌入模型的 bias 中,起到简化逻辑回归模型的做用,下降了模型过拟合的风险。

  • 离散特征通过 OHE 后,每一个分类型变量的各个值在模型中均可以看做独立变量,加强拟合能力。通常的,当模型加正则化的状况下约束模型自由度,咱们认为 OHE 更好。

  • 利用 feature hash 技术将高维稀疏特征映射到固定维度空间

半显式特征组合

区别于显式特征组合具备明确的组合解释信息,半显式特征组合一般的作法是基于树方法造成特征划分并给出相应组合路径。

通常作法是将样本的连续值特征输入 ensemble tree,分别在每颗决策树沿着特定分支路径最终落入某个叶子结点获得其编号,本质上是这些特征在特定取值区间内的组合。ensemble tree 能够采用 Gbdt 或者 random forest 实现。每一轮迭代,产生一棵新树,最终经过 one-hot encoding 转化为 binary vector,以下图所示。

640?wx_fmt=png

如下几点是咱们在实践中的一些总结和思考。


  • 在实验中发现若是将连续值特征进行离散化后喂入 gbdt,gbdt 的效果不佳,AUC 比较低。这是由于 gbdt 自己能很好的处理非线性特征,使用离散化后的特征反而没什么效果。xgboost 等树模型没法有效处理高维稀疏特征好比 user id 类特征,能够采用的替代方式是: 将这类 id 利用一种方式转换为一个或多个新的连续型特征,而后用于模型训练。

  • 须要注意的是当采用叶子结点的 index 做为特征输出须要考虑每棵树的叶子结点并不彻底同处于相同深度。

  • 实践中采用了 Monte Carlo Search 对 xgboost 的众多参数进行超参数选择。

  • 在离线训练阶段采用基于 Spark 集群的 xgboost 分布式训练,而在线预测时则对模型文件直接进行解析,可以知足线上实时响应的需求。此外,在实践发现单纯采用 Xgboost 自动学到的高阶组合特征后续输入 LR 模型并不能彻底替代人工特征工程的做用;能够将原始特征以及一些人工组合的高阶交叉特征同 xgboost 学习到的特征组合一块儿放入后续的模型,得到更好的效果。

总结

完整的推荐系统是一个庞大的系统,涉及多个方面,除了召回、排序、列表生产等步骤外,还有数据准备与处理,工程架构与实现,前端展示等等。 在实际中,经过把这些模块集成在一块儿,构成了一个集团通用推荐系统,对外提供推服务,应用在 10 多个栏位,60 多个场景,取得了很好的效果。本文侧重介绍了召回与排序算法相关的目前已有的一些工做与实践,下一步,计划引入更多地深度模型来处理召回与排序问题,并结合在线学习、强化学习、迁移学习等方面的进展,优化推荐的总体质量。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------