01 Likee短视频推荐模型和特征工程简介
Likee短视频是全球视频社交平台BIGO旗下的短视频产品,2017年7月正式上线,在三年的时间内已经交出了全球MAU过亿的成绩单。首页广场瀑布流是Likee短视频最主要的视频消费场景。三年来,Likee推荐模型在不断优化网络结构的同时,在特征工程方向也发展出一套特有的技术解决方案。
特征工程,顾名思义,是对原始数据进行一系列处理,将其提炼为模型可理解的输入数据格式,为模型提供信息增益以提升模型精度,特征工程是一个表示和展现信息的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与模型预测目标之间的关系。
特征是模型训练和预估的基础,决定了模型精度的上限。对于在线推荐服务而言,特征数据流对于策略迭代的效率起着至关重要的作用。经过多年实践中的积累和提炼,我们演化出一套针对大规模实时深度模型的特征数据框架,在提高策略迭代效率和模型效果的同时,也极大简化了工程复杂性和业务成本开销。这套特征数据流框架在Likee短视频首页推荐场景的精排和粗排模块完成多个AB实验和全流量上线,模型AUC和业务指标均取得显著提升。
如图一所示,排序模型流程包括日志收集、训练数据生成、模型训练和线上打分等阶段。当推荐系统对用户进行推荐时,会记录当时的物料特征、用户状态与上下文信息,并收集本次推荐的用户行为反馈。在经过样本标签匹配和特征抽取后生成最终的训练数据。离线使用 PS-WORKERS分布式训练框架对DNN模型进行分布式实时训练,定期dump最新模型并加载到线上,用于线上排序服务。
Likee首页推荐初始阶段为了满足快速上线的需求,线上使用的模型是基于连续统计特征的XGB模型,但是树模型在多目标建模和增量学习方便严重不足。近年来,深度学习模型凭借其强大的表达能力和灵活的网络结构在工业届推荐和广告领域取得重大进展,Likee首页推荐场景中,用户与视频交互产生了海量的真实行为数据,为深度学习模型应用提供了必要的条件。为处理大规模的训练样本和提高训练效率,我们使用分布式训练框架训练DNN模型,并基于该框架进行了多次优化尝试,在Likee首页推荐场景下取得了显著的效果提升。
特征数据作为模型的输入与模型结构紧密相连,特征体系随着模型选型不断升级,下面将分别从统计特征、session特征、多模态特征和cache tensor介绍我们在特征工程方面所做的优化与尝试。
02 Flink统计特征和session特征
2.1 基于滑动变长窗口聚合的Flink统计特征
相比于基于连续值统计特征的树模型,增量fine-train的DNN模型非常依赖于稀疏特征hashkey的复现,因此模型和特征时效性至关重要,因此我们引入业界主流的分布式流数据计算引擎Flink实现分钟级延迟的统计特征和秒级延迟的session特征。
如图二所示,我们采用变长bucket窗口聚合的方式对每一个统计实体进行counting,记录其在时间轴上不同bucket的counting累加值,对于越久远的行为我们采用更大的bucket时间间距进行聚合,在模型使用时,我们再根据特征具体的时间范围从聚合桶队列累加出任意时间段内的统计值。通过这样的方式,在保证counting统计值精度的同时,能够大幅降低redis和Flink任务的内存存储和读写压力。
2.3 Flink秒级延迟session特征
如图三所示,使用Flink任务记录用户历史行为队列,当Flink任务收到用户行为打点日志时,从redis读取用户行为队列进行更新然后写回到redis。其中,我们做了如下工程实践优化:
● 分用户行为队列存储。在短视频推荐场景用户行为丰富,用户的高阶行为(点赞,关注,分享)稀疏且更能够反应用户兴趣,因此根据用户不同行为划分成多个种子视频队列,保证用户兴趣度更高的高阶行为种子能够被更长久存储和充分利用;
● 冷热数据分离。为了优化redis的读写和存储压力,将用户一天以前的长周期行为队列冷备到pika,在线上模型使用时再将redis短期行为队列和pika长期行为队列合并成完整的用户行为队列,通过这样的方式,我们存储的用户历史行为队列长度可以达到千量级;
● 用户行为反馈编码。为了进一步建模用户对种子视频的偏好度,Flink任务会记录用户对每个种子视频的所有交互数据(是否播完,播放时长,播放次数,是否点赞|关注|分享|评论等),在模型网络里将用户反馈行为编码后embbeding作为用户对历史种子兴趣度的补充信息,在用户兴趣网络里该特征效果显著;
● 种子视频属性特征线上实时获取。Flink任务只记录种子视频id,种子视频属性特征是在线上模型使用时根据种子视频id从画像特征服务获取。
基于以上秒级延迟的用户session队列特征,Likee短视频首页推荐粗精排均全量了用户兴趣网络模型。
03 自动统计特征
3.1 Flink统计特征数据流的问题
随着Likee短视频日活和视频生产量高速增长,原有Flink统计任务很快遇到瓶颈,其面临以下几点问题:
● 机器资源消耗高,稳定性差。Flink统计任务涉及到打点日志解析、历史特征读取、特征计算&新特征回写,大量的计算和IO开销导致流式系统稳定性堪忧,并且机器消耗资源巨大;流失统计任务的不稳定导致统计特征分布剧烈变化,线上效果显著下降,同时会影响离线训练数据导致线上模型很难迅速恢复;
● 用户&物料交互统计信息缺失。推荐系统基于用户历史行为进行推荐,千人千面的个性化推荐系统强依赖于用户属性(用户id,性别,年龄,城市,兴趣标签,手机机型等)与物料属性(视频id,拍客id,标签,城市,国家等)之间的交叉特征。用户属性和视频属性间的交叉特征高度稀疏且数据量巨大, Flink统计的数据必须长久存储于内存或者分布式内存存储系统(如redis),受限于存储系统容量,无法统计这部分交叉特征的统计值。
3.2 自动统计特征的实现
自动统计特征就是把特征做到模型里,在模型训练时借助于分布式训练平台强大的I/O和存储能力,在训练引擎内进行特征级别的counting统计,从而简化离线特征计算流程的复杂度。
在模型训练时,以样本里出现的每个hashkey为统计对象实体,首先从参数服务器pull 该hashkey历史累计的行为统计量(stats feature),如果该hashkey第一次出现,则将stats feature用0向量初始化, 然后用当前样本的用户行为反馈action_tpl(表示样本是否曝光,是否点击,是否播完,播放时长等行为)对其进行更新:
Stats_feature <- stats_feature * decay_rate + actiontpl
其中decay_rate 表示时间衰减因子,然后将更新后的stats_feature push回参数服务器。
3.3 自动统计特征在DNN模型里的使用和优化
如上图所示,对每个特征域而言,根据其hashkey从参数服务器pull 其对应的counting统计值,然后多个特征域统计向量concat在一起构成统计特征域(stats feature)。对模型而言,原始的counting统计值与模型的预估目标并不完全一致,需要将原始counting统计值转换为与模型目标更相关的率值特征(列表点击率,播完率,点赞率等)。
图五为专门设计的counting统计特征预处理模块,首先将原值进行对数操作,将求比率的除法运算转换成等价的求差运算,然后引入差值矩阵实现批量求差操作,得到的结果即为我们需要的比率特征。
3.4 自动统计特征和embedding 特征的比较
stats特征和embedding特征从特征本质上而言其实是相通的,都是作为该特征filed特定的hashkey的信息输入,并且他们的原始信息都来源样本里的用户行为反馈,只不过二者更新方式(即获取特征信息的方式)不同。embedding特征的更新是通过梯度回传进行软更新(回传的梯度依赖于样本里的用户行为构造的label),stats特征则是直接根据样本里用户行为进行硬更新。软更新的embedding特征是基于整个模型参数每次进行小幅度更新,对于复现次数足够多的hashkey能够学习到更高的精度和更全面的信息,硬更新的stats特征对于复现次数少的hashkey能够做到更快速收敛。
stat特征和emb特征各有优劣互为补足,上图表示只用stat特征和只用emb特征以及二者都用的三个模型auc对比。
对于高度稀疏复现次数少的交叉特征,embbeding特征因为hashkey出现次数少导致训练不充分,而交叉统计特征则能够更快速准确地捕获到用户的个性化兴趣。
04 多模态特征
4.1 为什么引入多模态特征
在DNN模型升级和网络结构优化拿到巨大收益后,Likee模型组致力于将视频raw feature作为特征增加到模型中去。视频raw feature是用户直接接收的信号,并且raw feature和 ID 类特征不同,ID 类特征的所有信息都源于样本里和 label 共现信息的用户反馈,而raw feature本身具有物理含义,所以其具有更好的泛化性。另一方面,Likee短视频作为全球领先的短视频社区,新视频冷启和优质视频挖掘对于资源生态扮演着重要的角色,对于缺乏用户行为反馈的新视频,raw feature是视频内容理解和质量评估最重要的信息来源。
4.2 多模态特征抽取
视频raw feature过大,每天产生近百亿样本,涉及数据会达到上百 T,对于存储和 I/O 都会造成很大的压力,因此需要对视频raw feature进行特征提取和压缩。同时,如果直接引入视频raw feature作为排序模型的原始输入特征,将多模态模型和排序模型联合训练,会导致模型训练收敛慢且效果不稳定的问题。
最终多模态特征抽取设计如下:在视频上传入库时,使用预训练好的视频模型(I3D)和语音模型对原始视频进行特征提取,将多模态模型的最后一层全连接输入作为原始视频raw feature的低维向量表达,然后将他们存入到视频固有属性特征,在排序模型中将视觉和语音向量和视频ID emb向量以及其他side info作为视频表征的原始输入。
4.3 多模态向量聚类后embedding
由于预训练的多模态模型和排序模型目标完全不一致,为了让生成的多模态向量能够更好地拟合排序目标,除了将上述视觉和语音向量直接作为模型输入,我们还采用K-MEANS分别对视觉和语音向量进行聚类得到视觉聚类id和语音聚类id,然后将这两个聚类id再经过DNN模型 embbeding层得到新的向量,通过排序模型目标的梯度回传来进一步学习多模态特征的向量表达,作为多模态特征输入的补充信息。
05 cache tensor
5.1 特征数据流的进一步革新
在自动统计特征中,我们打破了特征体系和模型系统明确的分界线,将统计特征做到模型里,极大简化了在线和离线模型对外界特征数据流的依赖。随着推荐模型的迅猛发展,越来越丰富的模型特征导致线上原始特征和emb|stat特征参数的存储以及读取I/O压力骤增,越来越复杂的模型网络带来巨大的模型预估计算量。因此我们重新梳理了在线离线数据流和模型训练流程,通过cache tensor的方式极大缓解了以上所述的存储,I/O和计算压力。
5.2 cache tensor的工程实现
如图七所示,左边是我们过去的特征数据流程,线上特征服务根据用户id和候选视频id列表从在线存储系统获取特征片段并拼接成完整的原始特征数据,将其输入给线上排序服务的同时还将原始特征数据dump到日志系统供离线生成训练数据。在自动统计特征全量以后,我们的特征可以分为以下几类:用户画像特征,视频画像特征,拍客画像特征以及用户session特征,其中三个画像特征更新频次低且占据原始特征的大部分存储空间。
我们采用cache tensor技术对特征数据流进行简化,线上特征服务只读取变化快的user_session特征,不再读取时序上基本固定不变的画像特征,排序服务获取的(也就是日志系统dump的)原始特征只包含session特征以及用户uid还有候选视频item id。
在模型离线训练时,根据样本里的用户id和视频itemid从存储系统读取相应的画像特征对样本进行特征补全,然后使用batch 训练的方式对模型进行更新。在模型训练的同时,需要记录样本里出现过的用户id和物料id列表供后续流程使用。
在模型训练结束后加载训练得到的模型,分别输入样本里出现过的用户id和itemid列表,再次从存储系统读取相应的属性特征对样本进行特征补全,然后使用模型对样本进行预测。在预估过程中,将模型网络中的部分中间tensor cache到模型,和模型本来的emb参数一同存储。如上图所示,将模型网络分成两个部分, offline predict network和online predict network, 其中offline predictnet work中的虚线方框tensor (user emb和item emb) 即为需要cache的tensor。
在线服务模型对候选视频进行打分时,无需再读取和预处理画像特征,只需要将线上特征服务返回的用户id和候选视频itemid以及session特征输入给模型,模型根据用户id以及候选itemid在模型参数里查找相应cached tensor提供给裁剪后的模型网络进行预测,上图中 online predict network是根据cached tensor经过裁剪的线上预估网络,其输入为离线建库cache tensor后的模型参数。
采用cache tensor的方式优化离在线数据流后,线上预估服务吞吐量增加6倍的情况下预估耗时降低40%。同时基于cache tensor优化粗排模型结构,粗排模型auc提升2%,线上ab实验也取得显著效果收益。
06 总结
在Likee短视频推荐模型中,为了提升离在线特征数据流系统的稳定性和工程性能,同时优化排序模型效果,我们尝试了如下改进:(1)引入Flink实现秒级延迟的session特征服务,通过分队列和冷热数据分离实现千量级用户行为序列特征,用于建模用户长短期兴趣;(2)通过自动统计特征工程,在模型训练时同时进行特征更新,将统计特征做到模型参数里,极大简化特征数据流程,在提升工程架构性能的同时获得了业务指标的显著提升;(3)采用cache tensor的方式将画像特征做到模型参数里,进一步降低线上模型对于外围特征存储系统的数据依赖,同时经过预估网络的裁剪降低线上模型预估计算量,解决复杂模型网络的在线预估耗时瓶颈,为更复杂精准的排序模型打好基础。
下一篇 BIGO海量小文件存储实践