Skip to content

AI 第二章 数据与特征工程(AI-13 ~ AI-20) ​


AI-13. 商品 ID 有 1000 万个取值,One-Hot 直接爆炸(高基数类别) ​

【考察内容】高基数类别特征是推荐/广告岗必考题

【题目】推荐模型的特征里有商品 ID,取值上千万个,One-Hot 后维度爆炸、内存不够、还学不到泛化。怎么处理高基数类别特征(目标编码/频次编码/Embedding/哈希)?目标编码怎么防泄漏?

【参考答案】

  1. 问题:高基数 One-Hot → 维度爆炸(稀疏、内存爆炸、无泛化);

  2. 处理方法:

    • 统计特征(目标编码 Target Encoding):类别内目标均值(如该商品的 CTR),配合平滑(加入全局先验:(count*ctr + prior*α)/(count+α))防过拟合——推荐系统高频做法;注意:用 K 折统计防泄漏;
    • 频次编码(Count Encoding):类别的出现次数(商品热度)——简单有效;
    • 嵌入(Embedding):把 ID 映射为稠密向量(DNN 的 embedding 层/Word2Vec 式学习)——深度模型标准做法;
    • 哈希编码(Feature Hashing):哈希到固定维度(有冲突,需多哈希减少碰撞)——大规模稀疏场景;
    • 层次聚合:叶子类别聚合到父类(品牌→类目);
    • 保留高频、低频合并为“其他”(长尾治理);
  3. 选型:树模型用统计/频次编码;深度模型用 Embedding;LR 系用哈希或目标编码;

  4. 注意:目标编码必须在训练集内做 K 折统计(否则标签泄漏)。

  5. 关键公式: One-Hot 后维度=基数;千万 ID 直接爆炸。目标编码:ê=(sum_y + α·m)/(n+α)(加权均值防过拟合)。

  6. 排查步骤: 高基数 ID → 目标/频次编码或 Embedding;编码必须时间切分防止泄漏。线上-离线:新 ID 线上未知,必须有 OOV(未知)桶,否则特征全 0。

【原理溯源】

  • One-Hot 为何在千万级 ID 上不可行? 稀疏维度=类别数,内存与计算随基数线性爆炸;更致命的是每个 ID 几乎只有一个样本,模型学的是记忆不是泛化——新 ID 完全无法编码。
  • 目标编码为什么有效? 把 ID 压成“该类别的历史 CTR”这一标量,既降维又注入了与标签直接相关的统计信号。小样本类别的均值不可靠,所以要向全局先验收缩(平滑)。
  • 目标编码为何必须 K 折防泄漏? 若用全量均值编码,样本自己的标签参与了自己特征的计算——模型“看到答案”。K 折:每折的编码只用其他折的统计量。
  • Embedding 为何是深度模型标准解? 把 ID 映射到低维稠密空间,语义相近的 ID(相似商品)向量靠近,新样本可由相似旧样本泛化;同时支持在模型内端到端训练。

【选型判断树】

高基数类别(如商品 ID 千万级):
1. 模型类型
   ├─ 深度模型 → Embedding(首选)
   ├─ 树模型 → 目标编码 / 频次编码
   └─ LR 系 → 哈希编码 或 目标编码
2. 样本量
   └─ 类别样本极少 → 平滑目标编码或低频合并为“其他”
3. 泄漏
   └─ 目标编码必须 K 折
4. 内存
   └─ One-Hot/笛卡尔积直接排除

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“千万级 ID 不能 One-Hot,四条路:目标/频次/Embedding/哈希”
0:30–2:00四方案各自机制与适用模型
2:00–3:30目标编码细节平滑公式、K 折防泄漏
3:30–4:30选型树→统计;深度→Embedding;LR→哈希
4:30–5:00收尾“先想清楚模型,再选编码;K 折是红线”

【关键数字】

参数经验值说明
Embedding 维度8–256(ID 常用 16–64)视基数与样本
目标编码平滑 α10–100越大越偏向全局先验
低频阈值出现<5–20 次合并长尾治理
哈希桶按基数取 5–10 倍:千万 ID → 2^26–2^27(2^24 仍有约 25% 的 ID 与他人同桶,2^20 高达 89.5%)冲突率=(N−占用桶)/N;冲突不是「学不到」而是「学错」——不同 ID 共用一列权重、互相污染,LR 会被带偏;内存不足改用 sign-hash 多桶(2 个哈希、符号相加),别靠砍桶数省内存
K 折5目标编码防泄漏

【追问链】(三层)

L1|“为什么目标编码要平滑?” → 小样本类别的均值不可靠,向全局先验收缩,避免极端值。

L2|“目标编码不 K 折会怎样?” → 标签泄漏:样本自己的标签进入了它的特征,离线虚高、上线崩。

L3|“树模型和深度模型分别选什么编码?” → 树模型:目标/频次编码(已有统计意义);深度模型:Embedding(端到端学表征)。

【评分标准】

档位答案特征
60 分知道 One-Hot 爆炸,会说 Embedding
80 分四方案齐全;知道目标编码要平滑
95 分K 折防泄漏机制;按模型选型;低频治理;Embedding 泛化原理

【关联题】

  • 同一知识簇: AI-14(编码选型)、AI-19(Embedding)、AI-52(双塔)
  • 泄漏关联: AI-11

