推荐系统概论

原文链接:文档:推荐系统概论

文章目录

  • 简介
    • 目标:
    • 术语
      • 项目(也称为文档)
      • 查询(也称为上下文)
      • Embedding(嵌入)
    • 推荐系统概述
      • Candidate Generation 候选生成
      • Scoring 评分
      • Re-ranking 重新排名
  • 候选生成
    • 候选生成概述
      • Embedding Space(嵌入空间)
      • Similarity Measures 相似度量
        • Cosine
        • Dot Product
        • Euclidean distance
        • Comparing Similarity Measures
        • Which Similarity Measure to Choose?选择哪种相似性度量
      • 基于内容的过滤
        • 基础知识
        • 使用点积作为相似性度量
      • 基于内容过滤的优势和劣势
        • 优势
        • 缺点
    • 协同过滤和矩阵因子分解
      • 基础知识
        • Collaborative Filtering 协同过滤
        • 电影推荐示例
          • 1D Embedding
          • 2D Embedding
      • Matrix Factorization 矩阵分解
        • Choosing the Objective Function 选择目标函数
        • Minimizing the Objective Function 最小化目标函数
        • SGD vs. WALS
          • SGD
          • WALS
    • 协同过滤的优点和缺点
      • Advantages
      • Disadvantages
    • 使用深度神经网络提供建议
      • 深度神经网络模型
        • Softmax DNN for Recommendation
          • Input
          • Model Architecture
          • softmax输出:预测概率分布
          • Loss Function
          • Softmax Embeddings
        • DNN和矩阵分解
          • Can You Use Item Features?
      • Softmax Training
        • Training Data
        • Negative Sampling(下采样?)
        • 论矩阵分解与Softmax
    • 检索、评分、重排名
      • Retrieval 检索
        • 大规模的检索
      • Scoring 评分
        • 为什么不让候选生成器得分呢?
        • 为评分选择一个目标函数
        • Positional Bias in Scoring 推荐项目所在屏幕的位置对打分的影响
        • Solutions
      • Re-ranking
        • Freshness
          • Solutions
        • Diversity
          • Solutions
        • Fairness
          • Solutions
  • 课程总结

简介

目标:

描述推荐系统的目的。
了解推荐系统的组成部分,包括候选人生成,评分和重新排名。
使用嵌入(Embedding)来表示项目和查询。
对候选人生成中使用的通用技术有更深入的技术了解。
使用TensorFlow开发用于推荐的两个模型:矩阵分解和softmax。

术语

在进入之前,您应该了解一些术语:

项目(Items)(也称为文档)

系统推荐的实体。
对于Google Play商店,这些项目是要安装的应用程序。 对于YouTube,这些项目是视频。

查询(Query)(也称为上下文)

系统用来提出建议的信息。 查询可以是以下各项的组合:

  • 用户信息
    • 用户的id
    • 用户以前与之交互的项(用户交互历史)
  • additional context
    • 时间
    • 用户设备

Embedding(嵌入)

从离散集(在本例中是查询集或要推荐的项集)到称为嵌入空间的向量空间的映射。许多推荐系统依赖于学习查询和项的适当嵌入Embedding表示。

推荐系统概述

推荐系统的一个常见体系结构由以下组件组成:

  • 候选生成
  • 评分
  • 重新排序

Candidate Generation 候选生成

在此第一阶段,系统从潜在的庞大语料库开始,并生成较小的候选人子集。例如,YouTube中的候选生成器将数十亿个视频减少到数百或数千。考虑到语料库的庞大规模,该模型需要快速评估查询。给定的模型可以提供多个候选生成器,每个候选生成器都指定候选的不同子集。

Scoring 评分

接下来,另一个模型对候选进行评分和排名,以选择要显示给用户的项目集(约10个)。由于此模型评估的是商品的相对较小子集,因此系统可以使用依赖于其他查询的更精确的模型。

Re-ranking 重新排名

最后,系统必须考虑最终排名的其他限制。例如,系统删除用户明确不喜欢的项目或提高新鲜内容的得分。重新排名还可以帮助确保多样性,新鲜度和公平性。我们将在课堂上讨论每个阶段,并提供来自不同推荐系统(例如YouTube)的示例。

候选生成

候选生成概述

候选人生成是推荐的第一阶段。给定一个查询,系统生成一组相关的候选项。下表显示了两种常见的候选生成方法:

类型 定义 举例
content-based filtering 基于内容的过滤(推荐) 使用项目之间的相似性来推荐用户喜欢的相似项。 如果用户A观看了两个萌猫视频,那么系统可以向该用户推荐萌猫视频。
collaborative filtering 协同过滤 同时使用查询和项目之间的相似性来提供建议。 如果用户A与用户B相似,并且用户B喜欢视频1,那么系统可以向用户A推荐视频1(即使用户A没有看过任何类似于视频1的视频)。

Embedding Space(嵌入空间)

基于内容和协作过滤都将每个项目和每个查询(或上下文)映射到公共嵌入空间 E = R d E=\mathbb{R}^{d} E=Rd中的嵌入向量。通常,嵌入低维空间(也就是说嵌入空间的维度d远小于语料库中的向量维度(shape)),并捕捉一些项目或者查询集中潜在的结构。类似的项目,比如YouTube视频通常是相同的用户的关注,在嵌入空间中。“亲密度”的概念是通过相似性度量来定义的。

Similarity Measures 相似度量

