结合论文看Youtube推荐系统中召回和排序的演进之路(上)篇

本文涉及的论文如下:

  • 【2008 年】Video Suggestion and Discovery for YouTube: Taking Random Walks Through the View Graph
  • 【RecSys 2010】The YouTube Video Recommendation System
  • 【ICML 2013】Label Partitioning For Sublinear Ranking

内容主要介绍Youtube在机器学习方面的探索和尝试!后续会更新Youtube在深度学习和强化学习方向的几篇论文解读,以及在推荐系统方向做的探索!

2008年-Adsorption(吸附算法)

在论文《Video Suggestion and Discovery for YouTube: Taking Random Walks Through the View Graph》中作者定义了介绍的算法为:Adsorption(吸附算法),这篇论文比较老了,没有很大的参考意义,但是对于我们系统的了解Youtube推荐系统的进步却很有帮助,下面简单看下这篇论文的核心内容。

在最初,Youtube认为应该给用户推荐曾经看过视频的同类视频,或者说拥有同一标签的视频(有点类似于ItemCF),但是对于存在的视频,并不是都有标签的,虽然可以通过计算机视觉技术可靠的推断出某些视频的标签,但大部分unlabel的视频仍不能得到有效的标签,因此提出了论文中的Adsorption(吸附算法),通过吸附算法得到未知视频的标签,继而进行推荐。

算法实现的伪代码如下:

结合论文看Youtube推荐系统中召回和排序的演进之路(上)篇_第1张图片

其中

  • G ( V , E , w ) G(V,E,w) G(V,E,w) 表示的是一个节点图, V V V表示节点集合, E E E表示边的集合, w w w表示边的权重
  • L L L表示标签集合
  • V L V_L VL表示 V V V中拥有标签的节点集合
  • L v L_v Lv表示视频 v v v的标签分布概率
  • V ~ \widetilde{V} V 表示的是特殊处理的一些节点, V ~ = { v ~ ∣ v ∈ V L } \widetilde{V} = \{ \widetilde{v} | v \in V_L\} V ={ v vVL},即 v ~ \widetilde{v} v 只有一个邻节点 v v v,且 v ~ − v \widetilde{v} - v v v的连接权重为1
  • V ∪ V ~ V \cup \widetilde{V} VV 表示的是节点图中的节点只有一个连接的节点,且其 w = 1 w=1 w=1

每一轮迭代,将重新为所有节点计算标签概率分布。节点对应的标签分布由其连接的相邻节点关系强度,以及标签在相邻节点的分布概率乘积后累加得到。

即节点 v v v的标签的概率分布 L v L_v Lv等于点 u u u v v v之间的权重 w w w乘以点 u u u L u L_u Lu,通过这样一个传递,将邻居和自己的标签进行了“平均”。

其实这里的算法思想和PageRank算法是相似的,最终停止迭代的条件是标签分布相对平衡。

论文中提到了三种方式的吸附,分别为:

  • 均值吸附
  • 随机游走吸附
  • 线性吸附

这三种方式的吸附主要区别在于更新 L v L_v Lv时的方式,当是均值吸附时,如上图所示,当是随机游走吸附时,将 L v L_v Lv的迭代公式修改为:
L v = ∑ u w ( w , v ) ∑ u w ( w , v ) ∗ L u L_v = \sum_{u} \frac{ w(w,v) }{ \sum_u w(w,v) } * L_u Lv=uuw(w,v)w(w,v)Lu
其中 w ( w , v ) ∑ u w ( w , v ) \frac{ w(w,v) }{ \sum_u w(w,v) } uw(w,v)w(w,v) 表示随机遍历选择节点 u u u的概率,该算法就是将每一个顶点 v v v的标签发到相关联的邻居上,在每一次传递结束后,对顶点的标签进行归一化。

当为线性吸附时,即将 w ( w , v ) ∑ u w ( w , v ) \frac{ w(w,v) }{ \sum_u w(w,v) } uw(w,v)w(w,v) 理解成线性组合中占的比例。

