揭秘阿里 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 内部细节,包含外积与全连接层)
输入层构造:
不仅仅是输入两个向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A(历史行为)和 <math xmlns="http://www.w3.org/1998/Math/MathML"> B B </math>B(候选广告),而是构造了三个部分拼在一起:
- 原始向量 : <math xmlns="http://www.w3.org/1998/Math/MathML"> A , B A, B </math>A,B
- 外积 (Out Product) : <math xmlns="http://www.w3.org/1998/Math/MathML"> A ⊗ B A \otimes B </math>A⊗B(显式建模维度间的交互)
- 差值 (Difference) : <math xmlns="http://www.w3.org/1998/Math/MathML"> A − B A - B </math>A−B(显式建模距离关系)
计算流程:
<math xmlns="http://www.w3.org/1998/Math/MathML"> I n p u t = [ A , B , A ⊗ B , A − B ] Input = [A, B, A \otimes B, A - B] </math>Input=[A,B,A⊗B,A−B]
然后将这个高维向量喂给一个 MLP,输出最终的权重。
2.2 为什么 MLP 是三层的?
在 Activation Unit 内部,MLP 的结构通常是 Input(3d) -> h1 -> h2 -> 1。
深度解析:
- 线性复杂度 :整个 Attention 的计算复杂度是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 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)) </math>O(T⋅(3d⋅h1+h1⋅h2+h2))。这是线性的!即使用户历史行为很长,计算量也是可控的。
- 漏斗结构 : <math xmlns="http://www.w3.org/1998/Math/MathML"> h 1 h_1 </math>h1 负责特征融合, <math xmlns="http://www.w3.org/1998/Math/MathML"> h 2 h_2 </math>h2 负责信息提炼,最后输出一个标量。
- 非线性能力:如果只有一层,那就是线性回归。引入隐层和激活函数,是为了让模型能拟合"异或"等复杂的非线性兴趣匹配逻辑。
🛠 03. 工业界的落地优化:Dice 与 正则化
学术界的模型要上实战,必须解决两个问题:过拟合 和收敛难。DIN 给出了教科书般的解决方案。
3.1 Mini-batch Aware Regularization(自适应正则化)
场景:电商数据是典型的长尾分布 (Long-tail)。少量热门商品数据极多,海量冷门商品数据稀疏。
问题:直接用 L2 正则,计算量太大(参数都在 Embedding 层),且对所有特征惩罚一样不合理。
DIN 的解法:
<math xmlns="http://www.w3.org/1998/Math/MathML"> w i = w i − η [ ⋯ + λ 1 n i w i ] w_i = w_i - \eta [\dots + \lambda \frac{1}{n_i} w_i] </math>wi=wi−η[⋯+λni1wi]
- 频率 <math xmlns="http://www.w3.org/1998/Math/MathML"> n i n_i </math>ni 高(热门) <math xmlns="http://www.w3.org/1998/Math/MathML"> → \rightarrow </math>→ <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 n i \frac{1}{n_i} </math>ni1 小 <math xmlns="http://www.w3.org/1998/Math/MathML"> → \rightarrow </math>→ 惩罚小(放手让它学)。
- 频率 <math xmlns="http://www.w3.org/1998/Math/MathML"> n i n_i </math>ni 低(冷门) <math xmlns="http://www.w3.org/1998/Math/MathML"> → \rightarrow </math>→ <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 n i \frac{1}{n_i} </math>ni1 大 <math xmlns="http://www.w3.org/1998/Math/MathML"> → \rightarrow </math>→ 惩罚大(严防死守,防止过拟合)。
这与李沐老师提出的通用正则化公式逻辑恰好相反,体现了阿里对业务数据的深刻理解。
3.2 Dice 激活函数
为了解决训练过程中数据分布变化(Covariate Shift)的问题,DIN 改进了 PReLU,提出了 Dice。
它根据当前 Mini-batch 数据的均值和方差,动态调整激活函数的"拐点",保证了训练的稳定性。
⚔️ 04. 灵魂拷问:为什么不用 Transformer?
BERT 大火之后,大家都在问:为什么不直接上 Self-Attention?
时间复杂度是硬伤!
- Transformer (Self-Attention) :计算序列内部两两关系(Item-Item),复杂度是 <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( N 2 ) O(N^2) </math>O(N2) 。如果用户看了 1000 个商品,计算量就是百万级。
- DIN :只计算"历史"和"候选"的关系,复杂度是 <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( N ) O(N) </math>O(N) 。
对比结论:
- Transformer:精度更高(三阶交互),能捕捉序列内部结构,但太慢,适合离线或短序列。
- DIN:精度够用(二阶交互),速度极快,完全满足在线实时推断(RT < 30ms)的要求。
📊 05. 评估指标:GAUC
做推荐算法,如果你只看 AUC,可能会被坑。
DIN 论文强推 GAUC (Group AUC):
<math xmlns="http://www.w3.org/1998/Math/MathML"> G A U C = ∑ w i × A U C i ∑ w i GAUC = \frac{\sum w_i \times AUC_i}{\sum w_i} </math>GAUC=∑wi∑wi×AUCi
它先计算每个用户内部的排序准确度,再加权平均。这消除了"用户活跃度差异"带来的指标虚高,真正衡量了模型**"猜你喜欢"**的能力。
📝 总结
DIN 的成功不仅仅是加了一个 Attention,而是一套完整的工业级深度学习解决方案:
- 架构上:用 Local Activation Unit 解决了定长向量的表达瓶颈。
- 特征上:用外积和差值显式增强了特征交叉能力。
- 工程上:用自适应正则化和线性复杂度设计,兼顾了效果与效率。