相似度度量是一个函数 s : E × E → R s: E \times E \rightarrow \mathbb{R} s:E×ER,它接受一对嵌入并返回一个标量来度量它们的相似度。嵌入式可用于候选生成如下:给定一个查询嵌入 q ∈ E q \in E qE,系统查找接近的项目嵌入 x ∈ E x \in E xE,即高度相似的嵌入 s ( q , x ) s(q, x) s(q,x)

为了确定相似度,大多数推荐系统依赖于以下一种或多种方法:

  • cosine 余弦
  • Dot Product 点积
  • Euclidean distance 欧式距离

Cosine

这个就是两个向量夹角的余弦, s ( q , x ) = cos ⁡ ( q , x ) s(q, x)=\cos (q, x) s(q,x)=cos(q,x)

Dot Product

两个向量的点积是 s ( q , x ) = ⟨ q , x ⟩ = ∑ i = 1 d q i x i s(q, x)=\langle q, x\rangle=\sum_{i=1}^{d} q_{i} x_{i} s(q,x)=q,x=i=1dqixi。它也由(角的余弦乘以范数的乘积)给出 s ( q , x ) = ∥ x ∥ ∥ q ∥ cos ⁡ ( q , x ) s(q, x)=\|x\|\|q\| \cos (q, x) s(q,x)=xqcos(q,x)。因此,如果嵌入是标准化的,那么点积和余弦重合。

Euclidean distance

这是欧氏空间中通常的距离 s ( q , x ) = ∥ q − x ∥ = [ ∑ i = 1 d ( q i − x i ) 2 ] 1 2 s(q, x)=\|q-x\|=\left[\sum_{i=1}^{d}\left(q_{i}-x_{i}\right)^{2}\right]^{\frac{1}{2}} s(q,x)=qx=[i=1d(qixi)2]21。距离越小,相似度越高。注意,当嵌入被标准化时,欧氏距离的平方与点积(和余弦)一致,直到一个常数,因为在这种情况下 1 2 ∥ q − x ∥ 2 = 1 − ⟨ q , x ⟩ \frac{1}{2}\|q-x\|^{2}=1-\langle q, x\rangle 21qx2=1q,x

Comparing Similarity Measures

考虑下图中的例子。黑色向量演示了查询嵌入。其他三个嵌入向量(项目A、项目B、项目C)表示候选项目。根据所使用的相似度度量,项目的排序可以是不同的。

使用图像,尝试使用所有三个相似度度量来确定项目排名:余弦、点积和欧氏距离。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JeWlSztL-1580788276376)(5A9E847121614F72BE916F384428A64E)]

Which Similarity Measure to Choose?选择哪种相似性度量

与余弦函数相比,点积相似度对嵌入范数比较敏感。
也就是说,嵌入的规范性越高,相似度越高(对于锐角的项目),就越有可能推荐该项目。这可能会影响以下推荐:

  • 训练集中经常出现的项目(例如,流行的YouTube视频)往往嵌入了大量的规范。如果需要捕获合乎心意的流行信息,那么应该选择点积。然而,如果你不小心,流行的项目可能最终主导推荐。在实践中,您可以使用其他相似性度量的变量,这些变量不太强调项目的规范。例如,定义 s ( q , x ) = ∥ q ∥ α ∥ x ∥ α cos ⁡ ( q , x ) s(q, x)=\|q\|^{\alpha}\|x\|^{\alpha} \cos (q, x) s(q,x)=qαxαcos(q,x)其中 α ∈ ( 0 , 1 ) \alpha \in(0,1) α(0,1)

  • 很少出现的项目在训练期间可能不会经常更新。因此,如果它们是用一个大的范数初始化的,系统可能会推荐稀有的项而不是相关的项。要避免此问题,请小心嵌入初始化,并使用适当的正则化。我们将在第一个练习中详细讨论这个问题。

基于内容的过滤

基础知识

基于内容的过滤使用项目特征根据用户先前的操作或明确的反馈来推荐其他与用户喜欢的项目类似的内容。

要演示基于内容的过滤,请为GooglePlay商店手动设计一些特征(性)。下图显示了一个功能矩阵,其中每一行代表一个应用程序,每一列代表一个特征(性)。特征(性)可能包括类别(例如,教育,休闲,健康),应用程序的发布者等。为简化起见,假设此功能矩阵是二进制的:非零值表示应用程序具有该功能。

您还可以在同一特征空间中代表用户。一些与用户相关的特征可以由用户明确提供。例如,用户在其个人资料中选择“娱乐应用”。其他特征可能是隐式的,具体取决于它们先前安装的应用程序。例如,用户安装了由Science R Us发布的另一个应用程序。

该模型应推荐与此用户相关的项目。为此,您必须首先选择一个相似性指标(例如,点积)。然后,您必须设置系统以根据此相似性度量标准为每个候选项目评分。请注意,建议是针对该用户的,因为该模型未使用有关其他用户的任何信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mceLchVb-1580788276378)(84076D30321C4552B2880878746E7F33)]

使用点积作为相似性度量

考虑这样一种情况,用户嵌入x和应用程序嵌入y都是二进制向量。因为 ⟨ x , y ⟩ = ∑ i = 1 d x i y i \langle x, y\rangle=\sum_{i=1}^{d} x_{i} y_{i} x,y=i=1dxiyi(点积就是两个向量对应元素的乘积),一个特征同时出现在xy中,并为总和贡献一个1。换句话说, ⟨ x , y ⟩ \langle x, y\rangle x,y是同时在两个向量中活动的特征的数量。高点积表示更多的共同特征,因此相似度更高。

