Gorse推荐系统指南:制定推荐策略

1,848 阅读9分钟

Github: Gorse推荐引擎

Gorse推荐系统实现了很多类型的推荐算法,既包括了非个性化推荐算法,也包括了个性化推荐算法。实际上,没有一个推荐算法是万能的,只有将它们组合利用才能实现最好的推荐效果。

推荐算法介绍

首先,本文介绍一下Gorse中的各类推荐算法,每一类推荐算法都有各种的优缺点。

最新推荐

最新推荐就是按照时间线将最新的内容展示给用户,可以让新内容得到快速曝光。然而,最新推荐的缺点就是无法让优质的内容沉淀下来。想要在Gorse中启用最新推荐,就需要为物品设置时间戳信息。如果没有时间戳,Gorse就不会生成最新物品列表。

type Item struct {
    ItemId    string
    Timestamp time.Time // 设置一个有效的时间戳
    Labels    []string
    Comment   string
}

最热推荐

最热推荐一般将近期热门的内容展示给用户,最典型的就是微博热搜。在Gorse中,配置文件中的popular_window对应了热门物品的窗口期,下面的例子就是推荐一年之内的热门物品(有点太长了)。

popular_window = 365

最热推荐显然也不适合单独使用,否则会导致新内容无法曝光。很多网站都会以热门推荐和最新推荐结合的方式来展示内容,比如根据热门程度和新鲜程度计算出一个分数,最后按照分数进行排序。

基于相似物品推荐

某些场景下,用户会喜欢特定类型的物品,例子某游戏平台用户钟爱解谜类游戏、某视频平台用户喜欢看小姐姐跳舞。根据用户的历史记录和物品之间的相似度,就可以完成相似物品推荐。所以,相似物品推荐的关键在于计算物品之间的相似度。

Gorse计算物品相似度由三种模式,可以在配置文件中设置:

  • 相似: 根据物品之间的标签重合度来计算相似度。
  • 相关: 根据物品之间的用户重合度来计算相似度。
  • 自动: 优先使用标签计算相似度,如果没有标签那么使用用户计算相似度。
# The type of neighbors for items. There are three types:
#   similar: Neighbors are found by number of common labels.
#   related: Neighbors are found by number of common users.
#   auto: If a item have labels, neighbors are found by number of common labels.
#         If this item have no labels, neighbors are found by number of common users.
# The default values is "auto".
item_neighbor_type = "similar"

建议选择“相似”或者“自动”,因为使用“相关”的相似物品推荐和协同过滤推荐在功能上有所重合。基于相似物品(标签)推荐的优势在于,对于一个新物品,算法能够很快地根据标签信息推荐给对这类物品感兴趣的用户。当然,该算法也要求为物品生成比较准确的标签,无效的标签只会起到相反的作用。

基于相似用户推荐

相似的用户之间也通常存在共同的喜好,例如计算机专业的学生一般会购买计算机类书籍、长辈喜欢购买保健品。

Gorse计算用户之间相似度同样有三种模式,同样在配置文件中制定:

  • 相似: 根据用户之间的标签重合度计算相似度。
  • 相关: 根据用户之间的历史物品重合度计算相似度。
  • 自动: 优先使用用户标签,如果没有标签那么就使用历史物品计算相似度。
# The type of neighbors for users. There are three types:
#   similar: Neighbors are found by number of common labels.
#   related: Neighbors are found by number of common liked items.
#   auto: If a user have labels, neighbors are found by number of common labels.
#         If this user have no labels, neighbors are found by number of common liked items.
# The default values is "auto".
user_neighbor_type = "similar"

建议选择“相似”或者“自动”,因为使用“相关”的相似用户推荐和协同过滤推荐在功能上有所重合。该算法对新用户友好。如果拥有用户标签,即使用户没有任何历史记录,也能够根据类似用户的喜好来推荐。

协同过滤推荐

基于相似物品和相似用户的推荐算法要求被推荐的物品需要通过其他用户或者其他物品和被推荐用户之间建立联系,这就局限了筛选推荐内容的范围。Gorse中的协同过滤推荐使用矩阵分解算法来推荐物品,训练算法将用户和物品映射为一个高维空间中的向量,用户对物品的喜好程度就是用户向量和物品向量的乘积。然而,协同过滤推荐的缺点就是无法利用用户和物品的标签信息,也无法处理新用户和新物品。

点击率预测

是否有一种算法可以结合相似推荐和协同过滤推荐各自的有点?那么就是Gorse推荐系统中的点击率预测模型。Gorse中的点击率预测模型为因子分解机,除了为每个用户和物品生成向量之外,还会给每个用户标签和物品标签生成向量,虽然因子分解机的效果不错,但是一般不会把它作为粗排的推荐算法。和协同过滤推荐、相似推荐相比,因子分解机预测时的计算复杂度非常高。Gorse的点击率预测模型的功能就是对上述推荐算法的结果进行融合排序。