【自测】

  1. 目标编码为什么要 K 折? 参考答案: 防止样本自己的标签参与自己的特征计算(泄漏)。
  2. 树模型处理高基数 ID 首选? 参考答案: 目标编码或频次编码,配合低频合并。
  3. Embedding 相对 One-Hot 的核心优势? 参考答案: 降维+语义泛化,新/相似 ID 可映射到相近向量。

AI-14. 城市编码成 0/1/2,模型学出了“城市大小顺序”(编码选型) ​

【考察内容】编码选型是特征工程高频题

【题目】有工程师把“城市”直接编码成 0、1、2、3 喂给模型,结果模型学到了“城市 3 比城市 1 大”这种不存在的顺序关系。One-Hot 和 Label Encoding 分别适合什么类型(有序/无序)?对树模型和线性模型的影响有何不同?

【参考答案】

  1. One-Hot:每个取值一个 0/1 维度——无序类别正确选择(城市、颜色、品类),不引入虚假序关系;代价:维度膨胀(高基数不行);

  2. Label Encoding:取值映射为整数 0、1、2...——只适合有序类别(学历:初中<高中<大学、满意度:低<中<高);对无序类别会引入虚假的序/距离关系(模型误以为“红(1)<蓝(2)<绿(3)”且差距相等),树模型尚可容忍(切分无单调假设),线性/距离模型有害;

  3. 补充:有序编码(Ordinal Encoding)与 Label 本质同(但明确表达顺序);目标编码/频次编码更适合无序高基数(见 13 题);

  4. 实践:无序低基数→One-Hot;无序高基数→目标/频次/Embedding;有序→Ordinal;

  5. 树模型对无序类别也可直接用“类别序号”(LightGBM category 特征原生支持,按类别分组统计最优切分)。

  6. 关键公式: 独热/多热消除序关系;目标编码引入统计量;Embedding 学习向量。

  7. 排查步骤: 类别是否有序?无序则禁止 0/1/2 整数编码。线上-离线:编码表版本与线上不一致会导致同一城市映射不同——要版本化。

【原理溯源】

  • 为什么 Label Encoding 给无序类别会造假序? 整数隐含了“大小”和“等距”。线性模型会学出“城市越大风险越高”的单调关系;KNN 会把编号 1 和 2 当近邻——全是伪信号。
  • 树模型为何“尚可容忍”? 树按阈值切分,不要求序关系正确,只关心“这个子集是否更纯”。LightGBM 的类别特征处理是按类别统计最优分组,不是按数值大小。
  • One-Hot 的代价与陷阱是什么? 维度随类别数膨胀;完全共线(所有维度之和=1),线性回归要去掉一列(哑变量陷阱)。
  • 有序类别为什么必须用 Ordinal? “学历”真的有序,One-Hot 会丢掉序信息,模型无法利用“大学>高中>初中”的单调性。

【选型判断树】

类别特征怎么编码?
1. 是否有序?
   ├─ 是(学历/星级/满意度)→ Ordinal Encoding
   └─ 否 → 下一步
2. 基数
   ├─ 低基数(<20)→ One-Hot
   └─ 高基数 → 目标/频次/Embedding(见 AI-13)
3. 模型
   ├─ 线性/距离 → 严格 One-Hot 或有序 Ordinal
   └─ 树/LightGBM → 可用原生 category

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“无序 One-Hot,有序 Ordinal——Label 不能乱用”
0:30–2:00两种编码One-Hot vs Label 的适用与代价
2:00–3:30模型差异线性/距离受害;树可容忍/原生支持
3:30–4:30实践规则低基数 One-Hot;高基数统计/Embedding
4:30–5:00收尾“先问有没有序,再选编码”

【关键数字】

参数经验值说明
One-Hot 基数上限通常 <20–50再大考虑统计/Embedding
哑变量线性模型去掉一列防完全共线
LightGBM category原生支持无需手动 One-Hot
有序编码0,1,2… 按真实序非任意 Label

【追问链】(三层)

L1|“为什么 One-Hot 后共线性?” → 所有取值维度之和为 1,完全线性相关,可去掉一列(哑变量陷阱)。

L2|“树模型为什么可以不用 One-Hot?” → 树按类别分组统计增益(LightGBM category),不要求数值序关系。

L3|“高基数无序类别,树模型怎么做?” → 目标编码/频次编码,或 LightGBM 原生 category(注意过拟合与正则)。

【评分标准】

档位答案特征
60 分知道无序该 One-Hot
80 分有序用 Ordinal;知道树与线性差异
95 分讲清假序/假距离机制;哑变量;LightGBM 原生 category;与高基数题衔接

【关联题】

  • 同一知识簇: AI-13(高基数)、AI-08(缩放)
  • 模型衔接: AI-07、AI-12

【自测】

  1. “颜色”用什么编码? 参考答案: 无序低基数 → One-Hot。
  2. “学历”用什么? 参考答案: Ordinal Encoding,保留真实顺序。
  3. Label Encoding 给“城市”有什么害? 参考答案: 引入虚假序/等距,线性与距离模型学到伪信号。

AI-15. 单个特征都没用,组合起来却有效(特征交叉) ​

【考察内容】特征交叉是搜广推核心考点

【题目】特征分析发现:单独看“性别”“类目”都和点击相关性很弱,但“女性×美妆类目”的组合特征非常强。怎么构造交叉特征?人工构造、笛卡尔积、模型自动交叉(FM/GBDT+LR/深度模型)各怎么做?