基于内容过滤的优势和劣势

优势

  • 该模型不需要关于其他用户的任何数据,因为推荐是特定于该用户的。这使得它更容易扩展到大量用户。
  • 该模型可以捕获用户的特定兴趣,并且可以推荐很少其他用户感兴趣的小众项目。

缺点

  • 由于项目的特征表示在某种程度上是手工设计的,因此这种技术需要大量的领域知识。因此,模型只能和手工设计的特性一样好。
  • 模型只能根据用户现有的兴趣进行推荐。换句话说,该模型扩展用户现有兴趣的能力有限。

协同过滤和矩阵因子分解

基础知识

Collaborative Filtering 协同过滤

为了解决基于内容的过滤的一些限制,协同过滤同时使用用户和项目之间的相似性来提供建议。这允许偶然的建议;也就是说,协同过滤模型可以根据相似用户b的兴趣向用户A推荐一个项目。此外,嵌入可以自动学习,不需要依赖特性的手工工程。

电影推荐示例

考虑一个电影推荐系统,其中的训练数据包含一个反馈矩阵,其中:

  • 每一行代表一个用户。
  • 每一列表示一个项目(一个电影)。
    关于电影的反馈分为两类:
  • 显式——用户通过提供一个数字评分来指定他们对某部电影的喜爱程度。
  • 隐式——如果用户观看电影,系统会推断出用户感兴趣。

为了简化,我们将假设反馈矩阵是二进制的;也就是说,值1表示对电影感兴趣。

当用户访问主页时,系统应该基于以下两点推荐电影:

  • 与用户过去喜欢的电影相似
  • 相似用户喜欢的电影

为了说明,让我们手动设置一些特征来描述电影如下表:

电影 评分 描述
蝙蝠侠:黑暗骑士崛起 PG-13 在这部以DC漫画宇宙为背景的《黑暗骑士》续集中,蝙蝠侠努力将哥谭市从核毁灭中拯救出来。
哈利波特与魔法石 PG 一个孤儿发现自己是一名巫师,并进入霍格沃茨魔法学校学习,在那里他与邪恶的伏地魔展开了第一次战斗。
怪物史莱克 PG 一个可爱的食人魔和他的驴伙伴出发去营救菲奥娜公主,她在她的城堡里被一条龙报复。
佳丽村三姊妹 PG-13 当职业自行车冠军在环法自行车赛期间被绑架时,他的祖母和超重的狗狗在三位年长的爵士歌手的帮助下到海外去营救他。
记忆碎片 R 失忆症患者极力寻求通过在其身上纹身线索来解决妻子的谋杀案。
1D Embedding

假设我们为每部电影分配一个标量在[-1,1]之间,该标量用于描述电影是为儿童(负值)还是为成人(正值)。假设我们还为每个用户分配一个标量在[-1,1]之间,描述用户对儿童电影(接近-1)或成人电影(接近+1)的兴趣。对于我们期望用户喜欢的电影,电影嵌入和用户嵌入的产品应该更高(接近1)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rMMySdP5-1580788276379)(DD5A568EE1E4469CB4CFEB349F5FD5B8)]
在下面的图表中,每个复选标记标识特定用户观看的电影。第三和第四个用户的偏好可以很好地解释这个特性——第三个用户喜欢儿童电影,第四个用户喜欢成人电影。然而,第一个和第二个用户的偏好并不能很好地解释这个单一的特性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQVjeR7D-1580788276379)(010313257D1B453C9255F19D2DE1E740)]

2D Embedding

一个功能不足以解释所有用户的偏好。为了克服这个问题,让我们增加第二个特性:每部电影是大片还是艺术片。有了第二个特征,我们现在可以用以下二维嵌入来表示每个电影:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zl9lDhhr-1580788276379)(A237EBA9709F4733A02F3CE30BAB29FC)]
我们再次将用户放在相同的嵌入空间中,以最好地解释反馈矩阵:对于每个(用户,项目)对,我们希望在用户观看电影时,用户嵌入和项嵌入的点积接近1,否则为0。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKJjoORK-1580788276380)(9DFE9090DC0F4BC29CC55D8198DCD567)]

注意:我们在相同的嵌入空间中表示项目和用户。这似乎令人惊讶。毕竟,用户和项是两个不同的实体。但是,您可以将嵌入空间视为对项和用户都通用的抽象表示,在这种抽象表示中,我们可以使用相似度度量来度量相似度或相关性。

在本例中,我们手工设计了嵌入式。在实践中,嵌入可以自动学习,这是协同过滤模型的强大功能。在接下来的两个部分中,我们将讨论不同的模型来学习这些嵌入,以及如何培训它们。

当模型学习嵌入时,这种方法的协作性就很明显了。假设电影的嵌入向量是固定的。然后,该模型可以学习一个嵌入向量,为用户最好地解释他们的偏好。因此,具有相似首选项的用户的嵌入将紧密地结合在一起

Matrix Factorization 矩阵分解

