真实面经题目 · 原创解析
DSIN 中特征是如何做交叉的?
DSIN 的特征交叉不是一句“把稠密特征和稀疏特征拼接后送 DNN”就能解释清楚的。它的核心是先把用户历史行为按会话切分,在会话内用自注意力抽取局部兴趣,在会话间建模兴趣演化,再用目标物品对各个会话兴趣做激活。稠密特征通常经过归一化、分桶或线性投影后与稀疏 embedding 融合,交叉既包括注意力中的目标相关交互,也包括 DNN、乘积、差分、CrossNet 等可选显式交叉。
真实面经题目 · 原创解析
DSIN 的特征交叉不是一句“把稠密特征和稀疏特征拼接后送 DNN”就能解释清楚的。它的核心是先把用户历史行为按会话切分,在会话内用自注意力抽取局部兴趣,在会话间建模兴趣演化,再用目标物品对各个会话兴趣做激活。稠密特征通常经过归一化、分桶或线性投影后与稀疏 embedding 融合,交叉既包括注意力中的目标相关交互,也包括 DNN、乘积、差分、CrossNet 等可选显式交叉。
面试里我会先把概念拆开:DSIN 里的交叉主要发生在三个层次。第一层是行为序列内部的交叉,用户的 item、category、行为类型、时间间隔等特征会先变成 embedding 或数值向量,然后按 session 切分;同一 session 内通过 self-attention 建模行为之间的相关性,这相当于做了会话内的兴趣交叉。第二层是 session 之间的交叉,模型用序列结构建模不同 session 兴趣的演化,捕捉短期兴趣和更长期偏好的关系。第三层是目标物品与用户兴趣的交叉,目标 item embedding 会和每个 session interest 做 attention 或 DIN 风格的激活,例如拼接、差分、元素乘积后过 MLP。稠密特征不能原样粗暴拼接,通常要做 log、标准化、截断、缺失值处理,必要时用线性层投影到 embedding 空间;静态稠密特征放入最终 DNN,行为级稠密特征要对齐到每条行为,session 级稠密特征则对齐到每个 session。最后再把目标物品、用户画像、上下文、激活后的兴趣向量和稠密特征融合,由 DNN 学习隐式高阶交叉。
这个问题问的不是普通推荐模型里特征工程怎么拼,而是 DSIN 架构下稠密特征如何接入以及交叉发生在哪里。回答时要区分原始 DSIN 的核心机制和工程实现中的增强做法:原始思想重点在行为 session 建模、会话内兴趣抽取、会话间兴趣演化和目标激活;工程里可以额外加入数值特征投影、显式交叉层或统计特征,但不能把这些都说成论文天然包含。
DSIN 的第一步是把用户历史行为按时间间隔或业务规则切成多个 session。每条行为通常由 item id、类目、品牌、行为类型、时间等稀疏或稠密字段组成,稀疏字段查 embedding,稠密字段先归一化或投影,再与行为 embedding 融合。这样每个 session 不是一个简单 ID 列表,而是一组带有语义、时间和行为强度信息的向量序列。
会话内的特征交叉主要由 self-attention 完成。它让同一 session 中的不同行为两两建立相关性,例如用户连续浏览相近类目、先收藏后点击、或在短时间内对某类商品反复交互。这里的交叉不是人工构造 item_id_category 这种组合特征,而是在 embedding 空间里通过注意力权重学习行为之间的依赖关系,从而得到更稳定的 session interest 表示。
会话内兴趣抽取完成后,每个 session 会得到一个或多个兴趣向量,接下来需要建模 session 之间的变化。DSIN 通常会用序列建模结构捕捉兴趣演化,表达用户从早期兴趣到近期兴趣的迁移。这个阶段的交叉对象不再是单条行为,而是不同时间片的兴趣表示,能处理兴趣漂移、周期性兴趣和短期强意图之间的关系。
CTR 预测最终关心的是当前目标物品是否会被点击,所以 DSIN 需要把 target item 与各个 session interest 做交互。常见做法是用 attention 或 DIN 风格局部激活,输入可以包含目标向量、兴趣向量、二者差分、元素乘积等,再过小 MLP 得到权重。这样模型不是抽象地表示用户喜欢什么,而是判断当前候选物品与哪些历史会话兴趣最匹配。
稠密特征进入 DSIN 前要先处理尺度和分布,例如曝光时间、价格、历史点击率、用户活跃度、行为间隔、session 长度等通常需要 log1p、标准化、截断、分桶或缺失值标记。静态稠密特征可以和用户、物品、上下文 embedding 一起进入最终 DNN;行为级稠密特征则要对齐到每条行为;session 级稠密特征更适合拼到 session interest 后再参与目标激活。
DSIN 里的交叉可以分成隐式交叉和显式交叉。隐式交叉来自 self-attention、序列网络、target attention 和最终 DNN,它们通过参数学习高阶组合关系;显式交叉则是工程上额外加入的乘积、差分、FM、DCN 或特征分桶组合。回答时要强调直接拼接只是融合动作,本身不等于充分交叉,真正的交叉要看后面是否有注意力、乘积结构或非线性网络。
要看特征语义。用户年龄、价格、全局统计、上下文时间这类静态或样本级稠密特征通常放在最终融合层;停留时长、行为间隔、行为强度这类行为级稠密特征应对齐到每条历史行为;session 时长、session 长度、距当前时间等则更适合接到 session interest 层。
核心架构不依赖大量人工组合特征,它更强调通过 session 内 self-attention、session 间演化和 target activation 自动学习交互。但在工业实现里,常会保留一些强业务先验的统计交叉或分桶交叉,作为模型输入的补充。
全部 concat 后过 MLP 理论上可以学习交叉,但对长行为序列和多兴趣用户不够高效,且会弱化时间结构和目标相关性。DSIN 的价值在于先按 session 提炼兴趣,再让目标物品选择相关兴趣,结构归纳偏置更强。
DIN 主要让 target item 与每条历史行为做 attention,交叉粒度偏行为级。DSIN 会先在 session 内做行为间交叉,再在 session 间建模兴趣演化,最后让 target item 与 session interest 交叉,因此能表达更清晰的短期意图块。
连续数值可以直接归一化后输入 DNN,也可以经线性层投影;如果数值分布强非线性或业务上有明显区间含义,可以先分桶再 embedding。关键是保持训练和线上一致,并避免数值尺度压过稀疏 embedding。