【参考答案】

  1. 思想:单一特征线性不可分/相关性弱,交叉后能表达组合效应(如“男性×体育类目”才显著);

  2. 构造方法:

    • 人工/业务交叉:业务先验(年龄×类目、城市×时段)——可解释、有效;
    • 笛卡尔积组合:两两类别组合成新类别(One-Hot 后再交,如 城市×品类),维度会爆炸需控制;
    • 数值特征运算:加减乘除/比率(价格/收入=价格敏感度)、分桶后交叉(年龄分桶×城市);
    • 模型自动交叉:树模型:自动分裂即隐式交叉(GBDT 的叶子节点可当交叉特征喂给 LR——GBDT+LR);FM/FFM:二阶特征交互自动学习(稀疏特征场景);深度模型:Wide&Deep(Wide 记忆人工交叉+Deep 自动学习高阶交互)、DCN(显式特征交叉层);
  3. 交叉质量:交叉后看增益(特征重要性/线上 A/B);避免过拟合(交叉维度爆炸时用正则/降频);

  4. 经典范式:GBDT 特征 + LR(GBDT 产出的叶子路径作为交叉特征输入 LR)——树模型负责高阶交互,LR 负责线性拟合。

  5. 关键公式: 交叉特征 x_i·x_j 或哈希交叉;FM:ŷ=w0+Σwixi+ΣΣ<vi,vj>xixj,用隐向量内积近似交叉权重。

  6. 排查步骤: 先业务可解释交叉 → 树模型自动交叉 → FM/DeepFM 自动学。线上-离线:交叉特征爆炸要控制维度;在线计算交叉的 RT 要纳入预算。

【原理溯源】

  • 为什么单特征弱、交叉强? 标签是条件分布:P(click|女性,美妆) 高,但 P(click|女性) 与 P(click|美妆) 的边际被其他类目/性别稀释。交互项捕捉的是条件效应,不是主效应。
  • FM 的核心公式在做什么? 用隐向量内积近似交叉权重 w_ij,把 O(n²) 个交叉参数降到 O(nk),既自动学二阶交互,又解决了稀疏交叉的参数不可估计问题。
  • Wide&Deep 为何并存? Wide(含人工交叉)记忆历史共现,泛化差但精准;Deep 自动学未见组合,泛化强。两者互补。
  • 笛卡尔积为何危险? 维度 = |A|×|B|,多数组合无样本,模型在空单元上过拟合。必须降频/正则/只做业务先验交叉。

【选型判断树】

要不要做交叉、怎么做?
1. 有业务先验吗?
   ├─ 有 → 人工交叉(可解释、最稳)
   └─ 无 → 交给模型
2. 模型
   ├─ LR → 必须人工/哈希交叉,或 GBDT+LR
   ├─ 树 → 隐式交叉,可补业务交叉
   ├─ 稀疏 CTR → FM/FFM/DeepFM
   └─ 复杂序列/多目标 → DIN/MMoE/DCN
3. 风险
   └─ 组合基数爆炸 → 降频、只保留高频组合、加正则

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“边际弱≠条件弱,交叉捕捉组合效应”
0:30–2:00人工 vs 自动业务交叉、笛卡尔积、FM/GBDT+LR/DNN
2:00–3:30机制FM 隐向量;Wide 记忆 Deep 泛化
3:30–4:30风险维度爆炸、空组合过拟合
4:30–5:00收尾“先业务交叉,再模型自动交叉,控制基数”

【关键数字】

参数经验值说明
FM 隐向量维度8–64稀疏 CTR 常用
笛卡尔积保留只保留出现次数>N 的组合防空单元
GBDT+LR叶子路径作交叉特征经典工业范式
DCN 层数2–4 层高阶交叉
交叉收益看消融/A/B不是越多越好

【追问链】(三层)

L1|“Wide 和 Deep 各管什么?” → Wide 记忆历史共现(人工交叉),Deep 泛化学习未见过组合。

L2|“FM 为什么比直接 One-Hot 交叉好?” → 隐向量内积把交叉参数从 O(n²) 降到 O(nk),稀疏场景可学习。

L3|“交叉特征上线后指标没涨,可能是什么?” → 组合样本不足、与已有特征冗余、过拟合离线未泛化。先做消融与分组评估,再决定是否保留。

【评分标准】

档位答案特征
60 分知道要构造组合特征
80 分人工与模型自动两条线;提到 FM/GBDT+LR/Wide&Deep
95 分讲清条件效应 vs 边际;FM 参数压缩机制;维度爆炸与过拟合控制

【关联题】

  • 同一知识簇: AI-32(CTR 模型演进)、AI-13(高基数交叉)
  • 模型衔接: AI-12(树隐式交叉)、AI-07

【自测】

  1. 为什么要交叉特征? 参考答案: 单特征边际相关性弱,组合后条件效应强。
  2. GBDT+LR 的分工? 参考答案: 树负责高阶交互(叶子路径),LR 负责线性拟合与快速推理。
  3. 笛卡尔积最大风险? 参考答案: 维度爆炸、空组合过拟合。

AI-16. 用户刚搜过“手机”,推荐还是 3 天前的旧兴趣(实时特征) ​

【考察内容】实时特征是推荐工程高频题

