Skip to content
pth2002Public

About

Qwen2.5-3B SFT + DPO 两阶段微调 A股投资助手,GPT-4o 评判偏好胜率 74%

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FinPilot

股票投资实战助手 基于 Qwen2.5-3B 的两阶段对齐微调项目:SFT 监督微调 → DPO 偏好对齐。

项目定位

本项目聚焦于在小规模模型(Qwen2.5-3B)上进行对齐优化,通过 SFT(监督微调)与 DPO(偏好对齐)提升模型在 A 股投资场景中的实用性。 本项目目标并非训练通用大模型,而是针对特定金融任务,优化模型的表达质量、信息密度和实用性。


核心结果

指标 SFT only SFT + DPO 变化
GPT-4o 偏好胜率 26% 74% +48pp
含具体数字比例 100% 100% —
含套话比例 14% 4% −10pp
回声开头比例 40% 30% −10pp
平均回答长度 134.7 字 136.9 字 +2.2 字

评估方法:50 题独立测试集 × GPT-4o 裁判 × A/B 位置随机交换


流程概览

原始金融数据 (3939条)
      │
      ▼
[数据清洗 + GPT 扩充]
      │
      ▼
SFT 数据集 (5000条 instruction/output)
      │
      ▼
┌─────────────────────────────────────┐
│  Stage 1: SFT 监督微调               │
│  Qwen2.5-3B + LoRA (rank=16)        │
│  lr=1e-4 / 3 epochs / FP16          │
│  消融实验 → 选最优配置            │
└─────────────────────────────────────┘
      │
      ▼
[SFT adapter] ──merge_and_unload()──▶ merged base
      │
      ▼
DPO 偏好数据集 (1834组 chosen/rejected)
      │
      ▼
┌─────────────────────────────────────┐
│  Stage 2: DPO 偏好对齐               │
│  β=0.1 / lr=1e-5 / 1 epoch         │
│  sigmoid loss / 新 LoRA on merged   │
│  消融实验(6 个维度)            │
└─────────────────────────────────────┘
      │
      ▼
[DPO adapter]
      │
      ▼
评估:50题测试集 × GPT-4o裁判 → 胜率 74%

项目结构

FinPilot/
├── data/
│   ├── sample_sft.json          # SFT 数据样例
│   └── sample_dpo.json          # DPO 偏好对样例
├── scripts/
│   ├── data/
│   │   ├── generate_finance_sft.py   # 生成 SFT 数据
│   │   ├── generate_dpo_data.py      # 构造偏好对
│   │   └── merge_finance_sft.py      # 合并数据
│   ├── train/
│   │   ├── train_final.py            # SFT 最终训练
│   │   ├── train_dpo.py              # DPO 训练
│   │   └── run_ablation.py           # SFT 消融实验
│   └── eval/
│       ├── eval_dpo.py               # 生成对比回答
│       ├── generate_answers.py       # 独立生成回答文件
│       └── local_judge.py            # 4o裁判评估
├── demo/
│   └── demo.md               # 演示截图
├── results/
│   ├── dpo_results.json             # DPO 11 次消融完整指标
│   ├── ablation_results.json        # SFT 6 组消融结果
│   ├── eval_results.json            # GPT-4o 评估 50 个原始结果
│   ├── eval_report.md               # 评估报告
│   ├── dpo_summary.md               # DPO 消融汇总表
│   └── ablation_report.md           # SFT 消融报告
├── README.md
├── requirements.txt
└── .gitignore

Reward 设计(隐式偏好信号)

本项目未显式训练 reward model,而是通过构造 chosen/rejected 偏好对,引入隐式 reward 信号用于 DPO 训练。 偏好数据的构造基于以下规则:

  • 信息密度优先:优先选择包含具体金融指标(如市盈率区间、成交量特征等)的回答
  • 减少套话表达:降低“这是一个很好的问题”等模板化句式
  • 直接回答问题:避免重复问题(echo),强调直接给出结论与分析
  • 金融相关性:强调 A 股市场特有逻辑,而非通用解释

这些规则共同构成隐式 reward,使模型学习更偏向“实用投资回答”,而非泛化语言生成。

为什么使用 DPO 而非 RLHF

相比传统 RLHF,DPO 直接基于偏好对进行优化,具有以下优势:

  • 训练稳定性更高:避免 reward model 带来的不稳定性
  • 工程复杂度更低:无需额外训练 reward 模型
  • 适合小模型场景:在 3B 参数规模下,DPO 更容易收敛

因此在本项目的数据规模和模型规模以及算力限制下,DPO 是更合适的对齐方法。

评估方法

本项目使用 GPT-4o 作为裁判,在 50 题独立测试集上进行 A/B 对比评估:

  • 随机交换答案顺序用于消除位置偏差
  • 仅比较相对偏好而非绝对正确性 该方法在当前大模型对齐研究中被广泛用作人工评估的替代方案,用于衡量模型输出质量提升。

消融实验结论

SFT 阶段

消融维度 最优配置 结论
量化精度 FP16 4-bit 量化在 32GB 显存下无必要,FP16 训练更稳
LoRA rank rank=16 rank=32 无显著提升,rank=8 略有下降
target_modules 全部线性层 仅 q/v 效果弱,全部线性层更充分
学习率 1e-4 5e-5 收敛慢,2e-4 不稳定
epochs 3 2 epochs 欠拟合,4 epochs 过拟合
数据量 5000 条 3000 条指标明显低于 5000 条

DPO 阶段

消融维度 最优配置 结论
β 参数 0.1 β=0.5 过度约束,β=0.05 偏好漂移
学习率 1e-5 5e-6 学习不足,5e-5 发散
epoch 数 1 2+ epochs 出现过拟合
长度差消融 等长数据≈原始 DPO 学的是内容质量而非长度
loss 类型 sigmoid IPO loss 效果相当但不稳定
噪声鲁棒性 10% 噪声可接受 30% 噪声性能明显下降

模型权重

LoRA adapter 约 120MB,未上传至本仓库。训练脚本可复现完整流程。

About

Qwen2.5-3B SFT + DPO 两阶段微调 A股投资助手,GPT-4o 评判偏好胜率 74%

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages