当前位置:   article > 正文

【推荐系统】Learning Tree-based Deep Model for Recommender Systems

learning tree-based deep model for recommender systems

论文连接:Learning Tree-based Deep Model for Recommender Systems

学习基于树的推荐系统深度模型

1. 导言

基于用户历史行为或者其他有着相似偏好的用户行为来推断用户兴趣的个性化推荐已经被广泛应用于各个领域。

挑战

  • 语料库十分庞大的时候,即使是关于语料库大小线性复杂度的模型也不能够接受
  • 没有考虑推荐系统的新颖度(novelty)

小贴士:新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。在一个网站中实现新颖性的最简单办法是,把那些用户之前在网站中对其有过行为的物品从推荐列表中过滤掉。比如在一个视频网站中,新颖的推荐不应该给用户推荐那些他们已经看过、打过分或者浏览过的视频。但是,有些视频可能是用户在别的网站看过,或者是在电视上看过,因此仅仅过滤掉本网站中用户有过行为的物品还不能完全实现新颖性。

O’scar Celma在博士论文“Music Recommendation and Discovery in the Long Tail”中研究了新颖度的评测。评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。

但是,用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。

最近几年关于多样性和新颖性的研究越来越受到推荐系统研究人员的关注。ACM的推荐系统会议在2011年有一个专门的研讨会讨论推荐的多样性和新颖性。该研讨会的组织者认为,通过牺牲精度来提高多样性和新颖性是很容易的,而困难的是如何在不牺牲精度的情况下提高多样性和新颖性。关心这两个指标的读者可以关注一下这个研讨会最终发表的论文。

以往的解决办法

  • 协同过滤
    • item-based: 预先计算好物品对的相似度,由用户历史行为作为激发找到最相像的物品
    • 但是仅基于用户历史行为的推荐,无法发掘用户的潜在兴趣
  • 粗粒度的推荐
    • 推荐种类,再将种类下物品排序
    • 种类很多的时候,又遇到相同的计算复杂问题

2. 系统架构

在这里插入图片描述

页面在收到一个用户的请求后,在matching server上系统会使用用户的特征、情境特征和物品特征从百万级别的语料库中生成一个相对较小的(通常为几百个)候选物品集。这个阶段也是tree-based recommendation model所应用的地方。

依据这几百个候选物品集,real time prediction server会使用更具有表达能力但同时也会更费时的模型去预测比如点击率(click through rate)或者转化率(conversion rate)。

从一个完整的语料库中构建一个较小的候选物品集是至关重要的,在这一阶段需要权衡效率和有效性。

3. 基于树的深度模型

3.1 基于树的推荐

在这里插入图片描述

  • n o d e s = { n 1 , n 2 , ⋯   , n ∣ N ∣ } nodes=\{n_1, n_2,\cdots, n_{|N|}\} nodes={n1,n2,,nN}
  • 除了根节点外,每一个节点有一个父亲和任意个孩子
  • 假设 n 1 n_1 n1为根节点
  • 在corpus C C C中的每一个物品 c i c_i ci与树上的一个并且只有一个叶子节点对应
  • 非叶子节点对应一些粗粒度的概念
  • 图中的例子是个完全二叉树,但是模型对树并没有限制

3.2 Hierarchical softmax

在hierarchical softmax中,树中的每个叶子节点都有唯一一个编码,依据从根节点到该节点的路径。比如,我们以1表示选择左分支,0表示选择右分支,在上图中 n 9 n_9 n9的编码为 110 110 110 n 15 n_{15} n15的编码为 000 000 000

  • b j ( n ) b_j(n) bj(n): 第 j j j层节点 n n n的编码
  • 基于context下一个单词为节点 n n n的概率为
    P ( n ∣ c o n t e x t ) = ∏ i = 1 w P ( b = b j ( n ) ∣ l j ( n ) , c o n t e x t ) P(n|context)=\prod_{i=1}^{w}P(b=b_j(n)|l_j(n),context) P(ncontext)=i=1wP(b=bj(n)lj(n),context)
  • w w w 为叶子节点 n n n编码的长度
  • l j ( n ) l_j(n) lj(n)为节点 n n n j j j层的祖先节点