总结思考

本论文主要介绍的是推荐系统中的吸附算法,主要解决的是如何使用有效的视频标签为无标签的视频打标并为用户进行推荐,在如今的场景中可以将其应用到用户画像的技术上,扩展未知用户的标签属性。

2010年-Youtube Video 推荐

该部分内容来自于论文:《The YouTube Video Recommendation System》该论文发表于2010年的RecSys上,虽然只有四页,但是在当时也是干货满满,下面我们来复习一下这篇论文介绍的是什么内容。

目标

用户在浏览Youtube视频时一般有三种目的:

  • 观看特定的video
  • 观看特定类型的video
  • 浏览寻找感兴趣的video

推荐系统的目的也是为了满足用户浏览寻找感兴趣的video,因此推荐系统的目标是为用户推荐高质量并且符合兴趣的视频,推荐结果应该随时间和用户的行为进行更新。

系统设计

论文中提到的Youtube的推荐系统应该是目前推荐系统架构的比较古老的版本,其是一个经典的「二段式推荐架构」,包含召回和排序两个部分。只不过使用到的算法和策略相比现在来讲比较简单和直接。

召回部分

召回部分主要是将用户有行为的视频作为种子集合,再将它们相关的视频集合合并到一起,就是一个最简单的召回策略,但是由于用户的口味在一定时期往往保持一致,这些种子视频的范围往往很狭窄,为了扩大多样性,Youtube选择召回的不是1步相关视频,而是n步相关视频,即种子视频迭代n次后得到的相关视频集合。

这里我们说一下如何选择种子视频集合和计算种子视频的相关视频。

a)选择种子视频集合

在系统中,用户的行为包括explicit(显式)和implicit feedback(隐式),显式的行为包括:用户评分、明确表示喜欢,不喜欢等行为,隐式的行为包括:浏览、观看等。因为可以考虑结合用户的显式和隐式行为进行种子视频的选择,比如用户观看过的视频、喜欢过的视频、收藏过的视频等。

但是原始数据中还含有非常多的噪声,很多不可控的因素会影响原始数据的质量,因此在使用数据的时候要进行一定的清洗和选择。这一点无论是过去,还是现在未来都是需要进行处理的。

b)计算视频相关性

论文中指出相关视频的定义为:视频 v v v的相关视频为用户观看视频 v v v之后可能想看的视频。

两个视频的相关性由关联规则挖掘方法来确定,视频 i i i和视频 j j j的相关性定义为:
r ( v i , v j ) = c i j f ( v i , v j ) r(v_i, v_j) = \frac{c_{ij}}{f(v_i, v_j)} r(vi,vj)=f(vi,vj)cij

其中:

  • c i j c_{ij} cij表示 v i v_i vi v j v_j vj共同出现的次数
  • f ( v i , v j ) f(v_i, v_j) f(vi,vj)是一个和视频 v i v_i vi v j v_j vj出现的次数相关的函数,最简单的此类函数为: f ( v i , v j ) = c i ∗ c j f(v_i, v_j) = c_i * c_j f(vi,vj)=cicj

利用这个相关系数可以选择出与种子视频 v i v_i vi相关的视频集合 R i = r ( v i , v j ) R_i = r(v_i, v_j) Ri=r(vi,vj)。简单的说,这个视频集合是由一个阈值进行确定的。

排序部分

在得到召回的视频集合以后,需要对这些相关视频进行排序。
用于排序的数据主要包括:

  • 视频质量:包括观看次数、视频评分、评论、喜欢和分享次数等等
  • 用户数据:视频和当前用户的兴趣的match程度
  • 多样性:要在被推荐的视频集合的类别中做一个平衡,以保持结果的多样性

这些数据最终被线性组合起来,得到ranking的评分。

