Collaborative Filtering

一个经典的推荐系统一般分为召回阶段和排序阶段,召回阶段是指从大量的(可能高达数十亿)的item中选定候选集(一般为几千到几百的范围)的过程,而排序阶段是指对候选集中的item按照用户偏好进行排序。本质上来说,所有推荐算法的目标都是识别用户对某一item的偏好,也就是说,对于如下的一个user-item-preference矩阵,我们需要预测其中任意一点的值:

 

item1

item2

item3

...

Item m

user1

         

user2

         

...

         

大部分情况下,这张表是相当稀疏的,而且在随着时间不断更新,我们也不可能把它全部算出来。所以基本上我们只有在查询的时候才会由模型来计算某个用户的preference的值,而不同的推荐系统即意味着:

  1. 对用户preference的不同定义。有时候,用户的评分是明确的,比如我们会在豆瓣和淘宝对item进行打分。但更多时候,我们是没有这个明确的rank的。这种情况下,我们拥有的数据是用户的implicit feedback(隐式反馈),比如说用户的浏览、点击、播放等行为。我们需要使用用户的行为来确定preference的值,在很多情况下,我们使用不同行为的加权和作为preference。用户行为的权重会根据我们的关注度而改变,比如在视频网站,我们可能关注播放行为;在淘宝,可能主要关注购买行为。我们根据不同的关注点对用户的preference进行不同的定义,这个定义决定了推荐系统的输入,往往也决定了推荐系统的目标。

  2. 对预测目标的不同定义。一个推荐系统是非常复杂的,我们会在不同场景下使用很多不同的推荐算法,来构成整个推荐算法。用户的preference往往是较为复杂的,在很多场景下不能直接观测,这时我们通常会使用另外一些指标来作为它的度量。还有很多时候preference不是一个适合作为推荐算法目标的值,所以我们在不同的场景下还是会为推荐算法设立不同的相关的目标值。典型的比如CTR(click rate),playback_duration之类的。

  3. 对评测指标的不同定义。评测指标是个整体的目标,比如用户满意度、用户购买率等等,我们在最终评价一个推荐系统的好坏时会用这些指标。比如说一个视频网站,真正关注的肯定是用户留存率、盈利等数据,这是长期评测指标;总的用户watch minutes是短期评测指标;preference是一个用户播放行为、点击行为、收藏行为等综合起来决定的值;而在不同场景的推荐算法中,预测目标可能是用户的CTR,playback_duration等等。

  4. 召回阶段的不同筛选策略。基本是比较大方向的规则,比如popular content + saved content + historic related content等等。

  5. 排序阶段不同的预测模型。种类非常多,是现在推荐系统领域的主要关注方向。

  6. 不同的模型更新时间,即时的或者离线的。这个跟推荐系统的底层架构有关,通常是在整个系统设计的时候就已经决定了,不过还是有一些例外的情况,比如说有一些算法本身就是即时更新不需要预训练的,我遇到过的有MAB,kalman filter等等。

而我们日常的工作基本上只关注第5点,不同场景下,排序阶段不同的预测模型。接下来我们讨论的算法都只与这一点有关。

协同过滤: Collaborative Filtering

协同过滤是最经典的邻域推荐算法之一。所谓邻域算法,就是新的推荐项目是由它的邻居的数据生成的。在不同的协同过滤算法中,对邻居的定义是不同的。

User-based CF

我们考虑上面的user-item矩阵。假定我们现在有了一些user对item的preference,我们接下来的目标是把空白填满,我们会选择怎么填呢?在user-based CF,我们使用两个步骤:

(1)找到和目标用户兴趣相似的用户集合。

(2)找到这个集合中的用户喜欢的,且目标用户未consume的item,更新它们的user-item preference并排序。

我们把用户相似度定义为余弦相似度:

<math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi mathvariant="normal">w</mi><mi>ij</mi></msub><mo>&#xA0;</mo><mo>=</mo><mo>&#xA0;</mo><mfrac><mrow><mo>|</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">i</mi></mfenced><mo>&#x2229;</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">j</mi></mfenced><mo>|</mo></mrow><msqrt><mo>|</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">i</mi></mfenced><mo>|</mo><mo>|</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">j</mi></mfenced><mo>|</mo></msqrt></mfrac></math>