【题目】用户刚搜索了“手机”,推荐流却还在推他 3 天前看过的品类——因为用的是 T+1 离线特征。为什么需要实时特征?实时/近实时/离线三级特征怎么分层?实时特征链路(行为→MQ→流计算→Redis)怎么搭?

【参考答案】

  1. 为什么要实时特征:用户行为是动态的(刚看了什么、刚搜了什么),离线特征(T+1)反映不了当下兴趣——实时特征提升时效性(点击率/转化率明显收益);

  2. 特征分类:

    • 离线特征:用户长期画像(年龄、历史兴趣分布)、物品属性——低频更新(小时/天级);
    • 近实时特征:近 5 分钟/1 小时的行为统计(浏览次数、加购数)——分钟级;
    • 实时特征:当前会话行为(刚点击的物品 ID、当前页面、停留时长)——秒级;
  3. 实时特征建设:

    • 行为事件 → MQ(Kafka)→ Flink 流式计算(窗口聚合:近 5 分钟点击次数、最近点击序列)→ 写入 Redis(特征服务);
    • 在线请求时查 Redis 实时特征 + 特征服务合并离线特征 → 送入模型;
  4. 关键点:

    • 特征一致性:离线训练用的特征定义与在线一致(同一窗口/同一口径),否则训练服务偏差(见 AI-05);
    • 特征延迟可控(秒级)、Redis 容量(特征 TTL);
    • 特征回放:记录线上特征供离线训练复现(防 skew 的核心手段);
  5. 场景:电商推荐、广告(用户刚刚搜索的关键词)、信息流(实时兴趣)。

  6. 关键公式/架构: 实时特征=流式聚合(滑动窗口统计)。特征服务 p99 预算常见 5–20ms。

  7. 排查步骤: 对齐事件时间与处理时间;检查消息延迟、窗口触发、特征存储写入延迟、缓存 TTL。线上-离线:离线用天级表、在线用分钟级流,口径不一致就是 skew。

【原理溯源】

  • 为什么 T+1 特征跟不上即时兴趣? 用户意图是短时的:刚搜“手机”意味着此刻想买手机。三天前的兴趣分布无法表达“此刻”。实时特征把“用户在干什么”直接注入模型。
  • 为什么分三级而不是全实时? 长期画像变化慢,T+1 足够且便宜;会话行为必须秒级。分层在成本与时效之间取舍。
  • 实时链路为何是 Kafka+Flink+Redis? Kafka 削峰解耦埋点与计算;Flink 做窗口聚合与状态;Redis 提供毫秒级读。缺任一环,要么算不出要么读不动。
  • 为什么实时特征特别容易造成 Skew? 离线训练若用“日志里的特征快照”而不是“实时链路当时输出的值”,两边窗口/默认值/迟到数据处理不一致。特征回放是根治。

【选型判断树】

特征分几层、怎么建?
1. 时效需求
   ├─ 长期画像/属性 → 离线 T+1
   ├─ 近几分钟统计 → 近实时(Flink 分钟窗)
   └─ 当前会话 → 实时(秒级,会话内状态)
2. 存储
   └─ Redis(在线读)+ 离线数仓(训练)
3. 一致性
   └─ 特征回放:线上当时值落日志 → 训练用回放
4. 降级
   └─ 实时缺失回退离线特征

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“T+1 表达不了即时兴趣,要三级特征分层”
0:30–2:00三级分层离线 / 近实时 / 实时
2:00–3:30链路埋点→Kafka→Flink→Redis→在线合并
3:30–4:30一致性与回放防 Skew;特征回放训练
4:30–5:00收尾“实时特征是 CTR 收益大户,但一致性是前提”

【关键数字】

参数经验值说明
实时窗口会话内 / 最近 5–60 分钟看业务
行为延迟端到端 1–5 秒埋点到可读
Redis TTL会话级或小时级控容量
特征回放覆盖主流量场景防 Skew
收益实时特征常见 CTR 相对提升数个点业务相关

【追问链】(三层)

L1|“为什么实时特征能提升 CTR?” → 捕捉即时兴趣(刚搜过/刚点过),比长期画像更贴近当前意图。

L2|“实时链路挂了怎么办?” → 降级用离线/近实时特征;推荐质量下降但不白屏;熔断与兜底。

L3|“离线训练用什么特征?” → 优先用特征回放(线上当时值)。不要另写一套离线计算,否则 Skew。

【评分标准】

档位答案特征
60 分知道要用 Redis 存实时特征
80 分三级分层;Kafka+Flink+Redis 链路;一致性
95 分讲清时效-成本权衡;特征回放根治 Skew;降级预案

【关联题】

  • 同一知识簇: AI-18(Skew)、AI-53(实时推荐架构)、AI-05
  • 工程衔接: AI-28(特征预计算)

【自测】

  1. 为什么需要实时特征? 参考答案: 用户兴趣短时变化,T+1 反映不了当前意图。
  2. 三级特征分别更新频率? 参考答案: 离线天/小时;近实时分钟;实时秒级会话。
  3. 实时特征最大的工程坑? 参考答案: 离线在线不一致(Skew),要用特征回放。

AI-17. 点击率 1% 的曝光样本,正样本被淹没(样本加权) ​

【考察内容】样本工程是推荐岗高频题

