Downloads · 30 days
9
4% of all-time downloads
Dash10107/dbs-qwen3b-sft-grpo
dbs-qwen3b-sft-grpo is a reinforcement learning model from Dash10107. Use it for the reinforcement learning task on the model card, and read the license before you ship it in a product. The card lists the license as apache-2.0.
LLM agent (Qwen2.5-3B-Instruct-bnb-4bit + LoRA) trained as an adaptive Deep Brain Stimulation programmer for the Parkinson's Motor OpenEnv environment.
Downloads · 30 days
9
4% of all-time downloads
All-time downloads
248
Public
Parameters
3.1B
6.2 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors6.2 GB · 100%
From the Hugging Face model README
LLM agent (Qwen2.5-3B-Instruct-bnb-4bit + LoRA) trained as an adaptive Deep Brain Stimulation programmer for the Parkinson's Motor OpenEnv environment.
Mean grader (averaged over 3 tasks x 1 seeds): 0.664 (base) -> 0.664 (SFT) -> 0.664 (SFT+GRPO) (+0.000, +0.0%)
Success rate: 100% -> 100% (+0 percentage points)
| Task | random | no_dbs | safety_aware | base_qwen | sft_only | sft+GRPO | delta(base->grpo) |
|---|---|---|---|---|---|---|---|
beta_suppression | 0.584 | 0.346 | 0.540 | 0.750 | 0.750 | 0.750 | +0.000 |
tremor_correction | 0.375 | 0.071 | 0.642 | 0.544 | 0.544 | 0.544 | +0.000 |
full_episode | 0.563 | 0.394 | 0.738 | 0.698 | 0.698 | 0.698 | +0.000 |
safety_aware heuristic policy
({'beta_suppression': 12, 'tremor_correction': 12, 'full_episode': 6} eps/task across 3 tasks; kept fully when grader >= 0.55, top half kept when grader >= 0.3).| Plot | Description |
|---|---|
plots/sft_loss.png | Cross-entropy loss across SFT optimizer steps |
plots/grpo_reward_curve.png | Mean grader per group with +-1 std band, stage boundaries marked |
plots/grpo_curves.png | Env reward / parse rate / KL / success rate per stage |
plots/headline_before_after.png | Base LLM vs SFT+GRPO mean grader |
plots/eval_grader_by_task.png | Grader and success rate across all 6 policies and 3 tasks |
plots/eval_component_heatmap.png | 8 grader components x 6 policies |
plots/eval_trajectories_*.png | Per-step beta / tremor / side-effect / DBS amplitude |
logs/sft/sft_steps.jsonl - one row per SFT optimizer steplogs/grpo/rollouts.jsonl - one row per GRPO rollout episodelogs/grpo/updates.jsonl - one row per GRPO update steplogs/eval/episode_rows.jsonl - one row per eval episode (all policies)logs/eval/inference_*.jsonl - full LLM trace (prompt -> response -> action -> obs) for replaylogs/eval/submission_summary.json - the headline numbers abovelogs/eval/submission_checklist.json - submission-requirement auditSame patient, same seed, two policies. Look at how DBS amplitude and the beta/tremor biomarkers move differently after training.
beta_suppression (seed 0, 30 steps)0.750, success = True0.750, success = True [BASE] step= 0 amp=1.00mA pw=130us freq=130Hz | beta=0.624 tremor=0.079 side=0.065 reward=+0.646
[FINAL] step= 0 amp=1.00mA pw=130us freq=130Hz | beta=0.624 tremor=0.079 side=0.065 reward=+0.646
[BASE] step= 15 amp=1.00mA pw=130us freq=130Hz | beta=0.189 tremor=0.352 side=0.298 reward=+0.652
[FINAL] step= 15 amp=1.00mA pw=130us freq=130Hz | beta=0.189 tremor=0.352 side=0.298 reward=+0.652
[BASE] step= 29 amp=1.00mA pw=130us freq=130Hz | beta=0.210 tremor=0.401 side=0.386 reward=+0.605
[FINAL] step= 29 amp=1.00mA pw=130us freq=130Hz | beta=0.210 tremor=0.401 side=0.386 reward=+0.605
tremor_correction (seed 0, 48 steps)0.544, success = True0.544, success = True [BASE] step= 0 amp=1.00mA pw=130us freq=130Hz | beta=0.292 tremor=0.394 side=0.054 reward=+0.592
[FINAL] step= 0 amp=1.00mA pw=130us freq=130Hz | beta=0.292 tremor=0.394 side=0.054 reward=+0.592
[BASE] step= 24 amp=1.00mA pw=130us freq=130Hz | beta=0.079 tremor=0.490 side=0.274 reward=+0.517
[FINAL] step= 24 amp=1.00mA pw=130us freq=130Hz | beta=0.079 tremor=0.490 side=0.274 reward=+0.517
[BASE] step= 47 amp=1.00mA pw=130us freq=130Hz | beta=0.008 tremor=0.765 side=0.317 reward=+0.435
[FINAL] step= 47 amp=1.00mA pw=130us freq=130Hz | beta=0.008 tremor=0.765 side=0.317 reward=+0.435
full_episode (seed 0, 100 steps)0.698, success = True0.698, success = True [BASE] step= 0 amp=1.00mA pw=130us freq=130Hz | beta=0.679 tremor=0.040 side=0.046 reward=+0.751
[FINAL] step= 0 amp=1.00mA pw=130us freq=130Hz | beta=0.679 tremor=0.040 side=0.046 reward=+0.751
[BASE] step= 50 amp=1.00mA pw=130us freq=130Hz | beta=0.078 tremor=0.670 side=0.235 reward=+0.566
[FINAL] step= 50 amp=1.00mA pw=130us freq=130Hz | beta=0.078 tremor=0.670 side=0.235 reward=+0.566
[BASE] step= 99 amp=1.00mA pw=130us freq=130Hz | beta=0.002 tremor=0.497 side=0.240 reward=+0.586
[FINAL] step= 99 amp=1.00mA pw=130us freq=130Hz | beta=0.002 tremor=0.497 side=0.240 reward=+0.586
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained('Dash10107/dbs-qwen3b-sft-grpo')
mdl = AutoModelForCausalLM.from_pretrained('Dash10107/dbs-qwen3b-sft-grpo', torch_dtype='auto', device_map='auto')
The full Colab notebook is dbs_sft_grpo_colab.ipynb in the env repo.
The exact config used is checked into this model repo as cfg.json.