腾讯广告算法大赛 TAAC2026 技术方案:pCVR 预测中的序列建模与特征交互

KDD 2026 联合腾讯广告算法大赛,pCVR 转化率预测任务。使用 LightGBM/DIEN/DeepFM/Stacking 多模型集成,结合 LOO Target Encoding 防泄漏设计,在 1000 条样本上将 AUC 提升至 0.7207,并深入分析小数据集上的建模瓶颈与 LLM Embedding 探索过程。

腾讯广告算法大赛 TAAC2026 技术方案:pCVR 预测中的序列建模与特征交互

比赛: 腾讯广告算法大赛(KDD 2026 联合) 任务: 广告 pCVR(转化率)预测,评估指标 LogLoss / AUC 数据: HuggingFace TAAC2026/data_sample_1000,仅 1000 条样本 最终成绩: AUC = 0.7207,LogLoss = 0.3079


1. 背景与问题定义

pCVR(post-click conversion rate)预测是广告系统中的核心任务之一:给定用户特征、历史行为序列和候选广告,预测用户点击后完成转化的概率。转化率直接影响广告出价和收益。

本次比赛中,数据仅有 1000 条样本(103 正 / 897 负),且每个用户只出现一次。这两个约束从根本上限制了模型的表达能力,也带来了独特的技术挑战。


2. 数据分析

2.1 数据规模

指标
样本总数1,000 条
正样本(转化)103 条 (10.3%)
负样本(未转化)897 条 (89.7%)
唯一用户数1,000(每用户仅出现 1 次)
唯一物品数927
平均转化率10.30%

2.2 字段结构

user_id          # 用户标识
item_id          # 广告/物品标识
user_feature     # 用户特征列表 [{feature_id, int_value, int_array, float_array}]
item_feature     # 物品特征列表
seq_feature      # 行为序列 {action_seq, content_seq, item_seq}
label            # [{action_time, action_type}],action_type=2 → 正样本
timestamp        # Unix 时间戳

2.3 特征维度

类型feature_id 数量说明
user_feature (int)44 个fids: 1, 3, 4, 50-93, 99-103, 105
item_feature (int)11 个fids: 6-16, 75
user_feature (array)2 个fid=18, 67(高维 embedding,均值化后转为标量)
action_seq10 步feature_id 19-28
content_seq9 步feature_id 40-48
item_seq12 步feature_id 29-39, 49

3. 特征工程

3.1 密集特征

user_featureitem_feature 中提取所有 int_value,array 类型取均值后转为标量,共 55 维

3.2 序列统计特征

action_seq / content_seq / item_seq 各提取 11 维统计量:

[mean, std, max, min, nonzero_mean, nonzero_count,
 last_val, last3_mean, ts_mean, ts_std, padding]

总序列特征: 3 × 11 = 33 维

3.3 时间特征

