Zum Inhalt springen
CoMLRL
Schneller Start

Training anhand des Längenverhältnisses

Automatisch übersetzt mit translategemma:4b Englisches Original

Dieses Tutorial demonstriert eine einfache zweier-Agenten-Trainingsaufgabe mit einer Längenverhältnis-Belohnung. Beide Agenten erhalten denselben Prompt und generieren unabhängig voneinander; der zweite Agent sieht nicht die Antwort des ersten Agenten. Die Belohnung fördert, dass die zweite Ausgabe 2–3× so viele Zeichen enthält wie die erste. Sie bewertet keine Storyqualität oder semantische Zusammenarbeit.

Benutzer können das Beispiel aus einem installierten Quellcode-Checkout ausführen:

python examples/story-len-ratio.py

Speicheranforderungen hängen vom Modell, der Anzahl der Agenten, der Batch-Größe und der Antwortlänge ab. W&B-Protokollierung ist standardmäßig deaktiviert. Das --wandb-Flag aktiviert sie; --wandb-project und --wandb-entity sind optional.

Importiere Bibliotheken#

import math
from functools import partial
from datasets import Dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from comlrl.utils.reward_processor import RewardProcessors
from comlrl.trainers.reinforce import MAGRPOConfig, MAGRPOTrainer

Datenvorbereitung#

Der Datensatz enthält kreative Prompts für beide Agenten.

train_data = {
    "prompt": [
        "Describe a city in the clouds:",
        "Invent a new holiday and explain it:",
        "Write a bedtime story for a dragon:",
        "Explain how teleportation might work:",
        "Tell a joke about dinosaurs:",
        "Describe a world without electricity:",
        "Create a superhero with a unique power:",
        "Write a scene where the moon talks:",
        "Invent a new type of fruit:",
        "Design a playground on Mars:",
    ]
}
train_dataset = Dataset.from_dict(train_data)

Agenteninitialisierung#

Das tokenizer konvertiert Text in das Modell tokens. Jeder Agent verwendet eine separate Modellinstanz.

model_name = "Qwen/Qwen2.5-0.5B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
agents = [AutoModelForCausalLM.from_pretrained(model_name) for _ in range(2)]

Definiere die Belohnungsfunktion#

Die Belohnungsfunktion bewertet das Verhältnis der Ausgabenlänge der Agenten. Sie gibt die maximale Belohnung (1.0) zurück, wenn die zweite Ausgabe 2–3× so viele Zeichen enthält wie die erste. Außerhalb dieses Bereichs nimmt die Belohnung exponentiell ab, je weiter sie von der nächsten Grenze entfernt ist.

def proper_length_ratio_reward(
    completions1, completions2, target_min=2.0, target_max=3.0
):
    rewards = []
    for c1, c2 in zip(completions1, completions2):
        len1, len2 = len(c1), len(c2)

        if len1 == 0:
            rewards.append(0.0)
            continue

        ratio = len2 / len1

        if target_min <= ratio <= target_max:
            reward = 1.0
        else:
            if ratio < target_min:
                distance = target_min - ratio
            else:
                distance = ratio - target_max

            reward = math.exp(-distance)

        rewards.append(float(reward))

    return rewards

Konfiguriere das Training#

Benutzer können das Training über MAGRPOConfig konfigurieren, einschließlich der Lernrate, der Batch-Größe und der Anzahl der Generationen pro Agent pro Prompt.

output_dir = "./magrpo_multi_reward_output"
config = MAGRPOConfig(
    num_train_epochs=3,
    agent_learning_rate=5e-5,
    logging_steps=10,
    num_generations=8,
    num_turns=1,
    max_new_tokens=128,
)

Erstellen Sie Trainer#

Das folgende Beispiel initialisiert MAGRPOTrainer mit den oben definierten Agenten, der Belohnungsfunktion und der Konfiguration. RewardProcessors.scale multipliziert Task-Belohnungen mit 100. Mit der Standard-advantage_normalization=True wird die Normalisierung dies weitgehend aufheben, was nicht auf eine 100-fache Stärkung des Policy Gradient schließen lässt.

configured_reward_func = partial(
    proper_length_ratio_reward, target_min=2, target_max=3
)

trainer = MAGRPOTrainer(
    agents=agents,
    reward_func=configured_reward_func,
    reward_processor=RewardProcessors.scale(factor=100.0),
    args=config,
    train_dataset=train_dataset,
    tokenizer=tokenizer,
)

Training starten#

Der folgende Code trainiert beide Agenten, um die gemeinsame Belohnung zu maximieren und die trainierten Modelle zu speichern.

trainer.train()
trainer.save_model(f"{output_dir}/models")