亚马逊的(A9、COSMO)和视频推流(如ABR)点击推广算法
电商搜索推荐如亚马逊的A9、COSMO和视频推流如ABR这两个方向拆解它们的底层数学或逻辑实现。一、电商搜索排序A9 算法的技术骨架A9 的本质是一个线性可加的打分模型每个商品按如下公式计算总分Score∑iwi⋅fi(商品,查询,用户)Scorei∑wi⋅fi(商品,查询,用户)其中 fifi 是特征函数wiwi 是权重通过机器学习从点击、购买日志中训练得到。关键特征组技术细节特征类型具体例子计算方式文本相关性查询词与标题、描述、卖点的匹配度TF-IDF 或 BM25现在已升级为 BERT 双塔模型行为反馈历史点击率、加购率、购买率按时间衰减加权 (e.g., e−λΔte−λΔt)商品质量图片质量分、退货率、好评率基于统计分布的标准分 (z-score)流行度近24小时销量对数平滑 log(1sales)log(1sales)个性化用户历史类目偏好协同过滤 双塔向量召回A9 不是单一算法而是一个排序漏斗召回(布尔匹配 向量相似度) → 几百个候选粗排(轻量级LR模型) → 几十个候选精排(GBDT DNN) → 最终排序二、COSMO 的多模态理解如何“看懂”主图COSMO 的核心技术是多模态Transformer同时处理文本和图像。输入表示文本标题、描述 → 通过 BERT 编码为向量 T∈R768T∈R768图像主图 → 通过 Vision Transformer (ViT) 切分为16×16的patch编码为向量 I∈R768I∈R768跨模态融合使用Cross-Attention 机制Attention(Q,K,V)softmax(QKTdk)VAttention(Q,K,V)softmax(dkQKT)V其中 QQ 来自文本特征K,VK,V 来自图像特征。这样模型能学到“户外草地 便携音响 → 露营场景”这类关联。训练目标对比学习让匹配的图文向量距离近不匹配的远InfoNCE loss掩码建模随机遮盖图像的一块让模型从剩余部分预测类似BERT的MLM最终COSMO 输出一个场景向量例如露营、居家、办公作为召回或排序的特征。三、ABR (自适应比特率) 的技术实现细节以亚马逊的 SODA 算法为例它解决的核心问题是未来 N 个视频块应该选什么码率传统 ABR 的局限性大多数 ABR 算法如 BOLA只看当前吞吐量和缓冲区容易频繁切换画质。SODA 的“码率地平线规划”SODA 维护一个未来 K 块的码率序列R1,R2,...,RKR1,R2,...,RK目标函数为max∑t1KQ(Rt)−λ⋅∑t1K−1∣Rt1−Rt∣maxt1∑KQ(Rt)−λ⋅t1∑K−1∣Rt1−Rt∣Q(Rt)Q(Rt)码率为 RtRt 时的视频质量用VMAF或PSNR衡量第二项惩罚相邻块的码率变化实现平滑λλ平滑强度系数通过离线实验调参在线决策SODA 不直接求解整个序列而是用滚动优化 (Receding Horizon)基于当前吞吐量和缓冲区预测未来 K 块的可用带宽用动态规划在 O(K×M) 时间内求出最优码率序列M是可用码率等级数只执行第一块的码率下一时刻重复这种方法相比贪婪策略能将码率切换次数减少近 90%。四、Rufus亚马逊AI助手中的视觉搜索Rufus 允许用户上传图片然后返回相关商品。技术流程图像编码使用CLIP或类似的多模态模型将图片映射为向量 vimgvimg商品索引所有商品的主图也预计算向量 vprodvprod存入FAISS或SCaNN向量数据库近似最近邻搜索给定 vimgvimg在毫秒级内找到最相似的 vprodvprod使用乘积量化或HNSW图索引重排序结合文本匹配和用户个性化信号给出最终推荐关键技术参数向量维度512 或 768召回数量Top-100延迟要求50ms总结算法的本质算法就是一个确定的计算步骤序列将输入用户查询、主图、历史行为映射为输出商品排序、码率选择。技术细节体现在数学模型如线性加权、Transformer优化目标如最大化CTR、最小化卡顿数据结构与工程技巧如向量索引、滚动规划1. A9 排序中的线性模型逻辑回归用于粗排阶段输出点击概率。import numpy as np class LogisticRegression: def __init__(self, dim, lr0.01): self.w np.zeros(dim) self.b 0.0 self.lr lr def sigmoid(self, z): return 1 / (1 np.exp(-z)) def predict_proba(self, X): return self.sigmoid(X self.w self.b) def train_step(self, X, y): # X: (batch, dim), y: (batch,) pred self.predict_proba(X) grad_w X.T (pred - y) / len(y) grad_b np.mean(pred - y) self.w - self.lr * grad_w self.b - self.lr * grad_b loss -np.mean(y * np.log(pred 1e-8) (1-y) * np.log(1-pred 1e-8)) return loss2. GBDT梯度提升决策树用于精排亚马逊精排使用LightGBM或XGBoost。这里展示最简单的回归树提升版本用于预测CTR。from sklearn.tree import DecisionTreeRegressor class SimpleGBDT: def __init__(self, n_estimators100, learning_rate0.1, max_depth3): self.n_estimators n_estimators self.lr learning_rate self.trees [] self.max_depth max_depth def sigmoid(self, x): return 1 / (1 np.exp(-x)) def fit(self, X, y): # 初始化预测值为 log-odds (默认 0) self.initial_pred np.log(np.mean(y) / (1 - np.mean(y) 1e-8)) F np.full(len(y), self.initial_pred) for _ in range(self.n_estimators): # 计算负梯度残差 p self.sigmoid(F) residuals y - p # 训练回归树拟合残差 tree DecisionTreeRegressor(max_depthself.max_depth) tree.fit(X, residuals) self.trees.append(tree) # 更新预测值只使用树的叶节点均值此处简化 F self.lr * tree.predict(X) def predict_proba(self, X): F np.full(len(X), self.initial_pred) for tree in self.trees: F self.lr * tree.predict(X) return self.sigmoid(F)3. COSMO 中的跨模态注意力Transformer 风格这是多模态模型中“看图识字”的核心计算。import torch import torch.nn as nn import torch.nn.functional as F class CrossModalAttention(nn.Module): def __init__(self, d_model768, n_heads12): super().__init__() self.mha nn.MultiheadAttention(d_model, n_heads, batch_firstTrue) def forward(self, text_feat, image_feat): # text_feat: (batch, seq_len_text, d_model) # image_feat: (batch, seq_len_img, d_model) # 让文本作为 query图像作为 key/value attended, attn_weights self.mha( querytext_feat, # 文本 keyimage_feat, # 图像 valueimage_feat ) # attended: 融合了图像信息的文本特征 return attended, attn_weights # 使用示例 d_model 768 text torch.randn(4, 10, d_model) # batch4, 10个文本token image torch.randn(4, 49, d_model) # 49个图像patch model CrossModalAttention(d_model) output, weights model(text, image) print(output.shape) # torch.Size([4, 10, 768])4. SODA 动态规划求解最优码率序列SODA 的核心是在带宽预测下求解未来 K 个块的码率组合最大化质量并最小化切换。5. CLIP 对比损失用于 Rufus 视觉搜索Rufus 使用 CLIP 风格的对比学习使匹配的图像文本对向量相似度高。import torch import torch.nn.functional as F def clip_loss(image_embeds, text_embeds, temperature0.07): image_embeds, text_embeds: (batch, d) # 归一化 image_embeds F.normalize(image_embeds, dim1) text_embeds F.normalize(text_embeds, dim1) # 相似度矩阵 logits image_embeds text_embeds.T / temperature batch_size logits.shape[0] # 标签对角线位置 labels torch.arange(batch_size).to(logits.device) # 图像到文本的损失 loss_i2t F.cross_entropy(logits, labels) # 文本到图像的损失 loss_t2i F.cross_entropy(logits.T, labels) return (loss_i2t loss_t2i) / 2 # 模拟数据 img_vec torch.randn(64, 512) txt_vec torch.randn(64, 512) loss clip_loss(img_vec, txt_vec) print(Contrastive Loss:, loss.item())总结模型核心数学关键代码技巧逻辑回归sigmoid 交叉熵向量化梯度更新GBDT拟合负梯度残差递归拟合回归树跨模态注意力softmax(QK^T)VPyTorch MultiheadAttentionSODA动态规划二维状态 回溯CLIPInfoNCE 对比损失归一化 交叉熵