1. 序列推荐系统概述
在推荐系统领域,序列推荐(Sequential Recommendation)已经成为工业界和学术界的热点研究方向。与传统的协同过滤方法不同,序列推荐更关注用户行为的时间序列模式,通过建模用户历史交互序列来预测下一个可能感兴趣的物品。
1.1 序列推荐的核心思想
序列推荐的核心假设是:用户的下一个行为会受到其近期行为序列的影响。这种假设在电商、短视频、新闻资讯等场景下尤为适用。例如,在电商平台中,用户浏览了手机->手机壳->耳机这一序列后,下一个可能对充电器感兴趣。
序列推荐模型通常需要解决三个关键问题:
- 如何有效地表示用户的历史行为序列
- 如何捕捉序列中的时序依赖关系
- 如何将历史序列信息与候选物品进行匹配
1.2 序列推荐的数据处理
典型的序列推荐数据处理流程如下:
- 原始数据收集:记录用户的行为日志,通常包含(user_id, item_id, rating, timestamp)四元组
- 序列构建:按时间排序后,为每个用户构建固定长度的行为序列
- 负采样:为每个正样本(点击/购买)生成负样本(未点击/未购买)
- 训练/测试集划分:按用户或按时间划分数据集
python复制def genrateRecSeq(inPath,outPath):
'''
生成序列,序列会由6个物品id加1个标注组成
例如:
[1973,5995,560,5550,6517,4620,1],
[5995,560,5550,6517,4620,4563,1],
[560,5550,6517,4620,4563,1314,1],
[2439,1600,7999,1743,8282,8204,0]
前5个物品id代表用户最近点击的物品id,第6个物品id代表用户当前观看的物品,
第7位的标注即代表用户真实点击情况,1为点击,0为未点击。
'''
df = pd.read_csv(inPath,sep='\t',header=None)
df = df.sort_values(by=[0],axis=0)
seqs = []
df.groupby(0).apply(lambda x:doSeq(x,seqs))
seqs = np.array(seqs)
np.save(outPath,seqs)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础序列推荐模型实现
2.1 模型架构设计
基础序列推荐模型(BaseSequential)是最简单的序列推荐实现,其核心思想是将用户的历史行为序列通过求和或平均池化得到一个综合表征,然后与候选物品表征一起输入MLP进行预测。
模型主要包含以下组件:
- Embedding层:将物品ID映射为稠密向量
- 池化层:对历史行为序列进行求和池化
- MLP网络:融合历史行为和候选物品特征
python复制class BaseSequential(nn.Module):
def __init__(self, n_features, dim):
super().__init__()
self.features = nn.Embedding(n_features, dim, max_norm=1.0)
total_dim = 2 * dim
self.layer1 = nn.Linear(total_dim, total_dim // 2)
self.layer2 = nn.Linear(total_dim // 2, total_dim // 4)
self.layer3 = nn.Linear(total_dim // 4, 1)
self.dropout1 = nn.Dropout(p=0.1)
self.dropout2 = nn.Dropout(p=0.1)
self.sigmoid = nn.Sigmoid()
self.relu = nn.ReLU()
2.2 模型训练与评估
训练过程中需要注意以下几点:
- 学习率设置:推荐使用较小的学习率(如0.001-0.01)
- 批大小选择:根据数据规模选择合适batch size(通常512-2048)
- 正则化策略:结合Dropout和权重衰减防止过拟合
python复制def train(epochs=10, batchSize=1024, lr=0.01, dim=128):
# 数据准备
seqs_path = "./data_set/ml-latest-small/seqs.npy"
train, test, allItems = getTrainAndTestSeqs(seqs_path)
# 模型初始化
net = BaseSequential(max(allItems)+1, dim)
optimizer = torch.optim.AdamW(net.parameters(), lr=lr, weight_decay=0.01)
loss = torch.nn.BCELoss()
# 训练循环
for e in range(epochs):
net.train()
all_lose = 0
for train_d in DataLoader(train, batch_size=batchSize, shuffle=True):
X = train_d[:, :-2]
Items = train_d[:, -2]
y = train_d[:, -1].to(torch.float32)
optimizer.zero_grad()
y_pred = net(X, Items)
l = loss(y_pred, y)
l.backward()
optimizer.step()
3. 深度兴趣网络(DIN)实现
3.1 DIN模型原理
深度兴趣网络(Deep Interest Network, DIN)是阿里巴巴提出的序列推荐模型,其核心创新是引入了注意力机制,动态计算历史行为物品与候选物品的相关性。
DIN相比基础序列模型的改进:
- 注意力机制:不是简单池化历史行为,而是根据候选物品计算注意力权重
- Dice激活函数:改进的PReLU,能更好适应不同分布的数据
- 特征交互:显式建模历史物品与候选物品的交互特征
3.2 DIN模型实现
DIN的关键组件实现:
python复制class DIN(nn.Module):
def __init__(self, n_features, k, t=64):
super().__init__()
self.features = nn.Embedding(n_features, k, max_norm=1.0)
# 注意力网络
self.attention_dense = nn.Sequential(
nn.Linear(k * 4, t * 4),
nn.ReLU(),
nn.Linear(t*4, t)
)
self.h = nn.Linear(t, 1, bias=False)
# MLP网络
total_dim = 2 * k
self.layer1 = nn.Linear(total_dim, total_dim // 2)
self.layer2 = nn.Linear(total_dim // 2, total_dim // 4)
self.layer3 = nn.Linear(total_dim // 4, 1)
# 特殊组件
self.BN = nn.BatchNorm1d(1) # Dice激活使用
self.sigmoid = nn.Sigmoid()
self.relu = nn.ReLU()
注意力计算过程:
python复制def attention(self, hist_embs, target_emb):
# DIN标准做法:拼接[hist, target, hist-target, hist*target]
target_emb = target_emb.unsqueeze(dim=1).expand(-1, hist_embs.shape[1], -1)
concat_emb = torch.cat([hist_embs, target_emb,
hist_embs - target_emb,
hist_embs * target_emb], dim=-1)
concat_emb = self.attention_dense(concat_emb)
concat_emb = self.h(concat_emb)
atts = nn.functional.softmax(concat_emb, dim=1)
return atts
4. 深度兴趣演化网络(DIEN)
4.1 DIEN模型原理
深度兴趣演化网络(Deep Interest Evolution Network, DIEN)是DIN的升级版,主要改进在于:
- 兴趣抽取层:使用GRU捕捉行为序列的时序依赖
- 兴趣演化层:引入注意力机制建模兴趣演化过程
- 辅助损失:加入点击率预测辅助任务增强训练
DIEN更适合具有明显兴趣演化趋势的场景,如新闻推荐、短视频推荐等。
4.2 DIEN架构分析
DIEN的网络结构分为三部分:
- 行为层:原始用户行为序列
- 兴趣抽取层:GRU网络捕捉时序模式
- 兴趣演化层:AUGRU(GRU with Attention Update gate)建模兴趣演化
虽然DIEN效果优秀,但其计算复杂度较高,在实际应用中需要权衡效果与性能。
5. Transformer在推荐系统中的应用
5.1 Transformer Encoder架构
Transformer Encoder已成为序列建模的强大工具,其主要组件包括:
- 多头注意力机制:捕捉序列中不同位置的依赖关系
- 位置编码:注入序列的位置信息
- 前馈网络:进行非线性变换
- 残差连接和层归一化:稳定训练过程
python复制class TransformerEncoder(nn.Module):
def __init__(self, e_dim, h_dim, n_heads, n_layers, drop_rate=0.1):
super().__init__()
self.position_encoding = PositionalEncoding(e_dim)
self.encoder_layers = nn.ModuleList([
EncoderLayer(e_dim, h_dim, n_heads, drop_rate)
for _ in range(n_layers)
])
5.2 BST模型解��
行为序列Transformer(Behavior Sequence Transformer, BST)是将Transformer应用于推荐系统的典型代表,其特点包括:
- 物品Embedding:将用户历史行为序列中的物品映射为向量
- Transformer编码:捕捉序列中的复杂模式
- 特征拼接:将用户画像、上下文等特征与序列表征拼接
- MLP预测:最终预测用户对候选物品的兴趣程度
BST模型结构相对简洁但效果显著,特别适合处理长序列推荐问题。
6. 模型选型与实践建议
6.1 不同场景下的模型选择
- 简单场景:用户行为序列短、模式简单 → BaseSequential
- 电商场景:用户行为有明显注意力机制 → DIN
- 内容推荐:用户兴趣有明显演化过程 → DIEN
- 长序列推荐:用户历史行为丰富 → BST/Transformer
6.2 实践经验分享
- 数据质量优先:良好的数据预处理比复杂模型更重要
- 负采样策略:对性能影响很大,建议尝试多种采样比例
- 在线服务考量:复杂模型如DIEN可能不适合高QPS场景
- 特征工程:除了ID特征,加入品类、价格等属性特征能提升效果
提示:在实际项目中,建议从简单模型开始,逐步增加复杂度,并通过A/B测试验证效果提升是否值得额外的计算成本。
