推荐系统百问百答 | 性能与评估

推荐系统的性能

模型的实时性是如何影响推荐系统的效果的?

模型更新的间隔时间越长,推荐系统的效果越差;反过来说,模型更新得越频繁,实时性越好,损失越小,效果越好。

从用户体验的角度讲,在用户使用个性化新闻应用时,用户的期望是更快地找到与自己兴趣相符的文章;在使用短视频服务时,期望更快地”刷到“自己感兴趣的内容;在线购物时,也期望更快地找到自己喜欢的商品。只要推荐系统能感知用户反馈、实时满足用户的期望目标,就能提高推荐效果。

从机器学习角度来看,推荐系统的实时性重要之处体现在以下两个方面:

1)特征上的实时性:推荐系统对的更新速度越快,代表用户最近习惯和爱好的特征更新越快,越能为用户进行更有时效性的推荐。

2)模型上的实时性:推荐系统更新的越快,模型越容易发现最新流行的数据模式,越能让模型快速抓住最新的流行趋势。

客户端是如何做到对于实时特征进行实时推荐的?

客户端是最接近用户的环节,一般会利用客户端收集时间、地点、推荐场景等上下文特征,然后让这些特征随http请求一起到达服务器端,从而请求推荐服务,此外,客户端能够实时手机session(会话)内用户行为的地方。比如用户在一次会话中点击阅读了三篇文章,它们代表了用户的即时兴趣,若能根据用户的即时兴趣实时改变推荐结果,将大大提升用户体验。

所以可以通过客户端缓存session内部的行为,将其作为与上下文特征同样的实时特征传给推荐服务器,那么推荐系统就可以实时得到session内部的行为特征进行实时推荐。

流计算平台是如何进行准实时特征处理的?

Storm/Spark Streaming/Flink等流计算平台进行准实时的特征处理几乎成了推荐系统的标配,流计算平台是将日志以流的形式进行微批处理(mini batch)。由于每次需要等待并处理一小批日志,流计算平台并非完全实时的平台,但它的优势是可以进行简单的统计类特征,比如一个物品在该时间窗口内的曝光次数、点击次数等,计算出的特征可立刻存入特征数据库供推荐系统模型使用。虽然无法实时地根据用户行为改变用户结果,但分钟级别的延迟基本可以保证推荐系统能准实时地引入用户的近期行为。

分布式存储系统HDFS和分布式批处理平台在推荐中的作用有哪些?

用户的曝光、点击、转化数据往往是在不同时间到达HDFS的,有些游戏类应用的转化数据延迟甚至高达几个小时,因此只有在全量数据批处理这一阶段才能进行全部特征及相应标签的抽取和合并。也只有在全量特征准备好之后,才能够进行更高阶的特征组合工作。这往往是无法在客户端和流计算平台上进行的。

分布式批处理平台的计算结果的主要用途是:

1)模型训练和离线评估
2)特征保存入特征数据库,供之后的线上推荐系统使用

数据从产生到完全进入HDFS,再加上Spark的计算延迟,往往达到小时级别,已经无法进行所谓的”实时推荐“,因此更多的是保证推荐系统特征的全面性,以便用户在下次登录时进行更准确的推荐。

请简述offline/nearline/online训练方法和步骤。

offline即全量更新,是指模型利用某时间段内的所有训练样本进行训练,全量更新是最常用的模型训练方式,但需要等所有训练数据都存储在HDFS等大数据存储系统中才可,且全量样本训练的时间往往比较长,实时性最差。

nearline即近线更新,仅仅将新加入的样本”喂给“模型进行增量训练。从技术上讲,深度学习模型往往采用随机梯度下降(SGD)法及其变种进行学习,模型对增量样本的学习相当于在原有样本的基础上继续输入增量样本进行梯度下降。增量更新的缺点在于:增量更新的模型往往无法找到全局最优点,因此在实际的推荐系统中,经常采用增量更新与全局更新相结合的方式,在更新了几轮增量更新后,在业务量较小的时间窗口进行全局更新,纠正模型在增量更新过程中积累的误差。