【题目】CTR 模型训练时,100 条曝光样本里只有 1 条被点击,模型学出来“全预测不点击”。正负样本不平衡怎么处理(加权/负采样)?不同行为(曝光/点击/购买)的样本权重怎么设计?

【参考答案】

  1. 样本来源问题:模型学的是“曝光→点击”,直接训练会有样本选择偏差(只有曝光过的物品才有标签)与正负样本不平衡(点击率 1% 级);

  2. 加权设计:

    • 负样本降权/正样本加权:点击率低时给正样本更高权重(或负样本采样),平衡训练;
    • 曝光负采样:对曝光未点击的负样本做下采样,控制负样本量与比例;未曝光样本没有标签,属另一类问题——用随机/热门负采样补全或走 IPS 与探索(见【原理溯源】曝光偏差);
    • 时间衰减权重:近期行为权重更高(用户兴趣漂移);
    • 样本权重按行为价值:购买 > 加购 > 点击 > 曝光(不同行为强度加权);
    • ESMM 思路:曝光→点击→转化链路分别建模(解决稀疏转化);
  3. 实践:CTR 模型通常用“曝光未点击=负、点击=正”+负采样比例调整(如 1:2~1:5);CVR 模型用“点击后是否转化”;

  4. 注意:线上预测时不能照搬采样比例(要校准/按真实分布评估);权重调整后用验证集真实分布验证。

  5. 关键公式: 加权损失 L=-Σ w_y[y log p+(1-y)log(1-p)],常见 w1≈N_neg/N_pos 或按业务代价。

  6. 排查步骤: 确认是样本不均还是特征无区分;先加权再考虑采样;评估用 PR-AUC/召回@精确率。线上-离线:加权会改变分数分布,线上阈值必须重标定。

【原理溯源】

  • 为什么 CTR 1% 时模型会“全预测不点击”? 与 AI-01 同理:交叉熵被海量负样本主导,把所有样本判为负已能压低损失。
  • 负采样为何有效且要校准? 采样改变训练分布,让正负更平衡、梯度不被淹没。但线上要输出真实 CTR 概率,必须校准(或用真实分布评估),否则分数整体偏移。
  • 为什么要按行为强度加权? 购买比点击信号强、比曝光信号强。等权会浪费强信号。加权把模型注意力拉向高价值行为。
  • 曝光偏差是什么? 模型只见过历史策略曝光的物品,对未曝光物品一无所知。这是选择偏差,不是简单的类别不平衡——需要探索与 IPS 等方法(进阶)。

【选型判断树】

CTR 正负 1:99:
1. 先加权(成本最低)
   ├─ scale_pos_weight 或样本 weight
   └─ 不够再负采样(**二者择一,不要叠加**:1:99 加权后再把负样本采到 1:2,等于对同一批负样本削两次,有效比 99:2、正样本占梯度约 98%,分数整体右移、排序也退化;确需叠加时要把权重按保留率折回——负样本权重 ÷ 保留概率)
2. 负采样比例
   └─ 常见 1:2 ~ 1:5(训练),评估用真实分布
3. 行为分层
   └─ 购买>加购>点击>曝光 加权
4. 校准
   └─ 线上输出概率需校准(Platt/Isotonic 或后处理)
5. 评估
   └─ 真实分布上的 GAUC/LogLoss,不是采样后分布

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“1% CTR 就是不平衡,先加权再采样,评估保真分布”
0:30–2:00加权与采样正负加权、负采样、时间衰减
2:00–3:30行为分层曝光/点击/购买不同权重;ESMM
3:30–4:30校准与评估采样后校准;真实分布验证
4:30–5:00收尾“训练可以采样,评估必须真”

【关键数字】

参数经验值说明
真实 CTR常见 1%–5%场景差异大
负采样比正:负 = 1:2 ~ 1:5训练用
行为权重购买 >> 加购 > 点击 > 曝光相对值
时间衰减半衰期 7–30 天兴趣漂移
校准必要时 Platt/Isotonic输出概率用

【追问链】(三层)

L1|“负采样怎么采?” → 随机采样+难例挖掘(预测点击率高但实际未点击的样本,思路类似 Focal Loss 的难例聚焦)。

L2|“线上评估用采样后分布行不行?” → 不行。必须用真实分布,否则 Precision/CTR 估计全错。

L3|“只做正样本加权、不采样,够吗?” → 轻度不平衡够用。重不平衡(如 1:99)时加权与负采样二者择一:两者叠加=对同一批负样本削两次,正样本占梯度可达 ~98%,分数整体右移、排序退化;确需叠加要把负样本权重按保留率折回(w ÷ 保留概率)。

【评分标准】

档位答案特征
60 分知道正负不平衡要处理
80 分加权或负采样(择一;叠加须按采样率折回权重);知道评估用真实分布
95 分行为强度分层;校准;曝光选择偏差;难例负采样

【关联题】

  • 同一知识簇: AI-01(类别不平衡)、AI-21(评估指标)
  • 推荐衔接: AI-32(CTR 模型)、AI-20(探索)

【自测】

  1. CTR 训练为什么常用负采样? 参考答案: 控制正负比、加速训练、避免梯度被负样本淹没。
  2. 采样后为什么要校准? 参考答案: 训练分布≠真实分布,输出概率需映射回真实 CTR。
  3. 购买和曝光为什么不能等权? 参考答案: 信号强度不同,等权浪费强信号、模型注意力分散。

