扩散模型冷启动CTR - 新品零交互时的转化潜力预热
Skill-CSDM-Diffusion-ColdStart · 05-推荐系统
1. 解决的问题
传统推荐系统采用 Embedding & MLP 范式:每个商品 ID 对应一个向量,该向量通过用户历史交互数据学习。新品没有历史交互 → Embedding 全为随机噪声 → CTR 预测失效,这就是冷启动问题。
2. 核心算法逻辑
传统推荐系统采用 Embedding & MLP 范式:每个商品 ID 对应一个向量,该向量通过用户历史交互数据学习。新品没有历史交互 → Embedding 全为随机噪声 → CTR 预测失效,这就是冷启动问题。
3. 业务应用场景
业务问题 跨境母婴电商每周上新 200-500 个 SKU(Momcozy 双泵吸奶器、有机棉连体衣、婴儿推车配件等)。传统 CTR 模型对新品给出接近随机的预测值(AUC ≈ 0.5),导致: - 新品被排序算法压低权重,得不到曝光 - 潜在热销品在黄金流量窗口期被埋没 - 人工运营需要靠经验手动提权,效率低下
Sankey 图连接点:新品页面是用户旅程 Sankey 图中的"前置节点"——若新品页面的 CTR 预测不准,流量分发决策的 Prior 错误,整个漏斗分析失效。CSDM 生成的 Warmed-Up Embedding 为该节点提供有意义的先验估计。
| 字段 | 示例值 | 说明 | |------|--------|------| | category_id | `maternity_pump` | 一级类目编码 | | price_usd | 39.99 | 上架价格(美元) | | brand_id | `momcozy` | 品牌 ID | | image_embedding | `[0.12, -0.34, ...]` (512维) | 主图 ResNet/CLIP 特征 | | title_embedding | `[0.05, 0.21, ...]` (256维) | 商品标题语义向量 | | shipping_days |
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
10万
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
CSDM: Cold-Start Diffusion Model for CTR Prediction
论文: arXiv:2504.06270 (2025), Zhu et al.
场景: 母婴出海跨境电商新品冷启动 CTR 预热
核心流程:
1. 预训练 CTR backbone (DeepFM) 获得现有商品的 ID Embeddings (z0)
2. 训练 CSDM: 学习 z0 <-> 侧信息 h 之间的扩散映射
3. 推断: 新品只提供侧信息 h, 生成 Warmed-Up Embedding
4. 替换: 将 Warmed-Up Embedding 写入 Embedding Table, 正常 CTR 推断无额外成本
"""
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader
from typing import Optional
import math
# ─────────────────────────────────────────────
# 1. 超参数 & 噪声调度
# ─────────────────────────────────────────────
class CSDMConfig:
"""CSDM 超参数配置"""
# Embedding 维度
embed_dim: int = 64 # ID Embedding 维度 d
side_dim: int = 128 # 侧信息原始维度 (类目+价格+图像拼接后)
hidden_dim: int = 64 # 侧信息投影后的隐层维度 h
# 扩散过程
T: int = 1000 # 总扩散步数
T_sub: int = 50 # 非马尔可夫子序列步数 (训练加速)
sigma: float = 0.0 # 随机噪声强度 (0 = DDIM 确定性)
rho: float = 0.1 # 扩散损失权重
# 训练
lr: float = 1e-4
batch_size: int = 512
epochs: int = 30
# 噪声调度: 余弦调度
@staticmethod
def cosine_schedule(T: int, s: float = 0.008):
"""余弦噪声调度, 返回 alpha_t 序列 (长度 T+1)"""
steps = torch.arange(T + 1, dtype=torch.float64)
f = torch.cos(((steps / T) + s) / (1 + s) * math.pi / 2) ** 2
alpha = f / f[0]
return alpha.float() # shape: [T+1], alpha[0]=1, alpha[T]≈0
# ─────────────────────────────────────────────
# 2. 侧信息编码器
# ─────────────────────────────────────────────
class SideInfoEncoder(nn.Module):
"""
将商品侧信息 (类目 + 价格 + 图像特征) 映射到隐层向量 h
8. 论文来源
- 2504.06270