原文链接:文档:推荐系统概论
描述推荐系统的目的。
了解推荐系统的组成部分,包括候选人生成,评分和重新排名。
使用嵌入(Embedding)来表示项目和查询。
对候选人生成中使用的通用技术有更深入的技术了解。
使用TensorFlow开发用于推荐的两个模型:矩阵分解和softmax。
在进入之前,您应该了解一些术语:
系统推荐的实体。
对于Google Play商店,这些项目是要安装的应用程序。 对于YouTube,这些项目是视频。
系统用来提出建议的信息。 查询可以是以下各项的组合:
从离散集(在本例中是查询集或要推荐的项集)到称为嵌入空间的向量空间的映射。许多推荐系统依赖于学习查询和项的适当嵌入Embedding表示。
推荐系统的一个常见体系结构由以下组件组成:
在此第一阶段,系统从潜在的庞大语料库开始,并生成较小的候选人子集。例如,YouTube中的候选生成器将数十亿个视频减少到数百或数千。考虑到语料库的庞大规模,该模型需要快速评估查询。给定的模型可以提供多个候选生成器,每个候选生成器都指定候选的不同子集。
接下来,另一个模型对候选进行评分和排名,以选择要显示给用户的项目集(约10个)。由于此模型评估的是商品的相对较小子集,因此系统可以使用依赖于其他查询的更精确的模型。
最后,系统必须考虑最终排名的其他限制。例如,系统删除用户明确不喜欢的项目或提高新鲜内容的得分。重新排名还可以帮助确保多样性,新鲜度和公平性。我们将在课堂上讨论每个阶段,并提供来自不同推荐系统(例如YouTube)的示例。
候选人生成是推荐的第一阶段。给定一个查询,系统生成一组相关的候选项。下表显示了两种常见的候选生成方法:
类型 | 定义 | 举例 |
---|---|---|
content-based filtering 基于内容的过滤(推荐) | 使用项目之间的相似性来推荐用户喜欢的相似项。 | 如果用户A观看了两个萌猫视频,那么系统可以向该用户推荐萌猫视频。 |
collaborative filtering 协同过滤 | 同时使用查询和项目之间的相似性来提供建议。 | 如果用户A与用户B相似,并且用户B喜欢视频1,那么系统可以向用户A推荐视频1(即使用户A没有看过任何类似于视频1的视频)。 |
基于内容和协作过滤都将每个项目和每个查询(或上下文)映射到公共嵌入空间 E = R d E=\mathbb{R}^{d} E=Rd中的嵌入向量。通常,嵌入低维空间(也就是说嵌入空间的维度d远小于语料库中的向量维度(shape)),并捕捉一些项目或者查询集中潜在的结构。类似的项目,比如YouTube视频通常是相同的用户的关注,在嵌入空间中。“亲密度”的概念是通过相似性度量来定义的。
相似度度量是一个函数 s : E × E → R s: E \times E \rightarrow \mathbb{R} s:E×E→R,它接受一对嵌入并返回一个标量来度量它们的相似度。嵌入式可用于候选生成如下:给定一个查询嵌入 q ∈ E q \in E q∈E,系统查找接近的项目嵌入 x ∈ E x \in E x∈E,即高度相似的嵌入 s ( q , x ) s(q, x) s(q,x)。
为了确定相似度,大多数推荐系统依赖于以下一种或多种方法:
这个就是两个向量夹角的余弦, s ( q , x ) = cos ( q , x ) s(q, x)=\cos (q, x) s(q,x)=cos(q,x)
两个向量的点积是 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)=∥x∥∥q∥cos(q,x)。因此,如果嵌入是标准化的,那么点积和余弦重合。
这是欧氏空间中通常的距离 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)=∥q−x∥=[∑i=1d(qi−xi)2]21。距离越小,相似度越高。注意,当嵌入被标准化时,欧氏距离的平方与点积(和余弦)一致,直到一个常数,因为在这种情况下 1 2 ∥ q − x ∥ 2 = 1 − ⟨ q , x ⟩ \frac{1}{2}\|q-x\|^{2}=1-\langle q, x\rangle 21∥q−x∥2=1−⟨q,x⟩。
考虑下图中的例子。黑色向量演示了查询嵌入。其他三个嵌入向量(项目A、项目B、项目C)表示候选项目。根据所使用的相似度度量,项目的排序可以是不同的。
使用图像,尝试使用所有三个相似度度量来确定项目排名:余弦、点积和欧氏距离。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JeWlSztL-1580788276376)(5A9E847121614F72BE916F384428A64E)]
与余弦函数相比,点积相似度对嵌入范数比较敏感。
也就是说,嵌入的规范性越高,相似度越高(对于锐角的项目),就越有可能推荐该项目。这可能会影响以下推荐:
训练集中经常出现的项目(例如,流行的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(点积就是两个向量对应元素的乘积),一个特征同时出现在x
和y
中,并为总和贡献一个1。换句话说, ⟨ x , y ⟩ \langle x, y\rangle ⟨x,y⟩是同时在两个向量中活动的特征的数量。高点积表示更多的共同特征,因此相似度更高。
为了解决基于内容的过滤的一些限制,协同过滤同时使用用户和项目之间的相似性来提供建议。这允许偶然的建议;也就是说,协同过滤模型可以根据相似用户b的兴趣向用户A推荐一个项目。此外,嵌入可以自动学习,不需要依赖特性的手工工程。
考虑一个电影推荐系统,其中的训练数据包含一个反馈矩阵,其中:
为了简化,我们将假设反馈矩阵是二进制的;也就是说,值1表示对电影感兴趣。
当用户访问主页时,系统应该基于以下两点推荐电影:
为了说明,让我们手动设置一些特征来描述电影如下表:
电影 | 评分 | 描述 |
---|---|---|
蝙蝠侠:黑暗骑士崛起 | PG-13 | 在这部以DC漫画宇宙为背景的《黑暗骑士》续集中,蝙蝠侠努力将哥谭市从核毁灭中拯救出来。 |
哈利波特与魔法石 | PG | 一个孤儿发现自己是一名巫师,并进入霍格沃茨魔法学校学习,在那里他与邪恶的伏地魔展开了第一次战斗。 |
怪物史莱克 | PG | 一个可爱的食人魔和他的驴伙伴出发去营救菲奥娜公主,她在她的城堡里被一条龙报复。 |
佳丽村三姊妹 | PG-13 | 当职业自行车冠军在环法自行车赛期间被绑架时,他的祖母和超重的狗狗在三位年长的爵士歌手的帮助下到海外去营救他。 |
记忆碎片 | R | 失忆症患者极力寻求通过在其身上纹身线索来解决妻子的谋杀案。 |
假设我们为每部电影分配一个标量在[-1,1]之间,该标量用于描述电影是为儿童(负值)还是为成人(正值)。假设我们还为每个用户分配一个标量在[-1,1]之间,描述用户对儿童电影(接近-1)或成人电影(接近+1)的兴趣。对于我们期望用户喜欢的电影,电影嵌入和用户嵌入的产品应该更高(接近1)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rMMySdP5-1580788276379)(DD5A568EE1E4469CB4CFEB349F5FD5B8)]
在下面的图表中,每个复选标记标识特定用户观看的电影。第三和第四个用户的偏好可以很好地解释这个特性——第三个用户喜欢儿童电影,第四个用户喜欢成人电影。然而,第一个和第二个用户的偏好并不能很好地解释这个单一的特性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQVjeR7D-1580788276379)(010313257D1B453C9255F19D2DE1E740)]
一个功能不足以解释所有用户的偏好。为了克服这个问题,让我们增加第二个特性:每部电影是大片还是艺术片。有了第二个特征,我们现在可以用以下二维嵌入来表示每个电影:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zl9lDhhr-1580788276379)(A237EBA9709F4733A02F3CE30BAB29FC)]
我们再次将用户放在相同的嵌入空间中,以最好地解释反馈矩阵:对于每个(用户,项目)对,我们希望在用户观看电影时,用户嵌入和项嵌入的点积接近1,否则为0。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKJjoORK-1580788276380)(9DFE9090DC0F4BC29CC55D8198DCD567)]
注意:我们在相同的嵌入空间中表示项目和用户。这似乎令人惊讶。毕竟,用户和项是两个不同的实体。但是,您可以将嵌入空间视为对项和用户都通用的抽象表示,在这种抽象表示中,我们可以使用相似度度量来度量相似度或相关性。
在本例中,我们手工设计了嵌入式。在实践中,嵌入可以自动学习,这是协同过滤模型的强大功能。在接下来的两个部分中,我们将讨论不同的模型来学习这些嵌入,以及如何培训它们。
当模型学习嵌入时,这种方法的协作性就很明显了。假设电影的嵌入向量是固定的。然后,该模型可以学习一个嵌入向量,为用户最好地解释他们的偏好。因此,具有相似首选项的用户的嵌入将紧密地结合在一起
矩阵分解是一种简单的嵌入模型。给定反馈矩阵 A ∈ R m × n A \in R^{m \times n} A∈Rm×n(U, V T V^T VT两个矩阵的乘积),其中m
为用户(或查询)的数量,n
为项目的数量,模型学习:
i
行是用户i
的嵌入。j
行是项目j
的嵌入。注意:与学习完整矩阵相比,矩阵分解通常会提供更紧凑的表示。完整矩阵具有条目
O(nm)
,而嵌入矩阵U,V
具有条目O((n+m)d)
,其中嵌入维数通常比和小得多。因此,假设观测值位于一个低维子空间附近,矩阵分解就可以在数据中找到潜在结构。在前面的例子中,n、m和d的值非常低,所以优势可以忽略不计。然而,在现实世界中的推荐系统中,矩阵分解可以比学习整个矩阵要紧凑得多。
一个直观的目标函数是距离的平方。要做到这一点,请最小化所有观测项对的平方和误差:
\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
频率的函数。
常用的最小化目标函数的算法有:
[Stochastic gradient descent (SGD)
每个阶段都可以精确求解(通过线性系统的求解),并且可以分布。由于每一步都保证减少损失,因此保证了该技术的收敛性。
SGD和WALS各有利弊。查看下面的信息,看看它们是如何比较的:
不需要领域知识
我们不需要领域知识,因为Embeddings是自动学习的。
serendipity 易于发现新奇的事物
该模型可以帮助用户发现新的兴趣。在隔离的情况下,ML系统可能不知道用户对给定的项目感兴趣,但是模型可能仍然会推荐它,因为类似的用户对该项目感兴趣。
Great starting point 伟大的起点
在一定程度上,系统只需要反馈矩阵就可以训练出矩阵分解模型。特别是,系统不需要上下文特性。在实践中,它可以用作多个候选生成器之一。
\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ˉ来对输入矩阵进行特征增广,其中:
注意:Block(1,1)通常为空。如果您将矩阵分解应用于 A ˉ \bar{A} Aˉ,那么除了用户和项目嵌入之外,系统还将学习侧面特性的嵌入。
前一节主要展示了如何使用矩阵分解来学习嵌入。矩阵分解的一些局限性包括:
深度神经网络(DNN)模型可以解决矩阵分解的这些局限性。DNNs可以很容易地合并查询特性和项目特性(由于网络输入层的灵活性),这有助于捕获用户的特定兴趣,并提高推荐的相关性。
一种可能的DNN模型是softmax,它将该问题视为一个多类预测问题,其中:
DNN的输入包括:
与矩阵分解方法不同,您可以添加年龄或国家等附加功能。我们用x表示输入向量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TqLMHOR0-1580788276383)(B774715FC8314FD1AA071A3CAF508372)]
图1所示:输入层:x
模型体系结构决定了模型的复杂性和表达性。通过添加隐藏层和非线性激活函数(例如ReLU),模型可以捕获数据中更复杂的关系。然而,增加参数的数量通常也会使模型更难训练和更昂贵的服务。我们将表示最后一个隐含层的输出 ψ ( x ) ∈ R d \psi(x) \in \mathbb{R}^{d} ψ(x)∈Rd。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STWBMJ8W-1580788276383)(6FEAA93255E44C18A7386CF8AE63FE5A)]
图2 隐藏层的输出: ψ ( x ) \psi(x) ψ(x)
该模型通过一个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:Rn→Rn是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} V∈Rn×d是softmax层的权值矩阵。
softmax层将得分向量 y ∈ R n y \in \mathbb{R}^{n } y∈Rn(有时称为logits)映射到概率分布。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sECwTrLo-1580788276383)(ACD6A3BFD3B84BFC82BB78CBD9D07D9F)]
图3 预测概率分布: p ^ = h ( ψ ( x ) V T ) \hat{p}=h\left(\psi(x) V^{T}\right) p^=h(ψ(x)VT)
最后,定义一个损失函数来比较以下内容:
p
:ground truth表示用户与之交互的条目(例如,用户单击或观看的YouTube视频)。这可以表示为一个标准化的多热分布(一个概率向量)。例如,您可以使用交叉熵损失,因为您是在比较两个概率分布。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gk8WLnnV-1580788276384)(FF3D38AB7411438B8ED61AB8670895AB)]
图4 损失函数
项目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),Vj⟩−log(Z)
,所以一个项目j的日志概率是(直到一个附加常数)二维向量的点积,可以解释为查询和项目嵌入:
注意:由于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} Vj∈Rd
在softmax模型和矩阵分解模型中,系统每个项目j学习一个嵌入向量 V j V_{j} Vj。我们称之为项目嵌入矩阵 V j ∈ R d V_{j} \in \mathbb{R}^{d} Vj∈Rd
在矩阵分解中,现在是softmax层的权值矩阵。
但是,查询嵌入是不同的。系统不再是学习每个查询i的嵌入 U i U_{i} Ui,而是学习从查询特征x到嵌入的映射 ψ ( x ) ∈ R d \psi(x) \in \mathbb{R}^{d} ψ(x)∈Rd。因此,您可以将这个DNN模型看作是矩阵分解的泛化,在这个泛化过程中,用一个非线性函数 ψ ( ⋅ ) \psi(\cdot) ψ(⋅)替换查询端。
你能把同样的想法应用到产品方面吗?也就是说,不是学习每个项目一个嵌入,模型可以学习一个非线性函数,映射项目的特征到一个嵌入?是的。为此,使用一个双塔神经网络,它包括两个神经网络:
模型的输出可以定义为 ⟨ ψ ( 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层合并到用于推荐系统的深度神经网络中。本节详细介绍了该系统的培训数据。
softmax训练数据由查询特征x
和与用户进行交互的项目的向量组成(表示为概率分布p
)。这些在下图中用蓝色标记。模型的变量是不同层中的权重。在下面的图中,它们被标记为橙色。该模型通常使用随机梯度下降的任何变体进行训练。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ramwgx9d-1580788276385)(FCF6E86BDC164F5193AFFE93F70CC997)]
由于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更高的概率 ψ ( x ) ⋅ V j \psi(x) \cdot V_{j} ψ(x)⋅Vj。直观地说,这些例子对梯度贡献最大);这些例子通常被称为硬否定。
更多的资源:
- 有关YouTube中使用的技术、架构和模型的更全面介绍,请参阅YouTube推荐的Deep Neural Networks。
- 参见Xin等人的《折叠:为什么好的模型有时会为折叠的更多细节提供虚假的建议》。
- 有关负抽样的更多信息,请参见Bengio和Senecal的《自适应重要性抽样加速神经概率语言模型的训练》。
DNN模型解决了矩阵分解的许多限制,但是训练和查询通常更昂贵。下表总结了两个模型之间的一些重要区别。
v | Matrix Factorization (矩阵分解) | Softmax DNN |
---|---|---|
Query features | 不容易包括。 | 可以包括在内。 |
Cold start | 不容易处理的词汇查询或项目。可以使用一些试探法(例如,对于新查询,类似查询的平均嵌入)。 | 轻松处理新查询。 |
Folding | 通过调整未观察到的WALS中的权重,可以很容易地减少折叠。 | 容易折叠。需要使用负采样或重力等技术。 |
Training scalability(训练的可伸缩性) | 很容易扩展到非常大的语料库(可能是数亿项或更多),但只有在输入矩阵是稀疏的情况下。 | 很难扩展到非常大的语料库。可以使用一些技术,如哈希、负抽样等。 |
Serving scalability(服务的可伸缩性) | 很难扩展到非常大的语料库。可以使用一些技术,如哈希、负抽样等。 | 项目嵌入V是静态的,可以存储。查询嵌入通常需要在查询时计算,这使得模型的服务成本更高。 |
综上所述:
假设你有一个嵌入模型。给定一个用户,您如何决定推荐哪些项目?
在服务时间,给定一个查询,你开始做以下之一:
有了查询嵌入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视频时,系统可以首先查找该项目的嵌入,然后在嵌入空间中查找与之相似的其他项目的嵌入。
为了在嵌入空间中计算的最近邻居,系统可以对每个潜在的候选对象进行详尽的评分。详尽的评分对于非常大的语料库来说可能是昂贵的,但是您可以使用以下策略之一来提高效率:
生成候选项后,另一个模型对生成的候选项进行评分和排序,以选择要显示的项集。推荐系统可能有多个使用不同源的候选生成器,如:
Examples
- 矩阵分解模型中的相关项。
- 用于解释个性化的用户特征。
- “本地”与“远程”项目;也就是说,要考虑地理信息。
- 流行的或流行的项目。
- 一个社交网络;也就是说,朋友们喜欢或推荐的物品。
该系统将这些不同的资源组合成一个共同的候选池,然后由单个模型对候选池进行评分,并根据该评分进行排序。例如,系统可以训练一个模型来预测用户在YouTube上观看视频的概率,具体如下:
然后系统根据模型的预测对候选视频进行排序。
由于候选生成器会计算一个分数(例如嵌入空间中的相似性度量),所以您可能也想使用它们来进行排序。但是,你应该避免这种做法,原因如下:
您可能还记得,在介绍ML问题框架时,ML就像一个淘气的精灵:很高兴了解您提供的目标,但您必须小心您的愿望。这种有害的特性也适用于推荐系统。评分功能的选择会极大地影响项目的排名,并最终影响推荐的质量。
For Example:
显示在屏幕下方的项目比显示在屏幕上方的项目更不容易被点击。然而,当给视频打分时,系统通常不知道屏幕上那个视频的链接最终会出现在哪里。用所有可能的位置查询模型太昂贵了。即使查询多个位置是可行的,系统仍然可能无法在多个排名分数中找到一致的排名。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0P1e41T-1580788276387)(AFF6F5AB3C5D4712B7640D32559B8900)]
在推荐系统的最后阶段,系统可以对候选项重新排序,以考虑附加的标准或约束。一种重新排序的方法是使用过滤器来删除一些候选项
例子:你可以通过以下做法实现视频推荐的重新排名
- 训练一个单独的模型来检测视频是否是点击诱饵。
- 在候选列表上运行这个模型。
- 删除模型归类为“点击诱饵”的视频。
另一种重新排序的方法是手动转换排名器返回的分数。
例如:系统通过修改分数来对视频进行重新排序,其函数为:
- video age 视频时代(可能是为了推广更新鲜的内容)
- 视频长度
本节简要讨论新鲜度、多样性和公平性。这些因素可以帮助改善你的推荐系统。其中一些因素常常需要修改流程的不同阶段。每个部分都提供了您可以单独或集体应用的解决方案。
大多数推荐系统的目标是包含最新的使用信息,比如当前用户历史记录和最新的项目。保持模型新鲜有助于模型提出好的建议。
如果系统总是推荐与查询嵌入“最接近”的项,那么候选项往往非常相似。这种多样性的缺乏会导致糟糕或无聊的用户体验。例如,如果YouTube只是推荐与用户当前正在观看的视频非常相似的视频,比如nothing but owl视频(如图所示),用户可能会很快失去兴趣。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTjBdlEX-1580788276387)(719D5F20594042BF965746CF10FAEF23)]
您的模型应该公平地对待所有用户。因此,确保你的模型没有从训练数据中学习无意识的偏见。
你现在应该对如何: