Deep Learning Recommendation with Heterogeneous Inference
Skill-Deep-Learning-Recommendation-HI · 05-推荐系统
causalexperimentoptimizationrecommendationmulti_agent推荐与搜索MAS与智能体工程WF-H 复购增长
业务优先级⭐⭐⭐☆☆
业务视角
适用角色运营负责人 / 选品负责人 · 产品经理 · 广告优化师
适用平台Amazon · DTC 独立站 · 邮件/SMS 个性化
什么情况下用老客来了只买一件就走,相关产品没被推出去;Bundle 商品连带销售做不起来;站内推荐位点击率低
成功是什么样的老客连带购买率提升 20-35%,客单价提升,品类交叉销售做起来
业务痛点
1. 解决的问题
传统协同过滤只利用正向交互(用户点击、购买)来建模,忽略了负向信号(用户不点击、跳过)的价值。Heterogeneous Inference (HI) 通过同时建模两种推理模式
2. 核心算法逻辑
传统协同过滤只利用正向交互(用户点击、购买)来建模,忽略了负向信号(用户不点击、跳过)的价值。Heterogeneous Inference (HI) 通过同时建模两种推理模式:
3. 业务应用场景
业务问题 某母婴出海APP使用传统协同过滤进行首页推荐,发现: - 新用户总是被推荐奶粉、纸尿裤等标品,难以发现长尾商品 - 用户反馈"推荐太单一",复购率停滞在25% - 想推的新品牌(如本土有机棉品牌)得不到曝光机会
数据要求 - user_id, item_id, interaction_type, timestamp - user_features: baby_age, location - item_features: category, brand
预期产出 - 每位用户的个性化推荐列表(Top 50) - 多样性指标提升:平均ILS下降30% - 长尾商品曝光占比从15%提升至35%
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
未自动抽取;请查看原始 Skill 卡片。
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
Heterogeneous Inference for Recommendation
"""
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from collections import defaultdict
import random
class HINetwork(nn.Module):
"""Heterogeneous Inference Network"""
def __init__(self, n_users, n_items, embedding_dim=64, alpha=0.5, gamma=0.3):
super().__init__()
self.user_embedding = nn.Embedding(n_users, embedding_dim)
self.item_embedding_p2p = nn.Embedding(n_items, embedding_dim)
self.item_embedding_n2p = nn.Embedding(n_items, embedding_dim)
self.W = nn.Parameter(torch.randn(embedding_dim, embedding_dim))
self.alpha = alpha
self.gamma = gamma
# Init
for emb in [self.user_embedding, self.item_embedding_p2p, self.item_embedding_n2p]:
nn.init.normal_(emb.weight, std=0.01)
def compute_loss(self, users, pos_items, neg_items):
"""Compute HI loss: L = L+ + αL- + γL*"""
u = self.user_embedding(users)
i_pos_p2p = self.item_embedding_p2p(pos_items)
i_pos_n2p = self.item_embedding_n2p(pos_items)
# p2p score
score_p2p_pos = torch.sum(u * i_pos_p2p, dim=1)
# n2p score
score_n2p_pos = torch.sum(u * i_pos_n2p, dim=1)
# Negative samples
batch_size, n_neg = neg_items.shape
neg_items_flat = neg_items.view(-1)
i_neg_p2p = self.item_embedding_p2p(neg_items_flat).view(batch_size, n_neg, -1)
i_neg_n2p = self.item_embedding_n2p(neg_items_flat).view(batch_size, n_neg, -1)
u_expanded = u.unsqueeze(1)
score_neg_p2p = torch.sum(u_expanded * i_neg_p2p, dim=2)
score_neg_n2p = torch.sum(u_expanded * i_neg_n2p, dim=2)
# BPR losses
loss_p2p = -torch.mean(torch.log(torch.sigmoid(score_p2p_pos.unsqueeze(1) - score_neg_p2p) + 1e-10))
loss_n2p = -torch.mean(torch.log(torch.sigmoid(score_n2p_pos.unsqueeze(1) - score_neg_n2p) + 1e-10))
# Interaction loss
interaction = torch.sum(i_pos_p2p * torch.mm(i_pos_n2p, self.W.t()), dim=1)
loss_inter = -torch.mean(torch.log(torch.sigmoid(interaction) + 1e-10))
return loss_p2p + self.alpha * loss_n2p + self.gamma * loss_inter
def recommend(self, user_id, top_k=50, exclude_interacted=None):
8. 论文来源
- 2009.12969