AI 第二章 数据与特征工程(AI-13 ~ AI-20)
AI-13. 商品 ID 有 1000 万个取值,One-Hot 直接爆炸(高基数类别)
【考察内容】高基数类别特征是推荐/广告岗必考题
【题目】推荐模型的特征里有商品 ID,取值上千万个,One-Hot 后维度爆炸、内存不够、还学不到泛化。怎么处理高基数类别特征(目标编码/频次编码/Embedding/哈希)?目标编码怎么防泄漏?
【参考答案】
问题:高基数 One-Hot → 维度爆炸(稀疏、内存爆炸、无泛化);
处理方法:
- 统计特征(目标编码 Target Encoding):类别内目标均值(如该商品的 CTR),配合平滑(加入全局先验:
(count*ctr + prior*α)/(count+α))防过拟合——推荐系统高频做法;注意:用 K 折统计防泄漏; - 频次编码(Count Encoding):类别的出现次数(商品热度)——简单有效;
- 嵌入(Embedding):把 ID 映射为稠密向量(DNN 的 embedding 层/Word2Vec 式学习)——深度模型标准做法;
- 哈希编码(Feature Hashing):哈希到固定维度(有冲突,需多哈希减少碰撞)——大规模稀疏场景;
- 层次聚合:叶子类别聚合到父类(品牌→类目);
- 保留高频、低频合并为“其他”(长尾治理);
- 统计特征(目标编码 Target Encoding):类别内目标均值(如该商品的 CTR),配合平滑(加入全局先验:
选型:树模型用统计/频次编码;深度模型用 Embedding;LR 系用哈希或目标编码;
注意:目标编码必须在训练集内做 K 折统计(否则标签泄漏)。
关键公式: One-Hot 后维度=基数;千万 ID 直接爆炸。目标编码:ê=(sum_y + α·m)/(n+α)(加权均值防过拟合)。
排查步骤: 高基数 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
【自测】
- 目标编码为什么要 K 折? 参考答案: 防止样本自己的标签参与自己的特征计算(泄漏)。
- 树模型处理高基数 ID 首选? 参考答案: 目标编码或频次编码,配合低频合并。
- Embedding 相对 One-Hot 的核心优势? 参考答案: 降维+语义泛化,新/相似 ID 可映射到相近向量。
AI-14. 城市编码成 0/1/2,模型学出了“城市大小顺序”(编码选型)
【考察内容】编码选型是特征工程高频题
【题目】有工程师把“城市”直接编码成 0、1、2、3 喂给模型,结果模型学到了“城市 3 比城市 1 大”这种不存在的顺序关系。One-Hot 和 Label Encoding 分别适合什么类型(有序/无序)?对树模型和线性模型的影响有何不同?
【参考答案】
One-Hot:每个取值一个 0/1 维度——无序类别正确选择(城市、颜色、品类),不引入虚假序关系;代价:维度膨胀(高基数不行);
Label Encoding:取值映射为整数 0、1、2...——只适合有序类别(学历:初中<高中<大学、满意度:低<中<高);对无序类别会引入虚假的序/距离关系(模型误以为“红(1)<蓝(2)<绿(3)”且差距相等),树模型尚可容忍(切分无单调假设),线性/距离模型有害;
补充:有序编码(Ordinal Encoding)与 Label 本质同(但明确表达顺序);目标编码/频次编码更适合无序高基数(见 13 题);
实践:无序低基数→One-Hot;无序高基数→目标/频次/Embedding;有序→Ordinal;
树模型对无序类别也可直接用“类别序号”(LightGBM category 特征原生支持,按类别分组统计最优切分)。
关键公式: 独热/多热消除序关系;目标编码引入统计量;Embedding 学习向量。
排查步骤: 类别是否有序?无序则禁止 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
【自测】
- “颜色”用什么编码? 参考答案: 无序低基数 → One-Hot。
- “学历”用什么? 参考答案: Ordinal Encoding,保留真实顺序。
- Label Encoding 给“城市”有什么害? 参考答案: 引入虚假序/等距,线性与距离模型学到伪信号。
AI-15. 单个特征都没用,组合起来却有效(特征交叉)
【考察内容】特征交叉是搜广推核心考点
【题目】特征分析发现:单独看“性别”“类目”都和点击相关性很弱,但“女性×美妆类目”的组合特征非常强。怎么构造交叉特征?人工构造、笛卡尔积、模型自动交叉(FM/GBDT+LR/深度模型)各怎么做?
【参考答案】
思想:单一特征线性不可分/相关性弱,交叉后能表达组合效应(如“男性×体育类目”才显著);
构造方法:
- 人工/业务交叉:业务先验(年龄×类目、城市×时段)——可解释、有效;
- 笛卡尔积组合:两两类别组合成新类别(One-Hot 后再交,如 城市×品类),维度会爆炸需控制;
- 数值特征运算:加减乘除/比率(价格/收入=价格敏感度)、分桶后交叉(年龄分桶×城市);
- 模型自动交叉:树模型:自动分裂即隐式交叉(GBDT 的叶子节点可当交叉特征喂给 LR——GBDT+LR);FM/FFM:二阶特征交互自动学习(稀疏特征场景);深度模型:Wide&Deep(Wide 记忆人工交叉+Deep 自动学习高阶交互)、DCN(显式特征交叉层);
交叉质量:交叉后看增益(特征重要性/线上 A/B);避免过拟合(交叉维度爆炸时用正则/降频);
经典范式:GBDT 特征 + LR(GBDT 产出的叶子路径作为交叉特征输入 LR)——树模型负责高阶交互,LR 负责线性拟合。
关键公式: 交叉特征 x_i·x_j 或哈希交叉;FM:ŷ=w0+Σwixi+ΣΣ<vi,vj>xixj,用隐向量内积近似交叉权重。
排查步骤: 先业务可解释交叉 → 树模型自动交叉 → 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
【自测】
- 为什么要交叉特征? 参考答案: 单特征边际相关性弱,组合后条件效应强。
- GBDT+LR 的分工? 参考答案: 树负责高阶交互(叶子路径),LR 负责线性拟合与快速推理。
- 笛卡尔积最大风险? 参考答案: 维度爆炸、空组合过拟合。
AI-16. 用户刚搜过“手机”,推荐还是 3 天前的旧兴趣(实时特征)
【考察内容】实时特征是推荐工程高频题
【题目】用户刚搜索了“手机”,推荐流却还在推他 3 天前看过的品类——因为用的是 T+1 离线特征。为什么需要实时特征?实时/近实时/离线三级特征怎么分层?实时特征链路(行为→MQ→流计算→Redis)怎么搭?
【参考答案】
为什么要实时特征:用户行为是动态的(刚看了什么、刚搜了什么),离线特征(T+1)反映不了当下兴趣——实时特征提升时效性(点击率/转化率明显收益);
特征分类:
- 离线特征:用户长期画像(年龄、历史兴趣分布)、物品属性——低频更新(小时/天级);
- 近实时特征:近 5 分钟/1 小时的行为统计(浏览次数、加购数)——分钟级;
- 实时特征:当前会话行为(刚点击的物品 ID、当前页面、停留时长)——秒级;
实时特征建设:
- 行为事件 → MQ(Kafka)→ Flink 流式计算(窗口聚合:近 5 分钟点击次数、最近点击序列)→ 写入 Redis(特征服务);
- 在线请求时查 Redis 实时特征 + 特征服务合并离线特征 → 送入模型;
关键点:
- 特征一致性:离线训练用的特征定义与在线一致(同一窗口/同一口径),否则训练服务偏差(见 AI-05);
- 特征延迟可控(秒级)、Redis 容量(特征 TTL);
- 特征回放:记录线上特征供离线训练复现(防 skew 的核心手段);
场景:电商推荐、广告(用户刚刚搜索的关键词)、信息流(实时兴趣)。
关键公式/架构: 实时特征=流式聚合(滑动窗口统计)。特征服务 p99 预算常见 5–20ms。
排查步骤: 对齐事件时间与处理时间;检查消息延迟、窗口触发、特征存储写入延迟、缓存 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(特征预计算)
【自测】
- 为什么需要实时特征? 参考答案: 用户兴趣短时变化,T+1 反映不了当前意图。
- 三级特征分别更新频率? 参考答案: 离线天/小时;近实时分钟;实时秒级会话。
- 实时特征最大的工程坑? 参考答案: 离线在线不一致(Skew),要用特征回放。
AI-17. 点击率 1% 的曝光样本,正样本被淹没(样本加权)
【考察内容】样本工程是推荐岗高频题
【题目】CTR 模型训练时,100 条曝光样本里只有 1 条被点击,模型学出来“全预测不点击”。正负样本不平衡怎么处理(加权/负采样)?不同行为(曝光/点击/购买)的样本权重怎么设计?
【参考答案】
样本来源问题:模型学的是“曝光→点击”,直接训练会有样本选择偏差(只有曝光过的物品才有标签)与正负样本不平衡(点击率 1% 级);
加权设计:
- 负样本降权/正样本加权:点击率低时给正样本更高权重(或负样本采样),平衡训练;
- 曝光负采样:对曝光未点击的负样本做下采样,控制负样本量与比例;未曝光样本没有标签,属另一类问题——用随机/热门负采样补全或走 IPS 与探索(见【原理溯源】曝光偏差);
- 时间衰减权重:近期行为权重更高(用户兴趣漂移);
- 样本权重按行为价值:购买 > 加购 > 点击 > 曝光(不同行为强度加权);
- ESMM 思路:曝光→点击→转化链路分别建模(解决稀疏转化);
实践:CTR 模型通常用“曝光未点击=负、点击=正”+负采样比例调整(如 1:2~1:5);CVR 模型用“点击后是否转化”;
注意:线上预测时不能照搬采样比例(要校准/按真实分布评估);权重调整后用验证集真实分布验证。
关键公式: 加权损失 L=-Σ w_y[y log p+(1-y)log(1-p)],常见 w1≈N_neg/N_pos 或按业务代价。
排查步骤: 确认是样本不均还是特征无区分;先加权再考虑采样;评估用 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(探索)
【自测】
- CTR 训练为什么常用负采样? 参考答案: 控制正负比、加速训练、避免梯度被负样本淹没。
- 采样后为什么要校准? 参考答案: 训练分布≠真实分布,输出概率需映射回真实 CTR。
- 购买和曝光为什么不能等权? 参考答案: 信号强度不同,等权浪费强信号、模型注意力分散。
AI-18. 离线用 SQL 算特征、在线用 Java 算,结果对不上(特征 Skew)
【考察内容】Skew 是推荐/广告算法岗核心高频题
【题目】离线训练的特征用 SQL 批量算,在线推理的特征用 Java 实时算,两边口径不一致(时区、取整、默认值),导致“离线好、线上差”。训练服务偏差(Skew)怎么从根上解决(特征平台、特征回放)?
【参考答案】
问题本质:训练服务偏差(Training-Serving Skew)——离线与在线的特征计算逻辑/数据不一致,模型学到的是“离线特征分布”,线上喂的是“在线特征”;
根因:
- 计算逻辑不一致(SQL vs Java 实现差异:取整、时区、默认值);
- 数据时间点不一致(离线用全天数据,在线只有当前);
- 缺失值处理不一致(离线填充均值,在线填 0);
- 版本更新不同步;
解决方案(核心是“统一口径”):
- 特征平台:一套特征定义(DSL/配置化),离线在线共用同一套计算引擎/同一份代码生成特征(离线用 Spark 批量、在线用同逻辑的实时引擎),从源头消除不一致;
- 特征回放(Feature Logging):在线请求时把“当时的特征值”落日志,离线训练直接用回放的特征样本训练——线上特征训练,彻底一致(推荐系统标准做法);
- 缺失值/默认值规范统一(同一份默认配置);
- 版本管理:特征变更同步发布离线与在线;
验证:特征一致性校验(回放样本对比离线重算结果,差异率阈值告警);
原则:以线上真实特征为准训练(回放),而不是“让线上模仿离线”。
关键公式/原则: Skew 根治=训练与在线共用特征计算代码/特征平台(feast 等)。
排查步骤: 抽样对比同一实体同一时刻离线/在线特征值 → 定位字段差异 → 统一 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(实时架构)
【自测】
- 什么是 Training-Serving Skew? 参考答案: 训练与在线推理的特征计算/数据不一致。
- 特征回放为什么能根治? 参考答案: 训练直接用线上当时特征值,两边同源。
- 特征平台的作用? 参考答案: 一份特征定义,批/流/在线共用,降低两套代码漂移。
AI-19. “看过 A 的人还看 B”,怎么让机器理解物品相似(Embedding)
【考察内容】Embedding 是推荐算法必考核心
【题目】推荐系统要表达“看过《流浪地球》的人可能喜欢《星际穿越》”——需要把物品变成机器能算相似度的向量。Embedding 是什么?Item2Vec、Graph Embedding、双塔模型分别怎么生成?生成后用在哪些环节?
【参考答案】
概念:把高维稀疏 ID(用户/物品/词)映射为低维稠密向量,向量内积/余弦相似度表达语义相似度(“看过 A 的人可能喜欢 B”);
生成方法:
- Item2Vec/Word2Vec(行为序列):把用户行为序列当“句子”,物品当“词”,Skip-gram 训练得到物品向量(共现即相似);
- Graph Embedding(DeepWalk/Node2Vec):用户-物品二部图/物品共现图随机游走生成序列再 Word2Vec——表达多跳关系(阿里 EGES 加边权重);
- 双塔模型(Two-Tower):用户特征塔与物品特征塔分别过 DNN,训练时让“点击对”向量内积大(在线召回标准方案:离线算好物品向量,在线实时算用户向量,向量检索 ANN);
- 预训练模型产出:文本/图像用 BERT/CLIP 编码;
使用场景:
- 向量召回:物品向量离线建索引(Faiss/Milvus ANN),用户向量在线计算,TopK 相似检索;
- 特征输入:Embedding 向量作为稠密特征拼进精排模型;
- 相似物品/相似用户推荐(近邻检索);
- 冷启动:新物品用内容(文本/图像)Embedding 替代行为向量;
注意:向量维度(64~256)、训练数据更新(增量训练)、向量索引更新(定期重建)、embedding 质量评估(同品类相似度、召回效果 A/B)。
关键公式: 余弦相似度 cos(a,b)=a·b/(||a||·||b||);内积适用于已归一化或带偏置场景。
排查步骤: 双塔/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 + 随机/热门 | 双塔训练 |
| 索引更新 | 小时/天级重建 | 视业务 |
| 召回 TopK | 100–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)
【自测】
- Item2Vec 的核心假设? 参考答案: 同一行为序列共现的物品语义相似。
- 双塔为何适合在线召回? 参考答案: 物品向量预计算+ANN,在线只算用户向量再检索,极快。
- 双塔为什么不能替代精排? 参考答案: 独立编码缺少复杂交叉,只能表达粗粒度相似。
AI-20. 推荐全推爆款,新作者的内容永远没曝光(长尾治理)
【考察内容】长尾与 EE 是推荐系统进阶高频题
【题目】内容平台反馈:推荐算法永远推头部爆款,新人作者/冷门内容拿不到曝光,生态恶化。为什么会这样(马太效应)?怎么通过探索(EE)、多样性约束、新品保底让长尾内容有出头机会?
【参考答案】
问题:模型偏向热门(曝光多、样本多),长尾物品样本少→预测不准→更少曝光(马太效应/反馈循环);
解决:
- 探索(Exploration):给新/冷门物品一定探索流量——EE 策略:ε-greedy(小概率随机推)、UCB(置信上界:样本少时给高探索分)、Thompson Sampling(贝叶斯采样)、bandit 算法;
- 多样性约束:重排阶段打散/配额(同作者/类目上限),强制长尾曝光窗口;
- 数据层面:长尾物品加权/降采样热门(样本平衡)、图增强(EGES 用边信息);
- 模型层面:物品冷启动用内容特征/预训练 embedding 补充(双塔加内容塔);多目标中加“探索收益”项;
- 业务规则:新品保底曝光(新品流量池)、作者冷启动扶持;
度量:头部 vs 长尾的曝光/点击分布(基尼系数)、新品曝光率、作者生态指标;
平衡:探索损害短期 CTR(要监控),用长期指标(留存/内容供给)衡量收益。
关键公式: 流量探索 ε-greedy;MMR:λ·relevance-(1-λ)·similarity;类目熵 H=-Σ p log p。
排查步骤: 先量化长尾覆盖率/基尼系数 → 召回加探索路 → 重排打散 → 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 护栏)
【自测】
- 马太效应在推荐里怎么形成? 参考答案: 曝光多→样本多→预估准→更多曝光,长尾被系统性压制。
- UCB 为什么优于纯随机探索? 参考答案: 按不确定性智能分配探索,可收敛到最优臂。
- 为什么只靠重排不够? 参考答案: 长尾未进召回则无货可散,必须召回层给入口。