“点击率预测”的原意是预测用户对推荐内容或者广告产生点击行为的概率,需要注意的是,Gorse中点击率预测更多是指用户对推荐结果产生正反馈的概率。例子,假设我们在Gorse中设定,当用户看了视频的50%之后才算正反馈,那么“点击率”就是用户观看进度超过50%的概率。

构建推荐策略

单独的推荐算法无法很好地完成推荐任务,需要将多个推荐算法进行组合。Gorse提供了一个生成推荐结果的流程,我们可以在流程下制定适合于具体场景的推荐策略。推荐流程由两大部分构成:离线推荐和在线推荐。离线推荐主要从全体物品中为每个用户挑选推荐物品,缓存到Redis中。而在线推荐主要从拉取缓存的推荐结果,接着从推荐结果中删除已读内容,如果缓存的推荐结果已经用完,那么使用备用推荐算法实时生成推荐内容。

离线策略

离线推荐由三阶段构成:

  • 召回: 使用不同的全量推荐算法从全体物品中筛选推荐物品,全量推荐算法有热门推荐、最新推荐、基于相似物品推荐、基于相似用户推荐和协同过滤推荐这五种,可以在配置文件中设置打开或者关闭。
  • 排序: 使用因子分解机模型对召回过程收集的物品进行排序,当前也可以在配置中关闭点击率预测功能,使用随机排序。
  • 探索: 根据用户历史记录展示内容可以投用户锁所好,但是也同时限制了用户看到更加多样的内容的可能性。也是“探索利用”问题的一种,利用是指根据用户历史行为推荐内容,而探索指让用户接触更多认识之外的内容。为了能够让用户看到信息茧房之外的内容,一种最简单的办法就是向推荐列表中随机插入物品。Gorse中可以设置向推荐结果中随机插入最新物品或者热门物品,可以在配置文件中设置它们的占比。
# Enable latest recommendation during offline recommendation. The default values is false.
enable_latest_recommend = true
# Enable popular recommendation during offline recommendation. The default values is false.
enable_popular_recommend = false
# Enable user-based similarity recommendation during offline recommendation. The default values is false.
enable_user_based_recommend = true
# Enable item-based similarity recommendation during offline recommendation. The default values is false.
enable_item_based_recommend = false
# Enable collaborative filtering recommendation during offline recommendation. The default values is true.
enable_collaborative_recommend = true
# Enable click-though rate prediction during offline recommendation. Otherwise, results from multi-way recommendation
# would be merged randomly. The default values is true.
enable_click_through_prediction = true
# The explore recommendation method is used to inject popular items or latest items into recommended result:
#   popular: Recommend popular items to cold-start users.
#   latest: Recommend latest items to cold-start users.
# Recommenders are used in order. The default values is { popular = 0.0, latest = 0.0 }.
explore_recommend = { popular = 0.1, latest = 0.2 }

也许各类推荐算法的概念介绍不够直观,实际上可以在控制台界面中预览推荐效果。最热物品和最新物品可以在控制台主页面看到。 image.png 离线推荐结果、相似度物品推荐、相似用户推荐和协同过滤推荐的结果可以在用户页点击“预览”查看:

  1. 在导航栏中点击【Users】
  2. 在用户列表中点击【Insight】
  3. 可以在右侧的下拉菜单中选择展示离线推荐结果、相似度物品推荐、相似用户推荐和协同过滤推荐结果

image.png

image.png

由于目前Gorse还未提供A/B测试功能,因此需要通过预览功能感性地制定推荐策略。

在线策略

在线推荐有两个任务:

  • 删除已读: 推荐结果缓存中的已读内容需要被移除。
  • 降级推荐: 如果用户活跃度高并且工作节点的计算能力有限,就会出现缓存的推荐结果被消耗完的情况,这时就需要降级推荐算法实时生成推荐内容。降级推荐算法可以在配置文件中配置,优先级是从前往后,如果前部的推荐算法已经无法产生推荐内容,那么继续尝试后方的推荐算法。
# The fallback recommendation method for cold-start users:
#   item_based: Recommend similar items to cold-start users.
#   popular: Recommend popular items to cold-start users.
#   latest: Recommend latest items to cold-start users.
# The default values is ["latest"].
fallback_recommend = ["item_based", "latest"]

通过简单的配置,就可以得到一个支持多路召回、兼顾探索利用、能够服务降级的推荐系统了。