CausalDPO:推荐里的 DPO,不只会学偏好,也会把环境混杂一起对齐
背景
补完 DPO4Rec、DRPO、FlexRec 和 SearchLLM 之后,站里对推荐后训练已经能分出不少问题位:
- preference pair 是怎么构造出来的
- 离线日志先该过滤什么,再学什么
LLM-RL到底在对齐单一目标、多目标还是业务 reward- reward 最终被谁消费,是 ranker、reasoner 还是搜索策略
但这一轮继续做增量检索时,我发现这里还缺一个比“pair 怎么造”“reward 怎么配”更早的因果位:
推荐里的 DPO,到底会不会把环境偏差本身一起对齐进去
换句话说,问题不只是:
- chosen / rejected 有没有噪声
- offline log 是不是重尾
- reward 有没有业务偏置
还包括:
这对 chosen / rejected,到底是稳定偏好,还是某个环境下暂时成立的伪相关
这一轮我直接用 arXiv API、arXiv 摘要页、HTML、PDF 与 GitHub API 做定向核验,再补一轮中文检索,最终锁定:
Causal Direct Preference Optimization for Distributionally Robust Generative Recommendation2603.22335arXiv HTML2603.22335PDFuser683/CausalDPO
核完之后,我更愿意把它记成:
推荐里的 DPO,不只会学偏好,也会把环境混杂一起放大
核心判断
这条线真正新增的,不是“又一个 DPO 变体”,而是 environment confounder
DRPO 关注的是:
离线 generative recommendation 先要从脏日志里筛出值得学的样本
CausalDPO 问的则更前一步:
就算 pair 本身干净,这个 pair 背后的偏好关系是不是被环境条件扭曲过
也就是说,这篇 paper 真正补出的不是一个更细的 loss trick,而是一个此前站里没单独命名的 owner:
environment confounder
如果不把这层单独记出来,后面很容易继续把下面几类问题混写成一种“偏好对齐不稳”:
hard negative / noisy logobjective conflictreward governanceenvironment-driven spurious preference
而 CausalDPO 的判断很直接:
DPO 在推荐里不只是可能学偏,它还可能把环境偏差继续放大
它修的问题不是抽象的 OOD,而是 DPO amplifies spurious correlations
这篇 paper 最值得单独记的第一层,是作者没有只说“推荐会遇到分布漂移”,而是直接把矛头对准 DPO 本身。
摘要、Section 3.1 和附录都在反复证明一件事:
如果训练数据里的 chosen / rejected 已经带着 popularity、temporal drift、exposure bias 这类环境混杂,DPO 会进一步强化这种相关性
论文给的例子也很典型:
- 疫情期间医疗、健身、娱乐用品会一起涨
- 平台活动、政策变化、季节因素会改写交互分布
- item popularity 和 exposure 本身也会变成 confounder
这意味着推荐里的 preference pair 不能再被默认理解成纯净监督:
chosen > rejected 可能同时意味着“用户更喜欢”,也可能意味着“这个环境下它更容易被看见、更容易被点击”
Figure 1 还把这个风险写得很具体:DPO 训练后,高流行度 item group 的交互频次继续上升,长尾 group 继续被压低。
因此这条线的真正新意不是“做 OOD benchmark”,而是把 DPO 的主矛盾重新写成:
preference alignment 可能会主动放大 environment-driven shortcut
它给出的系统答案不是显式环境标签,而是 soft clustering -> backdoor adjustment -> invariance regularization
这篇 paper 的方法设计很值得记,因为它没有要求训练集自带明确的 environment label。
它的结构更像三层拼接:
- 先从模型 hidden representation 里抽 causal feature
- 用
DBSCAN先做初始 cluster,再用距离 softmax 得到pseudo-environment概率 - 再把这个 latent environment 分布接到
backdoor adjustment和MMDinvariance regularization
也就是说,这条线真正不是在说:
把时间戳、曝光位、场景 ID 明牌喂给模型
而是在说:
就算环境标签不可见,也可以先从表示空间里反推出伪环境,再约束偏好学习在这些环境之间保持稳定
这会逼着 Story Lab 再补几列:
latent-environment inferencecausal adjustment locusinvariance regularization
否则后面把 RW / D3 / SPRec / DRPO / CausalDPO 放在一起时,还会继续把它们都写成“在做 OOD 或 debias”的同一类方法。
这条线最有价值的,不是只在一个偏移上涨点,而是给了四种 shift contract
论文实验最值得留下来的,不是某一个最好结果,而是它把 OOD 明确拆成四种 shift:
popularity shifttemporal shiftexposure shiftmixed shift
这件事很重要,因为它让“稳健性”不再只是一个泛标签,而开始对应不同数据生成机制。
Table 1 里三组结果已经很清楚:
Yelp2018的 popularity shift 上,CausalDPO把H@10 / N@10做到1.53 / 0.77,明显高于最强 baselineSPRec的1.02 / 0.61ML-10M的 temporal shift 上,CausalDPO做到0.61 / 0.35,高于SDPO / SPRec这组0.55 / 0.30Book-Crossing的 exposure shift 上,CausalDPO做到0.64 / 0.37,也高于RW的0.59 / 0.29和BIGRec的0.53 / 0.30
正文还把平均增益写得很直:
- popularity shift 相对最强 competitor 平均增益
22.29% - temporal shift 平均增益
24.06% - exposure shift 各指标增益区间
8.47%到23.33%
Table 4 的 mixed shift 更值得单独记,因为它说明这条线不只是“单偏移专杀器”:
H@10从最强 baseline 的0.51拉到0.53N@10从0.22拉到0.24H@20从0.76直接拉到1.51N@20从0.28拉到0.47
这意味着这条线不该只被记成一个 popularity debias 或 temporal adaptation 方法,而更像:
preference alignment under multi-shift contract
它还有一个很值得单独记的边界:robustness 不一定要交出明显 IID tax
很多稳健方法都会默认给人一种印象:
你在 OOD 上更稳,往往要拿 IID 表现去换
但 CausalDPO 这里的一个重要信号是,它没有表现出明显的 IID tax。
Table 3 里:
ML-10M上,CausalDPO的H@10 / N@10是0.79 / 0.48,高于RW的0.77 / 0.45Book-Crossing上,CausalDPO的H@10 / N@10是1.77 / 0.99,高于SASRec的1.70 / 0.90
Section 3.5 还直接写出:
即便 OOD 假设不完全满足,MMD regularizer 仍会通过平滑不同 pseudo-environment 的输出,削弱环境特异噪声
这会让后续方法表里除了写 shift contract,还最好再补一列:
IID tax
否则后面很容易默认把所有 causal / robust 路线都理解成“拿 ID 性能换 OOD 稳定”。
Table 5 还补出了另一层:这不是只服务一个 loss,而像 causal regularization backbone
这篇 paper 还有一个很关键的附录信号:
它不是只证明自己的 loss 有效,还证明这套 causal regularization 可以接到其他 DPO 变体后面
Table 5 里:
Dr.DPO在ML-10M上的H@10 / N@10是0.17 / 0.20,加上 causal regularization 后到0.58 / 0.33CPO从0.41 / 0.25到0.52 / 0.31SimPO从0.29 / 0.21到0.36 / 0.27- 最终
CausalDPO自己做到0.61 / 0.35
作者的结论也很明确:
问题不只是某个 DPO 变体不够强,而是它们普遍没有系统建模 environment confounder
这件事很关键,因为它说明这里的主角不只是一个新名字,而是:
causal regularization as a reusable backbone
公开边界要写准:repo 不是 placeholder,但离低门槛复现还差一截
这条线的公开边界比很多 paper-first 路线强,但也没有强到可以直接写成 turnkey reproduction。
GitHub API 能稳定核到:
- 官方仓
user683/CausalDPO创建于2025-05-09 13:46:03 UTC - 最近一次 push 是
2025-07-17 03:28:00 UTC - 根目录已经公开
causal_dpo.py、sft.py、inference.py、evaluate.py、trainer/、dataset/与prompt/ trainer/causal_dpo_trainer.py里能直接看到DBSCAN、softmaxsoft clustering 和MMDloss
但 repo 也有明显实现漂移:
- README 写自己做了
Movielens-10M / Yelp2018 / Book-Crossing - 实际公开 tree 里只有
dataset/ml-1m和prompt/movie.txt *.sh里保留了大量base_model_path、/dataset、save_checkpoint/...这类本地占位- README 说可以下载 fine-tuned checkpoint,但并没有给出实际下载链接
所以更准确的定位不是“已开箱即用”,而是:
official workflow code with implementation drift
证据与来源
- 一手论文入口:
CausalDPOarXiv 摘要页、arXiv HTML、PDF - 时间与作者:arXiv 摘要页显示论文提交于
2026-03-21;PDF 元数据可回溯到作者Chu Zhao / Enneng Yang / Jianzhe Zhao / Guibing Guo - 关键机制:
Section 3.2-3.3直接写出backdoor adjustment、soft clustering、DBSCAN初始化、pseudo-environment推断与MMDinvariance regularization - 关键结果:
Table 1的popularity / temporal / exposure shift,Table 4的mixed shift,Table 3的IID对比,Table 5的Dr.DPO / CPO / SimPO + causal regularization - 复杂度边界:
Table 6显示CausalDPO在Book-Crossing上2971s / epoch,相对DPO的2482s约多19.70%,但正文同时写出平均性能提升约205.9% - 公开仓入口:
user683/CausalDPO;GitHub API 可核到创建时间、最近 push 时间、根目录结构与dataset/ml-1m的实际公开状态 - 中文传播层:截至
2026-03-25,继续补做论文全标题中文检索、site:zhihu.com、site:weixin.qq.com、site:xiaohongshu.com与xhslink检索后,稳定结果仍主要停留在 arXiv 和 GitHub 原始入口,没有拿到稳定高价值中文机制稿或可复用小红书线索
下一步
- 把
CausalDPO / DPO4Rec / DRPO / SPRec / SDPO / RosePO / RW / D3压到同一张OOD preference alignment观察表里,新增environment confounder / latent-environment inference / invariance regularization / shift contract / IID tax - 把这条线和
DRPO明确拆开:前者解决“先学什么样本”,后者解决“pair 本身是否带着环境伪相关” - 继续追中文传播层;如果后续出现稳定的中文机制稿、作者解读、讲义或
xhslink,再补一轮传播观察