想象一个场景:你要为好朋友挑选生日礼物。你记得他最近逛过哪些店——上周在游戏店停留了很久,前阵子总往摄影器材店跑,昨天又翻了几家户外用品店。这些记忆散落在你脑海里,但当你站在这家“礼物店”门口时,你不会把所有记忆都等量齐观地翻出来——你会自动聚焦在“他最近痴迷什么”“哪家店与他当下的需求最相关”上,然后快速决定:这家店的某个商品,他会不会喜欢? 这个“逛过的店”就是用户的历史行为序列,“要买的礼物”就是候选商品(Candidate Item),而你大脑里的那套“按住关键记忆、忽略无关噪音”的筛选过程,就是推荐系统里大名鼎鼎的DIN(Deep Interest Network,深度兴趣网络)。更进一步:如果他不只是“逛过”这些店,而是兴趣从游戏慢慢转向摄影、摄影又转向露营,这条“兴趣漂移”的轨迹该怎么追踪?这就要靠DIEN(Deep Interest Evolution Network,深度兴趣演化网络)——它像一部沿途记录你观察重点变化的行车记录仪,把“兴趣如何随时间演化”也建模进系统。 本文要用一个贯穿始终的比喻——“为朋友挑选礼物时翻阅历次逛街记忆”——带你彻底看懂 DIN 和 DIEN。你会理解注意力机制如何“激活”用户历史、GRU 如何刻画兴趣演化、辅助损失如何像“小考”一样帮模型学得更稳,以及长序列建模和工业部署中的关键诀窍。
对 AI 从业者而言,DIN/DIEN 是工业推荐系统处理用户行为序列的基石。掌握它,你就能理解从“猜你喜欢”到“猜你即将喜欢什么”的最核心技术路径,这也是招聘中高级推荐算法岗位的高频考点。
可视化演示
动态演示DIN/DIEN序列推荐的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
DIN/DIEN序列推荐:序列推荐 序列推荐中的用户兴趣建模挑战 DIN的注意力激活机制设计 核心机制可视化 DIN/DIEN序列推荐整体架构与关键组件
序列推荐基础
回到“挑选生日礼物”的场景。如果你只记得朋友“逛过店”这个事实,却完全不记得先后顺序、停留时间,那你很难判断他当下真正喜欢什么。推荐系统面对的用户也是如此——用户的行为(点击、加购、购买、收藏)天然构成一条有时间顺序的序列,比如:昨晚点击了游戏手柄 → 今早浏览了微单相机 → 午后收藏了一顶帐篷。这条序列里的每个元素,在系统里被表示为一个 Embedding(一个稠密向量),相当于每件商品在“兴趣空间”里的坐标。
早期推荐模型(如 YouTube DNN)会把这条序列里的所有行为向量做平均池化(简单求平均),得到一个“平均兴趣”。这就像你把朋友逛过的所有店一股脑记成“他什么都逛过”——游戏、摄影、露营被平均成一个模糊的“泛兴趣”。这样做的结果是:当你看到一件露营装备时,那条“平均兴趣向量”里游戏与摄影的成分会稀释掉露营的信号;当你看到游戏手柄时,露营的成分又在干扰判断。
DIN 的出发点正是:平均池化是不够的,历史行为的价值应当随“候选商品”动态变化。在电商系统里,模型的任务是预估“用户 u 点击候选商品 c 的概率”——点击率(CTR)预估。输入包括用户特征、候选商品特征和用户行为序列;模型需要输出一个 0 到 1 之间的概率。这个“是否点击”的信号,才是训练模型的真正目标(目标损失)。
平均池化的“平均”,是理解 DIN 价值的起点;它就像把所有逛街记忆一视同仁地混在一起,而 DIN 要做的,是给每条记忆插上一面“重要性旗帜”。
- sigmoid(·)把任意实数压缩到 0~1 之间。就像温度计把“冷热程度”变成 0~100 的读数。
- MLP([·])多层感知机是一个“万能函数拟合器”,它会自动组合输入特征,找出“什么信号组合最能预测点击”。
- user_embed用户向量。在没有 DIN 前,它通常就是行为序列的平均池化结果,也就是那条“模糊的平均兴趣”。
- item_embed候选商品向量,是要被预测的“那件礼物”在兴趣空间里的坐标。
- context_embed上下文向量,刻画时间(早上/凌晨)、场景(首页/搜索页)等信息,相当于“你在什么情境下想起这段记忆”。
DIN注意力激活
假设你站在礼物店门口,脑海里闪过朋友的十段逛街记忆。你不会把十段记忆平均成“他什么都爱看”;你会让记忆与“当前礼物”一一对话——游戏手柄出现时,“游戏店”的记忆自动放大;露营帐篷出现时,“户外店”的记忆占据主画面。DIN 把这个“对话”变成一套可学习、可微分的数学公式。
具体做法是:对历史行为序列中每个行为向量 $\displaystyle v_j$,计算它与候选商品向量 $\displaystyle v_c$ 的相似度得分,再经过 softmax 归一化为权重 $\displaystyle a_j$。这些权重反映了“该历史行为对当前候选的重要性”。最后用权重对行为向量做加权求和,得到用户向量:
DIN 不是简单地“算完权重就结束”,它允许训练过程中自动学习“什么样的行为组合对预测点击最有帮助”。它不要求设计复杂的特征交叉规则,而是让注意力机制自己发现——这正是它相比传统池化的核心优势。相比平均池化的“一视同仁”,DIN 像一位老友,能在你提到某件商品时精准忆起对应的那几次逛街经历。
- score(v_j, v_c)行为向量与候选向量的相似度得分。在实际实现中常使用“向量内积”或一个小型 MLP 来打分,对应比喻里“这段记忆与当前礼物的契合度”。
- exp(·)指数函数,把得分映射到非负区间,同时放大得分差异。分数越高,指数后相对优势越突出,就像“特别契合的记忆”在脑中一下子亮起。
- softmax 归一化把各历史行为的指数得分除以总和,让所有权重加起来等于 1。保证“蛋糕总共只有一块”,权重之间互相竞争。
- 加权求和池化把权重 $\displaystyle a_j$ 乘以各自行为向量再累加。权重大的行为主导用户向量,权重小的行为退居末位——这就是“注意力激活”的本质。
DIEN兴趣演化
DIN 虽然能动态赋予不同历史行为不同权重,但它把行为序列看成无序的集合——就像你把十段记忆乱序摊在桌上。可是用户的兴趣会漂移:半年前痴迷游戏,三个月后迷上摄影,最近开始研究露营。如果不考虑时间顺序,模型就看不到“兴趣从游戏 → 摄影 → 露营”这条演化轨迹。DIEN 的诞生正是为了填补这个空缺:它用 GRU(门控循环单元) 按时间顺序一步步消化用户行为序列,把“兴趣演化”本身变成可建模、可预测的过程。
具体来看,DIEN 通常使用两层 GRU:第一层把行为序列编码成“逐时刻的兴趣状态”;第二层则是带注意力更新门的 GRU(AUGRU),用候选商品与每个时刻兴趣状态的相似度作为“注意力门”,控制该时刻兴趣状态往下一时刻传递的比例。上面那份“兴趣状态”不仅服务最终预测,还要通过辅助损失被“小考”逼着往真实后续行为上靠。
DIEN 通过这套“有顺序、有门控、有注意力”的演化机制,让模型不仅知道“朋友逛过什么”,更能理解“他的兴趣如何一步步迁移至今”——这是捕捉长周期兴趣漂移的关键。
- e_t(第 t 个行为的嵌入向量)时刻 t 用户点击/购买的商品向量,对应“第 t 站逛的店”。
- h_{t-1}(上一时刻的兴趣状态)GRU 内部的隐藏状态,是压缩了此前所有行为信息的“兴趣摘要”。就像你在每逛完一家店后,脑中留下的“他目前可能喜欢什么”的最新印象。
- u_t(该时刻的更新门)决定“新信息占多少、旧记忆留多少”。数值越大,新行为越能覆盖旧印象,兴趣发生明显转向。
- a_t(注意力权重)候选商品 $\displaystyle v_c$ 与该时刻兴趣状态 $\displaystyle h_t$ 的相似度,对更新门做缩放。它把兴趣演化“按住重点”——如果这个时刻的兴趣与当前候选无关,就不会被放大。
- \tilde{h}_t(候选状态)由 GRU 根据当前输入和上一状态生成的“临时新状态”。
- \odot(逐元素相乘)与加权插值更新门在 0~1 之间逐维度地决定“旧记忆”与“新信息”各保留多少。最终兴趣状态 $\displaystyle h_t$ 是旧状态与新状态的加权融合——就像一张不断叠加新痕迹、又被记忆擦除旧印象的草稿纸。
辅助损失与训练
训练深层的 GRU 有一个常见痛点:当序列很长时,反向传播的梯度要穿过许多时间步,早期行为对最终预测的“贡献信号”会被逐渐稀释(梯度消失)。你想象一条很长的传话游戏:第 1 个人的话传到第 50 个人时,早已面目全非。如果只在最后一步(预测点击率时)计算损失,那么前几十个时刻的 GRU 状态很难被有效监督。
DIEN 的解决办法,是加上一个辅助损失(auxiliary loss):在每个时间步 t,用当前兴趣状态 $\displaystyle h_t$ 去预测“用户下一个真实行为 $\displaystyle e_{t+1}$”,并让它与负样本 $\displaystyle e'_{t+1}$ 做二分类。这相当于在每个传话节点都设置一道“小考”:如果你真的理解了当前兴趣,你应该能猜出他下一步会看什么。预测不准,就惩罚;预测对了,就奖励。最终总损失 = 目标损失 + 辅助损失:
辅助损失像一位在长廊里每隔五米设一个“检查点”的教练,让 GRU 每一步都保持“对兴趣的清醒理解”,而不是把全部赌注压在最后一步。
\displaystyle L = L_{\mathrm{target}} + \lambda \cdot L_{\mathrm{aux}},\qquadL_{\mathrm{aux}} = -\sum_{t}\left[\log\sigma(h_t^{\top} e_{t+1}) + \log(1-\sigma(h_t^{\top} e'_{t+1}))\right]- 目标损失 L_target最终“点击/未点击”预测的交叉熵,它是全局方向——判断“用户会不会点这个商品”。
- 辅助损失 L_aux每个时间步的“小考”损失总和,把“预测下一步行为”作为中间监督信号。
- σ(h_t^{\top} e_{t+1})(正样本得分)当前兴趣状态与真实下一行为的匹配度。匹配度高意味着 GRU 状态捕捉到了真实兴趣走向。
- σ(h_t^{\top} e'_{t+1})(负样本得分)当前兴趣状态与随机负样本的匹配度。负样本是随机抽的一个无关商品,相当于“你猜他下一步会看这本书?——不,他没看”。
- λ(辅助损失权重)控制小考分数在总成绩中占多大比例。通常取 0.1~0.5 之间。λ 过大,模型只顾“逐句预测”忽略最终目标;过小,辅助监督形同虚设。
- 求和 Σ_t把所有时间步的小考分数加起来——每个时间步都不能掉队。
长序列建模
工业界用户行为序列的真实长度,常常长到让人无奈:一个活跃用户一个月可能产生数百乃至上千条行为。如果把所有历史行为都送入 DIN/DIEN,计算量会呈线性爆炸。更糟的是,大部分历史行为与当前候选无关——翻出他一年前浏览过的 300 件夹克,并不能帮他判断今天是否点击这款耳机。但这些“无关行为”仍会参与注意力计算,就像你为了回忆朋友喜欢的礼物,把十年前的琐碎片段全部在脑中过一遍——既费时又摸不到重点。
长序列建模的核心思路是“稀疏采样 + 关键信号保持”。常用做法包括:按时间步长(如每 d 条行为采样一条)均匀抽样,或根据候选商品类别做分桶采样——保留与候选同类的行为,压缩异类行为。这样序列长度从“一万”降到“一百”,注意力计算量大幅下降,而真正相关的信号(同款、同类目行为)被保留下来。更有甚者,可以把超长序列离线聚类成“兴趣向量”缓存起来,在线推理时直接读取,连计算都省掉。
长序列建模的要点,是在信息与成本之间找到平衡:保留高价值信号,压缩低价值噪音。这与我们的直觉一致——回忆老朋友时,你不需要把十年里每一天都细数一遍,只要抓住几个关键节点就够了。
- 原始序列 e_t用户全部历史行为,按时间排序。用集合符号表示:长度为 T 的序列。
- 步长 d每隔 d 个行为采样一个。d 越大,序列越稀疏、计算越省;但 d 过大可能跳过关键兴趣转折点。
- T'(采样后长度)从 T 压缩到约 T/d,控制计算量。
- 均匀采样不丢主信号由于注意力机制本身会“激活”高相关行为,均匀采样后只要关键行为仍被保留,模型依然能抓住重点——就像你看一部两小时的电影,即便每隔几分钟快进几秒,剧情主线依然连贯。
- 离线兴趣向量复用把超长序列预先用轻量模型压缩成一个“长期兴趣向量”,在线阶段把它作为特征拼接进 DIN/DIEN,兼顾“深度建模”与“低延迟”。
工业部署实战
把 DIN/DIEN 从论文变成线上服务,需要一整套工程链路。真实推荐系统的部署流程大致如下:特征收集 → 序列构建 → 模型打分 → 排序融合 → 在线缓存。用户每一次点击、加购、收藏、购买行为,都会被记录成一条结构化日志(商品 ID、类目、价格、品牌、场景、时间戳),离线管道把这些日志拼接成用户的“行为序列”特征。
在线推理时,系统拿到候选商品集合后,会逐一调用 DIN/DIEN 模型计算点击率。为了控制延迟,常用“多阶段召回 + 精排”架构:先用粗粒度模型从千万级商品中召回几百个候选,再用 DIN/DIEN 精排打分。模型侧也有优化空间:把“候选商品 Embedding”与“历史行为 Embedding”提前算好并放入缓存,避免在线重复计算。而 DIEN 产出的“兴趣状态向量”,也可以缓存下来作为用户的实时兴趣画像,供后续商品召回和解释推荐原因使用。
工业部署的关键是把“模型效果”与“工程成本”放在同一天平上称量:缓存、采样、级联召回,都是为了在几十毫秒内完成从“用户记忆”到“推荐结果”的全链路。
- S_u(用户行为序列特征)离线构建的用户历史行为,在线上服务中被读取并拼接成模型输入。
- c_i(候选商品)当前要打分的商品,通常来自召回阶段筛选出的候选池。
- CTR_i(点击率预估值)模型对“用户 u 会点击商品 c_i”的概率预测,是精排阶段的核心排序依据。
- sort(排序)把几百个候选按 CTR 降序排列,取 TopK 展示给用户。
- 兴趣向量缓存DIEN 实时产出的兴趣状态向量是“动态画像”——它跟随行为序列更新,比静态画像(性别、年龄)更能反映“此刻的兴趣”。
AI 应用场景
电商首页信息流推荐
阶段:召回 → 粗排 → 精排 → 重排
解决的问题:传统协同过滤只能捕捉“用户与商品”的静态相似,无法处理“用户半年前爱游戏、最近转摄影”的兴趣漂移。DIN/DIEN 利用用户行为序列和候选商品注意力,让每个用户在每次请求时都获得动态演化的兴趣向量,显著提升点击率。
具体案例:某头部电商平台将 DIEN 部署在首页猜你喜欢信息流。用户前一天搜索“露营帐篷”后,当天首页便高频推荐帐篷、睡袋、营地灯。系统同时依据辅助损失训练出的兴趣状态,判断“该用户正在从摄影转向露营”,从而提前两周推荐露营装备,活动期间 CTR 提升 12%。
广告点击率预估平台
阶段:广告召回 → 精排打分 → 竞价排序
解决的问题:广告场景的候选商品变化极快,用户历史行为却可能来自完全不同的品类。DIN 的注意力机制能“按需激活”与当前广告相关的那部分历史,避免无关历史干扰 CTR 预估,提高广告竞价系统的 GMV 与 ROI。
具体案例:某程序化广告平台对某美妆品牌投放“精华液”广告。传统模型因为用户近期点击过“游戏配件”而稀释了对美妆的兴趣,导致 CTR 偏低。引入 DIN 后,模型在预估该广告时自动放大用户三个月前的美妆行为权重、压低游戏行为权重,CTR 提升 8.5%,单次点击成本下降 5%。
视频社区的兴趣演化推荐
阶段:内容召回 → 兴趣序列建模 → 多样性调控
解决的问题:视频社区用户的兴趣变化非常快,且伴随着“刷新即换兴趣”的高频漂移。DIEN 通过 GRU 记录兴趣演化轨迹,使推荐系统既能捕捉短期兴趣的爆发,又能维持中期兴趣的连贯性,避免推荐内容过度单一。
具体案例:某短视频平台发现用户在一周内从“篮球教学”逐渐迁向“户外徒步”。使用 DIEN 后,系统在用户观看第三条徒步视频时便检测到兴趣拐点,开始混入更多徒步与装备内容,用户次日留存率提升 3.2%,人均观看时长提升 6 分钟。
Python 演示
import numpy as np def softmax(x): """稳定的 softmax 归一化""" e_x = np.exp(x - np.max(x)) return e_x / e_x.sum() def sigmoid(x): return 1.0 / (1.0 + np.exp(-x)) class DIN: """简化版 DIN:对历史行为做候选相关的注意力加权""" def __init__(self, embed_dim, seed=0): rng = np.random.RandomState(seed) # 行为映射矩阵与候选映射向量(简化版,真实模型是学习的) self.Wq = rng.randn(embed_dim, embed_dim) * 0.1 def attention_weights(self, hist_embeds, cand_embed): """返回每个历史行为对候选的注意力权重""" cand_vec = self.Wq @ cand_embed.reshape(-1, 1) # (D,1) scores = hist_embeds @ cand_vec # (N,1) return softmax(scores.flatten()) def user_embed(self, hist_embeds, cand_embed): """加权求和得到用户向量""" a = self.attention_weights(hist_embeds, cand_embed) return (a.reshape(-1, 1) * hist_embeds).sum(axis=0) class GRUCell: """单步 GRU 单元""" def __init__(self, dim, seed=0): rng = np.random.RandomState(seed) self.dim = dim self.Wz = rng.randn(dim, dim) * 0.1 self.Uz = rng.randn(dim, dim) * 0.1 self.bz = np.zeros(dim) self.Wh = rng.randn(dim, dim) * 0.1 self.Uh = rng.randn(dim, dim) * 0.1 self.bh = np.zeros(dim) def forward(self, x, h_prev): z = sigmoid(self.Wz @ x + self.Uz @ h_prev + self.bz) h_tilde = np.tanh(self.Wh @ x + self.Uh @ (z * h_prev) + self.bh) return (1 - z) * h_prev + z * h_tilde class DIEN: """简化版 DIEN:GRU 兴趣演化 + 辅助损失""" def __init__(self, dim, seed=0): self.gru = GRUCell(dim, seed) self.din = DIN(dim, seed + 1) def evolve_interests(self, seq_embeds): """按顺序消化行为序列,返回每个时刻的兴趣状态""" h = np.zeros_like(seq_embeds[0]) h_list = [] for e in seq_embeds: h = self.gru.forward(e, h) h_list.append(h) return np.stack(h_list) def aux_loss(self, h_list, next_embeds, neg_embeds): """辅助损失:用 h_t 预测 e_{t+1} 与负样本""" loss = 0.0 for h_t, e_pos, e_neg in zip(h_list[:-1], next_embeds, neg_embeds): pos_logit = h_t @ e_pos neg_logit = h_t @ e_neg loss += -np.log(sigmoid(pos_logit) + 1e-9) loss += -np.log(1 - sigmoid(neg_logit) + 1e-9) return loss if __name__ == "__main__": dim = 8 T = 5 rng = np.random.RandomState(42) seq = rng.randn(T, dim) # 5 个历史行为向量 cand = rng.randn(dim) # 候选商品向量 din = DIN(dim) weights = din.attention_weights(seq, cand) print("DIN 注意力权重:", np.round(weights, 3)) print("权重之和:", round(weights.sum(), 6)) u_vec = din.user_embed(seq, cand) print("用户向量:", np.round(u_vec, 3)) dien = DIEN(dim) h_states = dien.evolve_interests(seq) print("兴趣状态矩阵形状:", h_states.shape) pos = rng.randn(T - 1, dim) neg = rng.randn(T - 1, dim) loss = dien.aux_loss(h_states, pos, neg) print("辅助损失:", round(loss, 4))
softmax(x)对注意力分数做归一化,保证权重和为 1,对应“蛋糕只有一块”的思想。self.Wq @ cand_embed对候选向量做线性变换,学习“候选如何与历史对话”。hist_embeds @ cand_vec计算每个历史行为与候选的相似度得分(点积)。weighted sum权重乘以历史向量再累加,得到“被激活”的用户向量。GRUCell.forward完成一次 GRU 状态更新,由更新门控制旧记忆与新信息的融合比例。evolve_interests按时间顺序处理序列,生成逐时刻兴趣状态。aux_loss用当前兴趣状态预测下一真实行为,并对照负样本计算二分类损失。
常见误区
误区以为 DIN 学到的注意力权重是行为本身的固有属性,权重高的历史永远比权重低的历史关键。于是有人试图直接离线统计“哪些行为平均权重高”作为用户长期偏好。
正解DIN 的注意力权重是“行为与候选商品”之间的交互结果。同一段游戏历史,在候选为“游戏手柄”时权重可能高达 0.8,在候选为“露营帐篷”时却可能只有 0.1。权重不是行为自身的标签,而是“这段记忆对当前决策的相关性”。就像“朋友去过游戏店”这件事,在挑游戏礼物时是重要线索,在挑帐篷时却几乎无关。
为何常见:人脑容易把“印象深刻的记忆”当作长期重要特征,但 DIN 的设计哲学恰恰是“没有一个历史行为永远重要”——重要性永远相对于当下的候选而存在。
误区认为辅助损失只是锦上添花的小技巧,去掉它模型照样能训练,顶多效果差一点点。
正解辅助损失对 DIEN 的 GRU 极其关键。没有辅助损失,GRU 的梯度要穿过几十个时间步才能到达早期状态,极易出现梯度消失,导致早期行为对最终预测几乎没有贡献。辅助损失在每个时间步提供“局部监督信号”,相当于在每个传话节点都设置小考,使 GRU 每一步都能学到“当前兴趣状态”。实践中去掉辅助损失,DIEN 在长序列上的 AUC 往往明显下降。
为何常见:很多初学者把“辅助损失”类比于 dropout 或 L2 正则化,事实上它是用来解决深层循环网络“梯度传播困难”的结构性设计,而不是防止过拟合的手段。
误区认为模型越复杂效果越好,因此推荐系统上线时直接用 DIEN 替换 DIN 就能提升指标。
正解DIEN 引入 GRU 与辅助损失,确实能捕捉时序演化信息,但也带来更高的计算量、更难的训练调参和延迟成本。在行为序列较短、用户兴趣相对稳定的场景(如某些低频消费品类),DIN 已经足够;在长序列、兴趣漂移明显的场景,DIEN 的优势才体现出来。工业界往往先用 DIN 做基线,再用 DIEN 做增量实验,根据线上收益决定是否升级。
为何常见:技术人容易迷信“更复杂 = 更先进 = 效果更好”,但工程上永远是“效果-成本-复杂度”三方权衡。
误区认为长序列建模就是把用户历史随机抽样砍短,反正注意力机制会忽略低相关行为,丢了也无所谓。
正解随机丢弃是危险的做法——它可能把“模型需要的高价值行为”直接丢掉,尤其是那些低频但关键的信号(如购买、收藏行为)。工业界的长序列策略是“有偏采样”:按行为类型加权(购买 > 加购 > 点击)、按时间衰减(近期行为保留率更高)、按候选相关性分桶(同品类行为全保)。无差别随机采样会让模型在长尾兴趣上表现明显下降。
为何常见:因为注意力机制看起来能“自动聚焦重要信息”,初学者容易误以为输入数据的质量不再重要,忽略了“模型只能从被喂进去的数据里学习”这一根本事实。
误区认为 DIN/DIEN 产出的用户兴趣向量只服务于 CTR 打分,不能直接用于业务决策。
正解DIEN 每个时间步产出的兴趣状态向量可以被缓存下来,作为用户的“实时兴趣画像”——它比静态标签(年龄、性别)更能反映“此刻的兴趣演化方向”。这些向量可以用于召回(向量相似检索)、人群分组、推送文案个性化,甚至作为“用户为什么看到这些推荐”的解释依据。兴趣向量的复用,是把模型效果扩散到全链路的关键手段。
为何常见:工程同学常把模型视作一个“黑盒打分器”,忽视中间表征的泛化价值。事实上,Embedding 和隐藏状态本身就是高价值资产,是连接“模型”与“业务”的桥梁。
面试题
Q1. DIN 的核心创新是什么?
- A.引入 GRU 建模行为时序
- B.用注意力机制动态激活历史行为← 正确答案
- C.使用辅助损失稳定训练
- D.提出长序列采样策略
答案:B。DIN 的核心是“候选商品引导的注意力权重”,让历史行为按与候选的相关性被加权激活。GRU、辅助损失属于 DIEN 的贡献;长序列采样属于工程优化,不是 DIN 的理论创新点。
Q2. 在 DIN 中,注意力权重的主要作用是?
- A.对候选商品特征做归一化
- B.决定历史行为向量的保留比例
- C.对用户历史行为进行加权求和← 正确答案
- D.对时间步进行降采样
答案:C。DIN 将注意力权重乘以对应行为向量并累加,得到用户向量。它不改变候选特征,也不做时间降采样。保留比例由 GRU 的更新门控制,属于 DIEN 的机制。
Q3. 平均池化的主要缺陷是?
- A.计算开销过大
- B.无法区分行为先后顺序
- C.将不同兴趣等权混合,稀释关键信号← 正确答案
- D.无法处理高维稀疏特征
答案:C。平均池化把所有行为向量求平均,导致强兴趣被弱兴趣“稀释”。它也确实不区分顺序,但这并非平均池化被 DIN 取代的主因;主因是对不同候选无法差异化地利用历史行为。
Q4. DIEN 相比 DIN 新增了哪些机制?
- A.注意力权重
- B.GRU 序列建模← 正确答案
- C.辅助损失← 正确答案
- D.Softmax 归一化
答案:BC。DIEN 在 DIN 注意力池化基础上,引入 GRU 按时间顺序建模行为序列,并用辅助损失对每个时间步的兴趣状态进行监督。注意力权重与 Softmax 在 DIN 中已有。
Q5. 辅助损失的主要作用是?
- A.防止模型过拟合
- B.缓解梯度消失,提供逐时间步监督← 正确答案
- C.加速模型收敛
- D.降低模型复杂度
答案:B。辅助损失对每个时间步的隐藏状态与后续真实行为计算二分类损失,相当于在每个时间步给模型“小考”,让梯度不必从最终损失一路穿回序列起点,从而缓解深层 GRU 的梯度消失。
Q6. AUGRU 中注意力权重 a_t 直接作用于?
- A.候选商品的 Embedding
- B.更新门 u_t← 正确答案
- C.重置门 r_t
- D.候选状态 h_t 的梯度
答案:B。AUGRU 用注意力权重缩放 GRU 的更新门:$u'_t = a_t \cdot u_t$。它通过控制“新信息覆盖旧记忆”的力度,让候选商品决定哪些时刻的兴趣演化被重点保留。
Q7. 长序列建模的常用策略包括?
- A.按时间步长均匀采样← 正确答案
- B.按行为类型加权采样← 正确答案
- C.随机丢弃一半历史
- D.用轻量模型压缩成兴趣向量← 正确答案
答案:ABD。均匀采样、按行为类型加权采样、以及离线压缩成兴趣向量缓存,都是工业界控制长序列计算量并保留关键信号的手段。随机丢弃没有偏好,容易丢失购买、收藏等低频但高价值的信号。
Q8. 工业推荐系统中 DIN/DIEN 通常用于哪个阶段?
- A.候选召回
- B.精排打分← 正确答案
- C.离线特征统计
- D.商品内容审核
答案:B。DIN/DIEN 的输入是用户行为序列与候选商品,输出是点击率概率,适合作为精排阶段的 CTR 模型。召回阶段更关注效率,通常使用双塔向量检索;统计与审核也和 CTR 打分模型属于不同环节。
Q9. 用户行为序列中的 Embedding 表示可以理解为?
- A.用户的地理位置编码
- B.商品在兴趣空间中的稠密向量坐标← 正确答案
- C.模型训练的随机噪声
- D.用户的唯一身份标识
答案:B。Embedding 将离散的商品 ID 或行为映射为稠密连续向量,其坐标刻画商品在“兴趣空间”中的语义位置。它是 DIN/DIEN 计算相似度和注意力的基础。
Q10. 关于 DIN 与 DIEN 的说法正确的是?
- A.两者都属于召回阶段的经典模型
- B.DIN 不显式建模行为时序,关注候选相关激活← 正确答案
- C.DIEN 用辅助损失稳定长序列训练← 正确答案
- D.注意力权重与候选商品无关
答案:BC。DIN 用候选相关注意力对无序行为序列加权;DIEN 通过 GRU 建模时序并用辅助损失提供逐时间步监督。两者均属于精排 CTR 模型,而非召回模型;DIN 的注意力权重是由候选商品决定的,并非与候选无关。