跳至主要內容

推荐流程

大约 9 分钟

推荐流程

Gorse 的工作流程如下图所示:

工作节点
服务节点
主节点
用户、物品和反馈
最新物品和热门物品
相似用户
相似物品
数据集
数据集
数据集
数据集
推荐缓存
用户、物品和反馈
最新物品和热门物品
相似用户
相似物品
最新物品和热门物品
推荐物品
推荐物品
推荐物品
推荐物品
MF 模型
FM 模型
FM 推荐
基于相似用户的推荐
基于相似物品的推荐
MF 推荐
本地缓存
RESTful APIs
搜索相似用户
加载数据
搜索相似物品
训练 MF
训练 FM
数据库
缓存
缓存
数据库
表示每个节点中的组件或者任务。

架构

主节点从数据库中加载数据。在加载数据的过程中,热门物品和最新物品被写入缓存。然后,主节点搜索相似物品和相似用户并训练推荐模型。同时主节点会在后台随机搜索寻找当前数据的最佳推荐模型参数。工作节点从主节点拉取推荐模型并为每个用户生成离线推荐。服务节点提供 RESTful APIs。工作节点和服务节点通过 GRPC 连接到主节点,需要在配置文件中配置 IP 和端口。

[master]

# GRPC port of the master node. The default value is 8086.
port = 8086

# gRPC host of the master node. The default values is "0.0.0.0".
host = "0.0.0.0"

# Number of working jobs in the master node. The default value is 1.
n_jobs = 1

# Meta information timeout. The default value is 10s.
meta_timeout = "10s"

主节点的工作线程数由master.n_jobs设置。对于工作节点的线程数量由命令行参数设置。

推荐流程

Gorse 像瀑布一样工作。用户、物品和反馈是水的源头。中间结果被缓存在缓存存储(例如 Redis)中,就像从第一个瀑布落下的水被缓存在中间的水池中。经过几个阶段后,将选定的物品推荐给用户。

中间结果缓存是可配置的。增加缓存的大小可以提升推荐准确率,因为推荐系统包含更多的信息,但也会消耗更多的缓存存储空间。缓存的过期时间应该在新鲜度和计算成本之间进行权衡。

[recommend]

# The cache size for recommended/popular/latest items. The default value is 10.
cache_size = 100

# Recommended cache expire time. The default value is 72h.
cache_expire = "72h"

推荐流程将以自上而下的方式介绍。

主节点:寻找相似和模型训练

主节点由数据加载驱动。数据加载发生在每个model_fit_period周期中。加载数据的同时会收集最新的物品和流行的物品。加载完数据后,将启动以下任务。

  • 查找相似: 找到并缓存相似用户和相似物品。
  • 训练模型: 矩阵分解模型和因子分解机模型经过训练后推送给工作节点。
  • 优化模型: 在每个model_search_period周期中,主节点使用随机搜索优化MF和FM。模型搜索器将产生model_search_trials种参数组合,在model_search_epoch迭代期间具有最佳得分的模型被用于下一轮模型训练。在大多数情况下,没有必要改变这两个选项值。默认情况下,模型大小是固定的,设置enable_model_size_search来搜索更大的模型,当然这样会消耗更多的内存。
[recommend.collaborative]

# The time period for model fitting. The default value is "60m".
model_fit_period = "60m"

# The time period for model searching. The default value is "360m".
model_search_period = "360m"

# The number of epochs for model searching. The default value is 100.
model_search_epoch = 100

# The number of trials for model searching. The default value is 10.
model_search_trials = 10

# Enable searching models of different sizes, which consume more memory. The default value is false.
enable_model_size_search = false

一旦数据被加载好,相似物品(用户)搜索和模型训练就会并行开始。在相似物品(用户)搜索和模型训练结束后,如果前一次优化时间是model_search_period之前,则开始模型优化任务。

开始
加载数据
搜索相似用户
搜索相似物品
训练矩阵分解模型
训练因子分解机
上次优化时间 -
当前时间 >
model_search_period
优化矩阵分解模型
训练因子分解机
结束

工作节点:离线推荐

工作节点生成并向缓存数据库写入离线推荐。工作节点在每个check_recommend_period周期中检查每个用户。如果一个用户的最后活跃时间晚于其最新的离线推荐缓存,或者该缓存在refresh_recommend_period之前被生成,工作节点会刷新该用户的离线推荐。

最新物品
{{if enable_latest_recommend }}

热门物品
{{ if enable_popular_recommend }}
相似用户
相似物品
推荐物品
推荐物品
反馈
推荐物品
候选物品
推荐物品
反馈
推荐物品
最新物品和热门物品
推荐物品
缓存
合并
基于相似用户的推荐
{{ if enable_user_based_recommend }}
基于相似物品的推荐
{{ if enable_item_based_recommend }}
数据库
矩阵分解推荐
{{ if enable_collaborative_recommend }}
矩阵分解推荐
移除已读物品
数据库
探索推荐
缓存
缓存

