推荐系统实战:协同过滤到深度学习
推荐系统是电商、内容平台和社交媒体的核心技术。从基于记忆的协同过滤到深度学习模型,推荐技术经历了多次范式演进。本文沿着这条演进路线,逐步构建更强大的推荐模型。
协同过滤是最经典的推荐方法:
from scipy.sparse import csr_matrix
from sklearn.metrics.pairwise import cosine_similarity
# 构建用户-物品矩阵
user_item = csr_matrix((ratings["rating"], (ratings["user_id"], ratings["item_id"])))
# 基于物品的协同过滤
item_sim = cosine_similarity(user_item.T)
def recommend(user_id, top_k=10):
user_ratings = user_item[user_id].toarray().flatten()
scores = user_ratings @ item_sim
scores[user_ratings > 0] = 0 # 排除已交互物品
return np.argsort(scores)[-top_k:][::-1]
深度学习推荐模型以 Wide&Deep 为起点:
class WideAndDeep(nn.Module):
def __init__(self, num_users, num_items, embed_dim=64):
super().__init__()
self.wide = nn.Linear(num_items, 1)
self.user_embed = nn.Embedding(num_users, embed_dim)
self.item_embed = nn.Embedding(num_items, embed_dim)
self.deep = nn.Sequential(
nn.Linear(embed_dim * 2, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 1),
)
def forward(self, user_ids, item_ids, wide_input):
wide_out = self.wide(wide_input)
deep_out = self.deep(
torch.cat([self.user_embed(user_ids), self.item_embed(item_ids)], dim=1)
)
return torch.sigmoid(wide_out + deep_out)
在实际部署中,双塔模型因其推理效率成为工业界主流。用户塔和物品塔分别产出向量,在线服务只需计算向量相似度即可完成推荐,延迟控制在 10ms 以内。