多样性算法简介 - cmzdandan/dpp GitHub Wiki
在推荐系统中,衡量系统好坏的指标,除了相关性之外,多样性也是重要的指标之一。 相关性:推荐的商品跟用户的意图是否相关; 多样性:推荐的商品品类不能单一,而应该尽可能丰富多样; 但往往相关性跟多样性直接存在一些矛盾的地方,需要做好平衡。
意义:一味的提高相关性,可能出现信息茧房,而提高多样性可以和相关性协同工作,提高推荐的用户体验和满意度。 难点:
- 模型优化目标模糊:多样性是一个集合计量,很难找到直接的用户行为来作为模型优化的目标;
- 业务指标和多样性指标冲突:业务指标和多样性指标并不是简单的正向负向关系;
数据决定了效果的上限,而算法只是逼近这个上限。
(1).召回层多样化
(2).规则层多样化
(1).多样性层架构图
(2).MMR算法
- 公式
- 实现流程
- 工程实现问题 距离计算的时候,当前文档与已文档之间的平均距离,来避免使用最大距离而导致推荐结果中后续加入的文档之间有高的相似性。 物品之间相似度函数的定义,可以根据论文里提到的用相似度。但是这样就要求候列表之间必须要一个统一的物品向量,以保证该向量是anything-to-anything。因为推荐结果有多种类型,并且是异构的,这种情况下相似度并没有很好的可解释性。 我们的做法是使用和业务结合的自定义距离,下文会详细介绍自定义距离。
(3).DPP算法 全称determinantal point process,是在一个离散的点集的幂集上定义的概率分布。
- 原理 该算法思路是把重排序问题看成一个子集选择问题,目标是从原始数据集合中选择具有高质量但又多样化的的子集,通过DPP来保持高质量和多样性的平衡。DPP是一个性能较高的概率模型,通过行列式将复杂的概率计算简单化。DPP还可以理解为一个抽样的过程,两个元素作为子集被抽取的概率与单一元素被抽取的概率以及这两个元素的相似度有关。
- 实现流程
- 工程实现问题 主要使用EJML这个高效的开源的Java矩阵运算库实现的,这个库是目前尝试过程中效率比较高的库。 相似度矩阵是自定义的; 核矩阵也是自定义; 针对DPP调参,首先固定自定义距离参数,找到一个合适的,然后固定,循环调节距离参数,网格搜索的方式优化参数。 由于核矩阵不满秩,导致返回数据量可能会小于预期的数据量,在对业务影响不大的情况下,可以正常使用。 如果对返回数据量严格要求,需要考虑对核矩阵进行修正,可以参考类似google提出的核矩阵修正方式,同时会对延迟有一点影响,延迟大概增加一倍。
(1).杰卡德距离/汉明距离
这种自定义距离实现方式,采用汉明-杰卡德距离平铺近似法
(2).自定义距离-树模型距离
自定义树模型的距离是通过树状分层衰减,自顶而下结合业务实现的
目前多样性的实践就文献中的效果来说,学习式的多样性算法效果大于非学习式的,显式的大于隐式的; 另外基于强化学习的多样性算法也是多样性研究的一个方向。