说说标签算法在视频推荐的那些事儿

转眼就到年关了,这里想认真总结下半年基于标签的个性化推荐项目的得与失。一方面记录下我们使用标签算法遇到的问题和解决方案,另一方面也和各位分享下过程中做过的那些事儿和踩过的那些坑。

1.事情由来

我们组负责的是优酷、土豆的所有的个性化推荐模块。当前覆蓋无线,主站,PC客户端等多端,近百个场景。每天从上亿的视频中,为上千万的用户提供个性化的服务。之前的个性化推荐算法主要基于Item-based协同过滤算法。熟悉推荐系统的同学,都知道这个算法的优势在于:

  • 协同过滤依靠的是“羣体智慧”,通过用户行为能直接计算出推荐内容之间的相似度。
  • 算法工程师不需要对于业务的理解,只要有用户的行为日志,就能得出还不错的结果。特别的,对于我们网站不需要对视频内容进行分析理解。

有优点就有缺点,缺点主要体现在:

  • 由于依赖用户的行为,捕捉新视频,实时热点视频能力较弱(即Item的冷启动问题)
  • 结果由于依赖其他用户的行为,可解释性不强。有时候会发现推荐了一些用户不可理解的内容,著名的例子就是推荐中的“哈利波特”问题。
  • 运营编辑人员无法显性的干预推荐结果,对于优酷土豆这种强媒体属性的公司,这种支持强干预、抗风险能力是必须的。

2.标签3

重要的事情说三遍! 是的,标签是我们的这件事成败的关键点,单独抽出来和大家分享。

2.1 标签体系

说到标签,大家的第一反应就是类似豆瓣、Delicious一样的网站,或者诸如下图的用户标签云模块。
《说说标签算法在视频推荐的那些事儿》

维基百科中,标签被定义为一种无层次化结构的,用来描述信息、表明物品语义的关键词。在我们的实际使用过程中,没有直接采用分词标签,而是将不同的词组合成一组能表达特殊兴趣的词包集合,从而构建成兴趣叶子节点。相关的叶子节点又组合成不同层级的兴趣标签,逐级的合并构建出一棵兴趣分类树,如下图所示。目前的兴趣分类树是四层结构,覆蓋近万个叶子兴趣节点。这样组织的好处是:

  • 层级化结构的标签,易于编辑运营人员的理解和使用,便于后续的更新与维护,能与已有的品类系统衔接配合
  • 能利用兴趣分类树的结构,进行相关标签计算以及在推荐算法的权重调整
    《说说标签算法在视频推荐的那些事儿》

2.2 标签匹配

大家知道优酷、土豆有别于其他的视频网站,既包含了例如“跑男”、“琅琊榜”等节目类的内容,又包含大量的用户产生内容,即通常称之为的UGC内容,总视频数超过2亿。对于如此之多的视频内容,想要分析其视频内容的成本是非常之高的。为此,我们通过视频的标题、描述以及用户上传视频时添加的tag信息,将视频vid 以及用户uid 映射至我们的兴趣标签 Interesting Tag,从而进行我们的个性化推荐。具体的标签匹配过程可以参见我们的上一篇博客《基于用户行为的兴趣标签模型》

2.3 遇到的问题

在我们实施的过程中,发现了之前未曾考虑的问题。

首先,标签的覆蓋是个比较大的问题。如果用户的兴趣没有对应的叶子节点,对应的视频是无法被推荐算法所匹配的。通过统计分析头部的VVLog,ClickLog以及SearchLog的方式,标签的覆蓋程度得到了提升,目前能到当天播放量的70%左右。

其次,标签体系一定是一个“活”的结构,新词发现、标签结构的增删是重要的组成部分。一方面通过同步官方媒资库的方式,扩充节目类视频的标签以及类目关系,另一方面通过站内搜索日志的新词、站外的内容的爬取扩充已有的兴趣标签。达到标签系统能更实时的捕捉到突发的兴趣点效果。

另外,标签二义性的问题也是需要解决的。通过标签的分类信息以及视频的属性信息的相关性判断与规则约束,以及上传者范围约束能较好的解决标签二义性问题。

3.从召回到排序

个性化推荐本质上就是在特定的场景(Context),为不同的用户匹配上满足用户需要的内容的过程。我们比较认同《京东个性化推荐系统持续优化的奥祕》这篇文章里的一个观点,将个性化推荐分为:召回与排序两大步骤。

3.1 召回策略

直接使用包含标签的视频作为候选集,一来质量较差,二来可召回的内容太多,计算复杂度较高,不利于后一步的排序工作的可扩展性。为此,我们需要对候选集进行过滤筛选,生成“优质视频”候选池。

