# GSPO Reinforcement Learning

Wir führen GSPO ein, eine Variante von [GRPO](https://unsloth.ai/docs/de/los-gehts/reinforcement-learning-rl-guide/..#from-rlhf-ppo-to-grpo-and-rlvr) entwickelt vom Qwen-Team bei Alibaba. Sie stellten die Beobachtung fest, dass GRPO Wichtigkeitsgewichte für jedes Token verwendet, obwohl sich Vorteile grundsätzlich nicht mit jedem Token skalieren oder ändern. Dies führte zur Entwicklung von GSPO, das nun die Wichtigkeit der Sequenzwahrscheinlichkeit anstelle der einzelnen Token-Wahrscheinlichkeiten der Tokens zuweist.

* Verwenden Sie unsere kostenlosen GSPO-Notebooks für: [**gpt-oss-20b**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-\(20B\)-GRPO.ipynb) und [**Qwen2.5-VL**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2_5_7B_VL_GRPO.ipynb)

Aktivieren Sie GSPO in Unsloth, indem Sie `importance_sampling_level = "sequence"` in der GRPO-Konfiguration einstellen. Der Unterschied zwischen diesen beiden Algorithmen ist unten zu sehen, sowohl aus dem GSPO-Paper von Qwen und Alibaba:

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-45d743dd5dcd590626777ce09cfab61808aa8c24%2Fimage.png?alt=media" alt="" width="563"><figcaption><p>GRPO-Algorithmus, Quelle: <a href="https://arxiv.org/abs/2507.18071">Qwen</a></p></figcaption></figure>

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-ee755850cbe17482ce240dde227d55c62e9a3e64%2Fimage.png?alt=media" alt="" width="563"><figcaption><p>GSPO-Algorithmus, Quelle: <a href="https://arxiv.org/abs/2507.18071">Qwen</a></p></figcaption></figure>

In Gleichung 1 ist zu sehen, dass die Vorteile jede der Zeilen in die Token-Logprobs skalieren, bevor dieser Tensor summiert wird. Im Wesentlichen erhält jedes Token dieselbe Skalierung, obwohl diese Skalierung der gesamten Sequenz und nicht jedem einzelnen Token gegeben wurde. Ein einfaches Diagramm dazu ist unten zu sehen:

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-b3c944808a15dde0a7ff45782f9f074993304bf1%2FCopy%20of%20GSPO%20diagram%20(1).jpg?alt=media" alt="" width="286"><figcaption><p>GRPO Logprob-Verhältnis zeilenweise mit Vorteilen skaliert</p></figcaption></figure>

Gleichung 2 zeigt, dass die Logprob-Verhältnisse für jede Sequenz summiert und nach der Berechnung der Logprob-Verhältnisse exponiert werden und nur die resultierenden nun Sequenz-Verhältnisse zeilenweise mit den Vorteilen multipliziert werden.

<figure><img src="https://797013937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-62fc5b50921e79cce155d2794201c9b96faf941e%2FGSPO%20diagram%20(1).jpg?alt=media" alt="" width="313"><figcaption><p>GSPO Sequenz-Verhältnis zeilenweise mit Vorteilen skaliert</p></figcaption></figure>

GSPO zu aktivieren ist einfach, alles, was Sie tun müssen, ist das `importance_sampling_level = "sequence"` Flag in der GRPO-Konfiguration zu setzen.

```python
training_args = GRPOConfig(
    output_dir = "vlm-grpo-unsloth",
    per_device_train_batch_size = 8,
    gradient_accumulation_steps = 4,
    learning_rate = 5e-6,
    adam_beta1 = 0.9,
    adam_beta2 = 0.99,
    weight_decay = 0.1,
    warmup_ratio = 0.1,
    lr_scheduler_type = "cosine",
    optim = "adamw_8bit",
    # beta = 0.00,
    epsilon = 3e-4,
    epsilon_high = 4e-4,
    num_generations = 8,    
    max_prompt_length = 1024,
    max_completion_length = 1024,
    log_completions = False,
    max_grad_norm = 0.1,
    temperature = 0.9,
    # report_to = "none", # Auf "wandb" setzen, wenn Sie zu Weights & Biases protokollieren möchten
    num_train_epochs = 2, # Für einen schnellen Testlauf, für vollständiges Training erhöhen
    report_to = "none"
    
    # GSPO ist unten:
    importance_sampling_level = "sequence",
    
    # Dr GRPO / GAPO etc
    loss_type = "dr_grpo",
)
```
