D2L项目解析:序列感知推荐系统Caser模型详解

D2L项目解析:序列感知推荐系统Caser模型详解

引言

在传统推荐系统中,我们通常将推荐任务抽象为矩阵补全问题,忽略了用户行为的时序特性。然而,用户的行为模式往往具有明显的时间依赖性,近期行为更能反映用户当前的兴趣偏好。本文将深入解析D2L项目中介绍的序列感知推荐系统Caser模型,该模型创新性地使用卷积神经网络捕捉用户行为序列中的时序模式。

序列感知推荐系统概述

序列感知推荐系统与传统推荐系统的核心区别在于,它考虑了用户交互行为的时间顺序。这类系统将用户的历史交互记录视为一个有序序列,通过分析序列中的模式来预测用户的下一个可能交互项。

为什么需要序列感知推荐?

  1. 兴趣漂移:用户的兴趣会随时间变化
  2. 短期偏好:用户近期行为更能反映当前需求
  3. 组合效应:多个行为的组合可能产生新的兴趣点(如购买牛奶和黄油后更可能购买面粉)

Caser模型架构

Caser(Convolutional Sequence Embedding Recommendation)模型通过卷积神经网络捕捉用户行为序列中的两种模式:

1. 水平卷积网络

  • 作用:捕捉联合级别(union-level)模式
  • 特点:考虑多个连续行为的组合影响
  • 实现:使用不同高度的滤波器(h=1到L)扫描序列

2. 垂直卷积网络

  • 作用:捕捉点级别(point-level)模式
  • 特点:关注单个行为对目标的影响
  • 实现:使用固定高度的滤波器(L×1)扫描序列

模型数学表达

给定用户u在时间t的前L个交互项序列Sᵘ = (S₁ᵘ, ..., Sₜ₋₁ᵘ),构建嵌入矩阵:

E⁽ᵘ⁾ = [q_{Sₜ₋L}ᵘ, ..., q_{Sₜ₋₂}ᵘ, q_{Sₜ₋₁}ᵘ]ᵀ

其中Q ∈ ℝⁿˣᵏ为物品嵌入矩阵,qᵢ为第i个物品的嵌入向量。

预测函数

模型最终预测结合了短期意图和长期偏好:

ŷᵤᵢₜ = vᵢ·[z,pᵤ]ᵀ + b'ᵢ

其中:

  • z:短期意图表示
  • pᵤ:用户长期偏好
  • vᵢ:目标物品表示

代码实现解析

1. 模型结构

class Caser(nn.Block):
    def __init__(self, num_factors, num_users, num_items, L=5, d=16,
                 d_prime=4, drop_ratio=0.05, **kwargs):
        super(Caser, self).__init__(**kwargs)
        # 用户和物品嵌入层
        self.P = nn.Embedding(num_users, num_factors)  # 用户长期偏好
        self.Q = nn.Embedding(num_items, num_factors)  # 物品嵌入
        
        # 垂直卷积层 (捕捉点级别模式)
        self.conv_v = nn.Conv2D(d_prime, (L, 1), in_channels=1)
        
        # 水平卷积层 (捕捉联合级别模式)
        h = [i + 1 for i in range(L)]
        self.conv_h, self.max_pool = nn.Sequential(), nn.Sequential()
        for i in h:
            self.conv_h.add(nn.Conv2D(d, (i, num_factors), in_channels=1))
            self.max_pool.add(nn.MaxPool1D(L - i + 1))
        
        # 全连接层
        self.fc = nn.Dense(in_units=d_prime*num_factors + d*L,
                          activation='relu', units=num_factors)
        # 预测层
        self.Q_prime = nn.Embedding(num_items, num_factors * 2)
        self.b = nn.Embedding(num_items, 1)
        self.dropout = nn.Dropout(drop_ratio)

2. 序列数据处理

为处理序列数据,实现了专门的SeqDataset类,关键特性包括:

  • 滑动窗口生成训练序列
  • 负采样处理
  • 保持时序完整性
class SeqDataset(gluon.data.Dataset):
    def __init__(self, user_ids, item_ids, L, num_users, num_items, candidates):
        # 数据排序和预处理
        # 生成序列和目标对
        # 实现负采样
    
    def _win(self, tensor, window_size, step_size=1):
        # 滑动窗口生成器
    
    def _seq(self, u_ids, i_ids, idx, max_len):
        # 序列生成逻辑

模型训练与评估

使用BPR损失函数进行优化,这是一种专门用于隐式反馈的成对损失函数:

# 初始化模型和优化器
net = Caser(10, num_users, num_items, L)
net.initialize(ctx=devices, init=mx.init.Normal(0.01))

# 使用BPR损失和Adam优化器
loss = d2l.BPRLoss()
trainer = gluon.Trainer(net.collect_params(), 'adam', 
                       {"learning_rate": 0.04, 'wd': 1e-5})

关键洞见与建议

  1. 模式捕捉能力:水平卷积网络更适合捕捉行为组合模式,而垂直卷积网络更适合分析单个行为影响

  2. 序列长度选择

    • 过短的序列无法捕捉足够模式
    • 过长的序列可能引入噪声
    • 需要通过实验确定最佳L值
  3. 应用场景差异

    • 序列感知推荐:有明确用户标识和长期历史
    • 会话推荐:匿名用户短期会话,需快速捕捉当前兴趣

总结

Caser模型通过创新的卷积神经网络架构,有效地将用户行为序列中的时序模式纳入推荐系统考量。其双通道设计(水平+垂直卷积)能够同时捕捉不同粒度的行为特征,结合长期偏好建模,实现了对用户兴趣的全面理解。这种序列感知方法在电商、视频推荐等场景中表现出色,特别适合用户兴趣变化明显的场景。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咎椒铭Bettina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值