Google推荐系统架构

google 推荐系统的总体架构


由上图可以看出google推荐系统分为候选部分(candidate Generation)及检索、评分与重排名三部分。下面我们以YouTube的视频数据作为数据样例,来分别看这三个组件。
YouTube上有上亿的视频数据。并且每秒都还有新的视频数据在上传。推荐系统就是想为不同的用户从海量的视频数据中挑选出他们可能感兴趣的视频。

候选部分

  1. 概述
    候选部分是要完成从海量数据中抽取与query(user or context) 及item(被推荐的东西,在此是视频)有关的数据,即从上亿的数据抽取成千或成百的子数据集。
    如何判断抽取的数据是与Query(user or context) 、item有关的呢?通过判断query与item的相似性来确定他们是否相关。
    Query数据的信息包括user信息(userId, user曾经看过的视频)和context信息(当前的时间,用户使用的设备等)。为了能判断query与item数据的相似性,我们需要先对它们做embedding, 将它们都映射到一个相同的向量空间中,然后考虑使用常见的cosine, dot product 及欧式距离来判断他们的相似性。

  2. 抽取数据的算法

    • 基于内容过滤
      提取item的特征,并以此作为embedding vector, 基于用户的行为来为该用户寻找他感兴趣的item。例如,一个用户以前看过哪些视频,根据人工定义的视频的特征(视频的分类,时长等),找与看过的视频类似的视频,将它们作业候选集。
      优点:首先该算法只与当前用户过去的行为有关,并不会使用其他用户的信息,故可以极大的缩小候选数据的规模。其次它只关注当前用户的兴趣,可以为当前用户找到他感兴趣,但比较冷门的视频。
      缺点:item的特征是人工定义的,所以特征的定义要求比较高,如果不了解视频,可能不能得到好的特征集,也就会影响到模型的效果。其次,它只能基于已有的行为得到候选集,对于新用户是无法提取候选集的。
    • 协同过滤及矩阵分解
      协同过滤与基于内容过滤的不同点在于,它是基于用户对item数据的反馈来学习user, item的embedding数据,并不需要人工去定义特征项。其次,它不仅基于当前用户推荐他所感兴趣的视频,也将与他相似的用户所感兴趣的视频推荐给他。
      协同过滤又分为领域算法和隐语义模型(Latent Factor Model )两类算法。
      领域算法:是为当前用户推荐与其相似的用户选择的item(user based) 或者是推荐当前用户以前选择的item相似的item (item based)。
      隐语议模型:即矩阵分解,通过学习用户对item的反馈数据,得到用户、item的隐(即无法解释)属性矩阵(即特征空间), 再通过两者的点乘得到用户对该item的反馈(即评分),并以此来作为推荐的基础。算法意义层面的解释就是通过用隐含特征(latent factor)来将用户的兴趣与item特征关联起来。
      对于矩阵分解,其基本目标函数为:
      r^ui=qiT∗pu\hat{r}_{ui} = q_i^T*p_u r^ui=qiTpu
      其中r^ui\hat{r}_{ui}r^ui是预测的用户对item的反馈值,pup_upu为用户u的隐向量,qiq_iqi为item i的隐向量。qi,puq_i, p_uqi,pu都是通过输入的反馈数据的训练得到的向量值。pup_upu矩阵的值表示的是用户对隐含特征的感兴趣的程度,而qiq_iqi表示的是item与这些隐含特征的相关联的程度。它们的点乘就为预测用户对item的反馈数据。
      如何训练才能得到我们想要的隐向量呢?
      首先我们得定义损失函数,在这里我们使用MSE,由此得到:
      L=∑u,i∈K(rui−r^ui)2L = \sum_{u,i \in K}(r_{ui} - \hat{r}_{ui})^2 L=u,iK(ruir^ui)2
      其中K表示的是得到的隐性属性(特征)的个数。
      加上L2正则项:
      L=∑u,i∈K(rui−r^ui)2+λ∗(∥qi∥2+∥pu∥2)L = \sum_{u,i \in K}(r_{ui}-\hat{r}_{ui})^2 + \lambda * (\parallel{q_i}\parallel^2 + \parallel{p_u}\parallel^2) L=u,iK(ruir^ui)2+λ(qi2+pu2)
      然后再使用SGD:qi=qi+γ∗(eui∗pu−λ∗qi)q_i = q_i + \gamma * (e_{ui}*p_u - \lambda * q_i)qi=qi+γ(euipuλqi), pu=pu+γ∗(eui∗qi−λ∗pu)p_u = p_u + \gamma *(e_{ui}*q_i - \lambda * p_u)pu=pu+γ(euiqiλpu) 逐步求得使用损失函数值最小的。
      进一步改进
    1. 添加偏置项(Bias SVD)
      但是使用最基本的目标函数,训练的效果并不是很好,因为不同的用户对item的评分会有不同的偏好,有些宽容的用户,对item的评分会稍高些,而有些严格的用户,则会偏低些,所以,我们可以对目标函数做进一步的改进,加上μ,bu,bi\mu, b_u, b_iμ,bu,bi。它们分别表示网站平均偏置,用户的偏置和item的偏置。它又被称为 BiasSVD:
      r^ui=qiT∗pu+μ+bu+bi\hat{r}_{ui} = q_i^T * p_u + \mu + b_u + b_ir^ui=qiTpu+μ+bu+bi
      L=∑u,i∈K(rui−r^ui)2+λ∗(∥qi∥2+∥pu∥2+bu2+bi2)L = \sum_{u,i \in K}(r_{ui} - \hat{r}_{ui})^2 + \lambda * (\parallel{q_i}\parallel^2 +\parallel{p_u}\parallel^2 + b_u^2 + b_i^2) L=u,iK(ruir^ui)2+λ(qi2+pu2+bu2+bi2)

    2. 添加隐式反馈信息(SVD++)
      由于显示的反馈信息(用户视频评分)数据并不多,很稀疏,训练的效果也不会太好,我们需要增加隐式反馈(如用户点击过,浏览过的item)的信息,虽然不一定准确,但可以使我们的训练数据更稠密,对于这块数据用xix_ixi表示历史的偏好向量,用∣N(u)∣0.5|N(u)|^{0.5}N(u)0.5表示对xix_ixi数据的置信度。目标函数为:
      r^ui=qiT∗[pu+∣N(u)∣0.5∗∑i∈N(u)xi]+μ+bu+bi\hat{r}_{ui} = q_i^T * [p_u+|N(u)|^{0.5}*\sum_{i \in N(u)} x_i] +\mu +b_u+b_ir^ui=qiT[pu+N(u)0.5iN(u)xi]+μ+bu+bi
      L=∑u,i∈K(rui−r^ui)2+λ∗(∥qi∥2+∥pu∥2+bu2+bi2+∑i∈N(u)∥xi∥2)L = \sum_{u,i \in K}(r_{ui} - \hat{r}_{ui})^2+\lambda * (\parallel{q_i}\parallel^2 + \parallel{p_u}\parallel^2+b_u^2+b_i^2+\sum_{i\in N(u)}\parallel{x_i}\parallel^2) L=u,iK(ruir^ui)2+λ(qi2+pu2+bu2+bi2+iN(u)xi2)
      N(u)表示用户u提供的隐式反馈物品的集合。这也是svd++算法。

    3. 添加标签信息(SVD++)
      此外,我们还可以使用用户的一些标签信息(年龄,性别,职业等)加入来推测用户对每个喜好的偏好程度。使用yay_aya来表示喜好程度。
      增加标签信息偏好后的目标函数为:
      r^ui=qiT∗[pu+∣N(u)∣0.5∗∑i∈N(u)xi+∑a∈A(u)ya]+μ+bu+bi\hat{r}_{ui} = q_i^T * [p_u+|N(u)|^{0.5}*\sum_{i \in N(u)} x_i + \sum_{a\in A(u)}y_a]+\mu + b_u + b_ir^ui=qiT[pu+N(u)0.5iN(u)xi+aA(u)ya]+μ+bu+bi
      L=∑u,i∈K(rui−r^ui)2+λ∗(∥qi∥2+∥pu∥2+bu2+bi2+∑i∈N(u)∥xi∥2+∑a∈A(u)∥ya∥2)L = \sum_{u,i \in K}(r_{ui}-\hat{r}_{ui})^2+\lambda*(\parallel{q_i}\parallel^2+\parallel{p_u}\parallel^2+b_u^2+b_i^2+\sum_{i \in N(u)}\parallel{x_i}\parallel^2 + \sum_{a\in A(u)}\parallel{y_a}\parallel^2) L=u,iK(ruir^ui)2+λ(qi2+pu2+bu2+bi2+iN(u)xi2+aA(u)ya2)

    4. 添加时间信息(timeSVD)
      用户的偏好是会随着时间而改变的,每个项目的评分也会随着时间而改变。因此bi,bu,pub_i, b_u, p_ubi,bu,pu都是随着时间变化的函数,为了进一步准确,可定义目标函数为:
      r^ui=qiT∗pu(t)+μ+bu(t)+bi(t)\hat{r}_{ui} = q_i^T * p_u(t) + \mu+b_u(t)+b_i(t)r^ui=qiTpu(t)+μ+bu(t)+bi(t)
      M∈Rm ⁣ ⁣×⁣ ⁣nM\in {{\mathbb{R}}^{\text{m }\!\!\times\!\!\text{ }n}} MRm×n

    5. 添加社会信息[^1]
      L=min⁡U,V12∑i=1m∑j=1nIij(rij−uiTvj)2+α2∑i=1m∑f∈F+(i)sif∥ui−uf∥F2+β2∑j=1n∑q∈Q+(j)sjq∥vj−vq∥F2+λ12∥U∥F2+λ22∥V∥F2\begin{aligned} L=& \min _{U, V} \frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{n} I_{i j}\left(r_{i j}-\mathbf{u}_{i}^{T} \mathbf{v}_{j}\right)^{2} \\ &+\frac{\alpha}{2} \sum_{i=1}^{m} \sum_{f \in \mathcal{F}^{+}(i)} s_{i f}\left\|\mathbf{u}_{i}-\mathbf{u}_{f}\right\|_{F}^{2} \\ &+\frac{\beta}{2} \sum_{j=1}^{n} \sum_{q \in \mathbb{Q}^{+}(j)} s_{j q}\left\|\mathbf{v}_{j}-\mathbf{v}_{q}\right\|_{F}^{2} \\ &+\frac{\lambda_{1}}{2}\|U\|_{F}^{2}+\frac{\lambda_{2}}{2}\|V\|_{F}^{2} \end{aligned} L=U,Vmin21i=1mj=1nIij(rijuiTvj)2+2αi=1mfF+(i)sifuiufF2+2βj=1nqQ+(j)sjqvjvqF2+2λ1UF2+2λ2VF2
      其中,sifs_{if}sif 表示用户 iii 和用户的 fff 社交相似度, sjqs_{jq}sjq 表示项目 jjj 与项目 qqq 的隐社交相似度,IijI_{ij}Iij表示当用户i对item j 打分时,值为1, 没打分,值为0。α,β,λ1,λ2\alpha, \beta, \lambda1,\lambda2α,β,λ1,λ2都是正则参数。F+(i)\mathcal{F}^{+}(i)F+(i)表示与用户i相似的用户的集合,相应的Q+(j)\mathbb{Q}^{+}(j)Q+(j)表示与item j相似的item的集合。在用户维度和项目维度分别增加了平滑项约束,使得学得的隐特征表示更加符合现实意义。需要注意的是这里直接使用用户显示反馈数据(稀疏数据),如果没有对某个item打分,就直接设置为0。

    6. 加权矩阵分解法(google推荐系统使用的模型)
      L=∑(i,j)∈obsWi,j(ru,i−r^u,i)2+∑(i,j)∉obsW0r^u,iL=\sum_{(i,j) \in obs}W_{i,j}(r_{u,i}-\hat{r}_{u,i})^2 +\sum_{(i,j) \notin obs}W_{0}\hat{r}_{u,i}L=(i,j)obsWi,j(ru,ir^u,i)2+(i,j)/obsW0r^u,i
      其中Wi,jW_{i,j}Wi,j表示的是用户i对item j做了评分时的权重,而W0则是没有评分时的权重W_{0}则是没有评分时的权重W0。而ru,ir_{u,i}ru,i的值,不再是具体的分数,而是0, 1值,0表示用户对该item没有做评分,1是表示做了评分。然后使用WALS方法来求得使损失函数L的值最小的U,V值。
      使用WALS来计算工U,V值,比SGD收敛得更快些,也能较好的处理没有得到显示反馈的数据。

    7. DNN(google for Youtube)[^2]
      输入:用户看的视频的ID平均值(embedded video watches), 即watch vector。用户查询的平均值(embedded search tokens),即search vector。还有用户的其他特征,如地理位置embedding, 年龄、性别等,一起组成一个定长的输入层数据。
      输出:用户对每个视频可能观看的概率。使用softmax函数(训练时)。而在实际使用时,使用ANN(Approximate nearest neighbor)查询出候选集。
      DNN模型与前面的MF相比,它能更好的使用更多的用户的特征,能够更好的提取出用户特别的兴趣。但是它的训练成本很高,且如果不采用负采样的方法可能会出现fold的问题。

