1. 项目概述
在计算广告领域,自动出价技术已经成为现代数字营销的核心基础设施。作为全球最大电子商务平台之一的淘宝广告团队,我们每天需要处理数十亿次的实时竞价请求,为广告主提供精准的出价决策。然而,传统竞价环境建模方法存在明显的局限性——它们往往针对特定场景设计,当面对不同预算规模、投放周期或商品类别的广告活动时,泛化能力显著下降。
Bid2X项目的诞生源于我们对这个行业痛点的深刻洞察。通过分析过去三年超过10亿条竞价记录,我们发现尽管不同广告场景的表象差异很大,但其底层竞价规律存在惊人的一致性。这启发我们思考:能否像自然语言处理领域的BERT那样,构建一个通用的"竞价环境基础模型"?
2. 核心挑战与技术路线
2.1 三大核心挑战
在构建通用竞价环境模型的过程中,我们识别出三个关键挑战:
-
数据异构性问题:淘宝平台上的竞价数据包含多种形态——有点数据(如单次出价记录)、时间序列数据(如连续时段的消耗曲线)、离散数据(如广告类别)和连续数据(如出价金额)。这些数据在时间粒度、数值范围和语义含义上都存在显著差异。
-
动态依赖关系:竞价环境本质上是一个多智能体博弈系统。我们的实测数据显示,同一出价在工作日晚间8点的点击成本可能比凌晨3点高出37%,这种时变特性使得静态建模方法难以奏效。
-
零膨胀分布:由于竞价成功率通常不足15%,约68%的时段记录中目标变量(如GMV、PV)为零值。这种特殊的分布特性导致常规神经网络模型的预测产生系统性偏差。
2.2 技术路线设计
针对上述挑战,我们设计了如图1所示的技术路线:
code复制[竞价数据] → [统一序列编码] → [双路注意力机制] → [零膨胀预测]
│ │ │
│ │ └── 处理稀疏响应
│ └── 捕捉变量/时间依赖
└── 解决异构性问题
该架构的核心创新在于:
- 将Transformer架构创造性应用于竞价环境建模
- 设计变量注意力和时间注意力的双路机制
- 提出零膨胀投影层处理稀疏响应
3. 模型架构详解
3.1 统一数据嵌入层
历史数据编码
对于长度为T的历史竞价轨迹,我们采用变量独立的嵌入策略:
python复制class HistoryEmbedder(nn.Module):
def __init__(self, var_num, d_model):
super().__init__()
self.embedders = nn.ModuleList([
nn.Linear(1, d_model) for _ in range(var_num)
])
def forward(self, x): # x: [B, T, var_num]
embeddings = []
for i in range(x.shape[2]):
# 每个变量独立嵌入
emb = self.embedders[i](x[:,:,i].unsqueeze(-1))
embeddings.append(emb)
return torch.stack(embeddings, dim=2) # [B, T, var_num, d_model]
这种设计使得模型可以学习到不同变量(如出价、消耗、点击等)的特有表征模式。
实时数据编码
对于当天实时数据,我们采用时间戳感知的编码方式:
- 将控制变量(出价等)与目标变量(GMV等)分离
- 对目标序列进行右移处理,避免信息泄露
- 添加可学习的时间嵌入和固定位置编码
python复制# 时间戳编码示例(简化版)
def get_timing_encoding(seq_len, d_model):
position = torch.arange(seq_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0)/d_model))
pe = torch.zeros(seq_len, d_model)
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
return pe
3.2 双路注意力机制
变量注意力编码器
该模块将每个变量视为一个token,计算变量间的相关性权重。我们设计了缩放点积注意力的变体:
code复制Attention(Q,K,V) = softmax((QK^T)/√d + M)V
其中掩码矩阵M用于控制可见范围。实测表明,这种设计能使模型自动发现如"出价与GMV的边际效应递减"等关键规律。
时间注意力解码器
采用因果注意力机制,确保预测时只能访问历史信息。关键技术点包括:
- 严格的下三角掩码
- 相对位置编码
- 多头注意力(8头)设计
python复制class CausalAttention(nn.Module):
def __init__(self, d_model, n_head):
super().__init__()
self.attn = nn.MultiheadAttention(d_model, n_head)
self.register_buffer("mask", torch.tril(torch.ones(1000,1000)))
def forward(self, x):
seq_len = x.size(0)
mask = self.mask[:seq_len,:seq_len]
return self.attn(x,x,x,attn_mask=mask)[0]
3.3 零膨胀投影层
为解决零值过多的问题,我们设计了两阶段预测机制:
- 先预测目标是否非零(二分类)
- 再预测具体数值(回归)
数学表达为:
code复制p = σ(W_p h + b_p) # 非零概率
y = p * (W_y h + b_y) # 最终预测
对应的损失函数为:
code复制L = BCE(p, 1_{y≠0}) + p * MSE(y_true, y_pred)
这种设计使模型在淘宝数据集上的MAE指标提升了23.7%。
4. 实验与部署
4.1 离线评估
我们在8个淘宝广告场景数据集上进行了对比实验:
| 模型 | Cost MAE | GMV MAE | PV MAE |
|---|---|---|---|
| LP | 0.142 | 0.098 | 0.087 |
| RL-Bid | 0.121 | 0.085 | 0.076 |
| Informer | 0.105 | 0.072 | 0.064 |
| Bid2X | 0.083 | 0.059 | 0.052 |
关键发现:
- Bid2X在所有指标上均显著优于基线
- 在冷启动场景(新广告主)优势更明显(提升达41%)
4.2 在线A/B测试
在淘宝主站进行为期4周的在线测试,关键结果:
| 指标 | 对照组 | Bid2X组 | 提升 |
|---|---|---|---|
| GMV | 1.00x | 1.0465x | +4.65% |
| ROI | 1.00x | 1.0244x | +2.44% |
| 消耗 | 1.00x | 1.0382x | +3.82% |
特别值得注意的是,中小广告主的收益提升更为显著(GMV +7.2%),这表明我们的模型确实实现了更好的场景泛化能力。
5. 工程实践要点
在工业级部署过程中,我们总结了以下关键经验:
5.1 特征工程规范
-
标准化处理:对连续特征采用RobustScaler(使用IQR而非标准差)
python复制from sklearn.preprocessing import RobustScaler scaler = RobustScaler(quantile_range=(10,90)) -
分类特征编码:对广告类别等特征采用动态分桶哈希
python复制# 根据出现频率自动分桶 bucket_size = int(np.sqrt(cat_feature.nunique()))
5.2 模型服务优化
-
动态批处理:在TF Serving中配置:
protobuf复制max_batch_size: 1024 batch_timeout_micros: 5000 -
量化部署:使用FP16量化使推理延迟降低40%:
bash复制
tensorflow_model_server --model_name=bid2x --enable_batching \ --model_config_file=models.config --enable_fp16
5.3 监控指标设计
我们建立了多维度的监控看板:
- 数据漂移检测:PSI < 0.1
- 预测稳定性:预测值IQR波动 < 15%
- 服务健康度:P99延迟 < 50ms
6. 常见问题排查
在实际运维中,我们遇到并解决了以下典型问题:
6.1 冷启动问题
现象:新广告主活动预测偏差大
解决方案:
- 构建"相似广告主"画像库
- 采用迁移学习微调最后两层
- 设置动态置信度阈值
6.2 节假日效应
现象:大促期间预测失准
应对策略:
- 添加节假日标志特征
- 构建专门的节日子模型
- 在线学习调整机制
6.3 实时数据延迟
处理流程:
- 检测数据流水线延迟
- 自动切换备用特征库
- 补偿时间衰减因子:
python复制decay = exp(-λ*delay) # λ=0.1
7. 扩展应用
Bid2X的框架可扩展至多个相关场景:
- 动态定价系统:只需将出价变量替换为价格变量
- 库存预测:调整时间注意力窗口为周粒度
- 推荐系统:将广告主目标重构为用户兴趣指标
在实际业务中,我们已经将核心模块复用于淘宝的"猜你喜欢"排序系统,取得CTR提升2.3%的效果。