推荐系统实战:协同过滤到深度学习

推荐系统实战:协同过滤到深度学习

推荐系统是电商、内容平台和社交媒体的核心技术。从基于记忆的协同过滤到深度学习模型,推荐技术经历了多次范式演进。本文沿着这条演进路线,逐步构建更强大的推荐模型。

协同过滤是最经典的推荐方法:

示意图
示意图
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 以内。