矩阵分解是一种简单的嵌入模型。给定反馈矩阵 A ∈ R m × n A \in R^{m \times n} ARm×n(U, V T V^T VT两个矩阵的乘积),其中m为用户(或查询)的数量,n为项目的数量,模型学习:

  • 一个用户嵌入矩阵 U ∈ R m × d U \in \mathbb{R}^{m \times d} URm×d,其中第i行是用户i的嵌入。
  • 一个项目嵌入矩阵 V ∈ R n × d V \in \mathbb{R}^{n \times d} VRn×d,其中第j行是项目j的嵌入。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytapSIEQ-1580788276381)(7EB5A69AFB2D4CECB39A171BFFC21A27)]
    通过学习嵌入使得 U V T U V^{T} UVT的乘积是反馈矩阵A的一个很好的近似值
    通过对嵌入项的学习,我们得知, U V T U V^{T} UVT的乘积是反馈矩阵A的一个很好的近似。请注意, U V T U V^{T} UVT的条目(i,j)仅仅只是用户i和项目j的嵌入项的点积,这也是你想要使得这个点积的结果接近 A i , j A_{i, j} Ai,j

注意:与学习完整矩阵相比,矩阵分解通常会提供更紧凑的表示。完整矩阵具有条目O(nm),而嵌入矩阵U,V具有条目O((n+m)d),其中嵌入维数通常比和小得多。因此,假设观测值位于一个低维子空间附近,矩阵分解就可以在数据中找到潜在结构。在前面的例子中,n、m和d的值非常低,所以优势可以忽略不计。然而,在现实世界中的推荐系统中,矩阵分解可以比学习整个矩阵要紧凑得多。

Choosing the Objective Function 选择目标函数

一个直观的目标函数是距离的平方。要做到这一点,请最小化所有观测项对的平方和误差:

\min _{U \in \mathbb{R}^{m \times d}, V \in \mathbb{R}^{n \times d}} \sum_{(i, j) \in \text { obs }}\left(A_{i j}-\left\langle U_{i}, V_{j}\right\rangle\right)^{2}

在这个目标函数中,只对观察到的(i, j)对求和,即对反馈矩阵中的非零值求和。然而,仅仅对一个值求和并不是一个好主意——所有值的矩阵损失最小,并且产生的模型不能给出有效的建议,而且泛化能力也很差。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-coyrA8GN-1580788276381)(2BFE20BC05094E7FA24AC5AFCCCD9AF9)]
也许您可以将未观察到的值视为零,然后对矩阵中的所有项求和。这相当于最小化A和它的近似值 U V T U V^{T} UVT的弗罗比尼乌斯距离的平方:

\min _{U \in \mathbb{R}^{m \times d}, V \in \mathbb{R}^{n \times d}}\left\|A-U V^{T}\right\|_{F}^{2}

你可以通过 矩阵的奇异值分解(SVD) 来解决这个二次问题。然而,SVD也不是一个很好的解决方案,因为在实际应用中,矩阵A可能非常稀疏。例如,将YouTube上的所有视频与特定用户看过的所有视频进行比较。解决方案 U V T U V^{T} UVT(对应于模型对输入矩阵的近似)可能接近于零,导致泛化性能差。

相比较而言,加权矩阵分解则将目标分解为以下两个和:

  • 观察到的项目的和。
  • 未观察到的项的总和(作为零对待)。
\min _{U \in \mathbb{R}^{m \times d}, V \in \mathbb{R}^{n \times d}} \sum_{(i, j) \in \mathrm{obs}}\left(A_{i j}-\left\langle U_{i}, V_{j}\right\rangle\right)^{2}+w_{0} \sum_{(i, j) \notin \operatorname{obs}}\left(\left\langle U_{i}, V_{j}\right\rangle\right)^{2}

这里, w 0 w_0 w0是一个超参数,它对这两项进行加权,这样目标就不会被其中一项所左右。调整这个超参数非常重要。

注意:在实际应用中,您还需要仔细权衡观察到的配对。例如,频繁的条目(例如,非常受欢迎的YouTube视频)或频繁的查询(例如,频繁的用户)可能会主导目标函数。您可以通过加权训练示例来纠正这种效果,以考虑项目频率。换句话说,你可以将目标函数替换为:

\sum_{(i, j) \in \text { obs }} w_{i, j}\left(A_{i, j}-\left\langle U_{i}, V_{j}\right\rangle\right)^{2}+w_{0} \sum_{i, j \neq 0 \mathrm{b} \mathrm{s}}\left\langle U_{i}, V_{j}\right\rangle^{2}

其中 w i , j w_{i, j} wi,j为查询i和项目j频率的函数。

Minimizing the Objective Function 最小化目标函数

