| --- |
| license: apache-2.0 |
| base_model: Qwen/Qwen3-4B |
| tags: |
| - reinforcement-learning |
| - grpo |
| - gdpo |
| - math |
| - lora |
| - qwen3 |
| datasets: |
| - agentica-org/DeepScaleR-Preview-Dataset |
| --- |
| |
| # DeepScaleR GDPO Length Penalty - LoRA Adapters |
|
|
| LoRA adapters from GRPO training with GDPO (Group Direct Preference Optimization) length penalty on the DeepScaleR math reasoning dataset. |
|
|
| ## Training Overview |
|
|
| **Objective**: Train a model to solve math problems correctly while penalizing unnecessarily long responses, using a combined reward signal with length penalty. |
|
|
| **Reward Function (Sum-then-Normalize GDPO)**: |
| For each group of rollouts from the same prompt: |
| 1. Compute raw combined score: `correctness + lambda * length_penalty` |
| - `correctness`: 1.0 if answer matches ground truth, 0.0 otherwise |
| - `length_penalty`: `-num_tokens / max_completion_length` |
| 2. Z-normalize the combined scores within each group (zero mean, unit variance) |
| 3. Use normalized scores as advantages for GRPO policy gradient update |
|
|
| This "sum-then-normalize" approach ensures the length penalty signal is proportional to lambda relative to correctness before normalization, rather than independently normalizing each component. |
|
|
| ## Training Configuration |
|
|
| | Parameter | Value | |
| |---|---| |
| | **Base Model** | Qwen/Qwen3-4B | |
| | **Method** | GRPO with GDPO length penalty | |
| | **Lambda (length penalty weight)** | 0.5 | |
| | **LoRA rank** | 16 | |
| | **LoRA alpha** | 16 | |
| | **LoRA target modules** | all-linear (q, k, v, o, gate, up, down proj) | |
| | **Learning rate** | 5e-5 (constant schedule) | |
| | **KL penalty (beta)** | 0.0 | |
| | **Temperature** | 1.0 | |
| | **Top-p** | 0.95 | |
| | **Prompts per step** | 6 | |
| | **Rollouts per prompt** | 8 | |
| | **Batch size** | 48 (6 x 8) | |
| | **Max completion length** | 15,000 tokens | |
| | **Total steps** | 200 | |
| | **Optimizer** | AdamW (weight_decay=0.1, betas=[0.9, 0.99]) | |
| | **Max grad norm** | 1.0 | |
| | **PPO epochs** | 1 | |
| | **Clip ratio** | 0.2 | |
| | **Framework** | Verl v0.6.1 + FSDP2 | |
| | **Hardware** | 4x NVIDIA H200 | |
| |
| ## Dataset |
| |
| - **Source**: DeepScaleR math reasoning dataset (`agentica-org/DeepScaleR-Preview-Dataset`) |
| - **Difficulty filter**: 99-100% solved percentage (easiest problems) |
| - **Size**: 1,840 problems after filtering |
| - **System prompt**: "Please reason through this problem for yourself, and then when giving your answer ONLY provide your final answer within \boxed{} and DO NOT provide any reasoning." |
| |
| ## Key Training Metrics |
| |
| | Metric | Step 1 | Step 100 | Step 199 | |
| |---|---|---|---| |
| | Mean response length | 1,414 | 61 | 92 | |
| | Max response length | 4,289 | 134 | 204 | |
| | KL divergence | 0.0 | 0.29 | 0.22 | |
| | Policy loss | 0.032 | 0.003 | 0.007 | |
| | Grad norm | 0.019 | 0.195 | 0.149 | |
| | Entropy | 0.140 | 0.057 | 0.061 | |
| |
| The model learned to produce dramatically shorter responses (from ~1,400 tokens to ~60-90 tokens average) while maintaining correctness on easy math problems. |
| |
| ## Checkpoints |
| |
| LoRA adapters are saved every 20 steps: |
| - `checkpoints/global_step_20/` through `checkpoints/global_step_200/` |
| |
| Each checkpoint contains: |
| - `adapter_model.safetensors` (~127MB) - LoRA adapter weights |
| - `adapter_config.json` - PEFT/LoRA configuration |
|
|
| ## Usage |
|
|
| ```python |
| from transformers import AutoModelForCausalLM, AutoTokenizer |
| from peft import PeftModel |
| |
| base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-4B") |
| tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-4B") |
| |
| # Load a specific checkpoint |
| model = PeftModel.from_pretrained(base_model, "brikdavies/deepscaleR/checkpoints/global_step_200") |
| ``` |
|
|
| ## Run Details |
|
|
| - **Run ID**: `20260223_182638_deepscaler_gdpo_lambda0.5` |
| - **Training time**: ~71 minutes (200 steps) |
| - **Wandb project**: `grpo-deepscaler` |
|
|