首先,工作节点从最新物品、热门物品、基于用户相似性的推荐、基于物品相似性的推荐和矩阵分解推荐中收集候选物品。候选物品的来源可以在配置中启用或禁用。然后,通过因子分解机对候选物品进行排名,并删除已读物品。如果enable_click_through_predictionfalse,则候选物品会被随机排序。最后,热门的物品和最新的物品将以explore_recommend中定义的概率被注入到推荐中。离线推荐结果将被写入到缓存。

[recommend.offline]

# The time period to check recommendation for users. The default values is 1m.
check_recommend_period = "1m"

# The time period to refresh recommendation for inactive users. The default values is 120h.
refresh_recommend_period = "24h"

# Enable latest recommendation during offline recommendation. The default value is false.
enable_latest_recommend = true

# Enable popular recommendation during offline recommendation. The default value is false.
enable_popular_recommend = false

# Enable user-based similarity recommendation during offline recommendation. The default value is false.
enable_user_based_recommend = true

# Enable item-based similarity recommendation during offline recommendation. The default value is false.
enable_item_based_recommend = false

# Enable collaborative filtering recommendation during offline recommendation. The default value 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 value is false.
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.
# The default values is { popular = 0.0, latest = 0.0 }.
explore_recommend = { popular = 0.1, latest = 0.2 }

服务节点:在线推荐

服务器节点为数据操作和推荐提供 RESTful API。

数据API

数据 API 为用户、物品和反馈提供 CRUD。插入反馈时,用户和物品必须已经存在。配置中有选项可以在插入反馈的时候自动插入用户或物品,或者忽略包含不存在的用户或物品的反馈。

[server]

# Insert new users while inserting feedback. The default value is true.
auto_insert_user = true

# Insert new items while inserting feedback. The default value is true.
auto_insert_item = true

推荐API

推荐 API 用于返回推荐结果。对于非个性化推荐(最新项目、热门物、相似用户和相似物品),服务器节点从缓存数据库中获取推荐然后发送响应。但是对于个性化推荐,服务节点需要做更多的工作。

  • 个性化推荐: 首先拉取工作节点产生的离线推荐,然后将已读物品删除。但如果离线推荐缓存被消耗完了,将使用兜底推荐算法。也就是从前往后尝试fallback_recommend中的推荐算法。
开始
加载离线推荐
删除已读物品
推荐数量
>= N
结束
第1个兜底推荐算法
删除已读物品
推荐数量
>= N
  • 会话推荐: 会话推荐器根据用户会话中的反馈,为未注册用户生成推荐。会话推荐是由基于最新的nn个反馈,通过基于物品相似性的推荐算法产生,反馈中的已读物品将从推荐中删除。使用的用户反馈的数量由num_feedback_fallback_item_based设置。
反馈
N 个反馈
推荐物品
推荐物品
反馈
相似物品
请求
最新的 N 个反馈
基于物品相似度的推荐
删除已读物品
响应
缓存
[recommend.online]

# The fallback recommendation method is used when cached recommendation drained out:
#   item_based: Recommend similar items.
#   popular: Recommend popular items.
#   latest: Recommend latest items.
# Recommenders are used in order. The default values is ["latest"].
fallback_recommend = ["item_based", "latest"]

# The number of feedback used in fallback item-based similar recommendation. The default values is 10.
num_feedback_fallback_item_based = 10

除了推荐之外,还有两个重要的服务节点配置项。

  • 时钟误差: Gorse 支持带有未来时间戳的反馈,因此 Gorse 依赖于一个正确的时钟。然而,不同主机的时钟可能不同,clock_error是各个节点时钟之间的最大误差。
  • 缓存过期时间: 服务节点将隐藏的物品和热门物品缓存在本地缓存中,以避免过于频繁地访问外部数据库。本地缓存每隔cache_expire都会被刷新。
[server]

# Clock error in the cluster. The default value is 5s.
clock_error = "5s"

# Server-side cache expire time. The default value is 10s.
cache_expire = "10s"

放回

在某些情况下,已读物品应该被再次推荐给用户,但其权重应该比首次推荐较低。如果enable_replacement被开启,已读物品将被放回到推荐池中。正向反馈和已读反馈的权重衰减因素由positive_replacement_decayread_replacement_decay控制。

[recommend.replacement]

# Replace historical items back to recommendations.
enable_replacement = false

# Decay the weights of replaced items from positive feedbacks.
positive_replacement_decay = 0.8

# Decay the weights of replaced items from read feedbacks.
read_replacement_decay = 0.6