即:

召回阶段,建立物品对用户的倒排索引表,对于每个物品都保存对该物品产生过行为的用户,扫描该表,找到所有|N(u)∩ N(v)|不为0的用户对,计算其余弦相似度。对于用户v,其所有有交集的用户中和他最相似的k个用户是他的邻居。这些用户发生过行为的item集合就是召回集合。

排序阶段:用户u对物品i的感兴趣程度如下,其中S(u, k)是和用户u兴趣最接近的k个用户,N(i)是对物品i有过行为的用户集合,wuv是用户u和v的兴趣相似度,rvi是用户v对物品i的感兴趣程度。

<math xmlns="http://www.w3.org/1998/Math/MathML"><mi mathvariant="normal">p</mi><mfenced><mrow><mi mathvariant="normal">u</mi><mo>,</mo><mi mathvariant="normal">i</mi></mrow></mfenced><mo>&#xA0;</mo><mo>=</mo><mo>&#xA0;</mo><munder><mo>&#x2211;</mo><mrow><mi mathvariant="normal">v</mi><mo>&#xA0;</mo><mo>&#x2208;</mo><mo>&#xA0;</mo><mi mathvariant="normal">S</mi><mfenced><mrow><mi mathvariant="normal">u</mi><mo>,</mo><mo>&#xA0;</mo><mi mathvariant="normal">k</mi></mrow></mfenced><mo>&#x2229;</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">i</mi></mfenced></mrow></munder><msub><mi mathvariant="normal">w</mi><mi>uv</mi></msub><msub><mi mathvariant="normal">r</mi><mi>vi</mi></msub></math>

对user-based CF的改进基本是对这两个公式的改变,即改变用户相似度的计算方法,或者改变物品感兴趣程度的计算方法。

Item-based CF

我们还是看这个user-item矩阵。在item-based CF中,我们给用户推荐和他们之前喜欢的物品相似的物品。而和user-based CF相对称,它主要通过用户的行为计算物品之间的相似度。

物品相似度:

<math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi mathvariant="normal">w</mi><mi>ij</mi></msub><mo>&#xA0;</mo><mo>=</mo><mo>&#xA0;</mo><mfrac><mrow><mo>|</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">i</mi></mfenced><mo>&#x2229;</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">j</mi></mfenced><mo>|</mo></mrow><msqrt><mo>|</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">i</mi></mfenced><mo>|</mo><mo>|</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">j</mi></mfenced><mo>|</mo></msqrt></mfrac></math>

其中N(i)表示喜欢item i的用户

和User-CF算法类似,使用item-CF可以先建立用户-物品倒排索引表,从而计算物品之间的余弦相似度,并在得到物品之间的相似度后,使用如下公式计算user u对item j的preference:

<math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi mathvariant="normal">p</mi><mi>uj</mi></msub><mo>&#xA0;</mo><mo>=</mo><mo>&#xA0;</mo><munder><mo>&#x2211;</mo><mrow><mi mathvariant="normal">i</mi><mo>&#xA0;</mo><mo>&#x2208;</mo><mo>&#xA0;</mo><mi mathvariant="normal">N</mi><mfenced><mi mathvariant="normal">u</mi></mfenced><mo>&#x2229;</mo><mi mathvariant="normal">S</mi><mfenced><mrow><mi mathvariant="normal">j</mi><mo>,</mo><mo>&#xA0;</mo><mi mathvariant="normal">K</mi></mrow></mfenced></mrow></munder><msub><mi mathvariant="normal">w</mi><mi>ji</mi></msub><msub><mi mathvariant="normal">r</mi><mi>ui</mi></msub></math>

其中N(u)是用户交互过的物品,S(j,K)是最相似的K个物品,wji是物品j和物品i的相似度,rui是user u对item i的偏好。

item-CF的最大优势是可以从历史数据中提供推荐解释。

通过偏好归一化、惩罚热门物品,改变相似度公式等方法,我们可以不断改进item-CF。

猜你喜欢

转载自blog.csdn.net/friyal/article/details/82758955