Fun-Rec项目中的DIEN模型深度解析
fun-rec 项目地址: https://gitcode.com/gh_mirrors/fu/fun-rec
引言
在推荐系统领域,如何精准捕捉用户兴趣并预测其行为一直是核心挑战。传统的推荐模型往往将用户行为序列简单视为兴趣表示,而忽略了兴趣的动态演化过程。本文将深入剖析Fun-Rec项目中实现的DIEN(Deep Interest Evolution Network)模型,该模型创新性地通过双层网络结构建模用户兴趣的提取与演化过程,显著提升了推荐效果。
DIEN模型的设计动机
推荐场景与搜索场景的关键区别在于:用户不会主动输入查询词来表达意图。这使得捕捉用户隐含兴趣及其动态变化变得尤为重要。
传统模型的局限性:
- Wide&Deep类模型:主要关注不同特征间的交互,缺乏对用户兴趣的显式建模
- DIN模型:虽然引入注意力机制捕捉与目标商品相关的兴趣,但直接将用户行为等同于兴趣表示
DIEN的创新点在于:
- 区分用户行为与潜在兴趣
- 显式建模兴趣的动态演化过程
- 通过辅助损失强化兴趣表示学习
DIEN模型架构详解
DIEN模型架构可分为三大模块:
1. 输入特征处理
模型输入包含两类特征:
- 用户行为序列:通过兴趣提取层和兴趣演化层转换为兴趣表示向量
- 其他特征:包括目标商品ID、上下文特征、用户画像特征等,转换为embedding后拼接
2. 兴趣提取层(Interest Extractor Layer)
该层使用GRU网络从用户行为序列中提取兴趣表示,并引入创新的辅助损失函数:
- GRU网络:处理embedding后的行为序列,捕捉序列依赖关系
- 辅助损失设计:
- 正样本:用户t+1时刻的实际点击商品
- 负样本:从用户未点击商品中采样
- 损失函数:计算每个时刻兴趣表示与正负样本间的交叉熵
辅助损失的作用:
- 提供更丰富的监督信号,优化GRU隐状态表示
- 缓解长序列梯度传播问题
- 提升embedding层的语义表达能力
3. 兴趣演化层(Interest Evolving Layer)
该层建模与目标商品相关的兴趣演化过程,提出三种注意力机制与GRU的结合方式:
-
AIGRU:直接以注意力分数加权输入序列
- 问题:零输入仍会影响隐状态更新
-
AGRU:将注意力分数作为更新门值
- 问题:弱化了兴趣间的时序依赖关系
-
AUGRU(最终采用):将注意力分数作为更新门权重
- 优势:平衡注意力机制与序列依赖关系
代码实现解析
Fun-Rec项目中的DIEN实现遵循清晰的模块化设计:
输入处理
# 构建输入层
input_layer_dict = build_input_layers(feature_columns)
特征分类处理
- 稠密特征:直接拼接
- 稀疏特征:通过embedding层转换后拼接
- 变长序列特征:padding后通过AttentionPooling层处理
核心网络结构
# 兴趣进化层计算
dnn_seq_input, aux_loss = interest_evolution(keys_emb, query_emb, user_behavior_length, neg_concat_behavior, gru_type="AUGRU")
损失函数设计
# 添加辅助损失
if use_neg_sample:
model.add_loss(alpha * aux_loss)
模型优势与思考
DIEN模型的创新价值:
- 区分用户行为与潜在兴趣表示
- 显式建模兴趣的动态演化过程
- 通过辅助损失强化兴趣表示学习
值得思考的问题:
- 辅助损失中的负采样策略如何影响模型效果?
- 在兴趣演化过程中,如何平衡长期兴趣与短期兴趣?
- 对于不同的业务场景,如何调整兴趣演化的时间尺度?
总结
DIEN模型通过创新的双层网络结构,实现了对用户兴趣的深度建模。Fun-Rec项目中的实现清晰地展现了模型的核心思想与关键技术,为推荐系统领域的研究与实践提供了有价值的参考。理解DIEN模型的设计思想,有助于我们在实际业务中更好地应用和改进深度推荐模型。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考