室内图生图用户偏好奖励模型项目。
当前已完成从数据处理到 Qwen3-VL 偏好奖励模型训练、独立推理和外部 GOOD/BAD 成对评估的完整链路。
模型输入为空房间原图和生成家具图,模型输出用户偏好奖励分数:
reward_score = logit(A_like) - logit(B_dislike)
当前最佳参考模型为无房型 Qwen3-VL-8B,最佳 Epoch 为 8,主要用于预测历史用户点赞/点踩偏好,并支持同一房间多个生成结果之间的排序。
configs/:数据、训练和模型配置文件data/raw/:原始 CSV,只读取不修改data/images/:本地图片数据,不提交到 Gitdata/processed/:清洗后的统一数据data/splits/:训练集和验证集data/reports/:字段、缺失值、标签和清洗统计data/external/:外部诊断测试清单;原始测试图片不提交src/preference_reward/common/:配置、日志和通用文件操作src/preference_reward/data/:数据结构、数据构建、清洗、划分和 Pairwise 清单读取src/preference_reward/models/:Qwen A/B Reward 模型封装和 Prompt 处理src/preference_reward/training/:训练器、调度器和独立正则损失src/preference_reward/inference/:Checkpoint 读取、模型加载和奖励打分src/preference_reward/evaluation/:分类评估、GOOD/BAD 成对评估和房型诊断scripts/:训练、数据构建和独立评估入口tests/:单元测试logs/:运行日志,不提交到 Gitoutputs/:模型输出、Checkpoint 和评估结果,不提交到 Git
configs/
├── qwen8b_layout_512_room_type.yaml
└── qwen8b_layout_512_margin_l2.yaml
src/preference_reward/
├── data/
│ └── room_type_manifest.py
├── models/
│ └── prompting.py
├── training/
│ └── margin_regularization.py
└── evaluation/
└── room_type.py
scripts/
├── add_room_type_to_manifests.py
├── evaluate_room_type.py
├── evaluate_training_manifest.py
└── build_layout_test100_manifests.py
tests/
├── test_room_type_manifest.py
├── test_room_type_prompt.py
├── test_room_type_checkpoint.py
├── test_room_type_evaluation.py
├── test_evaluate_room_type_script.py
└── test_margin_regularization.py
- 原始数据只读。
- 数据清洗、划分、训练、推理和评估模块职责分离。
- 训练 Backend 不负责加载已训练 Checkpoint 或执行外部评估。
- 推理统一通过独立
inference/模块读取 Checkpoint、加载 LoRA Adapter 并计算 Reward。 - Reward 定义为
logit(A_like) - logit(B_dislike)。 - 保留 BF16 主模型计算,并对 A/B 输出方向执行 FP32 投影,避免奖励分数离散。
- 外部 GOOD/BAD 成对数据仅用于独立诊断,不用于模型选择或反复调参。
- 启动脚本只解析参数并调用模块,不重复实现底层逻辑。
- 新增功能优先放在独立模块中,训练器只保留最小调用接缝。
- 构建点赞/点踩偏好数据集
- 按房间隔离训练集和验证集
- 使用 Qwen3-VL-8B-Instruct + LoRA 训练 A/B 偏好奖励模型
- 保存可独立推理的 Checkpoint 配置
- 加载最佳 Epoch 的 LoRA Adapter 进行 Reward 打分
- 对外部 GOOD/BAD 测试集进行 Pairwise Accuracy、Bootstrap CI 和错误样本分析
- 生成
REFERENCE | GOOD | BAD三联图用于人工审计 - 执行四折 OOF 泛化评估
- 执行房型捷径诊断
- 评估最佳 Checkpoint 在完整训练集上的表现
- 比较两个模型在同一批 Pair 上的差异
当前最佳参考模型:
Qwen3-VL-8B-Instruct + LoRA
无房型
Epoch 8
固定验证集结果:
ROC-AUC ≈ 0.6254
外部 39 组成对诊断结果:
Pairwise Accuracy ≈ 58.97%
扩展 100 组成对诊断结果:
Pairwise Accuracy = 56.00%
该外部结果只能表述为弱正向排序趋势,不能作为显著优于随机的结论。
固定验证集上的最佳 ROC-AUC 约为 0.6254,但该结果来自单次固定划分,不能完全反映模型在未参与训练样本上的稳定泛化能力。
在 749 条目标训练数据上执行了 4 折 Out-of-Fold 训练与预测。每一折的 Outer Holdout 均不参与模型训练、学习率调度、早停和 Checkpoint 选择。
| Fold | Outer ROC-AUC |
|---|---|
| 1 | 0.5553 |
| 2 | 0.5732 |
| 3 | 0.6181 |
| 4 | 0.5088 |
合并后的 OOF ROC-AUC:
0.5615
四折结果差异较大,最差一折接近随机,说明模型效果依赖数据划分,稳定性不足。
在无房型 Baseline 基础上加入房型 Prompt,最佳验证集 ROC-AUC 从 0.6254 小幅提高到 0.6291。
但外部 39 组结果明显下降:
| 模型 | 正确数 | Pair Accuracy |
|---|---|---|
| 无房型 Baseline | 23 / 39 | 58.97% |
| 加入房型 | 17 / 39 | 43.59% |
进一步诊断结果:
模型总体 AUC: 0.6291
房型内 Weighted AUC:0.5535
RoomType Only AUC: 0.6673
结论:
房型与点赞率之间存在明显相关性。模型容易通过房型猜测标签,而不是学习同一房型内部的布局质量,因此房型属于数据捷径,不再作为模型输入。
在无房型 512 配置上增加限制 A/B 分数差过大的 Margin-L2 正则。
固定验证集:
| 模型 | ROC-AUC |
|---|---|
| Baseline | 0.6254 |
| Margin-L2 | 0.6099 |
原 39 组测试:
| 模型 | 正确数 | Pair Accuracy |
|---|---|---|
| Baseline | 23 / 39 | 58.97% |
| Margin-L2 | 25 / 39 | 64.10% |
扩展 100 组测试:
| 模型 | 正确数 | Pair Accuracy |
|---|---|---|
| Baseline | 56 / 100 | 56.00% |
| Margin-L2 | 56 / 100 | 56.00% |
真正新增的 61 组:
| 模型 | 正确数 | Pair Accuracy |
|---|---|---|
| Baseline | 33 / 61 | 54.10% |
| Margin-L2 | 31 / 61 | 50.82% |
结论:
Margin-L2 在原 39 组上的小幅提升没有在新增数据中复现,整体没有稳定收益,因此停止继续调整该方向。
无房型 Baseline 最佳 Epoch 8 在完整训练集上的结果:
| 指标 | 训练集 |
|---|---|
| ROC-AUC | 0.9142 |
| Accuracy | 85.98% |
| Balanced Accuracy | 0.8119 |
| Positive PR-AUC | 0.9485 |
| Negative PR-AUC | 0.8684 |
| Brier Score | 0.1063 |
| ECE | 0.0474 |
训练集与验证集差距:
Train ROC-AUC:0.9142
Val ROC-AUC: 0.6254
Gap: 0.2888
Margin-L2 的训练集 ROC-AUC 达到 0.9579,但验证集下降到 0.6099,Train–Validation Gap 扩大到 0.3480。
结论:
当前模型已经能够充分拟合训练数据,主要问题是泛化不足,而不是 LoRA Rank 或模型容量不足。
本阶段将可用用户反馈数据从上一版的 936 条扩大到 5,236 条。其中训练集 4,189 条,验证集 1,047 条:
Train:Like 3,035 / Dislike 1,154
Validation:Like 759 / Dislike 288
当前最佳模型为:
Qwen3-VL-8B-Instruct + LoRA
无房型
512 分辨率
Epoch 4
固定验证集结果:
| 指标 | 结果 |
|---|---|
| ROC-AUC | 0.7047 |
| Balanced Accuracy | 0.5898 |
| Negative PR-AUC | 0.5001 |
| Brier Score | 0.1770 |
| ECE | 0.0201 |
与上一版相比,固定验证集 ROC-AUC 从 0.6254 提高到 0.7047,绝对提升约 0.0793。
在扩展 100 组 REFERENCE / GOOD / BAD 数据上的结果:
正确:66
错误:34
Pairwise Accuracy:66.00%
95% CI:[56.57%, 75.25%]
平均 GOOD-BAD Margin:0.1931
Pointwise ROC-AUC:0.5873
上一版模型在相同 100 组上的 Pairwise Accuracy 为 56%,本阶段提高到 66%。说明扩大真实用户反馈数据不仅改善了内部验证集表现,也提升了模型对人工 GOOD/BAD 布局结果的相对排序能力。
模型在 Epoch 4 达到最佳结果,之后训练损失继续下降,但验证指标逐步恶化,并在 Epoch 9 触发 Early Stopping,说明继续增加训练轮数不能解决过拟合问题。
当前模型更适合同一参考图下多个生成结果之间的候选排序,而不是使用统一阈值判断不同房间的绝对质量。下一阶段将使用现有 100 组 R / GOOD / BAD 数据,从 Qwen3-VL-8B 基模重新训练专项布局 Reward Model,并按 Pair 隔离训练集和验证集。
本阶段将训练目标从单张图片的 Like/Dislike 分类,改为直接学习同一个空房间下 GOOD 与 BAD 的相对排序。专项数据共 100 组,每组包含空房间 R、较好布局 GOOD 和较差布局 BAD:
Train:80 Pair
Validation:20 Pair
模型使用 Bradley–Terry Pairwise Loss,直接优化:
reward(R, GOOD) > reward(R, BAD)
本阶段比较了两种 Reward 结构:
P1:复用 Qwen3-VL 原有 A/B Token Logit 计算 Reward;P2:在最后一层 Hidden State 后增加独立 Scalar Reward Head。
固定验证集结果:
| 模型 | 最佳 Epoch | 正确数 | Pair Accuracy | Pairwise NLL |
|---|---|---|---|---|
| P1 A/B Logit | 23 | 18 / 20 | 90.00% | 0.3063 |
| P2 Scalar Head | 23 | 18 / 20 | 90.00% | 0.1853 |
P1 和 P2 在验证集上的错误存在一定互补性。P1 判断错误的 Pair 为 10 和 75,P2 判断错误的 Pair 为 63 和 75,其中 Pair 75 是两个模型共同判断错误的困难样本。
新增外部数据最初包含 41 组完整 Pair,但人工检查发现部分 Reference 并非空房间,或 Reference、GOOD、BAD 的房间结构和相机视角不一致。此类数据不能有效评估布局排序能力,因此首次 41 组评估结果不作为正式结论。按任务一致性要求筛选后,最终保留 18 组有效 Pair。
筛选后的测试结果:
| 模型 | 正确数 | Pair Accuracy | Pairwise NLL | 最小 Margin |
|---|---|---|---|---|
| P1 A/B Logit | 18 / 18 | 100.00% | 0.0318 | +1.1898 |
| P2 Scalar Head | 17 / 18 | 94.44% | 1.0475 | -18.6628 |
P1 在 18 组任务一致性测试数据上全部排序正确,且最小 GOOD-BAD Margin 仍为正。P2 虽然平均 Margin 更大,但出现了一次高置信反向排序,说明当前小数据条件下独立 Scalar Head 仍容易过拟合和过度自信。
当前专项布局主模型更新为:
Qwen3-VL-8B-Instruct + LoRA
Pairwise Bradley–Terry
P1 A/B Logit Reward
512 分辨率
LoRA Rank 8
Epoch 23
当前结果说明,直接使用同一空房间下的 GOOD/BAD Pair 训练,比通过统一 Like/Dislike 分数间接学习布局排序更符合实际应用目标。由于专项训练集仅有 100 组、有效外部测试集仅有 18 组,该结果应视为技术路线的阶段性验证,不能推断模型在所有真实场景中均达到 100% 准确率。
在相同 Layout100 Pairwise 数据上,进一步比较了 512、768 和 1024 三档分辨率。
| 模型 | 分辨率 | 最佳 Epoch | 正确数 | Pair Accuracy | Pairwise NLL |
|---|---|---|---|---|---|
| P1 A/B Logit | 512 | 23 | 18 / 20 | 90% | 0.3063 |
| P1 A/B Logit | 768 | 10 | 15 / 20 | 75% | 0.5616 |
| P1 A/B Logit | 1024 | 11 | 17 / 20 | 85% | 0.5177 |
| P2 Scalar Head | 512 | 23 | 18 / 20 | 90% | 0.1853 |
| P2 Scalar Head | 768 | 10 | 16 / 20 | 80% | 0.5052 |
| P2 Scalar Head | 1024 | 6 | 16 / 20 | 80% | 0.4894 |
| 模型 | 分辨率 | 正确数 | Pair Accuracy | Pairwise NLL | 最小 Margin |
|---|---|---|---|---|---|
| P1 A/B Logit | 512 | 18 / 18 | 100% | 0.0318 | +1.1898 |
| P1 A/B Logit | 768 | 16 / 18 | 88.89% | 0.1879 | -0.1031 |
| P1 A/B Logit | 1024 | 15 / 18 | 83.33% | 0.3225 | -1.8624 |
| P2 Scalar Head | 512 | 17 / 18 | 94.44% | 1.0475 | -18.6628 |
| P2 Scalar Head | 768 | 17 / 18 | 94.44% | 0.1862 | -0.7245 |
| P2 Scalar Head | 1024 | 15 / 18 | 83.33% | 0.3093 | -1.2748 |
- 512 仍是 P1 的最佳分辨率。P1-512 在外部 18 Pair 上全部排序正确,且最小 Margin 仍为正。
- 提高整图分辨率没有带来稳定收益。768 和 1024 在验证集及外部测试上均未超过 512。
- 1024 出现跨 Reward 结构的一致退化。P1-1024 与 P2-1024 错误 Pair 完全相同,说明问题更可能来自高分辨率视觉表征,而非单一 Reward Head。:contentReference[oaicite:0]{index=0} :contentReference[oaicite:1]{index=1}
- P2-512 存在高置信错误风险。唯一错误 Margin 达到
-18.6628;P2-768 保持 17 / 18,同时将最差错误缩小至-0.7245,校准更稳定。:contentReference[oaicite:2]{index=2} - 当前瓶颈不是模型容量或像素不足,而是专项 Pairwise 数据规模较小、困难样本覆盖不足。
当前正式主模型保持为:
Qwen3-VL-8B-Instruct
LoRA Rank 8
Pairwise Bradley–Terry
P1 A/B Token Logit Reward
512 分辨率
Epoch 23
## P1-768 低学习率复核
为了判断 P1-768 的下降是否由学习率过高造成,在保持数据、模型结构、LoRA 参数和输入分辨率不变的情况下,将学习率降低到 `5e-6` 重新训练。
结果如下:
| P1-768 设置 | 最佳 Epoch | 验证集正确数 | Pair Accuracy | Pairwise NLL |
|---|---:|---:|---:|---:|
| 原学习率 | 10 | 15 / 20 | 75% | 0.5616 |
| 学习率 `5e-6` | 6 | 15 / 20 | 75% | 0.6312 |
降低学习率后,最高验证准确率仍为 15 / 20,没有超过原 P1-768。验证 NLL 从 `0.5616` 上升到 `0.6312`,说明整体预测质量也没有改善。
训练后期出现了明显的训练与验证分离:
- 训练准确率最终提高到约 `86.25%`;
- 验证准确率大部分时间停留在 `60%~70%`;
- 最佳验证准确率仍只有 `75%`;
- Epoch 18 因验证 NLL 连续 6 个 Epoch 没有有效改善而触发 Early Stopping。
结论:
> P1-768 的性能下降不能简单归因于学习率过高。继续降低学习率没有带来有效收益,当前不再继续投入 768 和 1024 分辨率调参。
## P1-512 多随机种子稳定性实验
为了判断 P1-512 的结果是否依赖某一次偶然训练,在以下条件保持一致的情况下重新训练了三个随机种子:
- 相同的 80 个训练 Pair;
- 相同的 20 个验证 Pair;
- 相同的 Qwen3-VL-8B 基础模型;
- 相同的 P1 A/B Logit Reward;
- 相同的 512 分辨率;
- 相同的 LoRA、学习率、Batch 和 Early Stopping 设置。
仅修改训练随机种子,测试 `17`、`29` 和 `43`。
结果如下:
| 模型 | Seed | 最佳 Epoch | 验证集 | 验证 NLL | 外部测试 | 外部 NLL | 外部最小 Margin |
|---|---:|---:|---:|---:|---:|---:|---:|
| 原 P1-512 | 原始 | 23 | 18 / 20 | 0.3063 | 18 / 18 | 0.0318 | +1.1898 |
| P1-512 Seed 17 | 17 | 19 | **19 / 20** | **0.1988** | 17 / 18 | 0.0792 | -0.2081 |
| P1-512 Seed 29 | 29 | 18 | 18 / 20 | 0.2219 | **18 / 18** | 0.0372 | +0.4072 |
| P1-512 Seed 43 | 43 | 10 | 16 / 20 | 0.3673 | 17 / 18 | 0.4284 | -5.9172 |
三个新增随机种子的平均结果为:
```text
验证集 Pair Accuracy:88.33% ± 7.64 个百分点
验证集 Pairwise NLL:0.2627 ± 0.0913
外部测试 Pair Accuracy:96.30% ± 3.21 个百分点
外部测试 Pairwise NLL:0.1816 ± 0.2147