3.3 基于树的模型

对于每个用户 u u u,每个在 j j j层的非叶子节点 n n n满足下式:
P ( j ) ( n ∣ u ) = max ⁡ n c ∈ n’s children nodes in level j+1 P ( j + 1 ) ( n c ∣ u ) α ( j ) P^{(j)}(n|u)=\frac{\max_{n_c\in{\text{n's children nodes in level j+1}}}P^{(j+1)}(n_c|u)}{\alpha^{(j)}} P(j)(nu)=α(j)maxncn’s children nodes in level j+1P(j+1)(ncu)

  • P ( j ) ( n ∣ u ) P^{(j)}(n|u) P(j)(nu)为用户 u u u对于 n n n感兴趣的真实概率
  • α ( j ) \alpha^{(j)} α(j)是一个与层相关的正则化系数,保证在同一层上的概率和为1
  • 该式描述的是: u u u对于一个父节点的真实偏好等于该父节点孩子节点的最大偏好除以一个正则项
    • 这样可以保证孩子节点在top k中,他们的父亲节点也一定在top k中
  • u u u指代一个特定的使用者状态,一旦使用者有了一个新的行为,会变为 u ′ u^{\prime} u
我们的目标是找到 k k k个具有最大偏好概率的叶子节点。
  • 假设我们已知树中每个节点的真实概率 P ( j ) ( n ∣ u ) P^{(j)}(n|u) P(j)(nu)
  • 我们能获得每层具有最大偏好概率的 k k k个节点
  • 只有孩子节点属于 t o p ( k ) ( j ) top(k)^{(j)} top(k)(j)的父亲节点需要考虑
  • 实际上我们并不需要知道确切的 P ( j ) ( n ∣ u ) P^{(j)}(n|u) P(j)(nu),只需要获得每层节点偏好的排序
    • 如果 u u u对于叶子节点 n d n_d nd有行为(假设为正样本),这意味着 P ( m ) ( n d ∣ u ) > P ( m ) ( n t ∣ u ) P^{(m)}(n_d|u)>P^{(m)}(n_t|u) P(m)(ndu)>P(m)(ntu),即 u u u对于 l e v e l   m level\text{ } m level m n d n_d nd的偏好大于其他节点 n t n_t nt
    • 进而可以推出
      P ( j ) ( l j ( n d ) ∣ u ) > P ( j ) ( n q ∣ u ) , ∀ j P^{(j)}(l_j(n_d)|u)>P^{(j)}(n_q|u),\forall j P(j)(lj(nd)u)>P(j)(nqu)j
    • l j ( n d ) l_j(n_d) lj(nd) n d n_d nd j j j层上的祖先, n q n_q nq j j j层上除 l j ( n d ) l_j(n_d) lj(nd)的其他节点
可以使用负采样(negative sampling)来训练每层的order discriminator
  • u u u有交互的叶子节点以及他的祖先节点集构成 u u u的正样本,除了正样本外的随机挑选的其他节点构成负样本
    在这里插入图片描述
  • 比如在上图中 n 13 n_{13} n13为目标叶子节点,则 n 13 n_{13} n13在各层的祖先为正样本,随机选取的红色节点为负样本。
似然函数可以表示为

∏ u ( ∏ n ∈ Y u + P ( y ^ u ( n ) = 1 ∣ n , u ) ∏ n ∈ Y u − P ( y ^ u ( n ) = 0 ∣ n , u ) ) \prod_{u}(\prod_{n\in \mathcal{Y^{+}_{u}}}P(\hat{y}_{u}(n)=1|n,u)\prod_{n\in \mathcal{Y^{-}_{u}}}P(\hat{y}_{u}(n)=0|n,u)) u(nYu+P(y^u(n)=1n,u)nYuP(y^u(n)=0n,u))

  • Y u + , Y u − \mathcal{Y^{+}_{u}},\mathcal{Y^{-}_{u}} Yu+,Yu分别为 u u u的正负样本集
  • y ^ u ( n ) \hat{y}_{u}(n) y^u(n)为模型估计的类标
  • P ( y ^ u ( n ) ∣ n , u ) P(\hat{y}_{u}(n)|n,u) P(y^u(n)n,u)为二元概率模型的输出,以节点 n n n及用户状态 u u u为输入
对应的损失函数为

− ∑ u ∑ n ∈ Y u + ∪ Y u − y u ( n ) l o g P ( y ^ u ( n ) = 1 ∣ n , u ) + ( 1 − y u ( n ) ) l o g P ( y ^ u ( n ) = 0 ∣ n , u ) -\sum_{u}\sum_{n\in \mathcal{Y^{+}_{u}}\cup\mathcal{Y^-_{u}}}y_{u}(n)logP(\hat{y}_u(n)=1|n,u)+(1-y_u(n))logP(\hat{y}_{u}(n)=0|n,u) unYu+Yuyu(n)logP(y^u(n)=1n,u)+(1yu(n))logP(y^u(n)=0n,u)

算法:逐层检索预测算法

输入:用户状态 u u u,推荐树, k k k,学好的模型
输出: k k k个叶子节点

结果集 A = ∅ A=\varnothing A=,候选集 Q = { n 1 } Q=\{n_1\} Q={n1}

重复:

  • 如果叶子节点在 Q Q Q中,将它从 Q Q Q中移除,并且插入 A A A
  • 对于 Q Q Q中剩下的每个节点 n ∈ Q n\in Q nQ计算 P ( y ^ u ( n ) = 1 ∣ u , n ) P(\hat{y}_u(n)=1|u,n) P(y^u(n)=1u,n)
  • Q Q Q中的节点按照 P ( y ^ u ( n ) = 1 ∣ u , n ) P(\hat{y}_u(n)=1|u,n) P(y^u(n)=1u,n)降序排列,并且获得top k k k记作 I I I
  • Q = { children nodes of n|n ∈ I } Q=\{\text{children nodes of n|n} \in I \} Q={children nodes of n|nI}

直到 ∣ Q ∣ = = 0 |Q|==0 Q==0
返回 A A A中的top k k k(依据 P ( y ^ u ( n ) = 1 ∣ u , n ) P(\hat{y}_u(n)=1|u,n) P(y^u(n)=1u,n)

  • 对于大小为 ∣ C ∣ |C| C的corpus,如果推荐树为完全二叉树,至多遍历 2 k l o g ( ∣ C ∣ ) 2klog(|C|) 2klog(C)个节点就可以得到大小为 k k k的候选集。
  • 相对于Hierarchical softmax旨在区分最优和次优的结果,该模型使得每层的discriminator为一个intra-level global one,每层的global discriminator能够不依赖于上一层独立地进行精确预测
  • 因此即使上一层获得了一个较差的预测结果,一些比较差的节点进入了候选集,在下一层相对较好的节点而不是非常坏的节点会被选择

3.4 深度模型

我们用深度模型来计算 P ( j ) ( y ^ n ( u ) = 1 ∣ u , n ) P^{(j)}(\hat{y}_n(u)=1|u,n) P(j)(y^n(u)=1u,n)
在这里插入图片描述

  • 依据时间戳将用户行为分为不同的时间窗口。
  • 在每个时间戳内,对物品的嵌入式向量进行加权平均,权重由一个激活单元得到。
  • 每个时间窗口的输出和节点的嵌入式向量连接后作为神经网络的输入。
  • 经过三个带有PReLU激活函数以及batch normalization的全连接层
  • 由一个二元的softmax输出用户对于该候选节点感兴趣的概率
  • 每个物品和它对应的叶子节点使用相同的嵌入式表达
  • 所有的嵌入式表达随机初始化

3.5 树的构建和学习

在Hierarchical softmax中,基于专家知识的词的层次构建词的层次结构。但是对于推荐树,这样的专家知识并不是可以普遍获得的,一个直觉上的替代是我们可以基于物品的共线性和相似性采用层次聚类的方法,但是聚类树可能是极度不平衡的,这对于之后的训练和检索都是不利的。

基于物品对的相似性,文献Label embedding trees for largemulti-class tasks给出了一个利用谱聚类递归地将物品分为子集的方法,但是该算法的时间复杂度为 ∣ C ∣ 3 |C|^3 C3,在大规模corpus上的可延展性比较差。

树的初始化

很自然地,我们希望相似的物品在较近的位置。

考虑到在许多领域物品的category信息都是可获得的,我们首先想到的是利用物品种类信息来初始化推荐树。

以二叉树为例:

  • 首先对于categories随机排序
  • 然后对于属于同一类的物品在同一类下随机排序 (an intra-category random order)
    • 如果一个物品属于多个类,那么为了唯一性,我们随机挑选一个类将其放入
  • 这样我们得到 a list of ranked items
  • 然后,我们递归地将ranked items一分为二,直至当前集合仅包含一个item

树的学习

  • 在模型训练后,我们会得到每个叶子节点的嵌入式向量,利用训练得到的叶子节点嵌入式向量我们又会通过聚类生成一个新的树。
  • 考虑到聚类算法的可延展性,我们使用k-means。
  • 每一步,利用k-means递归地将物品集分为两个子集(adjusted to equal for a more balanced tree )直至当前集合只包含一个物品
  • 深度模型和树模型是同时训练的
    • 初始化一个树结构,然后训练模型直至收敛
    • 基于训练得到的叶子节点的嵌入式向量得到一个新的树结构
    • 利用新的树结构再次训练深度模型

4. 在线服务

在这里插入图片描述

  • 分为两个异步的阶段: input feature assembling和item retrieval
  • 用户的每个行为,包括点击、购买、加入购物车等都会实时激发real-time feature server生成新的输入特征
  • 一旦受到页面的请求,user targeting server就会根据预先生成的特征从树中获取候选集
    • 获取过程是逐层进行的,训练好的神经网络会计算给定输入特征下该节点被偏好的概率

5. 实验设置

5.2 评价指标

对于一个用户 u u u,模型召回的物品集记作 P u ( ∣ P u ∣ = M ) \mathcal{P}_u(|\mathcal{P}_u|=M) Pu(Pu=M),真实的物品集记作 G u \mathcal{G}_u Gu
P r e c i s i o n @ M ( u ) = ∣ P u ∩ G u ∣ M Precision@M(u)=\frac{|\mathcal{P}_u\cap\mathcal{G}_u|}{M} Precision@M(u)=MPuGu
R e c a l l @ M ( u ) = ∣ P u ∩ G u ∣ ∣ G u ∣ Recall@M(u)=\frac{|\mathcal{P}_u\cap\mathcal{G}_u|}{|\mathcal{G}_u|} Recall@M(u)=GuPuGu
F − M e a s u r e @ M ( u ) = 2 ⋅ P r e c i s i o n @ M ( u ) ⋅ R e c a l l @ M ( u ) P r e c i s i o n @ M ( u ) + R e c a l l @ M ( u ) F-Measure@M(u)=\frac{2\cdot Precision@M(u)\cdot Recall@M(u)}{Precision@M(u)+Recall@M(u)} FMeasure@M(u)=Precision@M(u)+Recall@M(u)2Precision@M(u)Recall@M(u)
N o v e l t y @ M ( u ) = ∣ P u ∖ S u ∣ M Novelty@M(u)=\frac{|\mathcal{P}_u\setminus \mathcal{S_u}|}{M} Novelty@M(u)=MPuSu
其中 S u \mathcal{S}_u Su为推荐前与用户有交互行为的物品集。

问题

  • 为什么选择孩子的最大偏好概率作为父亲的偏好概率
    • 使得我们可以top-down逐层选k个最大节点,因为如果叶子节点属于top k,那么它的祖先必然也属于所属层的top k,因此我们可以从根节点开始逐层的仅考虑每层的top k来找到叶子节点的top k
  • 怎么调整k-means的聚类结果使类别分布均衡
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/241170?site
推荐阅读