同时,直播业务是云音乐的衍生品,其推荐不同于音乐推荐,主要表现为用户意图不明确、直播用户行为稀疏、实时性要求高以及存在debias。
本文主要聚焦于直播推荐系统实时化,以场景的算法特色为切入点介绍直播场景的优化目标,从多个角度说明为什么直播需要实时化。同时,本文概述了推荐系统实时性的基本组成和基本解决方案。推荐系统实时性主要由特征实时性、模型实时性和系统实时性组成。具体地,本文也以云音乐直播场景的实时化演进来详细介绍我们是如何去搭建整个直播实时化系统,并解决实时化过程中带来的困难与挑战。最后,本文也给出了在大规模场景下的线上效果和分析。
大多数平台的直播场景,同时开播场次有限,对召回诉求不强,本质是一个对实时直播的精排或者粗排+精排的过程。
相比于传统的个性化推荐每天更新用户的推荐结果,实时推荐基于用户最近几秒的行为实时调整用户的推荐结果。实时推荐系统让用户当下的兴趣立刻反馈到了推荐结果的变化上,可以给用户所见即所得的视觉体验,它牢牢地抓住了用户的兴趣,让用户沉浸在其中。直播推荐系统更是对实时化需求非常高,大致可以从几个角度来介绍,Item推荐角度、数据指标、业务环境。
直播推荐是对实时在线主播的排序,是存量主播的一小部分。从下面这张平台主播开播分布情况图(图4)可以看出,我们平台存量主播有百万量级,而当天开播主播只有万量级,同时每个主播开播的时段不一,有凌晨、早上、下午、晚上,且每个时段开播主播咖位也不同,一般来说晚上开播主播更多,咖位更大。
直播推荐的item就是主播,是活的货物,这不同与歌曲推荐中的歌曲,信息流推荐中的图文或者视频,主播是一个不断变化的item,如下面这张图可以看出用户每次进入直播间看到的直播内容和主播状态都不一样,主播可能在pk、表演、聊天;而歌曲或者视频是一个完全静态的item,且每次推荐展示都是从头开始播放;所以直播推荐的不仅仅是一个item,更是status。
所以不管是从推荐的item、主播数据指标还是大环境,直播推荐都急需要一个实时化的推荐系统。
推荐系统实时化性由特征实时性、模型实时性和系统实时化组成,需要利用特征实时化去实时获取数据分布;模型实时化去实时拟合数据分布;最后基于实时系统去获取最新模型和数据。
抛开系统实时来说,算法同学当然更关心的是特征实时性和模型实时性。具体来说;
推荐系统依赖强大的数据处理能力
这是一个比较常见的特征实时化的实现框架图,主要包括日志系统、离线画像、实时画像,通过storm、flink、kafka完成实时数据的处理和传输,并存储在hbase和redis中,最后落盘到hdfs中。实时样本的处理中间环节是通过快照系统来解决样本的穿越问题和一致性问题。
但特征实时性再强,影响的范围也仅限于当前用户,要想快速抓住系统级别的全局的数据变化和新产生的数据pattern,就必须加强“模型”的实时性。
云音乐直播业务的实时化一直都是分成两条腿在走,一个特征实时,一个是模型实时。我们最初主要是通过不断增加各个维度的实时特征来提升系统的实时化能力,来实时反应主播、用户、上下文在当前的变化,使得模型能够跟上当前的实时变化来预估未来的趋势。另外在提升特征实时化的同时,我们也一直在对模型结构做升级迭代,业务最初采用的是特征工作+简单的单模型逻辑回归,这个方式的核心就在于实时数据、实时交叉特征打点志的建设。迭代到现阶段,我们采用的是ESMM+DFM+DMR模型,通过ESMM联合训练模型来解决SSB问题和转化样本的DataSparsity,DMR结构来捕捉用户长期和短期的兴趣。但是,现阶段还存在一些问题,特征够快了,模型够复杂了,可模型更新不够快,无法更快的抓住全局层面的新的数据pattern和趋势。
云音乐直播算法团队通过探索与实践,总结出了一个相对成熟且行之有效的实时增量模型的训练框架。
增量模型是在离线模型的基础上做进一步迭代,在不改变原有模型的网络结构,增量更新模型参数,来快速抓住系统级别的全局的数据变化和新产生的数据pattern。
我们现有的离线主模型是一个深度兴趣ESMM-DFM模型;该模型是借用Wide&Deep的思想,在ESMM框架下,增加特征交叉模块、用户兴趣模块,最后通过RestNet-DNN来加快模型收敛。
业内常见的样本归因方式,一般有两种,一个是facebook提出的负样本cache归因法,第二个就是twitter提出的样本矫正法。
Twitter的做法:两条样本都会保留,都会去更新模型,这样实时性最高,但是非常依赖样本矫正策略。
在现有的工程框架下,我们更倾向于构造类似于facebook的负样本cache策略,但是直接迁移使用会存在问题,我们尝试在首页直播模块落地,但是整体样本labeljoin率只有70%。
如我们上文给出的实时增量学习的技术架构图,右侧的离线训练过程是不会丢弃的,因为增量学习需要依赖离线模型做模型热启动重启。离线模型热启动重启的主要原因有两点:
(1)防止模型会因为一些局部的pattern而被带偏,基于离线模型热启动可以对其进行矫正。
(2)如果模型训练是longrunning的,会导致模型词表OOV的概率会越来越大,无法将新的ID快速加入到模型的词典并且快速淘汰老的ID。通过离线模型热启动重启,可以同步更新模型词表,防止OOV。
(3)场景使然,如4.2所述,首页直播场景存在严重的息屏现象,导致实时样本需要做进一步的累计归因,这样获得的样本均为当前时刻的累计样本,所以模型更新均需要在离线日更模型上做梯度下降。
因此,我们设计了天级别的离线模型热启动重启和15min样本级别的重启,以解决上述三个问题。这样既可以解决模型longruning带来的oov问题和局部pattern有偏的问题,更重要是保证进入模型训练的样本label都是准确的。
样本和特征作为机器学习的基石,其质量的好坏直接决定了模型效果的上限,所以做好样本和特征的质量保障,对实时增量学习的效果提升至关重要。上文4.2样本归因一节中,我们着力于保证进入模型训练的样本准确性。本节主要以具体case为切入点,分别从样本偏差特征和低频特征两个角度,介绍我们的解决方案。
由于增量的样本远远少于离线训练样本,所以全量特征的频次过滤条件不一定适用于增量特征的频次过滤条件。比如,全量时,某些特征的频次过滤数量设置为1000,但在增量时,应该设置得小一些。全量时,使用天级别积累的样本进行训练,但在增量时,则使用15分钟或者1小时内的样本进行训练,若仍然使用与之前全量相同的频次过滤条件,会过滤掉近1小时内频次不足1000的特征,即使在后一小时内,这些特征的频次增加到1000,也无法再追回已训练样本中的这些缺失特征值。
对于这类低频特征,我们采用了两种方式来解决,第一种方式就是硬准入策略,我们设置了两种特征频次过滤条件,全量更新时采用阈值较大的全量阈值;实时增量时,采用阈值相对较小的增量阈值。并且在构建增量样本时,之前在全量样本构建过程中被全量阈值过滤的特征,其频次会被保留,等到下一次增量到来时,若全量中被过滤的这些特征再次出现,则会将全量+当前增量的频次作为当前特征的频次。这样的话,某个特征的频次达到准入门槛后,才会进入模型训练。这样方式带来线上点击率相对提升0.94%,有效观看率相对提升0.23%。
优点:可以解决本次样本中的特征由于频次过低导致学出来的权重不够置信的问题。
缺点:仍然会过滤掉某些低频特征,损失一部分有效信息。特征在达到准入阈值之前,出现的前n次都被忽略了。
如上述“硬准入”的方案的缺点所述,硬准入会过滤掉某些低频特征,损失一部分有效信息。特征在达到准入阈值之前,出现的前n次都被忽略了,只有达到一定阈值后再进入训练的设计方案会破坏样本完整性,如全量频次99,增量频次1,阈值过滤100,则该特征出现的前99次都被忽略,仅会训练该特征出现的一次,导致模型训练的稳定性差。所以我们需要更加平滑的方式。
对于“软准入”方案,业界有两种比较常见的做法,基于泊松分布的特征频次估计和动态L1正则方案。
基于泊松分布的特征频次估计
在离线shuffle后的特征满足均匀分布,但对在线数据流,特征进入训练系统可看做泊松过程,符合泊松分布:
$$P(N(t)=n)=\frac{\lambdat^ne^{-\lambdat}}{n!}$$
$$P_{\lambda_{i}}(N(\frac{T-t}{t})>\vec{N}-n)$$
每次该特征出现时,都可按该概率\(P_{\lambda_{i}}\)做伯努利采样,特征在t步进入系统的概率用下式计算:
$$P=\prod_{i=1}^{t-1}{(1-P_{\lambdai})P_{\lambdat}}$$
通过真实线上数据仿真,它能接近离线频次过滤的效果,其λ是随每次特征进入时动态计算的。它的缺陷是:当t越小时,事件发生在t内的次数的variance越大,所以会以一定概率误加或丢弃特征。未来总的训练步数T在在线学习中是未知的。频次过滤与优化器相分离,导致不能获得优化器的统计信息。
动态L1正则方案
正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项或罚项,正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。L1范数是指向量中各个元素绝对值之和,也叫“稀疏规则算子”(Lassoregularization)。范数作为正则项,会让模型参数θ稀疏化,既让模型参数向量里为0的元素尽量多。在经典的FTRL实现中,L1正则对每个特征都是一致的。但是过大的L1虽然可以过滤掉极低频的特征,但由于约束太强,导致部分有效特征也被lasso,影响模型性能。
$$L_{1}(w_{i})=L_{1}(w_{i})*(1+\frac{(max((),0))}{N})$$其中C是惩罚倍数,N为特征最低门限,这两者皆为超参,freq(feaid)是当前特征出现的频次(包含当前增量中出现的频次以及历史总频次)。
我们也在线上环境,尝试使用了动态调节L1正则的方案,最后实现在原有硬准入方案的基础上,线上ABTest效果点击率相对提升1.2%;有效观看率相对提升1.1%。
当然除了模块带来的效果提升,我们整个实时增量模型方案上线,也取得比较喜人的结果。结合上述样本归因的处理、离线模型热启动重启以及特征准入方案,我们最终在首页直播模块推荐场景取得转化率:平均24天相对提升+5.219%;点击率:平均24天相对提升+6.575%的效果。
并且我们针对不同的模型更新频率进行了多种方案的测试,如下图,ABTestt1组为离线日更模型,每天更新替换模型文件;t2组为2小时更新模型,模型每两个小时增量训练;t8组为15分钟更新模型,模型每15分钟增量训练模型。经过我们多次测试,发现模型更新越快效果更佳也更佳稳定。