online学习是进行模型实时更新的主要方法,即在获得一个新的样本的同时更新模型,online学习在技术上也通过梯度下降的训练方式实现,但线上环境进行模型训练需要更新和存储大量的参数,对工程要求比较高。

在线学习中,模型的稀疏性不强。在一个输入特征向量达到几百万维的模型中,如果模型的稀疏性较好,就可以在模型效果不受影响的前提下,仅让一部分特征对应的权重非零,摒弃所有权重为0的特征,从而让上线的模型体积很小,有利于加速模型服务。但使用SGD的方式更新模型,容易产生大量小权重特征,增大了模型体积,从而增大模型部署和更新难度。FTRL就是为了解决在在线学习过程中兼顾训练效果和模型稀疏性的问题二提出来的。

性能评估

请说出几种离线评估的指标。

  1. 准确率

分类准确率是指分类正确的样本占总样本个数的比例,即

Accuracy=ncorrectntotalAccuracy=\frac{n_{correct}}{n_{total}}

其中,ncorrectn_{correct}为被正确分类的样本个数,ntotaln_{total}为总样本个数。

准确率较直观,可解释性较强,但当不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。如负样本占99%,那么分类器把所有样本都预测为负样本也可以获得99%的准确率。

  1. 精确率和召回率

精确率是分类正确的正样本个数占分类器判定为正样本的样本个数的比例。

召回率是分类正确的正样本个数占真正的正样本个数的比例。

排序模型中,通常没有一个确定的阈值把预测结果直接判定为正样本或负样本,而是采用TopN排序结果的精确率和召回率来衡量排序模型的性能,即认为模型排序的TopN的结果及时模型判定的正样本,然后计算Precision@N和Recall@N。

  1. F1-score

精确率和召回率是矛盾统一的两个指标,为提高精确率,分类器需要尽量在“更有把握时”才把样本预测为正样本,但往往会因过于保守而漏掉很多“没有把握”的正样本导致召回率降低。

为综合反映Presion和Recall的结果,可使用F1-score,它是精确率和召回率的调和平均值。其定义如下:

F1=2PrecisionRecallPrecision+RecallF1=\frac{2·Precision·Recall}{Precision+Recall}

  1. 对数损失

在一个二分类问题中,LogLoss的定义如下:

LogLoss=1Ni=1N(yilogPi+(1yi)log(1Pi))LogLoss=-\frac{1}{N}\sum_{i=1}^N(y_ilogP_i+(1-y_i)log(1-P_i))

其中,yiy_i为输入实例xix_i的真实类别,pip_i为预测输入实例xix_i是正样本的概率,NN为样本总数。

LogLoss是逻辑回归的损失函数,采用LogLoss作为评估函数能够非常直观地反映模型损失函数的变化,非常适用于观察模型收敛情况的评估指标。

  1. 均方根误差

RMSE=(yiyˉ)2nRMSE=\sqrt{\frac{\sum(y_i-\bar y)^2}{n}}

其中yiy_i是第i个样本点的真实值,yi^\hat{y_i}是第i个样本点的预测值,n是样本点的个数。

请说出P-R曲线、ROC曲线和AUC的含义和关系。

P-R曲线(Precision-Recall曲线)

为综合评价一个排序模型的好坏,不仅要看模型在不同TopN下的Precision@N和Recall@N,而且最好能绘制出模型的Precision-Recall曲线。

P-R曲线的横轴表示召回率,纵轴表示精确率。对于排序模型来说,其P-R曲线上的一个点代表”在某一阈值下模型将大于该阈值的结果判定为正样本,将小于该阈值的结果判定为负样本时,排序结果对应的召回率和精确率“。

整条P-R曲线是通过从高到低移动正样本阈值生成的。下图中实线代表算法1的P-R曲线,虚线代表算法2的P-R曲线。横轴0点附近代表阈值最大时模型的精确率和召回率。随着召回率的升高,精确率以不同的速度变化,只用一个点的精确率和召回率是不能全面衡量模型性能的。P-R曲线底下的面积越大表示模型的排序能力越好。

ROC曲线(the Receiver Operating Characteristic)曲线的横坐标为False Positive Rate(FPR,假阳性率);纵坐标为True Positive Rate(TPR,真阳性率)。FPR和TPR的计算方法如下:

