揭秘阿里 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 内部细节,包含外积与全连接层)

输入层构造:

不仅仅是输入两个向量 <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(候选广告),而是构造了三个部分拼在一起:

  1. 原始向量 : <math xmlns="http://www.w3.org/1998/Math/MathML"> A , B A, B </math>A,B
  2. 外积 (Out Product) : <math xmlns="http://www.w3.org/1998/Math/MathML"> A ⊗ B A \otimes B </math>A⊗B(显式建模维度间的交互)
  3. 差值 (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,而是一套完整的工业级深度学习解决方案

  1. 架构上:用 Local Activation Unit 解决了定长向量的表达瓶颈。
  2. 特征上:用外积和差值显式增强了特征交叉能力。
  3. 工程上:用自适应正则化和线性复杂度设计,兼顾了效果与效率。
相关推荐
m0_7487080530 分钟前
C++中的观察者模式实战
开发语言·c++·算法
然哥依旧30 分钟前
【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)
算法·支持向量机·matlab·cnn
qq_5375626742 分钟前
跨语言调用C++接口
开发语言·c++·算法
Tingjct1 小时前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
C雨后彩虹1 小时前
计算疫情扩散时间
java·数据结构·算法·华为·面试
yyy(十一月限定版)2 小时前
寒假集训4——二分排序
算法
星火开发设计2 小时前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
醉颜凉2 小时前
【LeetCode】打家劫舍III
c语言·算法·leetcode·树 深度优先搜索·动态规划 二叉树
达文汐2 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
一匹电信狗2 小时前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl