揭秘阿里 DIN:当深度学习遇上“千物千面”

揭秘阿里 DIN:当深度学习遇上"千物千面"

前言:在推荐系统的深度学习演进史中,阿里提出的 DIN (Deep Interest Network) 无疑是一个里程碑。它打破了 Google Wide&Deep 时代"将用户历史行为压缩成固定向量"的桎梏,首次将 Attention 机制引入工业级 CTR 预估,实现了从"千人千面"到"千物千面"的跨越。

这篇文章将结合模型架构、核心源码逻辑以及工业界落地的实战细节,带你彻底读懂 DIN。

🚀 01. 传统模型的阿喀琉斯之踵:Base Model 的困境

在 DIN 出现之前,工业界的主流模型(如 Wide&Deep, PNN, Deep Crossing)处理用户行为序列(User Behavior Sequence)的方式非常简单粗暴。

通常流程是:Embedding -> Pooling -> Concat -> MLP。

(图注:传统的 Base Model 架构,使用 Sum/Avg Pooling 处理变长序列)

痛点在哪里?

关键在于 Pooling 层。

假设一个用户买了 背包, 杯子,现在我们要预测他对 手提包 的点击率。

  • Base Model 会把"背包"和"杯子"的向量求平均。结果得到一个既不像背包、也不像杯子的"四不像"向量。
  • 直觉告诉我们:预测"手提包"时,"背包"的权重应该很高,而"杯子"应该是噪音。

结论 :简单 Pooling 导致用户兴趣被平均化 和固定化。无论候选商品是什么,用户的表达向量永远不变,这限制了模型的表达能力。


⚡️ 02. DIN 的核心变革:Local Activation Unit

DIN 的核心洞察非常犀利: "用户在点击不同商品时,表现出的兴趣是不同的。"

当预测"泳衣"时,用户历史里的"泳镜"被激活;当预测"键盘"时,用户历史里的"鼠标"被激活。这就是 Local Activation(局部激活) 。

(图注:DIN 架构图,引入了 Activation Unit 计算动态权重)

2.1 相似度计算的秘密(Attention ≠ Dot Product)

很多同学误以为 DIN 的 Attention 就是简单的向量点积。大错特错!

为了捕捉高阶特征交互,DIN 设计了一个精巧的 Activation Unit:

(图注:Activation Unit 内部细节,包含外积与全连接层)

输入层构造:

不仅仅是输入两个向量 A A A(历史行为)和 B B B(候选广告),而是构造了三个部分拼在一起:

  1. 原始向量 : A , B A, B A,B
  2. 外积 (Out Product) : A ⊗ B A \otimes B A⊗B(显式建模维度间的交互)
  3. 差值 (Difference) : A − B A - B A−B(显式建模距离关系)

计算流程:

I n p u t = A , B , A ⊗ B , A − B Input = A, B, A \\otimes B, A - B Input=A,B,A⊗B,A−B

然后将这个高维向量喂给一个 MLP,输出最终的权重。

2.2 为什么 MLP 是三层的?

在 Activation Unit 内部,MLP 的结构通常是 Input(3d) -> h1 -> h2 -> 1。

深度解析:

  • 线性复杂度 :整个 Attention 的计算复杂度是 O ( T ⋅ ( 3 d ⋅ h 1 + h 1 ⋅ h 2 + h 2 ) ) O(T \cdot (3d \cdot h_1 + h_1 \cdot h_2 + h_2)) O(T⋅(3d⋅h1+h1⋅h2+h2))。这是线性的!即使用户历史行为很长,计算量也是可控的。
  • 漏斗结构 : h 1 h_1 h1 负责特征融合, h 2 h_2 h2 负责信息提炼,最后输出一个标量。
  • 非线性能力:如果只有一层,那就是线性回归。引入隐层和激活函数,是为了让模型能拟合"异或"等复杂的非线性兴趣匹配逻辑。

🛠 03. 工业界的落地优化:Dice 与 正则化

学术界的模型要上实战,必须解决两个问题:过拟合 和收敛难。DIN 给出了教科书般的解决方案。

