序列推荐模型DIN在Python中如何构建_基于TargetAttention挖掘用户历史行为兴趣

浅辰小哥_3326

浅辰小哥_3326

2026-04-25

445人浏览

原创

不能直接套用nlp的selfattention,因din需targetattention:仅单向query→keys聚焦,须显式对齐维度、加padding mask、拼接query-key特征后过mlp生成权重,且需针对稀疏/高相似序列设计fallback与归一化策略。

序列推荐模型din在python中如何构建_基于targetattention挖掘用户历史行为兴趣

直接用 TargetAttention 层替代传统 SumPooling,就能让模型对每个候选 item 动态聚焦相关历史行为——但权重崩坏、稀疏失效、特征耦合这三类问题,不提前干预,上线后指标必掉。

为什么不能直接套用 NLP 的 SelfAttention?

DIN 的核心是 TargetAttention,不是 SelfAttention。前者只让用户行为序列(keys)向当前候选 item(query)单向“看”,后者会让所有行为互相“看”。在推荐场景中,用户点击球鞋和浏览口红之间本无时序依赖,强行建模内部关系反而引入噪声。

  • 输入维度错配:NLP 中 query/key 通常同维;DIN 中 query 是 target item embedding,keys 是用户行为 embedding,二者可能来自不同 embedding 表,需显式对齐或变换
  • 缺失 padding mask:用户行为序列长度不一,必须用 mask 屏蔽 padding 位置的 attention 权重,否则 softmax 会把无效位置分走概率
  • 无 query-key 交互增强:原始 SelfAttention 只算内积;DIN 论文中关键改进是拼接 [query, key, query - key, query * key] 再过 MLP,保留差异与共性信号

TargetAttention 层的 PyTorch 实现要点

别直接写 torch.nn.MultiheadAttention——它默认做 SelfAttention,且不支持 query-key 特征拼接。应手写一个轻量 nn.Module:

python 查询技能
python 查询技能

查询客流数据,输出JSON格式,可直接导入Bitable等可视化工具

下载
  • 输入必须含 keys_length(每个样本的真实序列长度),用于生成 mask:用 torch.arange(seq_len) 与 keys_length.unsqueeze(1) 比较,得到 bool mask 矩阵
  • 权重计算推荐用 DIN 原论文的 MLP 方式:torch.cat([query, keys, query - keys, query * keys], dim=-1) → self.mlp → softmax,比单纯点积更鲁棒
  • 输出是加权和:torch.sum(weights.unsqueeze(-1) * values, dim=1),注意 values 通常等于 keys,但留出接口便于后续替换(如接入 GRU 输出)
  • 初始化 mlp 最后一层 bias 为 0,避免初始权重均匀分布;训练初期用 tf.print 或 torch.histc 监控 weights 分布:均值应在 0.3–0.7,方差 > 0.1

稀疏行为与相似 item 导致的权重失效怎么破?

新用户只有 2–3 次点击,或某用户连续刷了 10 条同款手机视频,TargetAttention 容易输出退化权重(全 0.1 或单峰尖刺),这不是 bug,是机制局限。

  • 对低频用户:在 embedding 层前加 fallback 逻辑——若 keys_length ,跳过 attention,直接用 <code>MeanPooling + 小幅度 dropout,避免权重乱跳
  • 对高相似序列:在 MLP 输入前加入 LayerNorm,抑制 query * key 项因 embedding 过于接近导致的数值饱和
  • 硬约束可选:对 softmax 输出加 temperature 调节(如除以 0.5),但会削弱区分度;更稳妥的是在 loss 中加辅助项:鼓励 top-3 权重之和 ≥ 0.6
  • 别忽略 query 质量:target item embedding 若未 fine-tune(比如直接用预训练 ID embedding),query 表达能力弱,attention 必然失效——建议至少 joint train item tower

TensorFlow 2.x 里 TargetAttention 的部署陷阱

TF SavedModel 导出后线上 infer 时,常出现权重全为 0 或 nan,90% 源于动态 shape 处理不当。

  • keys 输入必须声明 shape=[None, None, embedding_dim],不能写死 seq_len;否则 batch 内不同长度样本会被 pad 到同一长度,mask 逻辑错位
  • tf.nn.softmax 在 axis=-1 上操作时,若未 mask,padding 位置参与归一化——务必用 tf.where(mask, scores, -1e9) 替换负无穷,避免 FP16 下 inf 溢出
  • 自定义 call 方法中,禁止用 tf.print 输出中间 tensor(影响图模式构建);调试用 tf.debugging.assert_all_finite 检查 scores 和 weights
  • 线上服务时,batch size 变化会导致 keys 第二维动态变化,Keras Model 需设 jit_compile=False,否则 XLA 编译失败

真正难的不是写出 attention 公式,而是让权重在千万级用户、千变万化行为序列下始终稳定有效——mask 是否严丝合缝、query 是否足够有判别力、稀疏 case 是否有 fallback,这三点漏掉任一,模型就只是个好看的离线指标提升器。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1691

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4264

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24837

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3027

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3067

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2363

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程