docs: fun-rec

This commit is contained in:
camera-2018
2023-04-25 19:17:30 +08:00
parent b7362898ff
commit 7b8e8a23f4
39 changed files with 10844 additions and 1 deletions

View File

@@ -0,0 +1,65 @@
# 背景和目的
召回早前经历的第一代协同过滤技术让模型可以在数量级巨大的item集中找到用户潜在想要看到的商品。这种方式有很明显的缺点一个是对于用户而言只能通过他历史行为去构建候选集并且会基于算力的局限做截断。所以推荐结果的多样性和新颖性比较局限导致推荐的有可能都是用户看过的或者买过的商品。之后在Facebook开源了FASSI库之后基于内积模型的向量检索方案得到了广泛应用也就是第二代召回技术。这种技术通过将用户和物品用向量表示然后用内积的大小度量兴趣借助向量索引实现大规模的全量检索。这里虽然改善了第一代的无法全局检索的缺点然而这种模式下存在索引构建和模型优化目标不一致的问题索引优化是基于向量的近似误差而召回问题的目标是最大化topK召回率。且这类方法也不方便在用户和物品之间做特征组合。
所以阿里开发了一种可以承载各种深度模型来检索用户潜在兴趣的推荐算法解决方案。这个TDM模型是基于树结构利用树结构对全量商品进行检索将复杂度由O(N)下降到O(logN)。
# 模型结构
**树结构**
<div align=center>
<img src="http://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220420213149324.png" alt="image-20210308142624189" style="zoom: 15%;" />
</div>
如上图树中的每一个叶子节点对应一个商品item非叶子结点表示的是item的集合**(这里的树不限于二叉树)**。这种层次化结构体现了粒度从粗到细的item架构。
**整体结构**
<div align=center>
<img src="http://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220420200433442.png" alt="image-20210308142624189" style="zoom: 70%;" />
</div>
# 算法详解
1. 基于树的高效检索
算法通常采用beam-search的方法根据用户对每层节点挑选出topK将挑选出来的这几个topK节点的子节点作为下一层的候选集最终会落到叶子节点上。
这么做的理论依据是当前层的最有优topK节点的父亲必然属于上次的父辈节点的最优topK
$$
p^{(j)}(n|u) = {{max \atop{n_{c}\in{\{n's children nodes in level j+1\}}}}p^{(j+1)}(n_{c}|u) \over {\alpha^{j}}}
$$
其中$p^{(j)}(n|u)$表示用户u对j层节点n感兴趣的概率$\alpha^{j}$表示归一化因子。
2. 对兴趣进行建模
<div align=center>
<img src="http://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220420214040264.png" alt="image-20210308142624189" style="zoom: 50%;" />
</div>
如上图用户对叶子层item6感兴趣可以认为它的兴趣是1同层别的候选节点的兴趣为0顺着着绿色线路上去的节点都标记为1路线上的同层别的候选节点都标记为0。这样的操作就可以根据1和0构建用于每一层的正负样本。
样本构建完成后可以在模型结构左侧采用任意的深度学习模型来承担用户兴趣判别器的角色输入就是当前层构造的正负样本输出则是用户节点对的兴趣度这个将被用作检索过程中选取topK的评判指标。**在整体结构图中我们可以看到节点特征方面使用的是node embedding**,说明在进入模型前已经向量化了。
3. 训练过程
<div align=center>
<img src="http://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220420220831318.png" alt="image-20210308142624189" style="zoom: 15%;" />
</div>
整体联合训练的方式如下:
1. 构造随机二叉树
2. 基于树模型生成样本
3. 训练DNN模型直到收敛
4. 基于DNN模型得到样本的Embedding重新构造聚类二叉树
5. 循环上述24过程
具体的在初始化树结构的时候首先借助商品的类别信息进行排序将相同类别的商品放到一起然后递归的将同类别中的商品等量的分到两个子类中直到集合中只包含一项利用这种自顶向下的方式来初始化一棵树。基于该树采样生成深度模型训练所需的样本然后进一步训练模型训练结束之后可以得到每个树节点对应的Embedding向量利用节点的Embedding向量采用K-Means聚类方法来重新构建一颗树最后基于这颗新生成的树重新训练深层网络。
**参考资料**
- [阿里妈妈深度树检索技术(TDM) 及应用框架的探索实践](https://mp.weixin.qq.com/s/sw16_sUsyYuzpqqy39RsdQ)
- [阿里TDMTree-based Deep Model](https://zhuanlan.zhihu.com/p/78941783)
- [阿里妈妈TDM模型详解](https://zhuanlan.zhihu.com/p/93201318)
- [Paddle TDM 模型实现](https://github.com/PaddlePaddle/PaddleRec/blob/master/models/treebased/README.md)