常用的最小化目标函数的算法有:
[Stochastic gradient descent (SGD)

  • 随机梯度下降法](https://developers.google.com/machine-learning/crash-course/glossary#SGD)是一种最小化损失函数的通用方法。
  • Weighted Alternating Least Squares (WALS) 加权交替最小二乘(WALS) 专门用于这个特定的目标。

每个阶段都可以精确求解(通过线性系统的求解),并且可以分布。由于每一步都保证减少损失,因此保证了该技术的收敛性。

SGD vs. WALS

SGD和WALS各有利弊。查看下面的信息,看看它们是如何比较的:

SGD
  • 非常灵活-可以使用其他损失函数。
  • 可以并行。
  • 慢-不收敛那么快。
  • 难以处理未观察到的条目(需要使用负抽样或重力)。
WALS
  • 仅依赖损失方格。
  • 可以并行。
  • 收敛速度快于SGD。
  • 更容易处理未观察到的条目。

协同过滤的优点和缺点

Advantages

  • 不需要领域知识
    我们不需要领域知识,因为Embeddings是自动学习的。

  • serendipity 易于发现新奇的事物
    该模型可以帮助用户发现新的兴趣。在隔离的情况下,ML系统可能不知道用户对给定的项目感兴趣,但是模型可能仍然会推荐它,因为类似的用户对该项目感兴趣。

  • Great starting point 伟大的起点
    在一定程度上,系统只需要反馈矩阵就可以训练出矩阵分解模型。特别是,系统不需要上下文特性。在实践中,它可以用作多个候选生成器之一。

Disadvantages

  • 不能处理新的项目
    给定(用户、项目)对模型的预测是对应嵌入的点积。因此,如果在训练期间没有看到一个项目,系统就不能为它创建嵌入,也不能用这个项目查询模型。这个问题通常被称为冷启动问题。但是,以下技术可以在一定程度上解决冷启动问题:
    • Projection in WALS 映射在WALS上
      给定一个在训练中没有出现的新项目 i 0 i_0 i0,如果系统与用户有一些交互,那么系统可以很容易地计算这个项目 v 0 v_0 v0的嵌入,而不必重新训练整个模型。系统只需求解以下方程或加权后的版本:
\min _{v_{i_{0}} \in \mathbb{R}^{d}}\left\|A_{i_{0}}-U v_{i_{0}}\right\|

上式对应于WALS中的一次迭代:保持用户嵌入固定,系统求解项目 i 0 i_0 i0的嵌入。对于新用户也可以这样做。

  • Heuristics to generate embeddings of fresh items 生成新项目嵌入的启发法。 如果系统没有交互,系统可以通过平均来自相同类别、来自相同上传者(在YouTube中)的项的嵌入来近似其嵌入。

  • 很难包含查询/项目的侧(副)特性
    副特征是查询或项目ID之外的任何特征。对于电影推荐,侧特征可能包括国家或年龄。包含可用的侧特性可以提高模型的质量。虽然在WALS中包含边特性可能不太容易,但是WALS的泛化使这成为可能。

为了推广WALS,通过定义一个块矩阵 A ˉ \bar{A} Aˉ来对输入矩阵进行特征增广,其中:

  • 块(0,0)是原始反馈矩阵A。
  • 块(0,1)是一个multi-hot编码的用户特性。
  • 块(1,0)是一个多热编码的项目特性。

注意:Block(1,1)通常为空。如果您将矩阵分解应用于 A ˉ \bar{A} Aˉ,那么除了用户和项目嵌入之外,系统还将学习侧面特性的嵌入。

使用深度神经网络提供建议

深度神经网络模型

前一节主要展示了如何使用矩阵分解来学习嵌入。矩阵分解的一些局限性包括:

  • 使用侧特性(即查询ID/项目ID之外的任何特性)的难度。因此,只能使用训练集中出现的用户或项目来查询模型。
  • 相关性的建议。正如你在第一个 Colab中所看到的,受欢迎的项目往往被推荐给每个人,特别是当使用点积作为相似性度量时。最好捕获特定的用户兴趣。

深度神经网络(DNN)模型可以解决矩阵分解的这些局限性。DNNs可以很容易地合并查询特性和项目特性(由于网络输入层的灵活性),这有助于捕获用户的特定兴趣,并提高推荐的相关性。

Softmax DNN for Recommendation

一种可能的DNN模型是softmax,它将该问题视为一个多类预测问题,其中:

  • 输入是用户查询。
  • 输出是一个概率向量,大小等于语料库中的条目数,表示与每个条目交互的概率;例如,点击或观看YouTube视频的概率。
Input

DNN的输入包括:

  • 密集特性(例如,钟表时间和上次查看钟表后的时间) dense features (for example, watch time and time since last watch)
  • 稀疏特性(例如,查看历史和国家) sparse features (for example, watch history and country)

与矩阵分解方法不同,您可以添加年龄或国家等附加功能。我们用x表示输入向量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TqLMHOR0-1580788276383)(B774715FC8314FD1AA071A3CAF508372)]

图1所示:输入层:x

Model Architecture

模型体系结构决定了模型的复杂性和表达性。通过添加隐藏层和非线性激活函数(例如ReLU),模型可以捕获数据中更复杂的关系。然而,增加参数的数量通常也会使模型更难训练和更昂贵的服务。我们将表示最后一个隐含层的输出 ψ ( x ) ∈ R d \psi(x) \in \mathbb{R}^{d} ψ(x)Rd

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STWBMJ8W-1580788276383)(6FEAA93255E44C18A7386CF8AE63FE5A)]

图2 隐藏层的输出: ψ ( x ) \psi(x) ψ(x)

softmax输出:预测概率分布

该模型通过一个softmax层将最后一层 ψ ( x ) \psi(x) ψ(x)的输出映射为一个概率分布 p ^ = h ( ψ ( x ) V T ) \hat{p}=h\left(\psi(x) V^{T}\right) p^=h(ψ(x)VT),其中:

  • h : R n → R n h: \mathbb{R}^{n} \rightarrow \mathbb{R}^{n} h:RnRn是softmax函数,由 h ( y ) i = e e i ∑ j e y j h(y)_{i}=\frac{e^{e_{i}}}{\sum_{j} e^{y_{j}}} h(y)i=jeyjeei得到的

  • V ∈ R n × d V \in \mathbb{R}^{n \times d} VRn×d是softmax层的权值矩阵。

softmax层将得分向量 y ∈ R n y \in \mathbb{R}^{n } yRn(有时称为logits)映射到概率分布。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sECwTrLo-1580788276383)(ACD6A3BFD3B84BFC82BB78CBD9D07D9F)]

图3 预测概率分布: p ^ = h ( ψ ( x ) V T ) \hat{p}=h\left(\psi(x) V^{T}\right) p^=h(ψ(x)VT)