3.1 Mini-batch Aware Regularization(自适应正则化)

场景:电商数据是典型的长尾分布 (Long-tail)。少量热门商品数据极多,海量冷门商品数据稀疏。

问题:直接用 L2 正则,计算量太大(参数都在 Embedding 层),且对所有特征惩罚一样不合理。

DIN 的解法:

w i = w i − η ⋯ + λ 1 n i w i w_i = w_i - \eta \\dots + \\lambda \\frac{1}{n_i} w_i wi=wi−η⋯+λni1wi

  • 频率 n i n_i ni 高(热门) → \rightarrow → 1 n i \frac{1}{n_i} ni1 小 → \rightarrow → 惩罚小(放手让它学)。
  • 频率 n i n_i ni 低(冷门) → \rightarrow → 1 n i \frac{1}{n_i} ni1 大 → \rightarrow → 惩罚大(严防死守,防止过拟合)。

这与李沐老师提出的通用正则化公式逻辑恰好相反,体现了阿里对业务数据的深刻理解。

3.2 Dice 激活函数

为了解决训练过程中数据分布变化(Covariate Shift)的问题,DIN 改进了 PReLU,提出了 Dice。

它根据当前 Mini-batch 数据的均值和方差,动态调整激活函数的"拐点",保证了训练的稳定性。


⚔️ 04. 灵魂拷问:为什么不用 Transformer?

BERT 大火之后,大家都在问:为什么不直接上 Self-Attention?

时间复杂度是硬伤!

  • Transformer (Self-Attention) :计算序列内部两两关系(Item-Item),复杂度是 O ( N 2 ) O(N^2) O(N2) 。如果用户看了 1000 个商品,计算量就是百万级。
  • DIN :只计算"历史"和"候选"的关系,复杂度是 O ( N ) O(N) O(N) 。

对比结论:

  • Transformer:精度更高(三阶交互),能捕捉序列内部结构,但太慢,适合离线或短序列。
  • DIN:精度够用(二阶交互),速度极快,完全满足在线实时推断(RT < 30ms)的要求。

📊 05. 评估指标:GAUC

做推荐算法,如果你只看 AUC,可能会被坑。

DIN 论文强推 GAUC (Group AUC):

G A U C = ∑ w i × A U C i ∑ w i GAUC = \frac{\sum w_i \times AUC_i}{\sum w_i} GAUC=∑wi∑wi×AUCi

它先计算每个用户内部的排序准确度,再加权平均。这消除了"用户活跃度差异"带来的指标虚高,真正衡量了模型**"猜你喜欢"**的能力。


📝 总结

DIN 的成功不仅仅是加了一个 Attention,而是一套完整的工业级深度学习解决方案:

  1. 架构上:用 Local Activation Unit 解决了定长向量的表达瓶颈。
  2. 特征上:用外积和差值显式增强了特征交叉能力。
  3. 工程上:用自适应正则化和线性复杂度设计,兼顾了效果与效率。
相关推荐
晴天的雨.9922 小时前
【C++算法】三数之和
开发语言·c++·算法
多多爱学习2 小时前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试
续写烂尾3 小时前
MK SD NAND(贴片式TF卡)替代Nor Flash:1Gb容量与256Mb Nor
算法·microsoft
u0111026753 小时前
图片预览越来越占内存聊聊 URL.createObjectURL 的释放时机
图像处理·深度学习·算法·ai作画
Zane19943 小时前
同样是遍历图,为什么BFS能保证找到最短路径,DFS却不行
算法
无限码力3 小时前
2026华为OD机试真题 新系统 9月27日【坚果巧克力】
算法·华为od·华为od机考·华为od机试真题·华为od机试·华为od机考真题题解·华为社招笔试真题
samforce3 小时前
叹息之墙——人类认知 AI,终将遇到的一堵同构之墙
人工智能·深度学习·算法·哲学·认知科学
l1t4 小时前
编译测试兼容gzip并行压缩解压工具pigz
c++·算法
代码不停4 小时前
BFS算法解决FloodFill问题
算法·bfs·宽度优先
纪念 2294 小时前
C++算法(一)
开发语言·c++·算法