Multi-agent PbRL entraîne les agents collaboratifs LLM à partir des préférences entre leurs réponses conjointes. CoMLRL construit les données de préférence à partir des éléments de tâche et les apprend avec l’un des deux algorithmes : MARLHF s’adapte à un modèle de récompense conjoint et entraîne ensuite les politiques avec RL, tandis que MADPO optimise directement les politiques à partir des préférences. MARLHFTrainer, MADPOTrainer et leurs variantes itératives MARLHFIterTrainer et MADPOIterTrainer sont disponibles à partir de comlrl.trainers.preference.
Les quatre trainers nécessitent actuellement
num_turns=1et des réponses conjointes alignées (joint_mode="aligned"). Une itération de l’algorithme trainers est une phase de collecte et d’entraînement de données, et non une tourn de dialogue.
Données de préférence#
Chaque agent \( i\in\mathcal{I}=\{1,\ldots,n\} \) échantillonne \( a_{i,t}\sim\pi_{\theta_i}(\cdot\mid h_{i,t}) \) de son historique local, et les réponses forment l’action conjointe \( \mathbf{a}_t=\{a_{1,t},\ldots,a_{n,t}\} \) avec l’historique conjoint \( \mathbf{h}_t \). Avec une seule tourn (\( H=1 \)), \( h_{i,0} \) est la requête de \( i \) et \( \mathbf{a}_0 \) est la réponse conjointe.
Les utilisateurs fournissent des éléments de tâche, et non des données de préférence. L’échantillon trainers obtient des réponses conjointes, les évalue avec une fonction oracle, et transforme les scores en paires de préférence.
Fonction oracle#
La fonction oracle évalue chaque réponse conjointe avec une valeur partagée. Par défaut, il s’agit de la récompense de la tâche reward_func, après l’optionnel reward_processor; elle peut suivre des règles ou appeler un modèle de récompense LLM, comme décrit dans Initialisation de l’entraînement. Les deux algorithmes apprennent uniquement à partir de la réponse conjointe qui gagne, de sorte que les valeurs de score ne comptent que pour choisir des paires. Dans MARLHFIterTrainer, preference_scoring_reward="reward_model" fait que le modèle de récompense le plus récemment ajusté soit l’oracle pour de nouvelles comparaisons, avec la récompense de la tâche comme sauvegarde jusqu’à ce qu’il existe.
Critère de préférence#
Pour chaque élément de tâche, chaque agent échantillonne les réponses preference_num_candidates à sa requête, et les réponses avec le même index candidat forment une réponse conjointe. Parmi deux réponses conjointes avec des scores différents, celle avec le score le plus élevé est préférée : elle est la gagnante \( w \), et l’autre est la perdante \( l \). Les égalités sont rejetées. pair_selection et preference_pairs_per_sample décident quelles paires chaque tâche conserve. Dans l’entraînement itératif, chaque comparaison est au lieu entre la réponse conjointe des agents actuels et la réponse conjointe du comparateur au même index candidat, et chaque côté peut gagner.
preference_num_candidates: Nombre de candidats échantillonnés par tâche et actor ; au moins 2 (par défaut 80)preference_pairs_per_sample: Nombre maximal de paires conservées par tâche, ouNonepour aucune limite (par défaut 16)pair_selection:"reward_gap"(par défaut) conserve les paires avec les plus grandes différences de récompense,"random"un sous-ensemble aléatoire, et"all"toutes les paires non liées, ce qui nécessitepreference_pairs_per_sample=None; l’itération trainers ajoute"comparator_reward", qui est leur valeur par défaut, et qui préfère les récompenses comparatrices plus élevées, puis les plus grandes différences de récompensemax_new_tokens,temperature,top_p,top_k: Paramètres de génération de candidats
Format des données#
Une paire \( (\mathbf{h}_H^{w},\mathbf{h}_H^{l}) \) contient les deux historiques de réponse conjointe d’une tâche. Chaque paire est un enregistrement comme suit, avec une entrée par agent dans chaque liste:
{
"prompts": ["<agent 1 prompt>", "<agent 2 prompt>"],
"winner_completions": ["<agent 1 response>", "<agent 2 response>"],
"loser_completions": ["<agent 1 response>", "<agent 2 response>"],
"winner_reward": 0.92,
"loser_reward": 0.41,
"candidate_reward_mean": 0.63,
"raw_rewards": [0.92, 0.41],
"target_raw_reward": 0.92,
"comparator_raw_reward": 0.41
}winner_reward et loser_reward sont les scores oracle des deux réponses conjointes, et candidate_reward_mean est le score moyen des candidats comparés pour la tâche. Les trois derniers champs proviennent de l’entraînement itératif : raw_rewards contient les scores du gagnant et du perdant avant reward_processor, et target_raw_reward et comparator_raw_reward contiennent ceux des agents et du comparateur actuels. L’itération trainers écrit les paires de chaque tour dans iteration_0001.json, iteration_0002.json, etc., sous preference_replay_dir, comme {"iteration": 1, "num_pairs": ..., "pairs": [...]}.
Pipeline d’entraînement#
L’entraînement d’un système multi-agent coopératif basé sur LLM avec PbRL alterne entre la collecte de données de préférence auprès des agents actuels et l’apprentissage à partir de celles-ci avec MARLHF ou MADPO.
- Base trainers (
MARLHFTrainer,MADPOTrainer) collectent les paires une seule fois, puis entraînent sur celles-ci. Si aucune tâche ne produit une paire non liée, l’entraînement se termine sans mettre à jour les politiques. - Boucle trainers (
MARLHFIterTrainer,MADPOIterTrainer) répète le cycle pournum_iterationstours. Le tour \( \nu \) compare les agents actuels avec le comparateur, stocke les nouveaux paires comme \( \mathcal{D}^{(\nu)} \), permet au tampon de relecture de sélectionner les paires d’entraînement \( \mathcal{B}^{(\nu)} \) de ce tour et des tours précédents, et les utilise pour l’entraînement. MADPO effectue ses mises à jour pournum_train_epochspar tour. MARLHF ajuste un modèle de récompense nouvellement initialisé sur ces données, puis exécute l’apprentissage de la politique.
L’évaluation échantillonne toujours à partir des politiques actuelles et les évalue avec la récompense de la tâche (reward_func et reward_processor), et non avec un modèle de récompense appris.
agent_modelouagents: Identifiant de modèle pour les agents homogènes, ou une liste d’identifiants de modèles ou d’instancesnum_agents: Nombre d’agents ou de rôles de tâche; doit correspondre àargs.num_agentstokenizer: Un tokenizer, ou un pour chaque actortrain_dataset: Éléments de tâche pour la collecte de préférences et, dans MARLHF, l’apprentissage de la politiqueeval_dataset: Ensemble de données d’évaluation facultatifreward_func: Appel requis qui renvoie une récompense de tâche partagée pour chaque réponse conjointe alignéereward_processor: Post-traitement facultatif des récompenses de tâcheformatters: Un formatteur de prompt partagé pour tous les rôles, ou une liste de formatteurs spécifiques aux rôlesargs: L’instance de configuration de trainermodel_config: Configuration facultative de chargement de modèlewandb_config: Configuration facultative de Weights & Biaseseval_logger,eval_aggregator: Accros facultatifs pour les métriques d’évaluation, comme dansMAGRPOTrainercentralized_comparator_adapter: Constructeur de requête conjointe et analyseur de rôle pour un actor ou un comparateur ; par défaut,<agent_0>...</agent_0>écrit des sections indexéescritic_modeloucritics(MARLHF uniquement) : Sources facultatives de critic pour un MAAC ou IAC.critic_modeldoit être une chaîne d’identifiant de modèle. Les utilisateurs peuvent fournir des instances de modèles chargées viacritics, avec une liste d’un élément pour MAAC ou une entrée par actor pour des critic et IAC séparés. Sans sources explicites,critic_model_nameou l’identifiant de modèle actor est utilisémetrics_callback(MARLHF uniquement) : Accro facultatif de callback de métriques personnalisées pour un actor-critic
- Hérite de
MADPOConfig;num_train_epochss’applique à chaque itération num_iterations: Nombre de tours de collecte et d’entraînement (par défaut : 6)- Paramètres de comparateur et de tampon de relecture : décrits dans Comparateur et Tampon de relecture
- Combine les paramètres de MARLHF avec
num_iterationset les paramètres de comparateur et de tampon de relecture preference_scoring_reward:"task"(par défaut) associent de nouvelles comparaisons à la récompense de la tâche;"reward_model"utilise le modèle de récompense de l’itération précédente une fois qu’il existereward_num_train_epochs: Entraînement du modèle de récompense epochs par itération (par défaut 2)
Comparateur#
Dans l’entraînement itératif, le comparateur fournit le côté de chaque comparaison. Les agents actuels et le comparateur répondent à la même tâche, et chaque comparaison avec un vainqueur clair sous la fonction oracle devient un couple, quel que soit le vainqueur.
comparator_policy choisit la source du comparateur:
comparator_policy="current"(par défaut): Poids actifs actor, échantillonnés avec un flux de nombres aléatoires distinct.
comparator_policy="current_copy": Poids actuels actor, copiés verscomparator_devicespour chaque phase de collecte lorsque ceux-ci diffèrent des appareils actor.
comparator_policy="model": Modèles explicites decomparator_model_nameoucomparator_agents.
comparator_policy="history": Un point de contrôle actor sauvegardé decomparator_history_kitérations en arrière; la politique initiale jusqu’à ce qu’elle existe.
comparator_policy="api": Un point de terminaison de modèle distant.
La source history sauvegarde automatiquement les points de contrôle de la politique. Les deux côtés peuvent échantillonner différents nombres de candidats; seuls les indices présents des deux côtés sont comparés, et pair_selection="comparator_reward" ne suppose pas que le comparateur gagne. Par défaut, le comparateur génère une réponse par rôle; avec comparator_generation_mode="centralized", un modèle de comparateur écrit chaque réponse du rôle dans une réponse conjointe, qui est analysée en réponses de rôle avant que les paires ne soient construites.
comparator_policy:"current","current_copy","model","history", ou"api"comparator_num_candidates: Nombre d’échantillons du comparateur; valeur par défautpreference_num_candidatescomparator_model_nameoucomparator_agents: Une source de modèle partagée, ou une par rôle, pour"model"comparator_history_k: Itérations en arrière pour"history"; valeur par défaut 1comparator_devices: Position de l’appareil pour les modèles de comparateur locauxcomparator_generation_mode:"decentralized"(par défaut) ou"centralized"comparator_centralized_agent_index: Le rôle dont actor, point de contrôle, ou modèle écrit la réponse conjointe d’un comparateur centralisé; valeur par défaut 0, ce qui est requis par un comparateur centralisé actorpolicy_checkpoint_dir: Emplacement optionnel de actor-point de contrôle; la définition enregistre également les points de contrôle pour les autres sources
Les sources de modèles peuvent être des référentiels de modèles ou des points de contrôle locaux, comme décrit dans Entraîner les entités:
comparator_policy=model
comparator_model_name=/path/to/comparator-checkpoint
comparator_generation_mode=centralized
comparator_centralized_agent_index=0
comparator_devices=cuda:1Comparateurs API#
Avec comparator_policy="api", le comparateur interroge un modèle distant. comparator_api_format sélectionne le format de la requête:
comparator_api_format="generic"(par défaut): La requête inclut le prompt, l’index actor, l’élément de tâche, le nombre de candidats et les paramètres de génération; les complétions sont lues à partir decomparator_api_response_field.
comparator_api_format="openai": Complétion de Chat, également utilisé par des points de terminaison compatibles tels que DeepSeek.
comparator_api_format="anthropic": Messages d’Anthropic API (https://api.anthropic.com/v1/messages,ANTHROPIC_API_KEY).
comparator_api_format="openai_responses"(aliasresponsesoucodex): Réponses OpenAI API (https://api.openai.com/v1/responses,OPENAI_API_KEY).
Les formats Anthropic et Réponses n’ont pas de paramètre n, ils envoient donc une requête par candidat. Les requêtes utilisent les invites de comparateur centralisées ou décentralisées standard.
comparator_policy=api
comparator_api_format=anthropic
comparator_api_url=https://api.anthropic.com/v1/messages
comparator_api_model=claude-sonnet-4-20250514
comparator_api_key_env=ANTHROPIC_API_KEYcomparator_api_url: Point de terminaison URL; requis pour"api"comparator_api_format:"generic"(par défaut),"openai","anthropic"ou"openai_responses"comparator_api_model: Nom du modèle transmis au point de terminaisoncomparator_api_key_envoucomparator_api_key: Variable d’environnement contenant la clé, ou la clé elle-mêmecomparator_api_headers: En-têtes de requête supplémentairescomparator_api_key_header,comparator_api_key_prefix: En-tête d’authentification et préfixe; par défaut"Authorization"et"Bearer", avec gestion native des en-têtes Anthropiccomparator_api_timeout: Délai d’attente de la requête en secondes; par défaut 120comparator_api_max_n_per_request: Nombre maximum de candidats par appel à Chat Completions, pour les points de terminaison qui limitentncomparator_api_response_field: Champ Completions dans une réponse générique; valeur par défaut"completions"comparator_api_extra_body: Champs supplémentaires du corps de la requête
Tampon de relecture#
Le tampon de relecture sélectionne les paires stockées utilisées pour l’entraînement à chaque étape. L’ensemble de données de la phase actuelle est enregistré en premier, ce qui le rend éligible ainsi que les phases précédentes. preference_replay_mode définit quelles phases sont éligibles:
preference_replay_mode="current"(par défaut): Toutes les paires de la phase actuelle, sans échantillonnage historique.
preference_replay_mode="nearest_k": Les derniers ensembles de données non videspreference_replay_k, y compris le dernier.
preference_replay_mode="all_history": Chaque ensemble de données non vide de la phase actuelle de l’exécution trainer.
preference_replay_mode="lambda_decay": Le même historique, avec une pondération vers les phases récentes.
Chaque ligne du diagramme montre quelles phases un mode peut utiliser et comment chaque phase est pondérée, avec la phase la plus récente à droite.
nearest_k signifie les phases les plus récentes, et non la récupération par voisin le plus proche. Dans nearest_k et all_history, les ensembles de données éligibles ont le même poids, quel que soit leur taille, et les modes historiques y échantillonnent plutôt que d’entraîner sur toutes les paires stockées. Les paires ré-tokenisées sont récupérées à partir des fichiers de la phase enregistrée. Définir preference_replay_dir sur une phase antérieure ne importe pas ses fichiers, tandis que les points de contrôle d’entraînement restaurent l’index de relecture et ses données.
Décroissance de Lambda#
Avec l’âge, \( a=0 \) pour les plus récents des ensembles de données \( K \), preference_replay_lambda (\( \lambda \)) définit les poids de sélection :
\( \lambda=0 \) conserve uniquement le dernier ensemble de données, les valeurs plus petites favorisent les dernières itérations, et \( \lambda=1 \) attribue le même poids à chaque ensemble de données.
Échantillonnage#
Les modes historiques attribuent chaque tirage preference_replay_sample_size à un ensemble de données selon un poids, puis échantillonnent des paires au sein de chaque ensemble de données. L’échantillonnage se poursuit sans répétition lorsque le nombre attribué ne dépasse pas la taille de l’ensemble de données ; les nombres plus importants passent en revue des copies mélangées. L’échantillon combiné est mélangé. La taille d’échantillonnage par défaut est le nombre de paires de la dernière itération, ou la taille de l’ensemble de données non vide le plus récent si la dernière itération est vide.
preference_replay_mode:"current"(par défaut),"nearest_k","all_history"ou"lambda_decay"preference_replay_k: Nombre de derniers ensembles de données non vides pour"nearest_k"; requis dans ce modepreference_replay_lambda: Paramètre de décroissance dans [0, 1] ; requis pour"lambda_decay"preference_replay_sample_size: Paires échantillonnées par les modes historiques, ouNonepour la valeur par défaut ci-dessuspreference_replay_dir: Emplacement facultatif pour les ensembles de données des rondes enregistrés
current rejette preference_replay_sample_size et preference_replay_lambda et accepte preference_replay_k uniquement si None ou 1. La configuration suivante échantillonne 256 paires de toutes les rondes, avec une pondération vers les dernières :
from comlrl.trainers.preference import MADPOIterConfig
args = MADPOIterConfig(
num_agents=2,
preference_replay_mode="lambda_decay",
preference_replay_lambda=0.8,
preference_replay_sample_size=256,
)MARLHFIterConfig accepte les mêmes options. Pour rejouer uniquement les dernières rondes, les utilisateurs peuvent définir preference_replay_mode="nearest_k" et le nombre de rondes via preference_replay_k.
MARLHF#
L’apprentissage par renforcement multi-agents à partir des retours humains (MARLHF) ajuste un modèle de récompense conjoint aux paires de préférences, puis entraîne les politiques avec RL sur le modèle de récompense appris. Étant donné que le modèle de récompense évalue la réponse complète de l’équipe, des modèles actors apprennent à partir d’une récompense partagée.
Apprentissage de la récompense#
Le JointRewardModel \( \widetilde{R}_{\psi}(\mathbf{h}_t,\mathbf{a}_t) \) lit les invites et les réponses de tous les agents en tant que texte et applique une tête scalaire à l’état caché final du causal-LM backbone à la dernière position non-remplie token. Il minimise la perte de Bradley–Terry sur les paires d’entraînement \( \mathcal{B} \):
où \( \sigma \) est la fonction sigmoïde. La perte augmente la note du gagnant par rapport à la note du perdant ; elle ne se régresse pas vers les récompenses de la tâche. Entités d’entraînement décrit comment le modèle de récompense est chargé.
Apprentissage de la politique#
Après l’apprentissage de la récompense, \( \widetilde{R}_{\psi} \) est fixé et remplace la récompense de la tâche. Les politiques échantillonnent de nouvelles réponses conjointes pour chaque tâche, \( \widetilde{R}_{\psi} \) les évaluent sans gradients, et un MARL backend met à jour la politique de chaque agent pour maximiser le retour appris :
rl_algorithm sélectionne le backend :
rl_algorithm="magrpo"(par défaut) : MAGRPO, avec une base de moyenne de groupe.
rl_algorithm="mareinforce": MAREINFORCE, avec des retours bruts.
rl_algorithm="marloo": MARLOO, avec une base de leave-one-out.
rl_algorithm="maremax": MAReMax, avec une base de maximum de groupe.
rl_algorithm="maac": MAAC, avec un modèle centralisé critic.
rl_algorithm="iac": IAC, avec-actor critics ou fixé value heads.
Réponse conjointe REINFORCE et Réponse conjointe Actor-Critic décrivent ces mises à jour, avec \( \widetilde{R}_{\psi}(\mathbf{h}_t,\mathbf{a}_t) \) à la place du modèle de récompense \( r_t \). La régularisation de référence optionnelle (KL, reference_kl_enabled, reference_kl_coef, reference_devices) s’applique uniquement à l’apprentissage de la politique : l’estimation de KL échantillée par chaque agent, mise à l’échelle par reference_kl_coef, est soustraite du signal de récompense.
- Hérite des paramètres MADPOConfig et des données de préférence, sauf
dpo_beta, qui n’est pas utilisé par MARLHF reward_model_name: Identifiant de modèle pour le modèle de récompense backbone; par défaut, l’identifiant de modèle actor est utilisé si disponiblereward_model_device: Appareil de modèle de récompense; par défaut,"cuda:0", ouNonepour utiliser l’appareil trainerreward_learning_rate,reward_num_train_epochs,reward_train_batch_size: Paramètres d’optimisation du modèle de récompensereward_max_length: Limite optionnelle token pour l’entrée combinée du modèle de récompensereward_freeze_backbone: Entraîne uniquement la tête de récompense scalaire lorsqueTruerl_algorithm: Backend d’apprentissage de la politique; par défaut,"magrpo"num_generations: Échantillons d’apprentissage de la politique par requête et actor (la taille du groupe); au moins 2 pour la famille MAGRPO, ou au moins 1 pour MAAC/IACnum_train_epochs,agent_learning_rate: Apprentissage de la politique epochs et taux d’apprentissagerollout_buffer_size,train_batch_size: Tampon d’apprentissage de la politique rollout et tailles de lots de mise à jour;train_batch_sizepar défautrollout_buffer_sizecritic_model_name,critic_learning_rate,critic_devices: Paramètres Critic pour un backend actor-criticcritic_type:"v"ou"q"pour un backend actor-criticuse_separate_critic: Choix de critics séparé ou value heads attaché à actor pour IACvalue_loss_coef,value_clip_range: Poids de perte Critic et troncature partagée IAC et value-head, tel que décrit dans Optimisation de préférences multi-agents Actor-Criticreference_kl_enabled,reference_kl_coef,reference_devices: Régularisation de référence figée optionnelle pour l’apprentissage de la politique
reward_model_nameest requis lorsque les objets de modèle actors n’ont pas d’identifiant de modèle. MAAC et critic séparés IAC nécessitent également des sources critic explicites ou un identifiant de modèle critic utilisable.
MADPO#
L’optimisation directe des préférences multi-agents (MADPO) entraîne les politiques directement à partir des paires de préférences, sans modèle de récompense ni étape RL. Sa fonction de perte combine toutes les préférences des agents margins, de sorte que chaque politique apprend de l’issue de l’équipe.
La margin de chaque agent est la différence entre ses probabilités logarithmiques des réponses gagnantes et perdantes, et la margin additionne ces valeurs pour tous les agents:
MADPO minimise
où \( \eta>0 \) est dpo_beta (par défaut 0,1). La récompense de la tâche ne commande qu’à chaque paire; la perte utilise les probabilités logarithmiques des politiques. Le gradient pour l’agent \( i \) est
Le poids \( \sigma(-\eta\,\Delta_{\boldsymbol{\theta}}) \) dépend de la réponse conjointe de l’équipe margin, tandis que le gradient ne traverse que la propre margin de l’agent \( i \). Dans chaque lot, le trainer calcule toutes les margins une fois sans gradients, puis met à jour chaque agent avec sa propre fonction différentiable margin plus les margins détachées des autres
L’objectif est sans référence : les paramètres hérités reference_kl_enabled, reference_kl_coef et reference_devices n’ajoutent aucun terme de référence à la perte MADPO. Les métriques d’entraînement turn_1/reward_mean et turn_1/expected_return calculent la moyenne des récompenses candidates enregistrées lors de la collecte des paires, de sorte qu’elles ne reflètent pas les politiques mises à jour
Le scoreur décentralisé exclut la dernière complétion token après avoir supprimé les rembourrages, de sorte que la probabilité logarithmique de chaque agent margin omet cette token. Le scoreur centralisé couvre la complétion conjointe complète
num_agents: Nombre d’agents, ou de rôles de tâche avec un scoreur centralisé actorcollaboration_mode:"decentralized"(par défaut) entraîne un actor par agent ;"centralized"entraîne un actor qui écrit la réponse conjointe complète, etmax_new_tokenscouvre alors la réponse conjointe complètenum_train_epochs: Optimisation epochs sur les paires de préférences collectéesagent_learning_rate: Taux d’apprentissage de la politiquedpo_beta: Coefficient positif sur la réponse conjointe margin (par défaut 0,1)train_batch_size: Paires de préférences par mise à jour ; par défautrollout_buffer_sizeparallel_training,agent_devices: Mode d’exécution de la politique et placement de l’appareileval_interval,eval_num_samples,eval_batch_size: Planning d’évaluation et tailles d’échantillon ; MADPO compteeval_intervaldans les mises à jour de préférenceslogging_steps: Intervalle d’enregistrement de l’entraînementenvironment_steps_per_pair: Nombre d’étapes de l’environnement par paire de préférences (par défaut 2)- Les données de préférence