推荐系统框架
基本模式
-
候选集生成
在第一阶段,系统从潜在的庞大语料库开始,并生成更小的候选集。 例如,YouTube中的候选生成器将数十亿个视频减少到数百或数千。 考虑到语料库的庞大规模,该模型需要快速评估查询。 给定模型可以提供多个候选生成器,每个候选生成器都指定候选的不同子集 -
评分
接下来,另一个模型对候选者进行评分和排名,以便选择要显示给用户的项目集(大约10个)。 由于此模型评估的是项目的相对较小子集,因此系统可以依靠其他查询来使用更精确的模型。 -
重排序
最后,系统必须考虑最终排名的其他限制条件。 例如,系统删除用户明确不喜欢的项目或提高新鲜内容的得分。 重新排序还可以帮助确保多样性,新鲜度和公平性。
先验知识
item 物品
物品/电影/音乐/…
Query 查询(用户和他的额外信息)
系统用来提出推荐的信息。 查询可以是以下各项的组合:
-
用户信息
-
用户的ID
-
用户先前与之互动的项目
-
-
附加语境
-
一天中的时间
-
用户的设备
-
候选集生成
两种常见的候选集生成算法
- 基于物品的协同过滤:物品(电影)之间的相似度
- 基于用户的协同过滤:用户之间的相似度
Embedding词嵌入方法
基于内容的过滤和协作过滤都将每个项目和每个查询(查询就是指用户)映射到公共嵌入空间<math><semantics><mrow><mi>E</mi><mo>∈</mo><msup><mi>R</mi><mi>d</mi></msup></mrow><annotation encoding="application/x-tex">E \in R^d</annotation></semantics></math>E∈Rd中的嵌入向量。 通常,嵌入空间是低维的(即d比语料库的大小小得多),并且捕获项目或查询集的某些潜在结构。 相似项目(例如通常由同一用户观看的YouTube视频)最终在嵌入空间中并排在一起。 “相似性”的概念由相似性度量定义。
相似度度量
相似性度量是函数<math><semantics><mrow><mi>s</mi><mo>:</mo><mi>E</mi><mo>×</mo><mi>E</mi><mo>→</mo><mrow><mi mathvariant="script">R</mi></mrow></mrow><annotation encoding="application/x-tex">s:E\times E \rightarrow\mathcal{R}</annotation></semantics></math>s:E×E→R ,它采用一对嵌入并返回一个标量来度量它们的相似性。 嵌入可用于候选生成,如下所示:给定查询嵌入<math><semantics><mrow><mi>q</mi><mo>∈</mo><mi>E</mi></mrow><annotation encoding="application/x-tex">q \in E</annotation></semantics></math>q∈E,系统将查找与q接近的项嵌入<math><semantics><mrow><mi>x</mi><mo>∈</mo><mi>E</mi></mrow><annotation encoding="application/x-tex">x \in E</annotation></semantics></math>x∈E,即具有高相似度<math><semantics><mrow><mi>s</mi><mo>(</mo><mi>q</mi><mo separator="true">,</mo><mi>x</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">s(q,x)</annotation></semantics></math>s(q,x)的嵌入。
为了确定相似程度,大多数推荐系统都依赖以下一项或多项:
-
余弦
-
点积
-
欧氏距离
余弦
<math><semantics><mrow><mi>s</mi><mo>(</mo><mi>q</mi><mo separator="true">,</mo><mi>x</mi><mo>)</mo><mo>=</mo><mi>c</mi><mi>o</mi><mi>s</mi><mo>(</mo><mi>q</mi><mo separator="true">,</mo><mi>x</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">s(q,x) = cos(q,x) </annotation></semantics></math>s(q,x)=cos(q,x)
点积
两个向量的点积为:
<math><semantics><mrow><mi>s</mi><mo>(</mo><mi>q</mi><mo separator="true">,</mo><mi>x</mi><mo>)</mo><mo>=</mo><mo><</mo><mi>q</mi><mo separator="true">,</mo><mi>x</mi><mo>></mo><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>d</mi></msubsup><mrow><msub><mi>q</mi><mi>i</mi></msub></mrow><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow></mrow><annotation encoding="application/x-tex">s(q,x) = <q,x> = \sum_{i=1}^d{q_i}{x_i} </annotation></semantics></math>s(q,x)=<q,x>=i=1∑dqixi
它也由
<math><semantics><mrow><mi>s</mi><mo>(</mo><mi>q</mi><mo separator="true">,</mo><mi>x</mi><mo>)</mo><mo>=</mo><mrow><mo fence="true">∥</mo><mi>x</mi><mo fence="true">∥</mo></mrow><mrow><mo fence="true">∥</mo><mi>q</mi><mo fence="true">∥</mo></mrow><mi>c</mi><mi>o</mi><mi>s</mi><mo>(</mo><mi>q</mi><mo separator="true">,</mo><mi>x</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">s(q,x) = \left \| x \right\| \left\| q \right\| cos(q,x) </annotation></semantics></math>s(q,x)=∥x∥∥q∥cos(q,x)
给出(角度的余弦乘以范数的乘积)。 因此,如果将嵌入标准化,则点积和余弦会重合。
欧式距离
比较相似度
考虑右图中的示例。 黑色矢量说明了查询嵌入。 其他三个嵌入向量(项A,项B,项C)表示候选项。 根据所使用的相似性度量,项目的排名可能会有所不同。
使用图像,尝试使用所有三种相似性度量来确定物品等级:余弦,点积和欧几里得距离。
选择哪种相似性度量?
与余弦相比,点积相似度对嵌入的规范敏感。 即,嵌入的范数越大,相似度越高(对于具有锐角的项目),并且推荐该项目的可能性就越大。 这可能会影响建议,如下所示:
-
训练集中经常出现的项目(例如,流行的YouTube视频)往往具有较大的规范嵌入。 如果需要捕获流行度信息,那么应该更喜欢点积。 但是,如果不小心,受欢迎的商品最终可能会主导这些建议。 在实践中,可以使用相似性度量的其他变体,这些变体较少强调项目的规范。
-
在训练期间,很少出现的项目可能不会经常更新。 因此,如果使用大范数对它们进行初始化,则系统可能会建议稀有项目,而不是更相关的项目。 为避免此问题,请注意嵌入初始化,并使用适当的正则化。