想象你走进一家旗舰店。店员老周的工位上贴着一张「客户画像卡」,上面把小王买过的东西全部揉在一起取了个平均值:「这客人运动、厨艺、户外都沾一点。」于是无论小王看跑鞋、看炒锅还是看登山包,老周都掏出同一张卡,给出一模一样的推荐。这种「一张画像卡应对所有提问」的做法,恰恰是早期深度推荐模型的通病:用一个固定的平均向量表示用户。直到店里来了新店员林姐,她的做法完全不同——小王望向货架上的跑鞋时,她会快速翻出他买过跑步服、运动鞋的记录,把「与跑鞋相关」的记忆放大,把炒锅、砧板这些无关记忆放到一边;小王转身去看炒锅,她又像换了一个人似的重新组织记忆。林姐这套「先看你手里的商品,再决定翻哪段记忆」的本事,就是深度兴趣网络(Deep Interest Network,简称 DIN)的核心——注意力机制。本文就用林姐的故事,带你拆解 DIN 的局部激活单元、注意力聚合方式,以及它带来的可解释性红利。
掌握 DIN,你就掌握了推荐系统「动态用户表示」的标准范式:候选物品驱动的注意力机制、行为序列加权聚合、可解释推荐,都是大厂算法岗面试与 CTR 预估场景中的高频考点。
目录
可视化演示
模拟DIN深度兴趣网络根据候选物品动态计算用户历史行为注意力权重,展示局部激活单元与兴趣聚合过程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
模式1:注意力加权聚合 高权重行为与候选物品强相关 低权重行为贡献被抑制 a_i = MLP(e_i, e_ad) → softmax DIN根据候选物品动态激活用户兴趣。
背景与痛点:一张画像卡应付所有提问
老周的画像卡很努力:他把小王所有购买记录的特征摊开、求和、再除以条数,形成一张「平均脸」。这张脸的特点是「什么都有一点」,但「什么都不突出」。深度推荐模型里也有这张「平均脸」——把用户历史交互过的 N 个商品先映射成稠密向量(可以理解为给每个商品记一组特征数字),再求平均,得到唯一的用户向量 $\mathbf{v}_U$。这个向量对所有候选商品一视同仁。
这种做法的直接问题是「兴趣被稀释」。小王的兴趣是多元的:运动、厨艺、户外都占一席。平均之后,每个兴趣信号都被其他信号互相拉低。推荐跑鞋时,厨具相关的信号成了噪声;推荐炒锅时,运动信号又成了噪声。用户向量与「当前在看什么」完全无关,这在数学上的表达就是简单的平均池化:
老周很勤奋,平均得很认真,但一张画像卡不可能同时服务好「运动小王」和「厨房小王」。这就是 DIN 要解决的第一个问题:固定表示与多样化兴趣之间的矛盾。
- 历史行为嵌入把用户历史上交互过的每个商品映射成稠密向量,第 $i$ 个行为记作
- 累加求和把 N 个行为向量逐位相加,每一位上「有信号」的维度会叠加
- 取平均除以 N,使向量尺度不受行为数量影响
- 固定表示得到的 $\mathbf{v}_U$ 与候选物品无关,跑鞋和炒锅共用同一个用户向量
DIN核心思想:先看商品再翻记忆
林姐接客的第一步永远是「看一眼顾客手里的东西」。这一眼决定了接下来翻记忆的方式。DIN 的核心理念与之一模一样:用户兴趣表示不应该是固定常数,而应该是「候选物品驱动」的。DIN 由阿里巴巴在 KDD 2018 提出,最初服务于淘宝展示广告的点击率(CTR)预估,其核心是把用户兴趣表示写成历史行为集合与候选物品向量的联合函数。
这里的用户行为被视为一个「无序集合」而不是「有序序列」——DIN 不关心用户先买了跑鞋还是先买了背包,只关心「有哪些行为」。这跟用 LSTM/GRU 建模行为顺序的序列模型有本质区别。形式上可以写成:
对比公式 (1),这里没有简单地除以 N,而是让每个历史行为都跟 $\mathbf{v}_A$ 交互一次。同样一个小王,看跑鞋时是「运动版小王」,看炒锅时是「厨房版小王」——兴趣画像跟着问题走,而不是永远一张脸。
- 行为集合大括号表示 N 个历史行为向量的无序集合,顺序被忽略
- 候选向量分号后的 $\mathbf{v}_A$ 是当前要预估的候选商品嵌入
- 聚合函数$\mathcal{F}$ 是注意力聚合函数,内部包含「打分 + 加权求和」两步
- 动态输出$\mathbf{v}_U(A)$ 带下标 A,表示「面对 A 时的用户兴趣」,换个候选就换个向量
局部激活单元:林姐的火眼金睛
林姐的眼睛是一台高速扫描仪:视线每扫过一条历史记录,心里就冒出一个「相关分」——跑步服对跑鞋 0.68、运动鞋对跑鞋 0.82、通勤背包对跑鞋 0.35、厨房锅具对跑鞋 0.18。这个打分器在 DIN 里叫「局部激活单元」(Local Activation Unit),本质是一个小型多层感知机(MLP,可以理解为一个会从数据里学规则的小型打分网络)。
它把历史行为向量 $\mathbf{u}_i$ 与候选物品向量 $\mathbf{v}_A$ 拼接起来,再额外塞进两个交互信号:逐元素相乘 $\mathbf{u}_i \odot \mathbf{v}_A$ 捕捉「有多像」,逐元素相减 $\mathbf{u}_i - \mathbf{v}_A$ 捕捉「差多少」。最后经过 sigmoid(一种把任意实数压缩到 0 和 1 之间的函数)输出权重:
为什么叫「局部激活」?因为它不产出全局唯一的权重,而是针对当前候选物品、逐个历史行为地激活,打分网络在所有行为上参数共享,所以行为数量可变也没关系。林姐的火眼金睛不是天生的——店主给她看了成千上万笔成交与未成交的数据,她才学会「什么旧记忆与什么新商品相关」。
- 拼接向量分号表示把四个向量首尾相连,形成一条同时包含「旧记忆」和「新商品」的长向量
- 逐元素相乘向量对应位置相乘,方向一致的信号被放大,是捕捉相似度的关键
- 逐元素相减保留互补与差异信息,例如「候选偏运动、行为偏厨艺」这类对比
- MLP 映射多层感知机从训练数据中学习「什么样的组合算相关」,激活函数常用 PReLU/Dice
- sigmoid 压缩把任意实数打分压到 $(0,1)$,作为注意力权重
注意力聚合:把相关记忆加权合并
打完分之后,林姐不会把五条记忆原封不动全倒给小王,而是「按分混音」:高分的跑步服、运动鞋记忆被放大,低分的锅具、砧板记忆被压低,最后合成一幅「运动版小王」的兴趣画像。这在 DIN 里叫注意力聚合,也叫加权求和池化:把每个历史行为向量乘上它的注意力权重,再全部加起来。
这是一种「软选择」而不是「硬选择」:不是只挑出最相关的那一条行为(那相当于 argmax 池化),而是让所有行为按权重共存,从而保留用户多兴趣的多样性。与平均池化对比,本质差异是「加权」——噪声被低权重压制到几乎不影响结果。不是所有记忆都重要,但重要的记忆在合成画像时都被优先听见。
- 权重计算每一个历史行为都拿到一个候选相关的注意力分数
- 加权缩放相关行为几乎完整保留,无关行为的信息量被压到接近零
- 累加聚合所有缩放后的行为向量相加,形成聚合兴趣
- 强度保留权重来自 sigmoid,总和不必等于 1,从而保留「激活了多少兴趣」的强度信息
可解释性价值:说说为什么推荐
小王问林姐:「为什么给我推荐这双跑鞋?」老周只能答「因为你什么都喜欢」,林姐却可以指着几条高权重记忆说:「你上周买了跑步服,三个月前买过运动鞋,这些都和跑鞋很搭。」注意力机制带来的第二份红利,正是这种可解释性:每个历史行为的权重本身就是「理由强度」。
把 N 个激活权重从大到小排序,取前 k 个权重对应的历史行为(Top-k 行为回溯),再映射回商品名称,就能生成「因为你浏览/购买过 XX,所以推荐 YY」的解释文案。这在电商产品里非常常见:
可解释性的价值不只是「给用户一个交代」。对算法工程师而言,权重分布可以用来排查 bad case:某条推荐点击率异常低,一看权重发现模型把高分给到了错误的历史行为,就能定位是数据问题还是特征问题。对产品而言,解释标签能显著提升点击与信任。林姐的解释不是事后编的,而是决策过程里真实使用的分数——推荐决策和推荐理由共用同一套证据,这是注意力机制比黑盒模型优雅的地方。
- 权重排序把 N 个激活权重从大到小排列,下标加括号表示排序后的位次
- 截取 Top-k保留权值最高的前 k 个行为的下标集合
- 映射业务名称把行为下标还原成商品名,形成「因为你看了 XX」的推荐理由
电商效果验证:数据会说话
店主决定做个 A/B 实验:一半顾客由老周接待,一半由林姐。一周后看数据,林姐接待的顾客当场成交率明显更高。模型是否有效,不看理念多漂亮,看对照实验。DIN 论文的原生落地场景是淘宝展示广告,离线评估中,作者在 Amazon 等多个数据集与自研工业数据集上对比了 DIN 与基线模型,DIN 的 AUC 与 GAUC 全面领先。GAUC 是「按用户分组计算 AUC 再加权平均」的指标,对用户高度异质的场景更公允。
线上效果则用点击率的相对提升来衡量:
据论文报告,DIN 在线上广告系统中获得了约 10% 的 CTR 相对提升,千次展现收益 RPM 也明显改善。原因并不神秘:展示广告场景用户行为稀疏、兴趣发散,动态兴趣表示比固定向量更能捕捉「此刻到底对什么感兴趣」。林姐上岗后,店主把老周那套画像卡收进了抽屉——数据不会骗人,能涨点击的模型才是好模型。
- 对照组点击率使用原模型打分服务的流量,记作基线点击率
- 实验组点击率使用 DIN 打分服务的流量,记作实验点击率
- 相对差两者之差除以基线,消除绝对基数的影响
- 转百分比乘以 100%,得到更直观的描述
DeepFM互补与落地:组合拳与工程化
林姐记性好,但店里还有一位老陈师傅,熟稔「价格—品类—季节」的交叉规律,比如「夏季 + 运动 + 折扣」往往高转化。林姐管行为记忆,老陈管特征交叉——这正是 DeepFM 与 DIN 的分工:DeepFM 擅长稀疏特征的显式交叉(FM 部分 + 深度部分),DIN 擅长用户行为序列的「候选相关激活」,两者并非二选一,而是互补关系。
工业界的常见做法是把两者拼进同一个模型:所有特征(用户、商品、上下文)先做嵌入,特征交叉走 DeepFM 通路,行为序列走注意力通路,最后把多路信号拼接进 MLP 输出点击概率:
落地时还有不少工程细节:训练侧,广告场景样本高度稀疏,常用负采样与 mini-batch aware 正则(DIN 论文提出)控制 embedding 稀疏性;推理侧,注意力打分需要对 N 个历史行为逐对计算,要限制行为序列长度(如截断到最近几十条)并做表征预聚合,以满足线上延迟要求。记性好的林姐加上会看规律的陈师傅,才是店里真正的黄金组合——一个负责「想起什么」,一个负责「看穿规律」。
- 兴趣通路DIN 输出的候选相关兴趣表示,对应林姐的「动态记忆」
- 候选通路候选商品本身的嵌入向量
- 交叉通路DeepFM 输出的特征交叉表示,对应老陈的「规律经验」
- 融合输出拼接后过 MLP 与 sigmoid,训练目标通常是交叉熵
AI 应用场景
场景一:电商首页「猜你喜欢」信息流精排
阶段:排序阶段(精排 CTR 预估)
解决的问题:用户兴趣多样且随场景漂移,传统固定向量表示会让「运动型兴趣」和「厨艺型兴趣」互相稀释,导致推荐平庸化。DIN 让排序模型先看候选物品,再动态聚合相关历史行为,使「今天逛户外」和「昨天逛厨房」能各自正确激活。
具体案例:小王最近浏览过跑鞋和跑步服,也买过锅具。信息流来了一条跑鞋候选,DIN 打出的历史权重中「跑步服 0.68、运动鞋 0.82」明显高于「锅具 0.18」,跑鞋顺利排进前三;若候选换成炒锅,权重分布立刻反转,炒锅相关的内容被顶上来。
场景二:展示广告 CTR 预估(广告系统精排)
阶段:广告召回与精排(竞价前的点击率预估)
解决的问题:广告场景用户行为稀疏、兴趣发散,且广告主只对「当前展示的物品」是否被点击付费。DIN 把候选广告物品直接嵌入用户行为聚合过程,让广告排序更贴近用户当下的意图。
具体案例:DIN 论文的落地场景就是淘宝展示广告。据论文报告,相比基线模型,线上点击率获得约 10% 的相对提升,千次展现收益 RPM 同步改善,验证了「动态兴趣表示」在真实商业流量中的价值。
场景三:推荐理由与可解释产品化
阶段:结果呈现层(推荐理由标签生成)
解决的问题:黑盒推荐让用户困惑且不信任——「你怎么知道我喜欢这个?」DIN 的注意力权重天然提供了解释依据:取 Top-k 权重对应的历史行为,即可生成「因为你看过 XX」的推荐理由。
具体案例:某内容社区在「猜你想看」卡片上叠加解释标签:「因为你常看跑步装备测评,所以推荐这双跑鞋。」点击率与停留时长均有提升;算法团队也利用权重分布排查坏样本,快速定位特征或数据问题。
Python 演示
import numpy as np # 模拟商品嵌入: 每个商品用4维向量表示兴趣取向item_emb = { '跑步服': np.array([1.0, 0.0, 0.4, 0.1]), '运动鞋': np.array([1.0, 0.0, 0.3, 0.2]), '速干衣': np.array([0.9, 0.1, 0.2, 0.1]), '炒锅': np.array([0.1, 1.0, 0.1, 0.2]), '砧板': np.array([0.2, 0.9, 0.2, 0.0]), '登山包': np.array([0.3, 0.1, 0.9, 0.2]), '跑鞋': np.array([1.0, 0.0, 0.5, 0.1])} def sigmoid(z): z = np.clip(z, -20.0, 20.0) return 1.0 / (1.0 + np.exp(-z)) # 构造训练数据: 行为与候选相关与否用向量内积模拟candidates = ['跑鞋', '炒锅', '登山包']X, y = [], []for cand in candidates: v_cand = item_emb[cand] for beh, u in item_emb.items(): feat = np.concatenate([u, v_cand, u * v_cand]) X.append(feat) y.append(1.0 if np.dot(u, v_cand) >= 0.8 else 0.0)X, y = np.array(X), np.array(y) # 梯度下降训练局部激活单元(逻辑回归形式)w = np.random.RandomState(0).randn(X.shape[1]) * 0.1lr = 0.1for _ in range(300): p = sigmoid(X @ w) w -= lr * (X.T @ (p - y)) / len(y) # 模拟用户小王的历史行为序列history = ['跑步服', '炒锅', '运动鞋', '砧板', '登山包'] def din_interest(cand_name): v_cand = item_emb[cand_name] weights = [] for beh in history: u = item_emb[beh] feat = np.concatenate([u, v_cand, u * v_cand]) weights.append(sigmoid(feat @ w)) weights = np.array(weights) pooled = sum(item_emb[beh] * a for beh, a in zip(history, weights)) order = np.argsort(-weights) return pooled, weights, order for cand_name in ['跑鞋', '炒锅']: pooled, weights, order = din_interest(cand_name) print('候选商品:', cand_name) for i in order: print(' 历史行为', history[i], '注意力权重=%.3f' % weights[i]) print(' 聚合兴趣向量:', np.round(pooled, 3))
feat = np.concatenate([u, v_cand, u * v_cand])把行为向量、候选向量、逐元素相乘结果拼在一起,对应局部激活单元的输入构造y.append(1.0 if np.dot(u, v_cand) >= 0.8 else 0.0)用内积模拟真实业务中的「相关标注」,作为打分器的学习目标w -= lr * (X.T @ (p - y)) / len(y)逻辑回归的梯度下降更新,让打分器学会区分相关与不相关weights.append(sigmoid(feat @ w))对每个历史行为独立打分,得到 0 到 1 的注意力权重pooled = sum(item_emb[beh] * a for beh, a in zip(history, weights))注意力聚合:权重乘行为向量再累加,得到候选相关的兴趣表示order = np.argsort(-weights)按权重降序排列,对应 Top-k 回溯,用于生成推荐理由
常见误区
误区DIN 的注意力权重和 Transformer 一样,都经过 softmax 归一化,加起来必须等于 1,否则模型就崩了。
正解DIN 论文刻意用 sigmoid 输出每个权重到 (0,1),不做归一化,加权求和保留「兴趣强度」信息,实验也表明 sum 池化优于平均池化。可以理解为:林姐的「相关分」是独立打的,每条记忆 0 到 1 分,不会因为别的记忆分高就把你的分摊薄。
为何常见:深度学习里最有名的注意力是 Transformer 的 softmax attention,大家容易把「注意力 = 必须归一化」当成通则。
误区局部激活单元本质上就是用户行为向量和候选向量做点积,跟传统的向量内积推荐没什么区别。
正解内积只是其中一个交互信号(逐元素相乘再求和),DIN 把「拼接、相乘、相减」三路信息都喂给 MLP,由数据学习匹配规则,表达能力比固定内积强得多。林姐不是背公式,而是从数据里学会了「什么组合算相关」。
为何常见:很多注意力文章用点积打分,读者容易以偏概全,忽略了 DIN 用小型神经网络学习打分这一步。
误区DIN 有神经网络,等于把用户所有历史行为都存进模型,能记住用户的一切兴趣,像个长期记忆库。
正解DIN 不存储任何「长期档案」,模型参数只是打分函数,历史行为始终作为输入喂进来。它只根据当前候选物品,对给定的历史行为序列做一次加权聚合。换句话说,林姐没有小王的完整花名册,她的本事是「看到商品现翻记忆并快速判断相关度」。
为何常见:「网络 = 记忆」的直觉在推荐场景容易误导,混淆了模型参数与模型输入。
误区都是深度学习推荐模型,有了 DeepFM 就不需要 DIN,或者 DIN 就是 DeepFM 的升级版。
正解DeepFM 解决「稀疏特征怎么交叉」,面向的是静态特征;DIN 解决「行为序列怎么动态激活」,面向的是用户历史。两者解决的问题不同,工业界常组合使用,而不是替换关系。
为何常见:课程把 DeepFM 和 DIN 放在同一篇章讲解,读者容易误以为是主线与支线的竞争关系。
误区某条历史行为注意力权重 0.9,说明用户特别喜欢这个东西,权重就是用户满意度的分数。
正解权重表达的是「该历史行为与当前候选物品的相关 / 匹配程度」,不是用户对它的绝对喜好分。可解释性也有边界:特征分布偏移时权重可能误导。林姐给炒锅打 0.18 分不代表小王讨厌炒锅,只是「炒锅对当前这双跑鞋的推荐不那么相关」。
为何常见:把注意力分数类比成「人情分」,忽略了它只是模型内部的一个中间量,不等价于用户真实偏好。
面试题
Q1. DIN 中注意力权重的主要作用是什么?
- A.对所有行为一视同仁看待
- B.对全部特征做归一化处理
- C.度量行为与候选物的相关度← 正确答案
- D.压缩行为向量的特征维度
答案:C。DIN 注意力权重的本质是「相关度计分器」:每个历史行为与当前候选物品越相关,权重越高。类比林姐给每条旧记忆打相关分。A 是平均池化的做法,B 是特征工程概念,D 是降维概念,都与注意力权重的作用不符。
Q2. DIN 中局部激活单元输出的注意力权重范围是?
- A.负无穷到正无穷的实数
- B.被压缩到 0 和 1 之间← 正确答案
- C.可以取任意大于 1 的数值
- D.固定为负一到正一区间
答案:B。局部激活单元最后接 sigmoid 函数,把任意实数打分压缩到 (0,1),类似林姐的相关分打在 0 到 1 之间。A 是 sigmoid 前的 MLP 输出范围;C、D 与 sigmoid 的定义矛盾。
Q3. 与平均池化相比,DIN 的加权聚合主要解决了什么问题?
- A.显著提高模型的训练速度
- B.兴趣信号被无关行为稀释← 正确答案
- C.无法处理高维稀疏特征
- D.缓解模型的过拟合问题
答案:B。平均池化把所有历史行为一视同仁,多元兴趣互相拉低,候选相关的信号被无关行为稀释。DIN 用注意力权重压制无关行为、放大相关行为,相当于林姐只让相关记忆参与合成画像。A、C、D 都不是 DIN 聚合阶段直接解决的目标。
Q4. DIN 局部激活单元的输入包含以下哪些?
- A.历史行为的嵌入向量← 正确答案
- B.候选物品的嵌入向量← 正确答案
- C.两者逐元素相乘结果← 正确答案
- D.用户输入的原始特征
答案:ABC。论文中局部激活单元输入是四路信息的拼接:行为向量、候选向量、逐元素相乘、逐元素相减。A、B、C 都正确。D 错误,因为原始 one-hot 特征需先经过嵌入层,不会直接送入激活单元。
Q5. 关于 DIN 中「动态兴趣表示」的正确说法有哪些?
- A.同一用户面对不同候选物品表示不同← 正确答案
- B.一个用户只维护一个固定兴趣向量
- C.兴趣表示由历史行为与候选物品共同决定← 正确答案
- D.兴趣表示只由候选物品独立决定
答案:AC。DIN 的核心就是「候选物品驱动」:兴趣表示是历史行为集合与候选物品向量的联合函数,因此 A、C 正确。B 是传统平均池化的固定表示;D 忽略了历史行为的贡献,都不符合 DIN 的设计。
Q6. DIN 使用 sigmoid 输出激活权重而不强制归一化,主要原因是什么?
- A.保留用户兴趣的强度信息← 正确答案
- B.计算过程会消耗更少资源
- C.防止训练时出现梯度消失
- D.保证权重总和必然为整数
答案:A。sigmoid 逐条打分、不做归一化,意味着「激活了多少条相关行为」的信息被保留;若用 softmax,行为越多单条权重越被摊薄,会丢失兴趣强度。论文实验也表明 sum 池化优于平均池化。B、C、D 都不是论文的设计动机。
Q7. 加权聚合后,DIN 得到的用户兴趣向量与候选物品的关系是?
- A.与候选物品完全没有任何关系
- B.随候选物品不同而动态变化← 正确答案
- C.只由候选物品独立决定
- D.只由历史行为独立决定
答案:B。DIN 的聚合权重由「行为—候选」配对打分得到,候选不同,权重分布就不同,聚合出的兴趣向量也不同,因此 B 正确。A 与注意力机制矛盾;C、D 都只强调了一侧而忽略了另一侧。
Q8. 关于 DIN 可解释性的正确说法有哪些?
- A.注意力权重可追溯相关历史行为← 正确答案
- B.权重可直接作为真实偏好程度
- C.可用于生成推荐理由文案← 正确答案
- D.权重解释完全透明无任何局限
答案:AC。取 Top-k 权重可回溯到具体历史行为,进而生成「因为你看过 XX」的理由,A、C 正确。权重衡量的是「与当前候选的相关性」而非绝对偏好,B 错误;顶层 MLP 仍是黑盒,且权重可能受特征分布偏移误导,D 过于绝对。
Q9. DIN 与 DeepFM 在推荐模型中的关系是什么?
- A.两者实现的功能完全相同
- B.侧重特征交叉与行为序列激活← 正确答案
- C.二者可以互相完全替代使用
- D.注意力机制仅作用于特征交叉
答案:B。DeepFM 负责稀疏特征的低阶与高阶交叉,DIN 负责用户行为序列的候选相关激活,二者解决不同问题、经常组合使用,B 正确。A、C 否定了它们的差异与互补性;D 把注意力机制误用到了特征交叉上。
Q10. 在电商展示广告场景应用 DIN 后,通常会观察到什么效果?
- A.转化率上升而点击率下降
- B.离线 AUC 指标明显下降
- C.点击率获得明显提升← 正确答案
- D.模型训练时间显著减少
答案:C。DIN 论文报告线上 CTR 相对提升约 10%,离线 AUC/GAUC 相比基线更优,说明点击率明显提升,C 正确。A 与实验结论相反;B 与离线指标提升的事实矛盾;D 并非 DIN 的设计目标。