基于深度强化学习的众包任务推荐系统
本项目使用 DQN 系列模型解决众包平台上的任务推荐问题,分别实现两个子目标:
- 最大化参与者(Worker)利益 — 让 worker 找到感兴趣、匹配度高、报酬好的任务
- 最大化请求者(Requester)利益 — 让发布者获得更高质量的回答
- Shared Scorer 架构:参数共享的 Q-Network,消除"槽位记忆"问题
- 周期时间编码:hour_sin/cos 替代 hour_norm,捕捉时间周期性
- 动态特征:progress/need/urgency 反映项目实时状态
- Worker-Project Affinity:基于历史偏好的亲和度计算
CrowdQ-Net/
├── src/ # 源代码
│ ├── data_loader.py # 数据加载与特征工程
│ ├── env.py # Gymnasium RL 环境
│ ├── train.py # SB3 DQN/PPO/A2C 训练
│ ├── train_shared_scorer.py # Shared Scorer DQN 训练
│ ├── shared_scorer.py # Shared Scorer Q-Network
│ └── evaluate.py # 评估脚本
├── run.py # 主入口
├── diagnose.py # Q 值诊断脚本
├── data/ # 数据文件
│ └── data/
│ ├── worker_quality.csv # Worker 质量数据
│ ├── project_list.csv # Project 列表
│ ├── project/ # Project 详情
│ └── entry/ # Entry 数据
├── results/ # 实验结果
├── INIT.md # 项目定义
├── AGENTS.md # 技术决策
├── PLAN.md # 执行计划
├── RESEARCH.md # 调研结果
├── IMPROVEMENT_PLAN.md # 改进计划
├── EXPERIMENT_LOG.md # 实验日志 V1
├── EXPERIMENT_LOG_V2.md # 实验日志 V2
├── EXPERIMENT_LOG_V3.md # 实验日志 V3
└── 实验报告.md # 实验报告
# 创建 conda 环境
conda create -n crowdq-net python=3.11
conda activate crowdq-net
# 安装依赖
pip install torch gymnasium stable-baselines3 pandas numpy matplotlib python-dateutil tensorboard# Worker 侧优化(DQN)
python run.py --reward worker --algorithm dqn --timesteps 50000
# Requester 侧优化(DQN)
python run.py --reward requester --algorithm dqn --timesteps 50000
# Shared Scorer DQN(最佳)
python run.py --reward requester --algorithm shared_scorer --timesteps 30000 \
--max_projects 10 --gamma 0.5 --lr 0.001
# Shared Scorer DQN(改进版)
python run.py --reward requester --algorithm shared_scorer --timesteps 30000 \
--max_projects 10 --gamma 0.5 --lr 0.001 --hidden_dim 64# 查看 TensorBoard 日志
tensorboard --logdir results/
# 查看实验结果
cat results/shared_scorer_requester_*/results.json| 指标 | Worker 侧 | Requester 侧 |
|---|---|---|
| match_rate | 10.3% | 16.20% |
| lift over 1/K | +0.3% | +6.20% |
| 模型 | SB3 DQN | Shared Scorer DQN |
- 架构改进最关键:Shared Scorer 的 lift 是 MLP 的 ~1.5 倍
- γ 是关键超参数:γ=0.5 对 Requester 侧效果显著
- hidden_dim=64 最优:较小网络更适合此问题
- 结果对 seed 敏感:3 seed 平均 lift=+2.72%
- 特征工程存在协同效应:单独有害的特征组合后可能有益
- 更多训练/更深网络/难负样本均无效
我们进行了44+个实验,系统性地探索了不同配置下的模型性能:
| 阶段 | 实验数量 | 主要发现 |
|---|---|---|
| 基线实验 | 6 | K=10时lift接近0 |
| Shared Scorer | 4 | 架构改进提升lift +2.72% |
| 借鉴改进 | 7 | 特征协同效应 |
| 超参数调优 | 15 | hidden_dim=64最优 |
| 组合实验 | 12 | γ=0.7/0.9较好 |
| 要素 | Worker 侧 | Requester 侧 |
|---|---|---|
| 状态 | worker 特征 + project 特征 + affinity | 同左 |
| 动作 | 从候选 project 中选一个 | 同左 |
| 奖励 | award_value | score/quality |
Worker 特征(5 维):
- worker_quality, history_count, award_rate, recency, preferred_category
Project 特征(16 维):
- category, sub_category, industry, entry_count, feedback
- days_remaining, days_elapsed, is_active, title_length, entry_density
- is_weekend, hour_sin, hour_cos, progress, need, urgency
Affinity(1 维):
- worker 与 project 的历史偏好匹配度
输入: [K * 22] flat vector
↓ reshape
[K, 22] — 每行是一个 (worker, project, affinity) 对
↓ scorer MLP(参数共享)
[K, 1] — 每个候选 project 的 Q 值
↓ squeeze
[K] — 输出 K 个 Q 值
- INIT.md - 项目定义与数据概览
- AGENTS.md - 技术决策与编码规范
- PLAN.md - 执行计划
- RESEARCH.md - 调研结果
- EXPERIMENT_LOG.md - 实验日志 V1(基线实验)
- EXPERIMENT_LOG_V2.md - 实验日志 V2(Shared Scorer)
- EXPERIMENT_LOG_V3.md - 实验日志 V3(借鉴改进)
- 实验报告.md - 完整实验报告
- Shan, Y., et al. "An End-to-End Deep RL Framework for Task Arrangement in Crowdsourcing Platforms." arXiv:1911.01030, 2019.
- Mnih, V., et al. "Human-level control through deep reinforcement learning." Nature, 2015.
- Van Hasselt, H., et al. "Deep Reinforcement Learning with Double Q-learning." AAAI, 2016.
- Wang, Z., et al. "Dueling Network Architectures for Deep Reinforcement Learning." ICML, 2016.
本项目仅用于学术研究目的。