DIN — 让推荐模型按你看的广告决定该激活你哪段历史
是什么
DIN(Deep Interest Network) 是阿里妈妈 2018 年的论文,提出在 CTR(点击率)预估模型里,用 attention 在用户历史行为序列上做”和当前候选广告相关的”加权——只点亮用户和这个广告有关的那一小段兴趣。
日常类比:你淘宝购物历史有 200 条——买过键盘、奶粉、跑鞋、咖啡豆。系统现在要决定要不要给你推一双”新跑鞋”。老办法是把这 200 条全部平均成一个”你”的画像向量,再判断推不推。DIN 是看到候选是跑鞋后,先只看你买过跑鞋、运动袜、护膝的那几条,把这部分加权放大,再判断。
一句话:用户兴趣不是一个固定向量,而是针对每个候选商品现场算一遍的局部激活。
为什么重要
不理解 DIN,下面这些事都没法解释:
- 为什么 2018 之后阿里、京东、ByteDance、Meta 的推荐都从 sum/avg pooling 转向 attention pooling
- 为什么 attention 从 NLP(Transformer 同年)跨界到了推荐——同样的 Q/K/V 思想换个场景照样work
- 为什么 DIEN / DSIN /
BST/ SIM 这些后续工作都把 DIN 当起点——它把”行为序列建模”这个新方向打开了 - 为什么阿里展示广告 CTR +10% 这件事被反复引用——它是工业级”attention 救场”的里程碑
核心要点
DIN 的核心设计可以拆成 三块:
-
打破 fixed pooling:之前的 Embedding & MLP 范式(YouTube DNN / Wide&Deep)把用户全部行为 sum 或 avg 成一个固定向量。这个向量不管推什么广告都长一样——表达力被瓶颈死。
-
Local Activation Unit(局部激活单元):候选广告
va和每条历史行为e_i配成一对,过一个小 MLP(输入是e_i, va, e_i*va, e_i-va),输出一个权重w_i。然后用户向量 =Σ w_i * e_i。关键是 w_i 不归一化(不做 softmax)——保留”总兴趣强度”的信息,用户买过 100 件跑鞋的权重之和就比买过 1 件大。 -
两个工程 trick:
- MBA 正则(Mini-batch Aware Regularization):电商特征是亿级稀疏 ID,传统 L2 算不动;MBA 只对当前 batch 出现过的特征施加正则
- Dice 激活:PReLU 的数据自适应版,分界点跟随 batch 统计量移动,比固定 0 点更贴合 CTR 数据分布
实践案例
案例 1:候选是”跑鞋”时,attention 怎么挑历史
假设用户历史 5 条:键盘 / 奶粉 / 跑鞋 A / 咖啡豆 / 运动袜。
候选广告 = 新跑鞋 B。Activation unit 算出权重大致是:
键盘: 0.1 奶粉: 0.1 跑鞋A: 1.8 咖啡豆: 0.1 运动袜: 1.2最终用户向量 = 0.1×键盘 + 0.1×奶粉 + 1.8×跑鞋A + 0.1×咖啡豆 + 1.2×运动袜。
跑鞋 A 和运动袜被点亮,键盘奶粉咖啡豆几乎被压成 0。这就是 “Deep Interest Network” 名字的由来——兴趣是局部的、随候选而变的。
案例 2:和 Transformer self-attention 的区别
| 维度 | DIN | Transformer self-attention |
|---|---|---|
| query 来源 | 候选广告(外部) | 序列内每个位置 |
| key/value 来源 | 历史行为 | 序列内每个位置 |
| 是否 softmax | 否 | 是 |
| 是否多层堆叠 | 一层够用 | 通常 6-12 层 |
| 位置编码 | 没有 | 有 |
DIN 是 cross-attention,Transformer 是 self-attention。DIN 不归一化是为了保留兴趣强度——softmax 会把 1 件和 100 件抹平。
案例 3:评估指标 GAUC
论文还提了一个新指标 GAUC(Group AUC):每个用户单独算 AUC,再按曝光数加权平均。
GAUC = Σ (impression_u × AUC_u) / Σ impression_u为什么需要它:普通 AUC 把所有用户的预测分混在一起排序,但用户 A 永远比用户 B 更爱点广告——这种用户级偏置会污染指标。GAUC 只在用户内部排序,才反映真实的”个性化排序”能力。
案例 4:MBA 正则一行直觉
电商场景每个 batch 只覆盖几万个特征 ID,但全表是亿级。传统 L2 要对全表所有 embedding 都施加梯度,O(N) 太慢。
MBA 的做法:
loss_reg = λ × Σ_{i ∈ batch} ||e_i||² / freq(i)只惩罚 batch 内出现的特征,且按出现频率倒数加权——高频特征惩罚轻、长尾特征惩罚重。这样既计算得动,也防止长尾 ID 过拟合。
踩过的坑
-
Activation unit 不要太深:3-4 层 MLP 够用。深了梯度消失,反而退化成普通 pooling。原论文也是这个深度。
-
历史序列长度 L 上线吃紧:每条候选广告都要扫一遍 L 条历史,复杂度 O(L)。L 到几百就影响 QPS。后续 SIM 用两阶段检索(粗筛再精筛)解决。
-
同用户多样本进同 batch 会学到捷径:训练时如果一个用户的多条样本进了同一 batch,attention 容易学到”看 batch 内其他样本”。业内常按 user_id hash 分 batch 隔开。
-
GAUC vs AUC 数字不能直接对比:学术圈常报普通 AUC,论文 +0.5 看着不大,工业界 GAUC +0.5 已是大幅提升。看推荐论文先确认指标定义。
-
Dice 激活别照搬到所有场景:Dice 假设特征近似正态分布,CTR 数据成立;表格数据 / 图像就不一定。
-
不要给权重加 softmax:复现 DIN 时一个常见错误是”看到 attention 就 softmax”。原论文明确不归一化——一旦归一化,“买过 1 件跑鞋”和”买过 100 件跑鞋”的兴趣强度就被抹平了。
-
冷启动用户上 DIN 会降效:历史 < 5 条的用户,attention 信号噪声远大于收益。工业上常按行为长度分桶——长序列走 DIN,短序列走传统 MLP。
适用 vs 不适用场景
适用:
- 用户有显式行为序列(点击 / 购买 / 浏览)的推荐场景
- 候选 item 数量不是太大(每个候选都要扫一遍历史)
- 行为顺序不重要、相关性重要——电商、内容推荐
- 工业 CTR/CVR 预估(DIN 已是事实标准的 baseline)
不适用:
- 行为顺序很重要的场景 → 用 DIEN(加 GRU)或
BST(加 Transformer) - 用户行为序列非常长(>1000)→ 用 SIM 两阶段检索
- 没有用户历史的冷启动场景 → DIN 退化成普通 MLP,提升消失
- 纯 listing 排序(没有”用户对候选”的二元关系)→ 用 LambdaMART 等 LTR 方法
历史小故事(可跳过)
- 2016:Wide&Deep(Google)确立了 Embedding & MLP 在 CTR 的主流地位。所有人都在做 sum pooling。
- 2017 年初:阿里展示广告团队发现 sum pooling 是天花板——用户兴趣多样,强行平均后向量信息量不足。
- 2017 年 6 月:DIN 第一版上 arxiv(1706.06978)。同年 6 月 Transformer 论文也上 arxiv。两篇都用了 attention,但用法完全不同——这是 attention 思想第一次在两个领域同时引爆。
- 2018:DIN 上 KDD,工业落地数据公开(CTR +10%,RPM +3.8%)。
- 2019:DIEN 接力(加兴趣演化建模);后面三年衍生出 DSIN、
BST、SIM、CAN 等一长串。
学到什么
- 固定向量 = 表达力上限——一个 user embedding 编码所有兴趣,必然丢信息。让向量”按候选动态算”是突破口。
- Attention 不只属于 NLP——任何”一个 query 对一组 key/value”的场景都能用。推荐里 query=候选、key/value=历史。
- 不 softmax 也是合法的 attention——softmax 会抹掉”强度”信息,DIN 故意不归一化。这是从场景需求倒推的设计选择。
- 工程 trick 决定能不能上线——MBA 正则、Dice、GAUC 三件套不亮眼,但少一个论文都跑不出工业数据。
- 同时代的论文常常分头解决同一个底层问题——DIN 和 Transformer 都是 2017 年用 attention 打破固定表示,相互独立。
- 工业论文的”+10% CTR”含金量——能在生产广告系统上线并跑出这个量级提升,意味着模型本身和工程链路都过关,是当时阿里整年 KPI 级的产出。
延伸阅读
- 论文 PDF:DIN arxiv 1706.06978
- 阿里官方实现:github.com/zhougr1993/DeepInterestNetwork(TensorFlow,KDD 论文配套代码)
- 后续工作 DIEN:Deep Interest Evolution Network, AAAI 2019(在 DIN 基础上加 GRU 建模兴趣随时间演化)
- 长序列方向 SIM:Search-based Interest Model, CIKM 2020(解决 DIN O(L) 复杂度问题)
- attention —— DIN 用的是 cross-attention,和 Transformer self-attention 是同年同根的两支
- wide-deep-2016 —— DIN 之前的范式,DIN 在它的 deep 部分换了 pooling 方式
关联
- attention —— attention 机制本身的源头;DIN 是它在推荐场景的早期落地
- wide-deep-2016 —— DIN 直接对标的范式;DIN 把 deep 侧的 pooling 换成 activation unit
- dcn-2017 —— 同期推荐工作;DCN 关注特征交叉,DIN 关注用户行为建模——正交方向
- transformer —— DIN 用一层 cross-attention,Transformer 用多层 self-attention,是 attention 在两个领域的两条路
反向链接
- attention —— Attention Is All You Need
- dcn-2017 —— DCN — 在 DNN 旁边并联一条专门学特征交叉的网络
- sasrec-2018 —— SASRec — 用 Transformer 的 self-attention 替 RNN 做下一步推荐
- wide-deep-2016 —— Wide & Deep — 让模型同时学会”记住”和”举一反三”