AI-18. 离线用 SQL 算特征、在线用 Java 算,结果对不上(特征 Skew) ​

【考察内容】Skew 是推荐/广告算法岗核心高频题

【题目】离线训练的特征用 SQL 批量算,在线推理的特征用 Java 实时算,两边口径不一致(时区、取整、默认值),导致“离线好、线上差”。训练服务偏差(Skew)怎么从根上解决(特征平台、特征回放)?

【参考答案】

  1. 问题本质:训练服务偏差(Training-Serving Skew)——离线与在线的特征计算逻辑/数据不一致,模型学到的是“离线特征分布”,线上喂的是“在线特征”;

  2. 根因:

    • 计算逻辑不一致(SQL vs Java 实现差异:取整、时区、默认值);
    • 数据时间点不一致(离线用全天数据,在线只有当前);
    • 缺失值处理不一致(离线填充均值,在线填 0);
    • 版本更新不同步;
  3. 解决方案(核心是“统一口径”):

    • 特征平台:一套特征定义(DSL/配置化),离线在线共用同一套计算引擎/同一份代码生成特征(离线用 Spark 批量、在线用同逻辑的实时引擎),从源头消除不一致;
    • 特征回放(Feature Logging):在线请求时把“当时的特征值”落日志,离线训练直接用回放的特征样本训练——线上特征训练,彻底一致(推荐系统标准做法);
    • 缺失值/默认值规范统一(同一份默认配置);
    • 版本管理:特征变更同步发布离线与在线;
  4. 验证:特征一致性校验(回放样本对比离线重算结果,差异率阈值告警);

  5. 原则:以线上真实特征为准训练(回放),而不是“让线上模仿离线”。

  6. 关键公式/原则: Skew 根治=训练与在线共用特征计算代码/特征平台(feast 等)。

  7. 排查步骤: 抽样对比同一实体同一时刻离线/在线特征值 → 定位字段差异 → 统一 UDF、时区、空值、默认值、字典版本。线上-离线:这是本题主题;必须建立特征对账监控(PSI/KS 漂移+数值 diff)。

【原理溯源】

  • Skew 为什么让“离线好线上差”? 模型在离线学的是 SQL 算出的分布,在线吃的是 Java 算出的分布。同一个特征名,数值系统性不同——模型在解另一道题。
  • 为什么“特征回放”比“两边对齐代码”更根治? 两套代码(SQL/Java)必然漂移(时区、精度、默认值、版本)。回放直接用线上当时值训练,训练与推理同源,Skew 在物理上消失。
  • 特征平台解决什么? 单一特征定义,批/流/在线共用。降低“两套代码”的发生概率,但实现成本高;回放是更务实的兜底。
  • 为什么默认值/缺失不一致杀伤力大? 线上缺失常填 0,离线填均值。模型对“缺失”很敏感,两边语义不同会系统性偏移预测分数。

【选型判断树】

出现 Skew 怎么根治?
1. 短期
   ├─ 对齐时区/取整/默认值(止血)
   └─ 特征一致性校验(回放对比)
2. 中期
   ├─ 建特征平台:一份定义,批/流/在线共用
   └─ 特征回放:训练直接用线上特征
3. 长期
   └─ 回放为主、平台为规范;变更同步发布
4. 验证
   └─ 差异率监控告警

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“这是 Training-Serving Skew,根因是两套计算”
0:30–2:00根因逻辑/时间/缺失/版本不一致
2:00–3:30根治特征平台统一;特征回放训练
3:30–4:30验证回放对比、差异率告警
4:30–5:00收尾“以线上特征为准,而不是让线上模仿离线”

【关键数字】

参数经验值说明
差异率阈值如 >1% 告警看特征重要性
回放存储量大,需分层/TTL成本考量
特征平台一份 DSL 定义批流在线共用
版本特征变更同步上线防漂移
时区统一 UTC 或业务时区常见踩坑

【追问链】(三层)

L1|“只靠规范代码行不行?” → 短期止血,长期仍会漂。根治靠回放或单一计算引擎。

L2|“回放有什么代价?” → 需要存储线上特征(量大)、冷启动特征缺失,配合离线特征补全。

L3|“怎么验证 Skew 是否还存在?” → 抽线上请求,回放特征 vs 离线重算,统计差异率;超阈值告警并定位特征。

【评分标准】

档位答案特征
60 分知道离线在线特征不一致
80 分分类根因;知道特征平台
95 分特征回放是标准根治;“以线上为准”;差异率监控;默认值/时区细节

【关联题】

  • 同一知识簇: AI-05(线上效果差)、AI-16(实时特征)、AI-28(训练服务差异)
  • 工程衔接: AI-53(实时架构)

【自测】

  1. 什么是 Training-Serving Skew? 参考答案: 训练与在线推理的特征计算/数据不一致。
  2. 特征回放为什么能根治? 参考答案: 训练直接用线上当时特征值,两边同源。
  3. 特征平台的作用? 参考答案: 一份特征定义,批/流/在线共用,降低两套代码漂移。

AI-19. “看过 A 的人还看 B”,怎么让机器理解物品相似(Embedding) ​

【考察内容】Embedding 是推荐算法必考核心