总结

  • 在进行视频推荐时,会显示视频的缩略图、标题、以及视频的年龄、受欢迎程度等信息,也会解释为什么推荐该视频
  • 会让用户控制他们看到的推荐结果的位置和数量,用户可以提供相关的建议(针对某些场景,数量这个可以进行设置,建议即反馈)
  • 采用AB实验(CTR指标)来测试结果
  • 文中利用到了BigTable和MapReduce的技术(这在当时也是很厉害的主流大数据方案,虽然今天不再使用,但是其思想仍然产生了很大的影响)

这是一个比较经典的二段式推荐架构,在今天的推荐系统中仍然被延用,如果是一个公司初代推荐系统版本,其实完全可以借用该篇论文的思想,然后再进行逐步的完善和优化。

2013年-基于标签分割的亚线性排序

本篇论文是Youtube在2013年发表在RecSys上的-《Label Partitioning For Sublinear Ranking》,主要介绍的是如何根据标签分割进行线性排序。下面进行简单的复习和说明。

背景

现实中,许多任务需要对巨大得目标进行排序,例如在推荐系统中,响应一个用户得请求时,可能对数百万个视频进行打分排序,然后把前 k k k个视频呈现给用户,通常得做法是依次对每个视频进行打分,但是随着视频数量得增加,算法的实时性会受很大得影响。

因此论文提出了一种基于标签分割的算法,最终实现压线性的排序。

算法

假设存在一个数据集, ( x i , y i ) , i = 1 , . . . , m (x_i, y_i), i=1,...,m (xi,yi),i=1,...,m,其中 x i x_i xi是输入样本, D D D是所有标签的集合, y i y_i yi是D的子集。我们得目标是给定一个新样本 x ∗ x^* x的情况下,对 D D D中所有标签进行排序,并将 k k k个最想管得标签呈现给用户。

eg:在视频推荐系统中, x i x_i xi是某个状态(搜索历史,观看历史,地理位置)下的用户, D D D是整个视频库, y i y_i yi是和用户最相关的视频集合,假设 ∣ y i ∣ |y_i| yi 表示 y i y_i yi中的数量,假设在响应用户 x ∗ x^* x的请求时,我们需要给用户呈现 k = 10 k=10 k=10个视频,假设和用户最相关的视频集为 y ∗ y^* y,如果 k < ∣ y ∗ ∣ k < |y^*| k<y,我们希望这 k k k 个视频都属于 y ∗ y^* y,如果 k > ∣ y ∗ ∣ k > |y^*| k>y,我们希望 y ∗ y^* y中所有视频都在这 k k k个视频中。

论文中提出的标签分割算法,包含两个部分:

  • 输入分割:给定一个输入样本,将其映射成一个 key,这里表示为:
    p = g ( x ) , p ∈ { 1 , . . . , P } p = g(x), p \in \{1, ..., P\} p=g(x),p{ 1,...,P}
  • 标签分割:为每个key分配一个标签子集 L L L

在预测阶段,给定一个输入样本 x ∗ x^* x,找到其对应的 p p p L L L,用 f ( x , y ) f(x,y) f(x,y) L L L中所有标签打分并排序,由于 ∣ L ∣ < < ∣ D ∣ |L| << |D| L<<D,因此可以大大提高打分的速度,并且,如果 L L L中不包含 f ( x , y ) f(x,y) f(x,y)打分很高但是不相关的物品,还是改善系统的准确度。

a)输入分割

对于输入样例的划分,论文提到了两种,一种是 Weighted Hierarchical Partitionr,它的思想和加权的 K-means 算法一样,而权重是通过给训练样例到中心的距离一个根据 label 预测准确度得出的 weight,即如果在样本上打分函数表现的好(与用户相关的物品打分都高,下面简称好样本),那么该样本在损失函数中占有更高的权重,这么做的目的是让表现好的样本优先聚成一类,优先将好样本聚成一类的好处是只要对该类分配的标签集合中包含与样本相关的标签,就能够给用户呈现出来(排名靠前)。