考虑的因素包含:用户观看量、播放完成率、评论量、点击量等综合考虑的视频质量分;视频上传的时间;上传者的历史播放情况;是否包含敏感词等众多因素。并且由于各个频道分类的不同,阈值也不同,我们针对各个频道消费特点进行调整。例如:电视剧频道的质量条件会比音乐频道严苛。上线之后,使用CTR与曝光量:将曝光量大,但却没有点击或CTR偏低的视频进行降权,效果得到进一步提升。最终我们按照视频的综合得分Vr排序,形成了Tag->Vid 的倒排表。

3.2排序策略

排序这块,我们参考了项亮《推荐系统实践》中提到的方法,并且结合特有的业务场景做出相应调整优化:

rank(u,v)=ttagU(u,t)V(t,v)

其中,

U(u,t) 表示的是用户兴趣画像特征,

V(t,v) 表示的是兴趣标签对于视频描述的重要程度。

上面的排序公式,倾向于推荐热门标签的权重,例如热门电视剧、综艺一般都好几十集,由于观看的次数较多导致对应的权重普遍偏高,而一些小众的兴趣点不能得到体现,不能很好的反应用户的个性化兴趣。为此,我们借鉴TF-IDF的思想,对公式进行修正:

rank(u,v)=ttagU(u,t)log1+cutV(t,v)

其中 cut 表示的是包含标签t 的人数。

如果我们考虑视频本身的质量因素Vr(可以是带时间衰减的观看次数,或加权质量分,也可以是上线之后的CTR);再考虑标签本身的质量TQ,上面的公式可修改为:

rank(u,v)=ttagTQU(u,t)log1+cutV(t,v)Vr

其中 TQ 表示的是标签的质量,表征各个标签的质量差异导致的对于推荐排序的影响。我们是通过spark-mllib 提供的L-BFGS模型,训练得到不同标签对于CTR的影响权重。

3.3上线效果

通过上面的介绍可以看到,我们优化工作是三管齐下:

  • 完善标签体系,增加兴趣标签的覆蓋度,降低标签错误率
  • 优化召回策略,找出最值得推荐的视频
  • 调整排序模型,以点击率作为学习目标
    《说说标签算法在视频推荐的那些事儿》

我们的工作从10月初正式开发上线至12月底,在优酷首页的猜你喜欢模块,基于标签的算法CTR从4.5%提升至8.2%。同时,基于标签的算法也在更多的应用场景落地。

4.任重而道远

但遗憾的是,目前基于标签的个性化推荐目前点击率仍落后于基于CF的个性化推荐4%左右。分析了原因,一方面是CF算法在第一节中提到的优点,能更精准的捕捉用户的兴趣(当然包含了众多宅男们喜爱的福利视频);另一方面,目前我们基于标签的推荐工作还不够深入。

未来我们还会在如下的方面做出尝试:

实时兴趣标签获取。目前的召回,或匹配都没有做到实时。实时可以细分三方面:一是新的热点兴趣标签的能被标签系统自动捕获。二是新的视频的兴趣标签的实时标注。三是用户的实时行为,无论是搜索、订阅、观看对应的兴趣标签也需要能及时计算。这样才能更准确的捕获用户的短期兴趣,推荐满足当前用户兴趣的新热奇视频。

排序模型优化。目前的排序模型还相对简单,只考察了用户与视频标签层面的特征匹配程度。对于用户本身特征,视频本身特征,上下文特征,用户的反馈特征,以及其他交叉特征都未做更深入的分析和探讨。同时,个性化推荐模块不但需要准确性,多样性和新颖性,也是需要考虑的因素。这一块也是未来的一个重点。

基于图模型的标签推荐算法。视频、标签、用户这三元组之间的关系可以表示为三部图的结构。Folkrank这一算法,能在标签推荐中获得类似Pageank的效果。基于图计算的分布式计算框架,例如Spark-GraphX,以及阿里的ODPS-GRAPH,能很好的支持在海量数据上的图算法的实现与计算。这也是下一步我们需要研究的一个方向。

多算法的融合。目前的推荐系统,如果要不断的迭代优化效果,仅仅依靠一个模型或者一个算法是远远不够的。多算法融合的方式有很多,如何发挥各个算法的优势,取长补短,从而为用户提供满意的推荐体验,也是目前需要解决的重要的一个问题。

说了这么多,看来2015年我们做的还不远远够,2016年又有不少的方向可以努力。

欢迎各位看官对于上面的内容,如果有什么问题或者建议,可以多交流讨论,我们的邮箱是 [email protected] 。如果你也想投身于个性化算法的优化改进工作,不断改善视频行业的用户体验,也欢迎把你的简历发给我们。这里有亿级的视频,亿级的用户等你来挑战。我们热忱欢迎你的加入。

最后,祝大家猴年行大运。

路漫漫其修远兮,吾将上下而求索。
To be continue…

点赞