Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Preference Reward

室内图生图用户偏好奖励模型项目。

当前阶段

当前已完成从数据处理到 Qwen3-VL 偏好奖励模型训练、独立推理和外部 GOOD/BAD 成对评估的完整链路。

模型输入为空房间原图和生成家具图,模型输出用户偏好奖励分数:

reward_score = logit(A_like) - logit(B_dislike)

当前最佳参考模型为无房型 Qwen3-VL-8B,最佳 Epoch 为 8,主要用于预测历史用户点赞/点踩偏好,并支持同一房间多个生成结果之间的排序。

目录说明

  • configs/:数据、训练和模型配置文件
  • data/raw/:原始 CSV,只读取不修改
  • data/images/:本地图片数据,不提交到 Git
  • data/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/:运行日志,不提交到 Git
  • outputs/:模型输出、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

核心设计

  1. 原始数据只读。
  2. 数据清洗、划分、训练、推理和评估模块职责分离。
  3. 训练 Backend 不负责加载已训练 Checkpoint 或执行外部评估。
  4. 推理统一通过独立 inference/ 模块读取 Checkpoint、加载 LoRA Adapter 并计算 Reward。
  5. Reward 定义为 logit(A_like) - logit(B_dislike)
  6. 保留 BF16 主模型计算,并对 A/B 输出方向执行 FP32 投影,避免奖励分数离散。
  7. 外部 GOOD/BAD 成对数据仅用于独立诊断,不用于模型选择或反复调参。
  8. 启动脚本只解析参数并调用模块,不重复实现底层逻辑。
  9. 新增功能优先放在独立模块中,训练器只保留最小调用接缝。

当前主要能力

  • 构建点赞/点踩偏好数据集
  • 按房间隔离训练集和验证集
  • 使用 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%

该外部结果只能表述为弱正向排序趋势,不能作为显著优于随机的结论。

OOF 泛化诊断

固定验证集上的最佳 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

结论:

房型与点赞率之间存在明显相关性。模型容易通过房型猜测标签,而不是学习同一房型内部的布局质量,因此房型属于数据捷径,不再作为模型输入。

Margin-L2 测试

在无房型 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 或模型容量不足。

AID Feedback V2 数据扩展结果

本阶段将可用用户反馈数据从上一版的 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 隔离训练集和验证集。

Layout100 专项 Pairwise Reward 结果

本阶段将训练目标从单张图片的 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 为 1075,P2 判断错误的 Pair 为 6375,其中 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

外部 18 Pair 测试

模型 分辨率 正确数 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

核心结论

  1. 512 仍是 P1 的最佳分辨率。P1-512 在外部 18 Pair 上全部排序正确,且最小 Margin 仍为正。
  2. 提高整图分辨率没有带来稳定收益。768 和 1024 在验证集及外部测试上均未超过 512。
  3. 1024 出现跨 Reward 结构的一致退化。P1-1024 与 P2-1024 错误 Pair 完全相同,说明问题更可能来自高分辨率视觉表征,而非单一 Reward Head。:contentReference[oaicite:0]{index=0} :contentReference[oaicite:1]{index=1}
  4. P2-512 存在高置信错误风险。唯一错误 Margin 达到 -18.6628;P2-768 保持 17 / 18,同时将最差错误缩小至 -0.7245,校准更稳定。:contentReference[oaicite:2]{index=2}
  5. 当前瓶颈不是模型容量或像素不足,而是专项 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

About

A modular preference reward modeling pipeline for interior furniture layout evaluation using Qwen3-VL and user feedback.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages