登录
原创

谷歌推荐系统框架 (三) —— 深度模型推荐

发布于 2020-10-25 阅读 90
  • 人工智能
原创

深度模型推荐

矩阵分解的一些限制包括:

  • 使用辅助功能(即查询ID /项目ID以外的任何功能)的难度。 结果,只能使用训练集中存在的用户或项目来查询模型。

  • 推荐的相关性。 正如您在第一个Colab中所看到的那样,倾向于向所有人推荐热门商品,尤其是在使用点积作为相似性度量时。 最好捕获特定的用户兴趣。

深度神经网络(DNN)模型可以解决矩阵分解的这些限制。 DNN可以轻松地合并查询功能和项目功能(由于网络输入层的灵活性),这可以帮助捕获用户的特定兴趣并提高建议的相关性。

Softmax DNN推荐

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

  • 输入:用户查询。

  • 输出: 大小等于语料库中项目数的概率向量,表示与每个项目进行交互的概率; 例如,点击或观看YouTube视频的可能性。

输入

DNN的输入可以包括:

  • 密集特征(例如,观看时间和自上次观看以来的时间)

  • 稀疏特征(例如观看历史和国家/地区)

与矩阵分解方法不同,您可以添加年龄或国家/地区等附加特征。 我们将用x表示输入向量。

模型架构

模型体系结构决定了模型的复杂性和可表达性。 通过添加隐藏层和非线性激活函数(例如ReLU),模型可以捕获数据中更复杂的关系。 但是,增加参数的数量通常也会使模型更难训练且服务成本更高。 我们将用ψ(x)∈R^d表示最后一个隐藏层的输出。

Image highlighting the hidden layers in a softmax deep neural network

利用Softmax函数预测

该模型通过softmax层将最后一层ψ(x)的输出映射到概率分布<math><semantics><mrow><mover accent="true"><mi>p</mi><mo>^</mo></mover><mo>=</mo><mi>h</mi><mo>(</mo><mi mathvariant="normal">Ψ</mi><mo>(</mo><mi>x</mi><mo>)</mo><msup><mi>V</mi><mi>T</mi></msup><mo>)</mo></mrow><annotation encoding="application/x-tex">\hat p = h(\Psi(x)V^T)</annotation></semantics></math>p^=h(Ψ(x)VT) ,其中:

  • <math><semantics><mrow><mi>h</mi><mo>:</mo><msup><mi>R</mi><mi>n</mi></msup><mo>→</mo><msup><mi>R</mi><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">h:R^n\rightarrow R^n</annotation></semantics></math>h:RnRn 是softmax函数:
  • <math><semantics><mrow><mi>V</mi><mo>∈</mo><msup><mi>R</mi><mrow><mi>n</mi><mo>×</mo><mi>d</mi></mrow></msup></mrow><annotation encoding="application/x-tex">V\in R^{n \times d}</annotation></semantics></math>VRn×d 是softmax层的权重矩阵。

softmax层将得分<math><semantics><mrow><mi>y</mi><mo>∈</mo><msup><mi>R</mi><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">y \in R^n</annotation></semantics></math>yRn 的向量(有时称为对数)映射到概率分布。

Image showing a predicted probability distribution in a softmax deep neural network

损失函数

最后,定义比较以下各项的损失函数:

  • <math><semantics><mrow><mover accent="true"><mi>p</mi><mo>^</mo></mover></mrow><annotation encoding="application/x-tex">\hat p</annotation></semantics></math>p^,softmax层的输出(概率分布)

  • <math><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math>p是ground-truth,代表用户与之互动的项目(例如,用户点击或观看的YouTube视频)。 这可以表示为归一化的多热点分布(概率向量)。

例如,由于要比较两个概率分布,因此可以使用交叉熵损失。
Image showing the loss function in a softmax deep neural network

Softmax嵌入

项目j的概率由<math><semantics><mrow><msub><mover accent="true"><mi>p</mi><mo>^</mo></mover><mi>j</mi></msub><mo>=</mo><mi>e</mi><mi>x</mi><mi>p</mi><mo>(</mo><mi mathvariant="normal">Ψ</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo separator="true">,</mo><msub><mi>V</mi><mi>j</mi></msub><mo>)</mo><mi mathvariant="normal">/</mi><mi>Z</mi></mrow><annotation encoding="application/x-tex">\hat p_j = exp(\Psi(x),V_j)/Z</annotation></semantics></math>p^j=exp(Ψ(x),Vj)/Z给出,其中Z是不依赖j的归一化常数。

