用分层兴趣表示连接用户与广告实体:深层漏斗优化的工程思路

2026-07-16 27 预计阅读时间: 1 分钟
来源: engineering.fb.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

Meta 正在研究一种用于广告深层漏斗优化的上游表示层:在用户、广告主、商品和服务等广告实体之上学习统一嵌入,把用户推断出的兴趣与广告主提供的内容连接起来。这里的关键变化不是再增加一个独立排序模型,而是尝试提供一套可以被多个下游任务复用的兴趣表示。

为什么需要“分层”兴趣

广告系统中的兴趣通常不处于同一个粒度。一个用户可能对“运动”有长期偏好,近期在浏览“户外运动”,当前又集中比较“轻量徒步鞋”。如果只把这些信号压缩成一个扁平向量,系统容易遇到两个问题:

  • 粗粒度兴趣覆盖面广,但无法区分具体购买意图。
  • 细粒度兴趣更精确,却容易受短期噪声、冷启动和数据稀疏影响。

分层表示可以同时保留多个层级,例如:

运动
└── 户外运动
    └── 徒步
        └── 轻量徒步鞋

同一套层级也能用于组织广告侧实体:广告主属于某个行业,商品属于某个品类,具体广告则表达价格、功能或使用场景。用户和广告实体进入统一向量空间后,召回与排序模型便可以在不同粒度上计算相关性。

这里需要谨慎区分来源事实与工程推演:来源摘要明确提到统一嵌入、用户推断兴趣以及广告主提供的商品和服务,但没有披露具体层级结构、训练损失或线上模型架构。下面的实现属于可以这样实践的简化方案,并不代表 Meta 的实际实现。

上游表示层如何服务深层漏斗

深层漏斗通常关心比点击更接近业务结果的事件,例如加入购物车、提交线索或购买。此类事件价值高,但样本量明显少于曝光和点击。统一表示层的作用,是先从更丰富的交互中学习稳定结构,再把表示交给下游任务使用。

一个可落地的系统可以拆成三层:

  1. 实体编码层:把用户行为、广告主、商品、服务和广告素材编码为向量。
  2. 层级约束层:让细粒度实体靠近其父级主题,同时保留区分具体商品的能力。
  3. 任务层:分别训练点击、加购、线索或购买模型,并复用上游向量。

可以将匹配分数抽象为:

score(user, ad) = Σ level_weight[l] × similarity(user_interest[l], ad_entity[l])

粗粒度层可以提供覆盖率,细粒度层可以提供精度。权重不应固定套用到所有场景:购买预测可能更依赖具体商品层,探索型召回则可能提高品类层的占比。

统一空间还带来一个重要边界:向量相似不等于转化因果关系。价格、库存、地域、投放约束和广告质量仍需由排序特征或规则系统处理,不能被兴趣嵌入替代。

一个可运行的分层匹配原型

下面是一个纯 Python 的最小示例。它分别计算用户与广告在“主题、品类、商品”三个层级的余弦相似度,再生成加权分数。示例数据是假设值,可替换为模型产出的真实嵌入。

将代码保存为 hierarchical_match.py,使用 Python 3.10 及以上版本运行,不需要第三方依赖:

from math import sqrt


def cosine(left: list[float], right: list[float]) -> float:
    numerator = sum(a * b for a, b in zip(left, right))
    left_norm = sqrt(sum(value * value for value in left))
    right_norm = sqrt(sum(value * value for value in right))
    if left_norm == 0 or right_norm == 0:
        return 0.0
    return numerator / (left_norm * right_norm)


def hierarchical_score(
    user: dict[str, list[float]],
    ad: dict[str, list[float]],
    weights: dict[str, float],
) -> tuple[float, dict[str, float]]:
    missing = (set(user) | set(ad) | set(weights)) - (
        set(user) & set(ad) & set(weights)
    )
    if missing:
        raise ValueError(f"Missing hierarchy levels: {sorted(missing)}")

    similarities = {
        level: cosine(user[level], ad[level])
        for level in weights
    }
    total_weight = sum(weights.values())
    score = sum(
        weights[level] * similarities[level]
        for level in weights
    ) / total_weight
    return score, similarities


user_interest = {
    "topic": [0.90, 0.10, 0.20],
    "category": [0.75, 0.55, 0.10],
    "product": [0.60, 0.78, 0.05],
}

ads = {
    "light_hiking_shoes": {
        "topic": [0.88, 0.12, 0.18],
        "category": [0.70, 0.62, 0.08],
        "product": [0.58, 0.82, 0.04],
    },
    "gym_membership": {
        "topic": [0.82, 0.16, 0.22],
        "category": [0.20, 0.90, 0.15],
        "product": [0.12, 0.30, 0.92],
    },
}

# 深层漏斗排序更强调商品层;探索型召回可提高 topic 权重。
weights = {"topic": 0.20, "category": 0.30, "product": 0.50}

ranking = []
for ad_id, ad_embedding in ads.items():
    score, details = hierarchical_score(user_interest, ad_embedding, weights)
    ranking.append((score, ad_id, details))

for score, ad_id, details in sorted(ranking, reverse=True):
    detail_text = ", ".join(
        f"{level}={value:.3f}" for level, value in details.items()
    )
    print(f"{ad_id:22s} score={score:.3f} ({detail_text})")

运行命令:

python hierarchical_match.py

这个原型适合验证接口和打分逻辑,但不能直接承担生产流量。生产系统通常还需要批量向量检索、嵌入版本管理、特征时效控制以及下游校准。若某一层缺失,也不应简单填充任意向量;更稳妥的做法是记录缺失掩码,并只在可用层级上重新归一化权重。

训练与评估不能只盯着离线相似度

分层表示的训练目标可以这样实践:把发生有效互动的用户与广告实体作为正样本,从同品类商品、跨品类热门商品以及随机实体中构造不同难度的负样本;同时增加父子层级约束,避免细粒度嵌入完全偏离上级主题。

评估时至少需要覆盖三类指标:

  • 表示质量:近邻是否保持合理的主题和品类关系,冷启动实体能否借助父级获得可用表示。
  • 检索与排序质量:Recall@K、NDCG,以及购买或线索任务上的校准误差。
  • 线上业务结果:深层转化率、每次转化成本、广告主覆盖率和用户负反馈。

还要检查分层表示是否放大历史偏差。统一嵌入会从行为数据中学习相关性,如果训练样本长期偏向头部广告主,向量空间也可能进一步挤压长尾供给。负样本策略、曝光校正、频控和公平性监控需要与表示学习同时设计。

采用前的工程检查表

引入这类上游表示层时,可以从一个低风险任务开始,例如只参与候选召回或作为排序模型的一组附加特征。上线前确认以下事项:

  • 用户侧和广告侧实体是否拥有一致、可追踪的版本定义。
  • 层级来自稳定 taxonomy,还是模型自动发现;层级变化后如何迁移嵌入。
  • 训练数据是否满足隐私、保留周期和访问控制要求。
  • 深层事件稀疏时,辅助任务是否会压过真正的业务目标。
  • 是否具备按层级消融、回滚和监控漂移的能力。

分层兴趣表示的价值,在于让广告系统同时利用广泛偏好和具体意图,并让这些知识跨召回、排序和深层漏斗任务复用。真正的难点不只是训练一个更大的向量模型,而是维护实体语义、层级演化、数据边界与线上目标之间的一致性。


相关推荐