资讯动态

Criteo广告推荐系统架构与机器学习优化实践

发布时间:2026/10/27 4:01:23 来源:尧图企业网站定制
1. 项目背景与核心价值Criteo项目是互联网广告领域最具代表性的实战案例之一。作为全球领先的效果营销平台Criteo每天要处理超过60亿次广告展示决策这对实时计算系统提出了极高要求。我在2018年首次接触这个项目时就被它精巧的工程架构所震撼——这不仅仅是一个广告推荐系统更是大规模机器学习工程化的典范案例。这个项目的核心价值在于解决了三个行业痛点首先是实时性要求从用户点击到模型响应必须在100毫秒内完成其次是数据规模每天新增的点击日志超过3TB最后是模型效果需要在保证响应速度的前提下持续优化点击率预测准确度。这三个挑战构成了一个典型的不可能三角而Criteo项目通过一系列创新设计实现了平衡。2. 技术架构解析2.1 整体架构设计Criteo系统的架构可以概括为三层流水线数据采集层部署在全球各地的Kafka集群负责收集用户行为数据峰值QPS超过50万特征工程层使用Spark进行特征预处理重点优化了类别型特征的哈希编码模型服务层基于自定义的LR模型后升级为FM进行实时预测这个架构最精妙之处在于各层之间的缓冲设计。我们在数据采集和特征工程之间加入了Redis作为临时存储解决了Spark批处理与实时流之间的速率不匹配问题。具体配置参数如下组件版本关键配置优化目标Kafka2.332 partitions/topic吞吐量Spark2.4executor.memory16G特征处理速度Redis5.0maxmemory-policyallkeys-lru缓存命中率2.2 特征工程实现特征处理是该项目最耗时的环节我们针对广告场景特别优化了以下特征用户历史行为采用滑动窗口统计最近7天的点击/购买次数上下文特征设备类型、地理位置、访问时段等交叉特征用户属性与广告类别的组合特征这里有个重要技巧对于高基数类别特征如商品ID我们采用特征哈希Hashing Trick而非one-hot编码。这使特征维度从千万级压缩到百万级内存占用减少80%。具体实现代码如下def feature_hashing(feature, dim2**20): hashed hashlib.md5(feature.encode()).hexdigest() return int(hashed, 16) % dim注意哈希维度选择需要平衡内存和冲突率我们通过实验发现2^20是个理想值3. 模型优化实战3.1 基础模型选型初期我们使用逻辑回归LR作为基线模型主要考虑三点训练速度快适合每天全量更新模型大小可控线上预测延迟低可解释性强便于业务分析但随着数据量增长我们发现LR的AUC指标停滞在0.72左右。通过特征分析发现很多有价值的交叉特征未被有效利用。于是我们进行了以下改进引入Field-aware Factorization MachineFFM增加二阶特征交叉采用FTRL优化器在线学习这些改进使AUC提升到0.78但模型大小增加了3倍。为此我们开发了特征重要性筛选模块只保留top 50%的特征在效果损失不超过1%的情况下将模型体积压缩回原有水平。3.2 在线学习实现实时模型更新是这个项目的关键技术难点。我们的解决方案是每小时全量训练一个基础模型每分钟用增量数据更新在线模型采用模型热切换保证服务连续性核心代码如下class OnlineLearner: def __init__(self, base_model): self.current_model base_model self.buffer [] def update(self, features, label): self.buffer.append((features, label)) if len(self.buffer) 1000: # 小批量更新 self.current_model.partial_fit(self.buffer) self.buffer []实操心得在线学习的学习率设置很关键我们最终采用自适应学习率η 1/(10.01*t)其中t是更新次数4. 性能优化技巧4.1 系统级优化在压力测试中我们发现几个性能瓶颈Kafka消费者延迟特征编码CPU占用高模型预测线程阻塞对应的解决方案是将Kafka消费者改为多线程模式每个分区独立消费用Cython重写特征编码核心逻辑实现预测请求的批处理模式优化前后对比如下指标优化前优化后提升幅度吞吐量2k QPS8k QPS300%P99延迟150ms50ms66%CPU利用率90%60%33%4.2 内存管理广告推荐系统往往面临内存爆炸问题。我们采用三种策略特征分片按广告主ID哈希分片存储LRU缓存最近最少使用的特征优先淘汰内存映射对静态特征使用mmap加载这里有个关键参数需要特别注意——Redis的maxmemory设置。我们通过监控发现当内存使用超过80%时性能会急剧下降。因此设置报警阈值在75%并配置了自动扩容机制。5. 踩坑实录与解决方案5.1 数据倾斜问题在项目初期我们发现某些广告主的CTR预估异常偏高。经过排查发现是某些热门商品的特征权重过大导致的。解决方案是对样本进行下采样平衡在损失函数中增加类别权重设置特征权重上限调整后的模型在不同广告主间的预测偏差从35%降低到8%。5.2 冷启动挑战新广告上线时缺乏历史数据我们的解决方案是构建一个内容理解管道提取广告文本的TF-IDF特征使用预训练的ResNet提取图片特征构建相似广告图谱这套方案使新广告的初始CTR预估准确率提升了40%。5.3 线上监控体系我们建立了三层监控体系数据质量监控检查特征缺失率、数值分布模型性能监控实时AUC、预测分布业务指标监控实际CTR与预估CTR的差异当任何一项指标超出阈值时系统会自动回滚到上一个稳定版本并触发告警。这套机制帮助我们避免了多次线上事故。6. 项目演进与展望从最初的传统LR模型到现在的复杂深度学习架构Criteo项目已经迭代了十几个大版本。最近我们正在试验以下改进方向使用Transformer建模用户行为序列引入多任务学习同时优化点击率和转化率探索联邦学习解决数据隐私问题每个改进都需要谨慎的AB测试。我们的经验是新模型必须在不增加延迟的前提下至少带来3%的AUC提升才考虑上线。这种严格的评估标准确保了系统持续稳定演进。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