# Apprentissage par renforcement GSPO

Nous introduisons GSPO qui est une variante de [GRPO](https://unsloth.ai/docs/fr/commencer/reinforcement-learning-rl-guide/..#from-rlhf-ppo-to-grpo-and-rlvr) créée par l'équipe Qwen chez Alibaba. Ils ont observé que lorsque GRPO attribue des poids d'importance à chaque jeton, les avantages intrinsèques ne s'étendent pas et ne changent pas avec chaque jeton. Cela a conduit à la création de GSPO, qui attribue désormais l'importance à la vraisemblance de la séquence plutôt qu'aux vraisemblances individuelles des jetons.

* Utilisez nos notebooks GSPO gratuits pour : [**gpt-oss-20b**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-\(20B\)-GRPO.ipynb) et [**Qwen2.5-VL**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2_5_7B_VL_GRPO.ipynb)

Activez GSPO dans Unsloth en définissant `importance_sampling_level = "sequence"` dans la configuration GRPO. La différence entre ces deux algorithmes peut être vue ci-dessous, à la fois dans l'article GSPO de Qwen et Alibaba :

<figure><img src="https://550366147-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>Algorithme GRPO, Source : <a href="https://arxiv.org/abs/2507.18071">Qwen</a></p></figcaption></figure>

<figure><img src="https://550366147-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>Algorithme GSPO, Source : <a href="https://arxiv.org/abs/2507.18071">Qwen</a></p></figcaption></figure>

Dans l'équation 1, on peut voir que les avantages mettent à l'échelle chacune des lignes dans les logprobs des tokens avant que ce tenseur ne soit sommée. Essentiellement, chaque token reçoit la même mise à l'échelle bien que cette mise à l'échelle ait été appliquée à l'ensemble de la séquence plutôt qu'à chaque token individuel. Un diagramme simple de ceci peut être vu ci‑dessous :

<figure><img src="https://550366147-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>Ratio de logprob GRPO mis à l'échelle ligne par ligne avec les avantages</p></figcaption></figure>

L'équation 2 montre que les ratios de logprob pour chaque séquence sont sommés et exponentiés après le calcul des ratios de logprob, et seuls les ratios de séquence résultants sont multipliés ligne par ligne par les avantages.

<figure><img src="https://550366147-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>Ratio de séquence GSPO mis à l'échelle ligne par ligne avec les avantages</p></figcaption></figure>

Activer GSPO est simple, il vous suffit de définir le `importance_sampling_level = "sequence"` indicateur dans la configuration GRPO.

```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", # Mettre à "wandb" si vous souhaitez enregistrer sur Weights & Biases
    num_train_epochs = 2, # Pour un test rapide, augmenter pour un entraînement complet
    report_to = "none"
    
    # GSPO est ci‑dessous :
    importance_sampling_level = "sequence",
    
    # Dr GRPO / GAPO etc
    loss_type = "dr_grpo",
)
```