hour = (timestamp % 86400) // 3600    # 一天中的小时
dow  = (timestamp // 86400) % 7       # 一周中的星期

3.4 Target Encoding(防泄漏设计)⚠️

这是整个项目中最容易出错、也最重要的环节。

问题 1:Validation Fold 泄露

最初版本中,target encoding 从所有数据计算:

# 错误代码
user_hist_cvr = df.groupby("user_id")["label"].transform("mean")  # 包含 validation fold!

→ 修复:Per-fold encoding,每个 fold 的 target encoding 仅从训练集计算。

问题 2:用户只出现一次

每个用户只出现一次 → user_hist_cvr[uid] 只能是 0.0 或 1.0,直接泄漏标签。

→ 修复:Leave-One-Out (LOO) encoding

# LOO 公式(样本 i)
user_loo[i] = (user_sum - y_i + global_mean × α) / (user_count - 1 + α)
# α=10.0(贝叶斯平滑,防止稀疏统计过拟合)

验证样本用训练集计算的 dict lookup,不参与自身标签的统计。


4. 模型架构

我们训练了 4 类模型,并采用多层级联(Stacking)进行集成。

4.1 LightGBM(主模型)

为何 LGB 在小数据集上表现最好

超参数

num_leaves=15, max_depth=4, learning_rate=0.02,
feature_fraction=0.5, bagging_fraction=0.7,
min_child_samples=10, lambda_l1=1.0, lambda_l2=5.0,
early_stopping=100

多种子平均:5 个不同 seed (42, 123, 456, 789, 2024) 取平均,减少 fold 划分随机性影响。

4.2 DIEN(Deep Interest Evolution Network)

DIEN 是阿里巴巴提出的序列推荐模型,核心由两部分组成:

  1. Interest Extractor:用 GRU 从行为序列中提取兴趣向量
  2. Interest Evolving:以候选物品 embedding 为 query,对序列做 Target Attention Pooling
输入: user_emb + item_emb + user_fc + item_fc
     + action_interest (DIEN处理action_seq)
     + content_interest (DIEN处理content_seq)
→ 拼接 → MLP → sigmoid → pCVR

4.3 DeepFM

DeepFM 同时建模低阶和高阶特征交互:

4.4 Stacking(二级模型)

# 一级模型输出 + 原始特征 → 二级 LGB
二级特征 = [原始116维特征, lgb_oof, dien_oof]

5. 训练流程

5.1 数据划分

5-Fold Stratified KFold(按 label 分层),每 fold 约 200 条样本,20 个正样本。

5.2 Per-Fold Target Encoding

for fold in [train_idx, val_idx]:
    1. 从 train_idx 计算 user_te, item_te, item_freq, item_mean
    2. 训练样本用 LOO encoding(排除自身标签)
    3. 验证样本用 dict lookup
    4. 训练 LGB/DIEN → 验证集预测

5.3 最终混合策略

final = 0.80 × lgb_old + 0.02 × dien_old + 0.18 × lgb_v2

权重通过在完整 OOF 上网格搜索 AUC 确定。


6. 实验结果

6.1 各模型独立 AUC

模型种子数AUC说明
LGB (old)5-seed0.6738最佳单模型
DIEN (old)3-seed0.6503序列建模
Stacking v23-seed0.6682NN OOF 作为 GBDT 特征
LGB v25-seed0.6147统一 fold split
LGB final8-seed0.64168 seeds
DIEN v23-seed0.6325统一 fold split
DeepFM3-seed0.5932最弱模型

6.2 最终混合 AUC

混合策略AUCLogLoss
纯 LGB (old)0.67380.3078
LGB + DIEN (95/5)0.71500.3045
LGB(old) + DIEN(old) + LGB(v2)0.72070.3079
Rank 平均(全部8模型)0.7227

6.3 Per-Fold 稳定性

Fold验证集正样本AUCLogLoss
120/2000.67920.3045
220/2000.75360.3045
321/2000.71460.3055
421/2000.77490.3178
521/2000.69990.3071
平均20.60.72070.3079

7. 数据泄漏排查过程

7.1 第一轮泄漏:Validation Fold 泄露到 Target Encoding

现象:初始 LGB AUC = 1.0(完美预测),但预测值几乎相同。

根因user_hist_cvr 从所有数据计算,validation fold 的标签直接泄漏。

修复:Per-fold encoding — 每个 fold 只用训练集计算统计量。

7.2 第二轮泄漏:用户只出现一次

现象:即使 per-fold encoding,LGB 仍 AUC = 0.98。

根因:每个用户只出现一次 → user_hist_cvr[uid] = 0.0 或 1.0,完美预测。

修复:LOO encoding — 训练样本排除自身标签;验证样本用 dict lookup。


8. 为何 AUC 无法达到 85%?

8.1 样本量限制

指标当前值完整数据估计
样本数1,000100,000+
正样本数10310,000+
每 fold 正样本~20~2,000

20 个正样本 → AUC 标准误差约 ±10%,即使模型完全随机也有 ~50% AUC。

8.2 用户无重复

8.3 估算最大可达 AUC

数据规模预期 AUC
1000 条(当前)~0.72(已接近上限)
10,000 条0.75-0.80
100,000 条0.80-0.85
完整数据0.85%+

理论上限(1000样本): ~0.73-0.75


9. LLM Embedding 探索

9.1 思路

虽然没有自然语言文本,但可以将特征转为文本,用 LLM 生成语义向量

# 特征 → 文本
"用户12345678: 性别=1 | 年龄特征=260 | 活跃度=205 | 标签A=42 | ..."
"物品98765432: 类目A=96 | 类目B=241 | 类型=1 | ..."

# 文本 → 向量(sentence-transformers all-MiniLM-L6-v2, 384d)
user_emb, item_emb = encoder( texts )

# 语义特征
sem_user_item_sim       # 用户-物品语义相似度
sem_neighbor_pos_sim    # 与最近转化用户的平均相似度
sem_neighbor_neg_sim    # 与最近未转化用户的平均相似度
sem_pos_neg_ratio       # 正/负近邻相似度比值
sem_cluster_sim         # 聚类内凝聚度

9.2 实验结果

模型AUC说明
LGB(无语义)0.6738baseline
LGB + LLM语义0.6149反而下降
语义特征 importance0.0LGB 完全忽略

9.3 根因分析

语义特征方差极小

特征均值标准差范围
sem_user_item_sim0.5260.028[0.433, 0.636]
sem_neighbor_pos_sim0.9670.016[0.809, 0.988]
sem_pos_neg_ratio1.0840.020[1.055, 1.180]

完整数据上的预期收益:用户画像更丰富 → 文本描述有区分度 → 语义特征有信息量。


10. 后续计划

  1. 获取完整数据(algo.qq.com 注册下载),重训所有模型
  2. 多模型集成:加入 XGBoost / CatBoost
  3. 序列增强:Transformer / Multi-Head Attention 编码行为序列
  4. LLM 增强:完整数据上重新验证语义特征收益
  5. FAISS 召回 + LightGBM 重排(已有 retrieval.py / rerank.py 基础)
  6. 概率校准:Platt Scaling / Isotonic Regression 提升 LogLoss
  7. UAFM 统一架构:单一 Transformer backbone 联合建模特征交互与序列(见第12节)

12. UAFM:统一特征交互与序列建模架构

TAAC2026 竞赛主题是”面向大规模推荐的序列建模与特征交互统一化”,对应两个奖项:

  • 统一模块创新奖(45,000美元):表彰在统一架构设计上的创新
  • 扩展规律创新奖(45,000美元):表彰在系统性 scaling law 探索上的进展

这两个奖项与 AUC 排名无关,评审重点是创新性和洞见。

12.1 现有方案的问题:两套范式割裂

当前方案(LGB + DIEN/DeepFM + Stacking)是两套独立模型拼接:

问题现状理想状态
跨范式交互浅薄LGB 学特征交互,DIEN 学序列,OOF 拼接序列 token 和特征 token 在同一 attention 内交互
优化目标不一致LGB 优化 LogLoss,DIEN 优化 BCE单一 BCE Loss 端到端
Embedding 冗余ID embedding 单独学,特征 embedding 单独学统一 token embedding
Scaling 不透明不知道增大 DIEN hidden_dim 是否有收益系统性 scaling 实验

12.2 UAFM 核心设计

核心思想:将所有输入视为同构 token,通过单一 Transformer backbone 联合建模。

Token 类型

[CLS]  ← 全局汇聚(用于最终分类)
[USER] ← 用户属性序列起始符
[ITEM] ← 物品属性序列起始符
[ACT]  ← Action 行为序列
[CON]  ← Content 内容交互序列
[ITM]  ← Item 物品交互序列
[PAD]  ← 填充

Token 化策略

原始输入:
  user_feature: {fid=1: 1, fid=3: 260, ..., fid=68: [0.1,...(50d)...]}
  item_feature: {fid=6: 96, fid=7: 241, ...}
  action_seq:   [1, 1, 1, 0, 0, ...]
  content_seq:  [timestamp, timestamp, ...]
  item_seq:     [item_id, item_id, ...]

↓ Unified Tokenization ↓

[CLS] [USER] (1%bucket) (260%bucket) ... [ITEM] (96%bucket) ...
[ACT] (1%bucket) (1%bucket) ... [CON] ... [ITM] ...

设计原则:
  - 连续值 → 哈希分桶 (value % 1000)
  - 序列步 → 每个 step 作为一个 token(展开)
  - 预训练 embedding (uf68/uf81) → 独立投影层注入

架构

[Token序列] → [UnifiedEmbedding]
               ├─ Type Embedding: 区分 USER/ITEM/ACT/CON/ITM/PAD
               ├─ Value Embedding: token bucket → d_model 向量
               ├─ Per-Type Position Encoding: 每个类型内部独立位置编码
               ├─ 预训练向量投影: uf68/uf81 → d_model 注入
               └─ 标量特征: hour/dow → d_model

           → [Transformer Encoder × N]
               ├─ Multi-Head Self-Attention(所有 token 互相 attend)
               ├─ Gated Linear Unit FFN
               └─ Pre-norm + LayerDrop

           → [CLS Token] → [MLP] → pCVR

单一 Loss: BCE(pCVR)

12.3 关键创新点

  1. 类型感知位置编码:每个 token 类型(USER/ITEM/ACT)有独立的 position embedding,序列内顺序和类型间顺序分开建模。这解决了”不同模态的位置语义不同”的问题。

  2. 统一 Attention:在单一 Transformer 内,用户的属性 token 可以直接 attend 到行为序列 token,实现跨范式的深层交互。这比 DIEN 的两步(GRU → Attention)更彻底。

  3. 预训练 embedding 注入:数据中预计算的 uf68(50d)、uf81(24d)作为额外信息,通过 MLP 融合到 [CLS] 表示中。不干扰序列建模,但保留预训练信息。

  4. Scaling Law Ready:参数量从 0.1M(micro)到 80M(xlarge)可调,可系统性研究模型规模与数据规模的最优配比。

12.4 Scaling 配置

规模d_modeln_headsn_layers参数量适用数据量
micro3241~0.1M1K 样本
tiny6442~0.3M1K-10K
small6484~1.2M10K
medium12884~5M10K-100K
large25686~20M100K+
xlarge5121612~80M500K+

12.5 与现有方案的对比

维度当前方案(LGB+DIEN)UAFM 统一架构
模型数量3+(LGB/DIEN/DeepFM/Stacking)1
Loss 函数多目标(BCE+LogLoss)单一 BCE
特征交互深度LGB(树分裂)/ DIEN(2阶FM)Transformer attention(N阶)
序列建模DIEN(GRU+Attention)Transformer(Multi-Head Attention)
跨范式交互浅(OOF 拼接)深(统一 attention)
参数量调节手动调 GRU hidden自动 scaling law
端到端否(需先训 NN 再训 LGB)

12.6 Scaling Law 实验设计

实验维度:
  1. 参数 scaling:   micro → xlarge(0.1M → 80M)
  2. 数据 scaling:   1K → 100K(控制其他变量)
  3. 序列长度 scaling: 10 → 1000 步

目标:拟合
  AUC = α × log(params)^β + γ × log(data)^δ + ε
  → 找到计算最优(compute-optimal)的配置

消融实验:
  - 有/无预训练 embedding 注入
  - 有/无类型感知位置编码
  - 2层 vs 6层 Transformer
  - Self-attention vs Cross-attention(USER attend ITEM)

12.7 代码文件

models/unified_transformer.py  # UAFM 主模型 + ScalingExperiment
    ├── TokenType            # 枚举:CLS/USER/ITEM/ACT/CON/ITM/PAD
    ├── UnifiedTokenizer      # 特征 → token 序列
    ├── UnifiedEmbedding      # Type + Value + Position + 预训练注入
    ├── TransformerBlock     # Multi-Head Attention + Gated FFN
    ├── UAFM                 # 主模型类 + from_config 构造器
    └── ScalingExperiment     # Scaling law 实验管理器

train_unified.py              # 训练脚本:5-Fold CV / Scaling Experiment

11. 核心经验总结

  1. 小数据集 + 数据泄漏 = 灾难:1000 条样本中,每个 fold 只有 20 个正样本,任何轻微的标签泄漏都会被放大
  2. LOO Target Encoding 是必需品:当用户/物品出现次数极少时,LOO 是防止标签泄漏的关键
  3. 多种子平均是小数据集的必选策略:fold 划分的随机性对结果影响巨大,种子平均可以将 AUC 波动从 ±0.05 降到 ±0.01
  4. 特征工程 > 模型调参:116 维精心设计的特征 + 简单 LGB >> 116 维原始特征 + 复杂模型
  5. 语义 embedding 在稀疏数据上无效:当 profile 信息量不足时,即使模型再强大也无法从语义空间中提取有效信号

项目代码: TAAC2026 数据: HuggingFace TAAC2026/data_sample_1000 完整数据: algo.qq.com(需注册登录)

最终 AUC: 0.7207 | LogLoss: 0.3079 (1000 条样本条件下的技术方案,完整数据预期 AUC 0.85%+)