FPR=FPN,TPR=TPPFPR=\frac{FP}{N},TPR=\frac{TP}{P}

其中PP是真实的正样本数量,NN是真实的负样本数量;TP指的是P个正样本中被分类器预测为正样本的个数,FP指的是N个负样本中被分类器预测为正样本的个数。

ROC也是通过不断移动正样本阈值生成的,动态调整截断点,从最高的得分开始,逐渐调整至最低得分,每个截断点都对应一个FPR和TPR,在ROC图上绘制,连接即可得到ROC曲线。AUC指的就是ROC曲线底下的面积。

如何巧妙地绘制ROC曲线?

首先根据样本标签统计出正负样本数量,正样本数量为P,负样本数量为N,接下来,把横轴的刻度间隔设置为1N\frac{1}{N},纵轴的刻度间隔设置为1P\frac{1}{P};再根据模型输出的预测概率对样本进行排序;依次遍历样本,同时从零点开始绘制ROC曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,直到遍历完所有样本,曲线最终停在(1,1)这个点,ROC曲线就绘制完成了。

线下AUC提升,一定会带来线上指标的提升吗?为什么?

不一定,虽然AUC表示了模型对正样本评分高于负样本的概率,但线下AUC的提高并不总是意味着线上点击率的提高。造成这种不一致现象的一个根本原因是,线下的AUC评估往往是将所有样本混杂在一起进行的,比如,对于用户维度,线下AUC的提高可能是将一部分用户的正样本排到了另一部分用户的负样本之前导致的,如有两组用户A和B,记用户组A的正负样本集分别为A+A^+AA^-,B组用户的正负样本集为B+B^+BB^-,当前模型排序为A+>A>B+>BA^+>A^->B^+>B^-,模型改进之后的排序为A+>B+>A>BA^+>B^+>A^->B^-,AUC提高了,但是对于线上实验而言,点击率不会发生变化,因为对于各组用户而言,他们看到的推荐结果仍然是一样的(A组用户看到的排序为A+>AA^+>A^-,B组用户看到的排序为B+>BB^+>B^-)。换言之,B组的用户并不能穿越去点击A组用户的负样本,因而将B+B^+这一组样本提升到AA^-前没有任何意义。

针对这一问题,我们可以对各个维度进行聚合计算AUC,即GAUC,这样就可以消除各个维度之间样本交叉的可能。

此外,线下验证集样本的分布、线上线下特征不一致也会导致AUC变化与点击率变化不一致的现象。

AB测试

为什么要进行AB测试?相比离线评估的优势是什么?

A/B测试又被成为”分流测试“或”分桶测试“,将用户随机分成实验组和对照组,对实验组的用户使用新模型,对对照组的用户使用旧模型,然后比较在线上评估指标上的差异。

相对于离线评估,线上AB测试无可替代

1)离线评估无法完全消除数据有偏现象的影响,因此得出的离线评估结果无法完全替代线上评估结果。

2)离线评估无法完全还原线上的工程环境。离线评估往往不考虑线上环境的延迟、数据丢失、标签数据缺失等情况,离线评估环境是理想状态下的,结果会有一定的失真。

3)线上系统的某些商业指标在离线评估下无法计算。离线评估一般针对模型本身进行评估,无法获得商业指标,比如离线评估关注的往往是AUC的改进,而线上评估可以全面了解该推荐系统模型带来的用户点击率、留存时长、PV/UV等变化,这些都需要AB测试进行评估。

AB测试是如何设计分层和分流机制的?

AB测试分层和分流的机制有两个:

  • 1)层与层之间的流量”正交“
  • 2)同层之间的流量”互斥“

层与层之间的流量”正交“的具体含义为:层与层之间的独立实验的流量时正交的,即实验中每组的流量穿越该层后,都会被再次随机打散,且均匀分布在下层实验的每个实验组中。

同层之间的流量”互斥“的具体含义为:

1)如果同层之间进行多组A/B测试,那么不同测试之间的流量时不重叠的,即互斥的

2)一组AB测试中实验组和对照组的流量是不重叠的,是互斥的

拓展 -> 推荐系统衡量:ABtest 框架

分享到