1. 排序模型的特征工程解析
在推荐系统的排序阶段,特征工程的质量直接决定了模型效果的上限。作为推荐系统的核心环节,我们需要从多个维度构建特征体系,让模型能够充分理解用户、物品及其交互场景。
1.1 用户画像特征构建
用户ID是推荐系统中最基础的特征,通常会通过embedding层转换为稠密向量。但实际工程中需要注意:
-
新用户冷启动问题:当遇到未登录用户或新注册用户时,需要设计特殊的默认embedding。我们通常采用该用户首次行为(如点击的类目)来初始化embedding
-
人口统计学特征的处理:
- 性别:建议采用one-hot编码而非数值编码(如男=1,女=0),避免引入人为的序关系
- 年龄:最佳实践是做分桶处理(如0-12,13-18,19-25等),每个区间单独做embedding
-
用户兴趣的动态更新:用户的类目偏好不能只依赖长期统计,需要设计时间衰减因子。例如:
python复制# 时间衰减公式示例 def time_decay(click_time, current_time, half_life=30*24*3600): delta = current_time - click_time return 0.5 ** (delta / half_life)
1.2 物品画像特征工程
物品特征的处理有以下几个关键点:
-
发布时间特征:直接使用时间戳效果不好,建议转换为:
- 物品年龄 = log(当前时间 - 发布时间 + 1)
- 时段特征:将一天分为6个时段(如0-4点,4-8点等)做embedding
-
地理位置编码:
- GeoHash精度选择:通常使用6-8位字符,对应150m-2km精度
- 城市等级划分:一线/新一线/二线等城市分级比直接使用城市ID更能泛化
-
多模态特征融合:
- 图像美学评分可以使用预训练的NIMA模型
- 文本信息量可以通过TF-IDF或BERT等模型提取
1.3 统计特征的处理技巧
用户和物品的统计特征是效果最强的特征之一,但需要注意:
-
时间窗口的选择:不同行为需要不同时间窗:
- 点击率:短期窗口(1天/7天)
- 转化率:中长期窗口(30天)
- 留存率:超长期窗口(90天)
-
分桶统计的实践:
python复制# 用户-类目分桶统计示例 def get_user_category_ctr(user_id, category): # 获取用户在该类目下的历史行为 clicks = get_clicks(user_id, category) impressions = get_impressions(user_id, category) # 做贝叶斯平滑 global_ctr = get_global_ctr(category) alpha, beta = estimate_beta_params(global_ctr) return (clicks + alpha) / (impressions + alpha + beta) -
冷启动处理:对于新物品,可以使用类目平均统计值作为初始值
2. 特征处理与优化策略
2.1 离散特征的最佳实践
-
Embedding维度选择:
- 用户ID/物品ID:64-128维
- 类目/品牌:16-32维
- 城市/手机型号:8-16维
-
共享embedding技巧:相关特征可以共享embedding矩阵。例如用户性别和作者性别可以共用同一个embedding
2.2 连续特征的处理方法
-
分桶策略:
- 等频分桶比等距分桶效果更好
- 动态分桶:根据数据分布自动调整分桶边界
-
特殊值处理:
- 缺失值:建议单独作为一个桶
- 异常值:Winsorize处理(如截断到99分位数)
-
平滑技术对比:
方法 公式 适用场景 Log变换 log(1+x) 长尾分布 Box-Cox (x^λ-1)/λ 需要正态化 Sigmoid 1/(1+e^(-x)) 有界输出
2.3 特征覆盖率优化
在实际系统中,特征缺失是常见问题。我们的处理方案:
-
分级回退策略:
- 首选:使用用户最近的有效值
- 次选:使用用户所在群体的平均值
- 最后:使用全局默认值
-
缺失模式识别:将"特征是否缺失"本身作为一个二值特征,有时能带来意外效果
-
数据收集优化:
- 非必填字段改为渐进式收集
- 用默认选项代替空白选项
3. 粗排三塔模型详解
3.1 模型架构设计
三塔模型由用户塔、物品塔和交叉塔组成,其优势在于:
- 计算效率:用户特征只需计算一次
- 特征隔离:用户和物品特征独立编码
- 灵活更新:不同塔可以独立迭代
3.1.1 用户塔实现细节
输入层:
python复制user_input = {
'user_id': Input(shape=(1,), name='user_id'),
'gender': Input(shape=(1,), name='gender'),
'age': Input(shape=(1,), name='age'),
# 其他用户特征...
}
特征处理层:
python复制# ID类特征
user_id_emb = Embedding(input_dim=MAX_USER_ID, output_dim=64)(user_input['user_id'])
user_id_emb = Flatten()(user_id_emb)
# 类别特征
gender_emb = Embedding(input_dim=3, output_dim=8)(user_input['gender']) # 0=未知,1=男,2=女
gender_emb = Flatten()(gender_emb)
# 数值特征
age_processed = Discretization(bins=[0,18,25,35,45,55,65])(user_input['age'])
age_emb = Embedding(input_dim=6, output_dim=8)(age_processed)
age_emb = Flatten()(age_emb)
3.1.2 物品塔优化技巧
- 动态缓存:高频物品的向量可以缓存24小时
- 特征分组:将物品特征分为静态(如类目)和动态(如点击率)两组,分别更新
- 降维处理:对高维特征(如标题embedding)先做PCA降维
3.2 交叉塔的创新设计
交叉塔的核心是捕获用户和物品的细粒度交互。我们开发了两种高效实现方式:
-
轻量级交叉:
python复制def cross_interaction(user_vec, item_vec): # 元素级乘积 element_wise = Multiply()([user_vec, item_vec]) # 拼接所有交互特征 return Concatenate()([user_vec, item_vec, element_wise]) -
注意力交叉:
python复制def attention_cross(user_vec, item_vec): # 计算注意力权重 attention = Dot(axes=-1)([user_vec, item_vec]) attention = Activation('softmax')(attention) # 加权交互 attended = Multiply()([attention, item_vec]) return Concatenate()([user_vec, attended])
3.3 工程实现优化
-
批量推理技巧:
- 对物品塔做批量前向计算(batch_size=256)
- 使用GPU的tensor core加速矩阵运算
-
缓存策略:
- 用户向量缓存5分钟
- 热门物品向量缓存1小时
- 使用LRU缓存淘汰策略
-
性能监控指标:
指标 达标线 监控频率 用户塔延迟 <10ms 每分钟 物品塔缓存命中率 >85% 每5分钟 交叉塔吞吐量 >1000QPS 实时监控
4. 实战经验与调优技巧
4.1 特征组合的黄金法则
在实践中,我们发现这些特征组合特别有效:
-
用户兴趣衰减组合:
code复制
用户近期点击率 × 物品新鲜度 -
地域匹配组合:
code复制
用户城市等级 × 物品城市热度 -
设备适配组合:
code复制
用户手机品牌 × 物品客户端优化标记
4.2 模型调参经验
基于数百次实验,我们总结出这些参数范围:
- 学习率:3e-4 到 1e-3 之间
- Batch size:1024 到 4096
- Dropout率:0.1 到 0.3
- 隐藏层维度:用户塔 > 物品塔 > 交叉塔
4.3 常见问题排查
-
特征穿越问题:
- 现象:离线AUC很高但线上效果差
- 检查:确保没有使用未来信息(如用当天统计预测当天行为)
-
服务超时问题:
- 现象:粗排延迟突增
- 解决方案:
- 限制每个请求的最大物品数
- 实现超时熔断机制
-
特征分布偏移:
- 监控特征统计量的PSI(Population Stability Index)
- 当PSI>0.25时需要重新训练模型
4.4 效果提升的奇技淫巧
-
动态温度系数:
python复制# 对得分做动态调整 def dynamic_temperature(scoring, user_activity): base_temp = 1.0 activity_factor = 1 + log(user_activity + 1) return scoring / (base_temp * activity_factor) -
多样性保护:
- 在粗排阶段就对同类目物品做得分衰减
- 实现类目内打散
-
实时反馈注入:
- 将用户最近10次点击的物品特征加权平均
- 作为额外特征输入用户塔
在实际业务中,三塔模型的优势在于它的灵活性和可解释性。我们可以单独优化用户塔来提升个性化效果,或者改进物品塔来更好地捕捉物品特性。这种模块化设计也使得AB测试更加容易实施。