Loss Function

最后,定义一个损失函数来比较以下内容:

  • p ^ \hat{p} p^:softmax层的输出(概率分布)
  • p:ground truth表示用户与之交互的条目(例如,用户单击或观看的YouTube视频)。这可以表示为一个标准化的多热分布(一个概率向量)。

例如,您可以使用交叉熵损失,因为您是在比较两个概率分布。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gk8WLnnV-1580788276384)(FF3D38AB7411438B8ED61AB8670895AB)]

图4 损失函数

Softmax Embeddings

项目j的概率为 p ^ j = exp ⁡ ( ( ψ ( x ) , V j ⟩ ) Z \hat{p}_{j}=\frac{\exp \left(\left(\psi(x), V_{j}\right\rangle\right)}{Z} p^j=Zexp((ψ(x),Vj),其中Z为不依赖j的归一化常数.
换句话说, log ⁡ ( p ^ j ) = ⟨ ψ ( x ) , V j ⟩ − log ⁡ ( Z ) \log \left(\hat{p}_{j}\right)=\left\langle\psi(x), V_{j}\right\rangle-\log (Z) log(p^j)=ψ(x),Vjlog(Z)
,所以一个项目j的日志概率是(直到一个附加常数)二维向量的点积,可以解释为查询和项目嵌入:

  • ψ ( x ) ∈ R D \psi(x) \in \mathbb{R}^{D} ψ(x)RD是最后一个隐藏层的输出。我们称之为查询的嵌入x。
  • V j ∈ R d V_{j} \in \mathbb{R}^{d} VjRd为连接最后一个隐藏层到输出j的权值向量,我们称之为item的嵌入。

注意:由于log是一个递增函数,所以项目j的最高概率 p ^ j \hat{p}_{j} p^j是点积最高的项目 ⟨ ψ ( x ) , V j ⟩ \left\langle\psi(x), V_{j}\right\rangle ψ(x),Vj。因此,点积可以解释为什么在这个嵌入空间中的相似性度量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXGFlXdD-1580788276385)(180217A545944369ABC0E5C5437ED0D2)]
图5 嵌入项j, V j ∈ R d V_{j} \in \mathbb{R}^{d} VjRd

DNN和矩阵分解

在softmax模型和矩阵分解模型中,系统每个项目j学习一个嵌入向量 V j V_{j} Vj。我们称之为项目嵌入矩阵 V j ∈ R d V_{j} \in \mathbb{R}^{d} VjRd
在矩阵分解中,现在是softmax层的权值矩阵。

但是,查询嵌入是不同的。系统不再是学习每个查询i的嵌入 U i U_{i} Ui,而是学习从查询特征x到嵌入的映射 ψ ( x ) ∈ R d \psi(x) \in \mathbb{R}^{d} ψ(x)Rd。因此,您可以将这个DNN模型看作是矩阵分解的泛化,在这个泛化过程中,用一个非线性函数 ψ ( ⋅ ) \psi(\cdot) ψ()替换查询端。

Can You Use Item Features?

你能把同样的想法应用到产品方面吗?也就是说,不是学习每个项目一个嵌入,模型可以学习一个非线性函数,映射项目的特征到一个嵌入?是的。为此,使用一个双塔神经网络,它包括两个神经网络:

  • 一个神经网络将查询特征 x query  x_{\text {query }} xquery 映射到查询嵌入 ψ ( x query  ) ∈ R d \psi\left(x_{\text {query }}\right) \in \mathbb{R}^{d} ψ(xquery )Rd
  • 一个神经网络将项目特征 x item  x_{\text {item }} xitem 映射到项目嵌入 ϕ ( x item  ) ∈ R d \phi\left(x_{\text {item }}\right) \in \mathbb{R}^{d} ϕ(xitem )Rd

模型的输出可以定义为 ⟨ ψ ( x query  ) , ϕ ( x item  ) ⟩ \left\langle\psi\left(x_{\text {query }}\right), \phi\left(x_{\text {item }}\right)\right\rangle ψ(xquery ),ϕ(xitem )的点积。注意,这不再是一个softmax模型。新模型为每对 ( x query  , x item  ) \left(x_{\text {query }}, x_{\text {item }}\right) (xquery ,xitem )查询预测一个值,而不是为每个查询 x query  x_{\text {query }} xquery 预测一个概率向量。

Softmax Training

前一节解释了如何将softmax层合并到用于推荐系统的深度神经网络中。本节详细介绍了该系统的培训数据。

Training Data

softmax训练数据由查询特征x和与用户进行交互的项目的向量组成(表示为概率分布p)。这些在下图中用蓝色标记。模型的变量是不同层中的权重。在下面的图中,它们被标记为橙色。该模型通常使用随机梯度下降的任何变体进行训练。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ramwgx9d-1580788276385)(FCF6E86BDC164F5193AFFE93F70CC997)]

Negative Sampling(下采样?)

由于loss函数比较两个概率向量 p , p ^ ( x ) ∈ R n p, \hat{p}(x) \in \mathbb{R}^{n} p,p^(x)Rn(分别是ground truth和模型的输出),如果语料库n的大小太大,计算损失的梯度(对于单个查询x)的代价可能会非常高.
你可以建立一个系统来计算梯度只对积极的项目(项目是积极的ground truth 向量)。然而,如果系统只训练正对,模型可能遭受折叠,如下所述。

