2.4.2 技术实现难题

在推荐系统的技术实现过程中,存在实时性问题、线上线下特征不一致的问题、数据分布不一致的问题、脏数据问题以及算法复杂度问题,我们接下来逐一介绍各技术问题的详细情况。

1.实时性问题

推荐系统能够针对离线数据进行规模复杂的计算,来定义清楚用户特征与内容特征,但是用户的兴趣是不断变化的,通过解析用户的线上行为,及时针对用户变化的兴趣做出反馈,是提升推荐效率的一个非常重要的方面。例如用户的标签是“男性,26岁,爱好运动与摄影”,这些是根据用户历史行为得出的标签数据,但是如果用户搜索了“绘画教程”这样的词语,那么推荐系统要是能在用户下一次刷新首页的时候及时推荐《21天学会画漫画》这样的教程,该内容点击率一定会得到极大的提升,用户的兴趣经常是一闪而过的,能够捕捉到这些瞬时兴趣,更能体现推荐系统的优劣。

在实时性计算的问题上,由于短视频社区的用户和内容特征量巨大,因此想用协同过滤召回则比较耗时,实时推荐主要依靠兴趣标签的方法来计算,能否及时给用户的临时兴趣打上标签,并且决策好该用户兴趣标签的权重和时效,都是算法与工程环节面临挑战的问题。

2.特征不一致

这里的特征不一致,主要指的是线上模型的特征和离线模型的特征不一致,为什么会发生这种情况呢?一般离线特征都是按照天级别处理的,离线特征处理完后导入到线上,供线上模型使用,假设离线特征计算完成的时间是T-2,那么在T-1天其实线上用的是离线T-2计算出的特征模型,依此推算,在T天线上应该用离线T-1天计算出的特征模型,而如果由于系统的计算延迟等问题,造成在T天线上还是用的T-2天计算的特征模型(T-1天离线模型尚未来得及上传至线上),由于线上模型未能及时迭代更新,则会造成离线训练效果较好,但线上效果却不及预期的情况发生。

要严格保证线上线下的特征一致,避免特征问题而导致的模型性能差异,就需要工程上及时进行计算,保障系统的稳定性。

3.分布不一致

有时候在系统稳定、线上特征与线下特征一致的前提下,仍然会发生模型在线下训练效果不错,但在线上效果差强人意的现象,这有可能是因为样本数据与真实环境数据分布的偏差造成的。举个例子,在一个100人的电影社区小组里,有20个喜欢戏剧的人,我们在采样的时候选取10个人作为样本(假设我们在20个喜欢戏剧的人里选取了7个人,在剩下80个喜欢电影的人里选取了3个人),经过对该样本的分析,得出一个预估该电影社区小组70%的人会喜欢戏剧的结论,但当将这个模型应用到线上全量数据后,会发现预估结果偏差较大(真实全量人群喜欢戏剧的比例只有20%)。

以上情况在推荐系统里很常见,往往就是因为样本选取的偏差太大,不足以反映整体人群比例的分布情况,这种现象通常也比较隐蔽,缺乏大致预判的情况下往往难以发现,这就需要在选取样本的过程中有比较了解业务的人员参与,或者通过离散采样多准备几份不同的样本(随机采样),最后的模型是这几个不同样本组综合训练得出来的结果。

4.脏数据问题

线下训练的数据往往会采用特征工程,工程技术人员利用大量的算法进行缺失数据填充、标准化、离散化、归一化处理后,生产出一份干净完备的标准化数据训练集,模型在这个标准化数据集上能够得出不错的结果。然而线上环境的数据却是非标准化的,因为数据规模量级会大很多,甚至有很多数据是缺失的,需要涉及非常复杂且烦琐的特征工程工作,数据集的收集、清洗和加工都需要耗费大量的人力物力,而模型能否在如此复杂的线上数据环境取得不错的效果,则要看数据处理的效果。

5.算法复杂度

算法追求的是精准度。可以认为,越复杂的算法模型,其计算越精准。例如之前在个性化召回里介绍过的内容协同过滤算法,其时间和空间复杂度是O(N×N),一个内容视频可以有几十个特征,而短视频社区内还在分发的可能有几千万个视频,如此量级下可能需要跑几天才能计算出结果,这对于推荐系统来说是不可接受的,必须要做算法优化。兼顾算法复杂度,在保证推荐结果的精准性和在工程角度取得良好性能这两方面,需要找到一个平衡点。