【题目】推荐系统要表达“看过《流浪地球》的人可能喜欢《星际穿越》”——需要把物品变成机器能算相似度的向量。Embedding 是什么?Item2Vec、Graph Embedding、双塔模型分别怎么生成?生成后用在哪些环节?

【参考答案】

  1. 概念:把高维稀疏 ID(用户/物品/词)映射为低维稠密向量,向量内积/余弦相似度表达语义相似度(“看过 A 的人可能喜欢 B”);

  2. 生成方法:

    • Item2Vec/Word2Vec(行为序列):把用户行为序列当“句子”,物品当“词”,Skip-gram 训练得到物品向量(共现即相似);
    • Graph Embedding(DeepWalk/Node2Vec):用户-物品二部图/物品共现图随机游走生成序列再 Word2Vec——表达多跳关系(阿里 EGES 加边权重);
    • 双塔模型(Two-Tower):用户特征塔与物品特征塔分别过 DNN,训练时让“点击对”向量内积大(在线召回标准方案:离线算好物品向量,在线实时算用户向量,向量检索 ANN);
    • 预训练模型产出:文本/图像用 BERT/CLIP 编码;
  3. 使用场景:

    • 向量召回:物品向量离线建索引(Faiss/Milvus ANN),用户向量在线计算,TopK 相似检索;
    • 特征输入:Embedding 向量作为稠密特征拼进精排模型;
    • 相似物品/相似用户推荐(近邻检索);
    • 冷启动:新物品用内容(文本/图像)Embedding 替代行为向量;
  4. 注意:向量维度(64~256)、训练数据更新(增量训练)、向量索引更新(定期重建)、embedding 质量评估(同品类相似度、召回效果 A/B)。

  5. 关键公式: 余弦相似度 cos(a,b)=a·b/(||a||·||b||);内积适用于已归一化或带偏置场景。

  6. 排查步骤: 双塔/Item2Vec/Graph Embedding 学表示 → 近邻检索 ANN → 冷启动物品用内容特征兜底。线上-离线:离线全量近邻表与在线 ANN 索引可能不一致,要监控召回重合率。

【原理溯源】

  • 为什么“共现即相似”成立? Item2Vec 的假设是:出现在同一会话/序列中的物品,被同一兴趣驱动。Skip-gram 最大化共现概率,向量空间里相近物品自然聚集。
  • 双塔为何是在线召回标准? 物品塔可离线预计算全库向量并建 ANN 索引;用户塔在线毫秒级算向量,然后 ANN 检索 TopK。把昂贵的用户×物品联合编码(交叉)开销拆成两侧独立编码 + 向量距离——省的是联合前向,与 AI-15 说的「特征交叉」(特征工程)不是同一件事。
  • 双塔的表达上限在哪? 用户塔与物品塔独立编码,只在最后做内积——无法建模复杂交叉(价格敏感、实时上下文)。所以双塔做召回,精排要上交叉模型。
  • 为什么新物品需要内容 Embedding? 行为向量需要曝光/点击数据,新品没有。用标题/类目/图像编码出的内容向量,可冷启动进向量索引。

【选型判断树】

要生成物品 Embedding:
1. 有什么数据?
   ├─ 丰富行为序列 → Item2Vec / 双塔
   ├─ 图结构(共现/社交)→ Graph Embedding
   └─ 只有内容(新品)→ 文本/图像预训练编码
2. 用途
   ├─ 在线召回 → 双塔 + ANN(标准)
   ├─ 精排特征 → 行为/内容向量拼入
   └─ 相似推荐 → 近邻检索
3. 工程
   └─ 维度 64–256;定期重建索引;A/B 评估召回

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“Embedding 把稀疏 ID 映射为稠密向量,用距离表达相似”
0:30–2:00三类生成Item2Vec / Graph / 双塔
2:00–3:30使用场景向量召回、精排特征、冷启动
3:30–4:30工程ANN 索引、增量更新、评估
4:30–5:00收尾“双塔是在线召回标准,但精排要交叉模型”

【关键数字】

参数经验值说明
向量维度64–256召回常用 64–128
ANN 索引HNSW / IVF-PQ见 AI-52
负样本in-batch + 随机/热门双塔训练
索引更新小时/天级重建视业务
召回 TopK100–1000进粗排

【追问链】(三层)

L1|“双塔怎么训练?” → 正样本(点击对)拉近、负样本(随机/热门)拉远,softmax/采样损失;in-batch 负采样高效。

L2|“为什么用 ANN 不用精确 KNN?” → 百万级向量精确计算太慢,ANN(HNSW/IVF)牺牲少量精度换毫秒级检索。

L3|“Embedding 质量怎么评估?” → 内在:同品类相似度抽检;外在:向量召回的 Recall@K 与线上 A/B CTR。

【评分标准】

档位答案特征
60 分知道 Embedding 是稠密向量
80 分Item2Vec/双塔/Graph 三类;向量召回流程
95 分双塔独立编码的表达上限;ANN 为何必要;冷启动内容向量;训练负采样

【关联题】

  • 同一知识簇: AI-31(多路召回)、AI-52(双塔 vs 精排)、AI-13(ID Embedding)
  • LLM 衔接: AI-49(Embedding 选型)、AI-39(RAG)

【自测】

  1. Item2Vec 的核心假设? 参考答案: 同一行为序列共现的物品语义相似。
  2. 双塔为何适合在线召回? 参考答案: 物品向量预计算+ANN,在线只算用户向量再检索,极快。
  3. 双塔为什么不能替代精排? 参考答案: 独立编码缺少复杂交叉,只能表达粗粒度相似。