评分、排序

生成候选集后,我们就需要对候选集中的数据再评分、排序。在这阶段,我们的候选集可能有多个,不仅仅来源于一个数据源。如有来自于MF提取的相关的item候选集,有基于用户个性化提取的候选集,有基于流行性、流行趋势的候选集等。在这些数据基础上,我们需要建立一个模型,预测用户观看这些候选视频的概率,然后基于预测结果排序。
YouTube的评分模型的架构:

由DNN + Logistic Regression

[^1]引用论文《An experimental study on implicit social recommendation》link
[^2] 引用 《Deep Neural Networks for YouTube Recommendations》

google推荐系统初探相关推荐

  1. Google推荐系统Wide Deep Learning for Recommender Systems论文翻译解读

    Wide & Deep Learning for Recommender Systems 推荐系统中的Wide & Deep Learning 摘要 Generalized linea ...

  2. 【推荐系统学习总结 NCF => NGCF => LightGCN】

    推荐系统学习总结 NCF => NGCF => LightGCN NCF(别名 NeuMF) 背景 动机 创新点 模型框架 损失函数 核心代码实现 NGCF 背景 动机 创新点 模型框架 ...

  3. 视觉设计_视觉设计:

    视觉设计 What does the customer first see in your application? Yes, its your application design. So it i ...

  4. 最新基于协同过滤的毕业设计题目

    基于协同过滤的毕业设计题目1-10题 1.基于协同过滤理论的民机智能故障诊断方法 2.基于协同过滤的图书个性化推荐研究 3.基于协同过滤的全球AI挑战赛社区的设计与实现 4.基于协同过滤的专利TRIZ ...

  5. 机器学习中的矩阵分解方法

    基于郭栋老师的教学PPT,配上相关paper和资料,做到对矩阵分解技术有个大致了解. 一个假设:数据由有限的潜在因子决定,数据样本的观测值是潜在因子的一个映射. 矩阵分解发展历史: 经典的方法PCA, ...

  6. (一)推荐算法概述——以协同过滤为主

    推荐算法具有非常多的应用场景和商业价值,因此对推荐算法需要认真学习.推荐算法种类很多,但是目前应用最广泛的应该是基于协同过滤的推荐算法. 本文总结了多种推荐算法,其中重点对协同过滤的推荐算法做一个概括 ...

  7. 清华大学关健博士:利用自监督学习的开放端故事生成评价方法

    ⬆⬆⬆              点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 尽管现有的有参考指标(如BLEU)已经在机器翻译评价等任务上有较好的表现,但是对于开放端语言生成评价( ...

  8. 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探

    2019独角兽企业重金招聘Python工程师标准>>> 用意: 希望了解Mahout中数据的存储方式, 它如何避免java object带来的冗余开销.学完知识,要进行些实战 去分析 ...

  9. 入坑推荐系统,从Google这篇开始

    推荐系统内容实在太丰富了,以至于刚开始学的人都无从下手,当年时晴无意中翻到谷歌这篇教程,然后就开启了入"坑"推荐系统的神奇旅程,极力推荐给大家,大家也可以推荐给想学推荐系统的童鞋们 ...

最新文章

  1. 如何与您的经理和上层人员进行有效沟通
  2. 多选月份的日期选择器_GitHub - ylmyg/SelectionTime: Android下日期选择器,支持范围选择、多选、单选、根据输入天数选择日期...
  3. LiveVideoStackCon 2022 上海站 专题抢先看(2)
  4. 计算机网络(十六)-轮询访问介质访问控制
  5. 神经网络隐藏层个数怎么确定_含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业)...
  6. 写了个散列算法... 用来获取字符串的哈希. 超高效.10亿以下几乎无碰撞.
  7. Silverlight 中的 CoreCLR
  8. Windows脚本bat命令
  9. MySql常用语句汇总
  10. xampp的安装及使用
  11. Python读写LMDB文件
  12. 多个pdf怎么合并成一个pdf?
  13. 智能电视大战背后的秘密
  14. 转载.NET技术-.NET各大网站-编程技术网址
  15. 12.28 笔记 (集合) --- 耐得住寂寞
  16. 洛谷P4315 月下“毛景树”(树剖+线段树)
  17. 用python画星空-用python画星空源代码是什么?
  18. 娱乐而已,认真你就输了
  19. Python新手引导 第三篇-Python基础和字符编码
  20. 基于IMX6Q的uboot启动流程分析(3):_main函数之relocate_code与board_init_r

热门文章

  1. 2018年Android版本分布(市场占有率、市场份额)统计
  2. RSocket——Http协议的替代者
  3. MySQL之——MySQL远程连接丢失问题解决方法(Lost connection to MySQL server)
  4. 如何向纯洁的女朋友解释并发与并行的区别?
  5. Fast AI人工智能审图平台-建筑图纸设计效率的倍增器
  6. writing Typecho Plugin记录
  7. 大土狗书屋好书推荐--《编程之道》
  8. 新的RA Group勒索软件针对美国组织进行双重勒索攻击
  9. (转)乔布斯:遗失的访谈1995
  10. 一是数据库,数据库是一