∑ i = 1 m ∑ j = 1 P l ( f ( x i ) , y i ) ∣ ∣ x i − c j ∣ ∣ 2 \sum_{i=1}^{m}\sum_{j=1}^{P} l (f(x_i), y_i)||x_i - c_j||^2 i=1mj=1Pl(f(xi),yi)xicj2

另一个叫 Weighted Embedding Partitioner,它是通过对训练样例的转换使得 label 相同的训练样例尽可能被划分到一个集合中去,即作采用embedding的方法,将标签相似的样本映射到相似的空间:

∑ i = 1 m ∑ j = 1 P l ( f ( x i ) , y i ) ∣ ∣ M x i − c j ∣ ∣ 2 \sum_{i=1}^{m}\sum_{j=1}^{P} l(f(x_i), y_i)||Mx_i - c_j||^2 i=1mj=1Pl(f(xi),yi)Mxicj2
其中 M M M 表示的是 embedding矩阵。

b)标签分割

输入分割完成之后,就可以进行标签分配,下面讨论如何为一个key分配标签子集。论文中分为四种进行处理,分别为:

1、每个样本一个相关标签,且 k = 1 k=1 k=1,优化后最终的目标函数为:

m a x a ∑ t a y t ( 1 − m a x R t , i < R t , y t a i ) \underset{a}{max} \sum_{t} a_{y_t} (1- \underset{R_{t,i} < R_{t,y_t}} {max} a_i) amaxtayt(1Rt,i<Rt,ytmaxai)

2、每个样本一个相关标签,且 k > 1 k>1 k>1,优化后最终的目标函数为:

m a x a ∑ t a y t ( 1 − Φ ( ∑ R t , i < R t , y t a i ) ) \underset{a}{max} \sum_{t} a_{y_t}(1- \Phi ( \sum_{R_{t,i} < R_{t,y_t}}a_i)) amaxtayt(1Φ(Rt,i<Rt,ytai))
其中 r < k r < k r<k时, Φ ( r ) = 0 \Phi(r) =0 Φ(r)=0, 否则 Φ ( r ) = 1 \Phi(r) =1 Φ(r)=1

3、每个样本多个相关标签,且 k = 1 k=1 k=1,目标函数为:
m a x a ∑ t m a x y ∈ y t   a y ( 1 − m a x R t , i < R t , y a i ) \underset{a}{max} \sum_{t} \underset{y \in y_t}{max} \, a_y(1- \underset{R_{t,i} < R_{t,y}} {max} a_i) amaxtyytmaxay(1Rt,i<Rt,ymaxai)

4、每个样本多个相关标签,且 k > 1 k>1 k>1,此种情况下,目标函数为:
m a x a ∑ t 1 ∣ y t ∣ ∑ y ∈ y t a y w ( R t , y ) ( 1 − Φ ( ∑ R t , i < R t , y a i ) ) \underset{a}{max} \sum_{t} \frac{1}{|y_t|} \sum_{y \in y_t} \frac{a_y}{w(R_{t,y})}(1 - \Phi ( \sum_{R_{t,i} < R_{t,y}}a_i) ) amaxtyt1yytw(Rt,y)ay(1Φ(Rt,i<Rt,yai))

然后使用随即梯度下降法去优化该目标函数就好了。

总结

本文提出了一种“包装器”方法来加快标签得分排名。它采用了一种新颖的优化方法来进行输入分割和标签分配。结果与原始标签评分器相似或更好,但速度快了几个数量级,这使该技术可以在数量级很大的视频推荐系统中使用。

目前的推荐系统场景中,此方法已经没有太大的借鉴意义,但是通过上面Youtube发表的三篇论文来看,可以得知,Youtube在推荐系统方面也是在做不同的尝试和探索,从而更好的服务用户。


【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

你可能感兴趣的:(#,论文,推荐系统,CTR预估,Youtube论文,召回排序)