换句话说,<math><semantics><mrow><mi>l</mi><mi>o</mi><mi>g</mi><mo>(</mo><msub><mover accent="true"><mi>p</mi><mo>^</mo></mover><mi>j</mi></msub><mo>)</mo><mo>=</mo><mo><</mo><mi mathvariant="normal">Ψ</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo separator="true">,</mo><msub><mi>V</mi><mi>j</mi></msub><mo>></mo><mo>−</mo><mi>l</mi><mi>o</mi><mi>g</mi><mo>(</mo><mi>Z</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">log(\hat p_j) = <\Psi(x),V_j> - log(Z)</annotation></semantics></math>log(p^j)=<Ψ(x),Vj>log(Z) ,因此,项j的对数概率为(直到加法常数)二维二维点积 向量,可以解释为查询和项目嵌入:

  • <math><semantics><mrow><mi mathvariant="normal">Ψ</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>∈</mo><msup><mi>R</mi><mi>d</mi></msup></mrow><annotation encoding="application/x-tex">\Psi(x) \in R^d</annotation></semantics></math>Ψ(x)Rd 是最后一个隐藏层的输出。 我们称其为查询<math><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math>x的嵌入。

  • <math><semantics><mrow><msub><mi>V</mi><mi>j</mi></msub><mo>∈</mo><msup><mi>R</mi><mi>d</mi></msup></mrow><annotation encoding="application/x-tex">V_j \in R^d</annotation></semantics></math>VjRd是连接最后一个隐藏层与输出<math><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math>j的权重向量。 我们称其为项目<math><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math>j的嵌入。

DNN和矩阵分解

在softmax模型和矩阵分解模型中,系统都为每一物品j学习一个嵌入矢量<math><semantics><mrow><msub><mi>V</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">V_j</annotation></semantics></math>Vj 。 我们在矩阵分解中所谓的项嵌入矩阵<math><semantics><mrow><mi>V</mi><mo>∈</mo><msup><mi>R</mi><mrow><mi>n</mi><mo>×</mo><mi>d</mi></mrow></msup></mrow><annotation encoding="application/x-tex">V \in R ^{n \times d}</annotation></semantics></math>VRn×d 现在是softmax层的权重矩阵。

但是,查询嵌入是不同的。 系统不是学习每个查询i的一个嵌入<math><semantics><mrow><msub><mi>U</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">U_i</annotation></semantics></math>Ui,而是学习从查询特征<math><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math>x到嵌入<math><semantics><mrow><mi mathvariant="normal">Ψ</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>∈</mo><msup><mi>R</mi><mi>d</mi></msup></mrow><annotation encoding="application/x-tex">\Psi(x) \in R^d</annotation></semantics></math>Ψ(x)Rd的映射。 因此,您可以将此DNN模型视为矩阵分解的一种概括,其中您可以用非线性函数<math><semantics><mrow><mi mathvariant="normal">Ψ</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow><annotation encoding="application/x-tex">\Psi (x)</annotation></semantics></math>Ψ(x)代替查询方。

物品特征的使用

您可以将相同的想法应用到物品侧吗? 也就是说,除了学习每个项目一个嵌入之外,模型还可以学习将项目特征映射到嵌入的非线性函数吗? 是。 为此,请使用由两个神经网络组成的两塔神经网络:

  • 一个神经网络将查询特征<math><semantics><mrow><msub><mi>x</mi><mrow><mi>q</mi><mi>u</mi><mi>e</mi><mi>r</mi><mi>y</mi></mrow></msub></mrow><annotation encoding="application/x-tex">x_{query}</annotation></semantics></math>xquery映射到查询嵌入<math><semantics><mrow><mi mathvariant="normal">Ψ</mi><mo>(</mo><msub><mi>x</mi><mrow><mi>q</mi><mi>u</mi><mi>e</mi><mi>r</mi><mi>y</mi></mrow></msub><mo>)</mo><mo>∈</mo><msup><mi>R</mi><mi>d</mi></msup></mrow><annotation encoding="application/x-tex">\Psi(x_{query}) \in R^d</annotation></semantics></math>Ψ(xquery)Rd

  • 一个神经网络将项特征<math><semantics><mrow><msub><mi>x</mi><mrow><mi>i</mi><mi>t</mi><mi>e</mi><mi>m</mi></mrow></msub></mrow><annotation encoding="application/x-tex">x_{item}</annotation></semantics></math>xitem映射到项嵌入<math><semantics><mrow><mi mathvariant="normal">Φ</mi><mo>(</mo><msub><mi>x</mi><mrow><mi>i</mi><mi>t</mi><mi>e</mi><mi>m</mi></mrow></msub><mo>)</mo><mo>∈</mo><msup><mi>R</mi><mi>d</mi></msup></mrow><annotation encoding="application/x-tex">\Phi(x_{item})\in R^d</annotation></semantics></math>Φ(xitem)Rd

模型的输出可以定义为<math><semantics><mrow><mo><</mo><mi mathvariant="normal">Ψ</mi><mo>(</mo><msub><mi>x</mi><mrow><mi>q</mi><mi>u</mi><mi>e</mi><mi>r</mi><mi>y</mi></mrow></msub><mo>)</mo><mo separator="true">,</mo><mi mathvariant="normal">Φ</mi><mo>(</mo><msub><mi>x</mi><mrow><mi>i</mi><mi>t</mi><mi>e</mi><mi>m</mi></mrow></msub><mo>)</mo><mo>></mo></mrow><annotation encoding="application/x-tex"><\Psi(x_{query}),\Phi(x_{item})></annotation></semantics></math><Ψ(xquery),Φ(xitem)>的点积。 请注意,这不再是softmax模型。 新模型预测每对(<math><semantics><mrow><msub><mi>x</mi><mrow><mi>q</mi><mi>u</mi><mi>e</mi><mi>r</mi><mi>y</mi></mrow></msub></mrow><annotation encoding="application/x-tex">x_{query}</annotation></semantics></math>xquery<math><semantics><mrow><msub><mi>x</mi><mrow><mi>i</mi><mi>t</mi><mi>e</mi><mi>m</mi></mrow></msub></mrow><annotation encoding="application/x-tex">x_{item}</annotation></semantics></math>xitem)的值,而不是每个查询<math><semantics><mrow><msub><mi>x</mi><mrow><mi>q</mi><mi>u</mi><mi>e</mi><mi>r</mi><mi>y</mi></mrow></msub></mrow><annotation encoding="application/x-tex">x_{query}</annotation></semantics></math>xquery的概率向量。

评论区

哎嘿

1

0

1