一、早期启发式规则:基于业务经验的简单排序
在推荐广告系统发展初期,受限于计算资源与数据规模,主流云服务商普遍采用启发式规则进行广告排序。这类方法的核心是通过人工总结业务经验,设计一系列可解释的规则来衡量广告价值。
1.1 典型规则设计
早期排序规则通常围绕三个核心维度展开:
- 出价权重:直接使用广告主设定的CPC(单次点击成本)作为主要排序依据,例如
score = bid_price - 质量分修正:引入点击率(CTR)预估值对出价进行修正,形成
score = bid_price * predicted_ctr的组合指标 - 基础过滤规则:设置广告素材尺寸、落地页加载速度等硬性门槛,过滤不符合平台规范的广告
某平台早期广告系统曾采用如下简化排序逻辑:
def heuristic_ranking(ads):ranked_ads = []for ad in ads:if not meets_basic_quality(ad): # 检查素材尺寸、落地页速度等continuequality_score = predict_ctr(ad) # 简单CTR预估模型bid_score = ad.bid_price * 1000 # 转换为统一货币单位ad.score = bid_score * quality_scoreranked_ads.append(ad)return sorted(ranked_ads, key=lambda x: x.score, reverse=True)
1.2 规则系统的局限性
尽管启发式规则具有实现简单、可解释性强的优点,但其缺陷随着业务发展逐渐暴露:
- 规则膨胀问题:为覆盖各种业务场景,规则数量可能增长至数百条,导致维护成本激增
- 静态特征处理:无法动态学习用户与广告的交互模式,特征工程依赖人工经验
- 组合优化困难:多目标排序(如点击率与转化率平衡)需要复杂规则嵌套,效果难以保证
二、机器学习模型阶段:特征工程与线性模型的结合
随着数据积累和计算能力提升,行业常见技术方案开始引入机器学习模型优化排序逻辑。这个阶段的核心是通过特征工程和线性模型实现更精细化的价值评估。
2.1 特征工程体系构建
典型特征维度包括:
- 用户画像特征:年龄、性别、地域、设备类型等基础属性
- 行为序列特征:过去7天点击/购买品类、浏览深度、停留时长等时序特征
- 广告属性特征:素材类型、行业类别、出价策略等静态特征
- 上下文特征:请求时间、网络环境、当前页面主题等场景特征
特征处理流程通常包含:
- 离散特征编码(One-Hot/Hash编码)
- 连续特征分桶(等频/等距分桶)
- 特征交叉(如用户年龄×广告行业)
- 特征归一化(Min-Max/Z-Score标准化)
2.2 线性模型应用
LR(逻辑回归)模型因其可解释性和训练效率成为主流选择。模型训练流程如下:
from sklearn.linear_model import LogisticRegression# 特征矩阵X包含用户特征、广告特征、上下文特征等# 标签y为点击/不点击的二元标记model = LogisticRegression(penalty='l2', C=1.0)model.fit(X_train, y_train)# 预测阶段计算pCTR(预测点击率)predicted_ctr = model.predict_proba(X_query)[:, 1]
2.3 排序公式优化
基于pCTR的排序公式演进为:score = bid_price * pCTR * position_bias_correction
其中position_bias_correction用于修正广告展示位置对点击率的影响。
这个阶段的改进显著提升了排序效果,但仍存在:
- 特征交互能力有限,难以捕捉高阶组合模式
- 模型更新频率低(通常日级更新),无法实时响应数据分布变化
- 多目标优化需要多个独立模型,协调困难
三、深度学习时代:端到端建模与多目标优化
随着深度学习技术成熟,主流云服务商的广告排序系统进入模型化阶段。这个阶段的核心是通过深度神经网络实现特征自动交互和多目标联合优化。
3.1 深度排序模型架构
典型深度排序模型包含三个模块:
-
特征嵌入层:将高维稀疏特征映射为低维稠密向量
import torch.nn as nnclass EmbeddingLayer(nn.Module):def __init__(self, feature_dims, embed_dim):super().__init__()self.embeddings = nn.ModuleList([nn.Embedding(dim, embed_dim) for dim in feature_dims])def forward(self, features):embeds = []for i, feat in enumerate(features):embeds.append(self.embeddings[i](feat))return torch.cat(embeds, dim=-1)
-
特征交互层:通过DNN/FM/DIN等结构捕捉特征间复杂关系
class DNNInteraction(nn.Module):def __init__(self, input_dim, hidden_dims):super().__init__()layers = []for h in hidden_dims:layers.append(nn.Linear(input_dim, h))layers.append(nn.ReLU())input_dim = hself.dnn = nn.Sequential(*layers[:-1]) # 去掉最后一个ReLUdef forward(self, x):return self.dnn(x)
-
多目标输出层:同时预测点击率、转化率等多个指标
class MultiTaskHead(nn.Module):def __init__(self, input_dim, task_dims):super().__init__()self.tasks = nn.ModuleList([nn.Sequential(nn.Linear(input_dim, h),nn.ReLU(),nn.Linear(h, out_dim)) for h, out_dim in task_dims])def forward(self, x):return [task(x) for task in self.tasks]
3.2 实时排序系统设计
现代广告排序系统需要满足:
- 低延迟预测:通常要求<50ms的端到端响应时间
- 动态特征更新:支持实时用户行为特征注入
- 模型在线学习:通过FTRL等算法实现实时参数更新
典型系统架构包含:
- 特征服务层:缓存用户静态特征,实时获取行为序列
- 模型服务层:部署多版本模型,支持A/B测试
- 排序引擎层:执行多目标融合排序,生成最终展示序列
3.3 多目标融合策略
常见融合方法包括:
- 加权求和:
score = w1*pCTR + w2*pCVR + w3*bid_price - 帕累托优化:寻找多个目标的非支配解集
- 强化学习:通过环境反馈动态调整排序策略
某平台实际使用的动态权重调整方案:
def dynamic_weighting(user_context):# 根据用户设备类型调整转化率权重if user_context['device'] == 'mobile':cvr_weight = 0.6else:cvr_weight = 0.4# 根据用户历史行为调整出价权重if user_context['history_clicks'] > 10:bid_weight = 0.3else:bid_weight = 0.5return {'ctr_weight': 1 - cvr_weight - bid_weight,'cvr_weight': cvr_weight,'bid_weight': bid_weight}
四、未来演进方向:强化学习与实时决策
当前行业前沿正在探索以下方向:
- 强化学习排序:将排序问题建模为马尔可夫决策过程,通过环境反馈持续优化策略
- 实时竞价优化:结合实时流量预测与出价策略,实现动态竞价
- 图神经网络应用:利用用户-广告-商品图结构捕捉复杂关系
- 联邦学习部署:在保护数据隐私前提下实现跨域模型训练
五、工程实践建议
对于构建广告排序系统的开发者,建议:
- 渐进式演进:从启发式规则开始,逐步引入机器学习模型
- 特征平台建设:构建统一的特征生产、存储和访问体系
- 模型评估体系:建立包含离线指标(AUC、GAUC)和在线指标(CTR、RPM)的完整评估链
- AB测试框架:支持多策略并行测试与流量渐进扩大
- 监控告警系统:实时监控模型性能漂移和系统异常
技术演进的核心逻辑始终围绕:更精准的价值评估、更实时的响应能力、更复杂的目标平衡。从启发式规则到深度学习模型,不仅是技术手段的升级,更是对广告业务本质理解的深化。未来随着计算能力的进一步提升和算法创新,广告排序系统将向更智能、更自适应的方向持续演进。