The Text on the Creative: An Under-Exploited Ranking Modality for Short-Form Video Ads
Meta
把短视频广告画面上叠加的文字(促销文案、价格、CTA、品牌)当成一种被低估的排序模态,并论证它的高收益部分不需要新的 dense 塔:只要用 3 字节的 RQ-VAE 语义 ID 加 TF-IDF 词袋,挂到排序模型现有的稀疏 embedding 表上即可。链路为:CTR 打分器选帧加 SSIM 去重,再用专用 OCR(约为 VLM 吞吐的 80 倍)识别,之后用广告域句向量 TextRay(768 维)编码,最后由 3x256 RQ-VAE 量化成语义 ID。Instagram 广告排序模型离线 NE -0.055~0.06%(Reels 约 0.12%),线上 80% 流量 A/B 中 NE -0.06~0.08%。
核心思路
短视频广告的画面上通常叠着大量文字:促销文案、价格、折扣、CTA、品牌名和商品名。这些信息对点击和转化很有预测力,但线上 CTR 排序基本没有用上,主要依赖用户侧信号、行为序列和 dense 视觉 embedding。Meta 这篇 RecSys 2026 产业论文把这类文字当作一种被低估、成本低、收益高的排序模态,并在 Instagram 广告排序模型上全量上线。
文中最值得关注的结论是:这个模态的高收益部分只需要三次类别查表,即一个 3 字节的 RQ-VAE 语义 ID(3 层,每层 256 个码)加一个稀疏 TF-IDF 视图,全部挂到排序模型现有的稀疏 embedding 表上,不需要新的 dense 塔。768 维 dense 句向量放在 bundle 之上只多出 ≤0.005% NE,这个差异在多次运行的波动范围之内,所以最终没有上线。
整体实现思路
链路分四段,每天离线跑一次,覆盖数千万新增和更新的广告:
- 智能抽帧:复用线上缩略图 CTR 打分模型给每帧打质量分,按分数排序后用 windowless SSIM 贪心去重,再按观看时长自适应设定采样率。
- Ads-OCR:专用的检测、裁剪、识别三段式 OCR,吞吐约为 VLM 的 80 倍,质量达到 VLM 的 93%。
- 文本到特征:TF-IDF(10 万词表)、TextRay 句向量(768 维)、RQ-VAE 语义 ID(3×8bit)三类特征。
- 接入排序:所有特征只加在 ad 侧塔,交叉交给已有的 FM、DCN 和 cross-attention 层。最终上线的是 TF-IDF 和 RQ-VAE 两类。
作者把这套做法总结为可迁移的配方:低成本的逐帧感知 → 领域微调的文本编码器 → 离散语义 ID 加词面视图,两者都作为类别特征。文中提到它也适用于 ASR 转写、场景标签、落地页文本、logo 等信号。
子模块实现(可复现细节)
Ads-OCR
- 检测:ConvNeXt 主干加 CSP-PAN neck,输出旋转框,计算效率高于 Faster R-CNN。
- 裁剪:每个文字区域 resize 成固定的 48×320 张量,按词并行组 batch。
- 识别:覆盖 41 种语言。先用 CNN 判断文字体系,拉丁文进 TrOCR encoder-decoder,非拉丁文进旧版 LSTM(为了兼容 tokenizer)。每个词约 60 个 patch token,解码步数少,配合 KV cache、Flash Attention、FP16 和 torch.compile。
- 每个 token 带置信度,下游特征只保留置信度 ≥0.6 的 token。
- 与旧 OCR 相比:手写体 precision/recall 提升 15.4%/19.8%,印刷体提升 5.1%/3.4%,吞吐为 4.2 倍。
| 模型 | Word F1 | img/s (A100) |
|---|---|---|
| Legacy OCR | 75.4 | 23 |
| PaddleOCR-VL-1.5 | 72.71 | 3 |
| Llama4-8b | 84.5 | 1.2 |
| Ads-OCR | 79.4 | 97 |
基准共 5,800 张图,81% 为英文,另含 10 种语言。VLM 一侧同样用了 vLLM、batching 和 bf16 等推理优化。
智能抽帧
- 质量分:直接复用线上做缩略图选择的视频帧 CTR 模型,该模型用视频内 pairwise 目标在缩略图 CTR 数据上微调过,所以不增加推理成本。
- 去重:帧按质量分排序后做 greedy 去重,用 AVX2 向量化的 windowless SSIM,阈值 0.5。因为候选已经排好序,复杂度是 O(n) 而不是 O(n²)。
- 自适应采样:0–5s 每秒 2 帧,5–15s 每秒 1 帧,15–30s 每 2 秒 1 帧,30s 以后每 5 秒 1 帧。线上每个视频的帧数中位数为 6。
三类文本特征
- TF-IDF:词表固定为 10 万,每天用最近 30 天的 OCR 输出重建,排序依据是频率-多样性分,会压低品牌词和单个素材专属的词。每个广告得到一个 10 万维稀疏向量,切成 top-25K、25–50K、50–75K、75–100K 四个桶分别输入,方便模型区分高频词和长尾词。
- TextRay:先按水平和垂直邻近关系把 OCR 词聚成段落,每段编码后对所有段做 mean pool。TextRay 基于 EmbeddingGemma,约 300M 参数,训练数据是真实广告文案加指令 LLM 合成的广告风格文本,用有监督对比学习并挖掘近重复促销话术作为难负例,训练分布偏向 CTA、品牌和商品提及以及价格表达。MTEB 约 0.71,支持 Matryoshka 768/512/256/128 截断,量化前保持冻结。
- RQ-VAE 语义 ID:输出 (c0,c1,c2)∈{0..255}³,作为
cluster_id0/1/2三个类别特征查 embedding 表。
RQ-VAE 配置与损失
| 超参 | 值 |
|---|---|
| 输入 | 768 维 TextRay |
| 层数 × 码本 | 3 × 256 |
| cluster 空间 d | 32 |
| Encoder | 768→512→256→32,GELU |
| Decoder | 32→256→512→768 |
| 梯度 | STE |
| 优化 | AdamW,lr 1e-3,batch 1024 |
| 数据 | 500K(语料的确定性 3%),150 epoch |
残差量化:r_l = f(x) − Σ_{k<l} e_{c_k},c_l = argmin_j ‖r_l − e_j‖²;码字求和得到 ẑ = Σ e_{c_l},再解码回 768 维。
容易踩的坑:损失应为重建项、VQ commitment 项 L_vq(对码本做 stop-gradient)和稀疏正则三者之和。在 STE 下,重建路径传给码本的梯度为零,码本只能通过 L_vq 更新。很多小规模复现只回传重建损失,结果码本停在初始化状态,而 dead-code 替换又让利用率维持在 60–80%,看起来一切正常。加回 L_vq 和稀疏项(λ=1.0,β=0.25)后,利用率从 79/67/66% 升到 96.5/100/100%,下游 kNN 一致性也明显改善。
| 配置 | K^L | λ | lr | c0% | c1% | c2% |
|---|---|---|---|---|---|---|
| Recon-only | 256³ | — | 1e-3 | 79.0 | 67.0 | 66.0 |
| Composite | 256³ | 0.1 | 1e-3 | 93.4 | 100 | 100 |
| Composite | 256³ | 0.5 | 1e-3 | 94.1 | 100 | 100 |
| Composite | 256³ | 1.0 | 1e-3 | 96.5 | 100 | 100 |
| Composite | 256³ | 0.1 | 1e-2 | 0.0 | 0.0 | 0.0 |
| 小码本 | 128³ | 1.0 | 1e-3 | 100 | 100 | 100 |
| 小码本 | 64³ | 1.0 | 1e-3 | 100 | 100 | 100 |
每层 top 码的质量占比 ≤2.7%。lr 取 1e-2 时完全坍缩,说明 composite 损失对学习率比较敏感。量化每 1 万个广告不到 1 CPU 秒,主要耗时在加载 checkpoint。
实验设置与结果
表示消融(不重训排序模型的代理评估)
从某一天的推理表中确定性抽取 N=200,000 个广告,由外部前沿 LLM 打 vertical(10 类)、intent(6 类)、audience(3 类)标签,另外约 30 万次调用用于相似度打分。
| 表示 | kNN 平均 LLM 评分 (1–5) | Recall@10 词面 | 每广告字节 |
|---|---|---|---|
| Tokens (TF-IDF) | 3.043 | 1.000 | 400 |
| TextRay 768d | 3.559 | 0.986 | 1536 |
| RQ-VAE 3×8b | 3.359 | 0.933 | 3 |
RQ-VAE 按匹配层级拆开:全码匹配 4.974,只匹配 L0+L1 为 2.772,只匹配 L0 为 2.427。
| 线性探针 Acc | Vertical | Intent | Audience | OOD Intent | OOD Audience |
|---|---|---|---|---|---|
| Tokens | 0.715 | 0.714 | 0.828 | 0.385 | 0.632 |
| TextRay | 0.826 | 0.758 | 0.828 | 0.541 | 0.712 |
| RQ-VAE | 0.757 | 0.690 | 0.789 | 0.395 | 0.669 |
逐层重建(N=20,000):只用 c0 时 MSE 0.00082、cos 0.604;c0+c1 时 0.00071、0.665;三层时 0.00067、0.687,随层数单调改善。人工校准:5 名评审、195 对样本,LLM 与人均评分的 Spearman ρ=0.74,加权 κ=0.74,而人与人两两之间的 Spearman 只有 0.58。用人均评分替代 LLM 后,TextRay > RQ-VAE > Tokens 的排序不变。
抽帧召回(12 万视频,以每 1s 一帧全量 OCR 为 oracle)
| 每视频帧数 | 均匀采样 | 智能采样 |
|---|---|---|
| 3 | 0.58 | 0.78 |
| 6 | 0.71 | 0.92 |
| 12 | 0.84 | 0.97 |
离线 NE(相对 NE,越低越好;训练窗口约 1200 亿样本)
| 处理组 | NE 收益 |
|---|---|
| Tokens 单独 | 0.015–0.02% |
| RQ-VAE 单独 | 0.045–0.05% |
| TextRay 单独(独立 dense 塔) | 0.05–0.053% |
| Tokens + RQ-VAE(上线) | 0.055–0.06% |
| bundle + TextRay | 额外 ≤0.005%(在噪声内) |
| 只对缩略图做 OCR(失败实验) | 0.01–0.015% |
约 300 亿样本之后,window-NE diff 稳定在 [−0.060%, −0.055%] 区间,bootstrap CI 为 ±0.005%。分 surface 看,Reels 类约 0.12%,Feed/Story 约 0.05–0.06%,没有 surface 出现负向。
线上 A/B
处理组占 80% 流量,持续数周,每天数百亿次变现曝光。CTR 头 Online NE 为 −0.06% 到 −0.08%,p<0.01(单侧 z 检验,按 ad-id 计算聚类稳健标准误)。该特征已在 Instagram 广告排序模型上全量。
思考与可参考价值
- SID 不一定要走生成式:把 RQ-VAE 码当成判别式排序里的 3 个类别特征,能拿到 dense 向量约 85–90% 的收益(0.045–0.05 对比 0.05–0.053),存储只有它的 1/500,也不用新塔。对已经有 SID 产物、但生成式还没上线的团队来说,这是一条改造成本很低的落地路径,也能为 tokenizer 质量提供线上信号。
- SID 会丢掉词面信息:品牌名、具体数字(“50% off”)、长尾词在量化后会被抹平,需要 TF-IDF 或关键词通道补上。电商场景里价格、券和品牌更集中,这一点更重要(推断)。
- 码本健康度不能只看利用率:先检查 commitment 项是否真的回传到了码本,再用 kNN 语义一致性或 LLM-judge 做二次确认。
- 覆盖优先于特征工程:只用单张缩略图时 NE 只有 0.01–0.015%,多帧后达到 0.055–0.06%。电商主图和视频之间大概率也有类似差距(推断)。
- 局限:NE 只有 0.06% 量级,也没有报告 CTR 和收入;没有和 RQ-KMeans、FSQ、协同信号增强的 SID 做对比,128³ 和 64³ 码本也没有下游 NE;SID 前缀组合特征、embedding 表大小等排序侧细节都没写;与视觉塔融合的实验明确没做;TextRay、OCR 模型和数据都不公开。
- 落地前需要确认:业务素材的文字密度、OCR 吞吐预算;如果已有多模态 dense 素材 embedding,OCR SID 还有多少增量;SID 是否需要 c0、c0c1、c0c1c2 的层级组合特征,以及码冲突如何处理。