Folding
在下面的图中,假设每种颜色表示不同类别的查询和项目。每个查询(以正方形表示)只与相同颜色的项目(以圆圈表示)进行交互。例如,将YouTube中的每个类别视为一种不同的语言。一个典型的用户将主要与一种给定语言的视频进行交互。模型可能会学习如何将给定颜色的查询/项目嵌入彼此相对(正确地捕获该颜色内的相似性),但是来自不同颜色的嵌入可能会偶然出现在嵌入空间的同一区域。这种现象被称为“折叠”,可能会导致虚假的建议:在查询时,模型可能会错误地预测来自不同组的一个项目的高分。反例是标记为与给定查询“无关”的项。在培训过程中展示模型的负面例子,告诉模型应该将不同组的嵌入彼此推开。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6jvSA4X-1580788276385)(8199EDF756B347B8A8C4884846238A20)]

您可以使用负抽样,而不是使用所有项来计算梯度(这可能太昂贵)或只使用正项(这使模型易于折叠)。更准确地说,你计算一个近似梯度,使用以下项目:

  • 所有积极的项目(出现在目标标签中的项目)
  • 负项目样本(j in 1, … , n)

有多种进行负采样的策略:

  • 可以均匀采样。

  • 你可以给得分高的项目j更高的概率 ψ ( x ) ⋅ V j \psi(x) \cdot V_{j} ψ(x)Vj。直观地说,这些例子对梯度贡献最大);这些例子通常被称为硬否定。

更多的资源:

  • 有关YouTube中使用的技术、架构和模型的更全面介绍,请参阅YouTube推荐的Deep Neural Networks。
  • 参见Xin等人的《折叠:为什么好的模型有时会为折叠的更多细节提供虚假的建议》。
  • 有关负抽样的更多信息,请参见Bengio和Senecal的《自适应重要性抽样加速神经概率语言模型的训练》。

论矩阵分解与Softmax

DNN模型解决了矩阵分解的许多限制,但是训练和查询通常更昂贵。下表总结了两个模型之间的一些重要区别。

v Matrix Factorization (矩阵分解) Softmax DNN
Query features 不容易包括。 可以包括在内。
Cold start 不容易处理的词汇查询或项目。可以使用一些试探法(例如,对于新查询,类似查询的平均嵌入)。 轻松处理新查询。
Folding 通过调整未观察到的WALS中的权重,可以很容易地减少折叠。 容易折叠。需要使用负采样或重力等技术。
Training scalability(训练的可伸缩性) 很容易扩展到非常大的语料库(可能是数亿项或更多),但只有在输入矩阵是稀疏的情况下。 很难扩展到非常大的语料库。可以使用一些技术,如哈希、负抽样等。
Serving scalability(服务的可伸缩性) 很难扩展到非常大的语料库。可以使用一些技术,如哈希、负抽样等。 项目嵌入V是静态的,可以存储。查询嵌入通常需要在查询时计算,这使得模型的服务成本更高。

综上所述:

  • 对于大型语料库,矩阵分解通常是更好的选择。它更容易伸缩,查询成本更低,而且不易折叠。DNN模型能更好地捕捉个性化偏好,但训练难度更大,查询成本更高。
  • DNN模型比矩阵因子分解更适合用于评分,因为DNN模型可以使用更多的特征来更好地捕获相关性。此外,DNN模型折叠通常是可以接受的,因为您主要关心的是对假定相关的预先筛选的候选集进行排序。

检索、评分、重排名

Retrieval 检索

假设你有一个嵌入模型。给定一个用户,您如何决定推荐哪些项目?
在服务时间,给定一个查询,你开始做以下之一:

  • 对于矩阵分解模型,查询(或用户)嵌入是静态已知的,系统只需从用户嵌入矩阵中查找即可。
  • 对于DNN模型,系统通过在特征向量x上运行网络来计算查询的嵌入 ψ ( x ) \psi(x) ψ(x)

有了查询嵌入q之后,在嵌入空间中搜索与查询嵌入q相近的项目嵌入 V j V_{j} Vj。这是一个近邻问题。例如,您可以根据相似度评分 s ( q , V j ) s\left(q, V_{j}\right) s(q,Vj)返回前k个条目。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wr3Jskhf-1580788276386)(8B1B264763C04F7CBE001C81FD0401AD)]

您可以在相关项目推荐中使用类似的方法。例如,当用户在观看YouTube视频时,系统可以首先查找该项目的嵌入,然后在嵌入空间中查找与之相似的其他项目的嵌入。

大规模的检索

为了在嵌入空间中计算的最近邻居,系统可以对每个潜在的候选对象进行详尽的评分。详尽的评分对于非常大的语料库来说可能是昂贵的,但是您可以使用以下策略之一来提高效率:

  • 如果查询嵌入是静态的,那么系统可以离线执行详尽的评分,预先计算并存储每个查询的最优候选项列表。这是相关项目推荐的常见做法。
  • 使用最接近的邻居。

Scoring 评分

生成候选项后,另一个模型对生成的候选项进行评分和排序,以选择要显示的项集。推荐系统可能有多个使用不同源的候选生成器,如:

Examples

  • 矩阵分解模型中的相关项。
  • 用于解释个性化的用户特征。
  • “本地”与“远程”项目;也就是说,要考虑地理信息。
  • 流行的或流行的项目。
  • 一个社交网络;也就是说,朋友们喜欢或推荐的物品。