AI-20. 推荐全推爆款,新作者的内容永远没曝光(长尾治理) ​

【考察内容】长尾与 EE 是推荐系统进阶高频题

【题目】内容平台反馈:推荐算法永远推头部爆款,新人作者/冷门内容拿不到曝光,生态恶化。为什么会这样(马太效应)?怎么通过探索(EE)、多样性约束、新品保底让长尾内容有出头机会?

【参考答案】

  1. 问题:模型偏向热门(曝光多、样本多),长尾物品样本少→预测不准→更少曝光(马太效应/反馈循环);

  2. 解决:

    • 探索(Exploration):给新/冷门物品一定探索流量——EE 策略:ε-greedy(小概率随机推)、UCB(置信上界:样本少时给高探索分)、Thompson Sampling(贝叶斯采样)、bandit 算法;
    • 多样性约束:重排阶段打散/配额(同作者/类目上限),强制长尾曝光窗口;
    • 数据层面:长尾物品加权/降采样热门(样本平衡)、图增强(EGES 用边信息);
    • 模型层面:物品冷启动用内容特征/预训练 embedding 补充(双塔加内容塔);多目标中加“探索收益”项;
    • 业务规则:新品保底曝光(新品流量池)、作者冷启动扶持;
  3. 度量:头部 vs 长尾的曝光/点击分布(基尼系数)、新品曝光率、作者生态指标;

  4. 平衡:探索损害短期 CTR(要监控),用长期指标(留存/内容供给)衡量收益。

  5. 关键公式: 流量探索 ε-greedy;MMR:λ·relevance-(1-λ)·similarity;类目熵 H=-Σ p log p。

  6. 排查步骤: 先量化长尾覆盖率/基尼系数 → 召回加探索路 → 重排打散 → AB 护栏。线上-离线:离线只优化相关性会系统性牺牲长尾,必须把多样性指标纳入离线评估。

【原理溯源】

  • 马太效应的反馈循环是什么? 曝光多 → 样本多 → 预估准 → 更多曝光。长尾物品样本少,预估方差大,模型不敢推——这不是模型“偏见”,而是数据闭环造成的系统性放大。
  • UCB/Thompson 如何实现“智能探索”? 不是纯随机。UCB 给不确定物品加探索加分(乐观面对不确定性);Thompson 从后验分布采样,样本少的物品天然有更大方差、更多机会。探索收益可度量、可收敛。
  • 为什么只靠重排打散不够? 打散只能在已召回的候选里调剂。若长尾物品根本没进召回,重排无货可散。必须在召回层就给长尾入口。
  • 为什么要用长期指标? 探索短期常掉 CTR(推了不那么“精准”的内容),换来内容供给增加、作者留存、长期生态健康。只看短期 CTR 会杀死探索。

【选型判断树】

长尾没曝光:
1. 召回层
   ├─ 加多样性/探索路;新品流量池
   └─ 内容 Embedding 冷启动
2. 排序层
   ├─ 多目标(不只 CTR)
   └─ 可加探索正则
3. 重排层
   └─ 打散/配额/作者上限
4. 评估
   ├─ 短期 CTR 护栏
   └─ 长期:基尼系数、新品曝光、作者留存

【口述骨架】(5 分钟)

时间任务内容
0:00–0:30定性“马太效应:曝光→样本→预估→曝光的正反馈”
0:30–2:00探索 EEε-greedy / UCB / Thompson
2:00–3:30分层方案召回探索、重排打散、业务保底
3:30–4:30度量基尼、新品曝光;短期 vs 长期
4:30–5:00收尾“探索要智能且可度量,不是纯随机”

【关键数字】

参数经验值说明
ε-greedyε=1%–10%简单但盲目
新品保底曝光每新品 N 次试投平台策略
作者/类目上限窗口内 ≤1–2 条重排打散
基尼系数越低越均衡监控生态
探索代价短期 CTR 可能降 1%–5%换长期

【追问链】(三层)

L1|“UCB 和 Thompson 区别?” → UCB 按置信上界确定性选;Thompson 按后验分布采样(带随机性,实践更稳)。

L2|“探索会不会浪费流量?” → 会占用少量流量,但 Bandit 可按收益动态分配;比固定比例纯随机更省。

L3|“只在重排打散够吗?” → 不够。长尾若未进召回,重排无货。必须召回层给入口 + 业务保底。

【评分标准】

档位答案特征
60 分知道要打散、给新品流量
80 分会讲马太效应;EE 三种算法;重排+召回分层
95 分反馈循环机制;UCB/Thompson 智能探索;长期指标;召回层入口必要性

【关联题】

  • 同一知识簇: AI-29(冷启动)、AI-51(信息茧房)、AI-33(重排打散)
  • 评估衔接: AI-22(A/B 护栏)

【自测】

  1. 马太效应在推荐里怎么形成? 参考答案: 曝光多→样本多→预估准→更多曝光,长尾被系统性压制。
  2. UCB 为什么优于纯随机探索? 参考答案: 按不确定性智能分配探索,可收敛到最优臂。
  3. 为什么只靠重排不够? 参考答案: 长尾未进召回则无货可散,必须召回层给入口。

持续学习,持续积累。