2025搜索广告中的对比学习:从原理到新手实战指南

1次阅读
没有评论

共计 1849 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点:为什么需要对比学习

传统 CTR 预估模型(如 LR、DeepFM)在动态广告场景面临三大挑战:

2025 搜索广告中的对比学习:从原理到新手实战指南

  • 冷启动问题 :新广告或新用户缺乏历史交互数据,导致 Embedding 初始化困难
  • 长尾效应 :中小广告主样本稀疏,模型容易过拟合头部广告
  • 动态性不足 :静态 Embedding 难以捕捉用户实时兴趣变化

技术对比:三大学习范式差异

方法类型 代表算法 广告场景优势 广告场景劣势
Pointwise LogisticRegression 实现简单,计算高效 忽略广告间相对关系
Pairwise RankNet 优化广告对排序 仅考虑两两比较
Listwise LambdaMART 直接优化 NDCG 等列表指标 计算复杂度高

核心实现:双塔模型代码详解

基础结构实现(PyTorch)

import torch
import torch.nn as nn

class DualTower(nn.Module):
    def __init__(self, user_feat_dim=256, ad_feat_dim=128):
        super().__init__()
        # 用户塔(实际工程需包含多模态特征处理)self.user_tower = nn.Sequential(nn.Linear(user_feat_dim, 512),
            nn.ReLU(),
            nn.Linear(512, 256)  # 最终输出用户向量维度
        )

        # 广告塔
        self.ad_tower = nn.Sequential(nn.Linear(ad_feat_dim, 256),
            nn.ReLU(),
            nn.Linear(256, 256)  # 需与用户塔输出维度一致
        )

    def forward(self, user_feats, ad_feats):
        user_emb = self.user_tower(user_feats)  # [batch_size, 256]
        ad_emb = self.ad_tower(ad_feats)        # [batch_size, 256]
        return user_emb, ad_emb

InfoNCE 损失函数实战

def info_nce_loss(user_embs, pos_ad_embs, neg_ad_embs, temperature=0.1):
    """
    user_embs: 用户向量 [batch_size, dim]
    pos_ad_embs: 正样本广告向量 [batch_size, dim]
    neg_ad_embs: 负样本广告向量 [batch_size, num_neg, dim]
    """
    # 计算正样本得分
    pos_scores = torch.sum(user_embs * pos_ad_embs, dim=-1)  # [batch_size]
    pos_scores = torch.exp(pos_scores / temperature)

    # 计算负样本得分
    user_embs_expanded = user_embs.unsqueeze(1)  # [batch_size, 1, dim]
    neg_scores = torch.sum(user_embs_expanded * neg_ad_embs, dim=-1)  # [batch_size, num_neg]
    neg_scores = torch.exp(neg_scores / temperature).sum(dim=-1)

    # 计算损失
    losses = -torch.log(pos_scores / (pos_scores + neg_scores))
    return losses.mean()

性能优化关键点

负采样策略选择

  • 随机负采样 :简单但效果差,易采样 ” 假负样本 ”
  • Batch 内负采样 :复用同 batch 其他正样本作为负样本,节省计算
  • 困难负样本挖掘 :存储近期高得分但未点击的广告作为负样本池

Faiss 加速检索

import faiss

# 构建广告向量索引
d = 256  # 向量维度
index = faiss.IndexFlatIP(d)  # 内积相似度
index.add(ad_embeddings)  # 添加所有广告向量

# 线上实时查询
D, I = index.search(user_embedding, k=100)  # 返回 top100 相似广告 

避坑指南

特征穿越预防

  • 严格划分训练 / 验证时间窗口
  • 禁用未来特征(如次日点击率)
  • 在线服务使用 T + 1 更新策略

AB 测试指标设计

  • 核心指标
  • CTR 提升幅度(需统计显著)
  • 广告主 ROI 变化
  • 辅助指标
  • 长尾广告曝光占比
  • 新广告冷启动速度

思考题

在跨渠道广告(搜索 + 信息流 + 视频)场景中,如何设计统一的对比学习策略?考虑:
1. 渠道特性差异如何处理
2. 用户行为序列如何融合
3. 负样本如何跨渠道构建

正文完
 0
评论(没有评论)