该系统将这些不同的资源组合成一个共同的候选池,然后由单个模型对候选池进行评分,并根据该评分进行排序。例如,系统可以训练一个模型来预测用户在YouTube上观看视频的概率,具体如下:

  • 查询特征(例如,用户查看历史、语言、国家、时间)
  • 视频特征(例如,标题、标签、视频嵌入)

然后系统根据模型的预测对候选视频进行排序。

为什么不让候选生成器得分呢?

由于候选生成器会计算一个分数(例如嵌入空间中的相似性度量),所以您可能也想使用它们来进行排序。但是,你应该避免这种做法,原因如下:

  • 一些系统依赖于多个候选生成器。这些不同生成器的得分可能不具有可比性。
  • 有了更少的候选对象,系统就可以使用更多的特性和更复杂的模型来更好地捕获上下文。

为评分选择一个目标函数

您可能还记得,在介绍ML问题框架时,ML就像一个淘气的精灵:很高兴了解您提供的目标,但您必须小心您的愿望。这种有害的特性也适用于推荐系统。评分功能的选择会极大地影响项目的排名,并最终影响推荐的质量。

For Example:

  • 最大限度地提高点击率 Maximize Click Rate
    如果评分功能可以优化点击,系统可能会推荐点击诱饵视频。此评分函数生成单击,但不能提供良好的用户体验。用户的兴趣可能很快就会消退。
  • Maximize Watch Time 最大化观看时间
    如果评分功能针对观看时间进行了优化,系统可能会推荐非常长的视频,这可能会导致糟糕的用户体验。注意,多个短视频的观看和一个长视频的观看一样好。
  • 加多样性并最大化观看时间
    推荐较短频,但更有可能让用户参与的视频。

Positional Bias in Scoring 推荐项目所在屏幕的位置对打分的影响

显示在屏幕下方的项目比显示在屏幕上方的项目更不容易被点击。然而,当给视频打分时,系统通常不知道屏幕上那个视频的链接最终会出现在哪里。用所有可能的位置查询模型太昂贵了。即使查询多个位置是可行的,系统仍然可能无法在多个排名分数中找到一致的排名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0P1e41T-1580788276387)(AFF6F5AB3C5D4712B7640D32559B8900)]

Solutions

  • 创建位置无关的排名。
  • 将所有的候选人按照他们在屏幕上的最高位置排序。

Re-ranking

在推荐系统的最后阶段,系统可以对候选项重新排序,以考虑附加的标准或约束。一种重新排序的方法是使用过滤器来删除一些候选项

例子:你可以通过以下做法实现视频推荐的重新排名

  • 训练一个单独的模型来检测视频是否是点击诱饵。
  • 在候选列表上运行这个模型。
  • 删除模型归类为“点击诱饵”的视频。

另一种重新排序的方法是手动转换排名器返回的分数。

例如:系统通过修改分数来对视频进行重新排序,其函数为:

  • video age 视频时代(可能是为了推广更新鲜的内容)
  • 视频长度

本节简要讨论新鲜度、多样性和公平性。这些因素可以帮助改善你的推荐系统。其中一些因素常常需要修改流程的不同阶段。每个部分都提供了您可以单独或集体应用的解决方案。

Freshness

大多数推荐系统的目标是包含最新的使用信息,比如当前用户历史记录和最新的项目。保持模型新鲜有助于模型提出好的建议。

Solutions
  • 尽可能多地重新运行训练,学习最新的训练数据。我们建议进行warm-starting训练,这样模型就不必从头开始重新学习了。Warm-starting可以显著减少训练时间。例如,在矩阵分解中,对模型的前一个实例中出现的项目进行warm-start the embeddings。
  • 创建一个“平均”用户来代表矩阵分解模型中的新用户。您不需要为每个用户提供相同的嵌入—您可以根据用户特性创建用户集群。
  • 使用DNN,如softmax模型或双塔模型。由于该模型采用特征向量作为输入,因此它可以在训练期间没有看到的查询或项目上运行
  • 添加文档年龄作为一个特征。例如,YouTube可以添加视频的年龄或最后一次观看的时间作为一个特征。

Diversity

如果系统总是推荐与查询嵌入“最接近”的项,那么候选项往往非常相似。这种多样性的缺乏会导致糟糕或无聊的用户体验。例如,如果YouTube只是推荐与用户当前正在观看的视频非常相似的视频,比如nothing but owl视频(如图所示),用户可能会很快失去兴趣。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTjBdlEX-1580788276387)(719D5F20594042BF965746CF10FAEF23)]

Solutions
  • 使用不同的源训练多个候选生成器。
  • 使用不同的目标函数训练多个等级。
  • 根据类型或其他元数据对项目重新排序,以确保多样性。

Fairness

您的模型应该公平地对待所有用户。因此,确保你的模型没有从训练数据中学习无意识的偏见。

Solutions
  • 在设计和开发中包含不同的观点。
  • 在综合数据集上训练ML模型。当您的数据过于稀疏时(例如,当某些类别没有得到充分表示时)添加辅助数据。
  • 跟踪每个人口统计的指标(例如,准确性和绝对误差),以观察偏差。
  • 为服务不足的群体建立单独的模型。

课程总结

你现在应该对如何:

  • 描述推荐系统的用途。
  • 了解推荐系统的组成部分,包括候选人生成、评分和重新排序。
  • 使用嵌入来表示项目和查询。
  • 对候选生成中使用的常用技术有更深入的技术理解。
  • 使用TensorFlow开发两个用于推荐的模型:矩阵分解和softmax。

你可能感兴趣的:(推荐系统)