Proximal Policy Optimization (PPO)
Proximal Policy Optimization (PPO) ist der Prozess, bei dem mehrere Machine-Learning-Modelle verwendet werden, um ein Modell zu trainieren und zu bewerten. Die folgenden Modelle sind Teil des PPO-Prozesses:
-
Akteurtrainings- oder Richtlinienmodell: Ein Modell der überwachten Optimierung (SFT), das in jeder Epoche optimiert und aktualisiert wird. Die Aktualisierungen erfolgen durch Stichproben von Prompts, Generierung von Vervollständigungen und Aktualisierung der Gewichtungen unter Verwendung eines beschnittenen Ersatzziels. Dadurch wird die Veränderung der Protokollrentabilität pro Token begrenzt, sodass jeder Richtlinienschritt nahe am vorherigen liegt und die Stabilität des Trainings gewahrt bleibt.
-
Modell zur Akteurgenerierung: Ein Modell, das Prompt-Ausführungen oder -Antworten generiert, die anhand des Belohnungs- und des kritischen Modells bewertet werden. Die Gewichtungen dieses Modells werden in jeder Epoche anhand des Akteurtrainings- oder Richtlinienmodells aktualisiert.
-
Belohnungsmodell: Ein Modell mit eingefrorenen Gewichtungen, das zur Bewertung des Modells zur Akteurgenerierung verwendet wird.
-
Kritisches Modell: Ein Modell mit nicht eingefrorenen Gewichtungen, das zur Bewertung des Modells zur Akteurgenerierung verwendet wird. Diese Bewertung wird oft als Schätzung der Gesamtbelohnung angesehen, die der Akteur erhält, wenn er die verbleibenden Token generiert.
-
Ankermodell: Ein SFT-Modell mit eingefrorenen Gewichtungen, das zur Berechnung der KL-Divergenz zwischen dem Akteurtrainingsmodell und dem Basismodell verwendet wird. Das Ankermodell stellt sicher, dass die Aktualisierungen des Akteurmodells im Vergleich zum Basismodell nicht zu drastisch ausfallen. Drastische Änderungen können zu Instabilität oder Leistungseinbußen führen.
Die Trainingsdaten müssen im JSONL-Format vorliegen, wobei jede Zeile ein einzelnes JSON-Objekt enthält, das ein Trainingsbeispiel darstellt. Ein Beispiel:
{ "turns": ["string", "string", ...], // Required "turns_to_mask": [integer, integer, ...], // Required "reward_category": "string", // Required "meta_data": {} // Optional }
-
turnsist ein Array von Konversationszeichenfolgen-Arrays, die die Dialogsequenz darstellen. Diese Zeile enthält System-Prompts, Benutzernachrichten und Bot-Antworten. Benutzernachrichten enden normalerweise mit „Bot:“, um anzugeben, wo die Modellausgabe beginnt. Beispiel,[["System prompt"], ["User: Question Bot:"], ["Bot response"]]. -
turns_to_maskist ein Array von 0-basierten Indizes, die angeben, für welche Züge keine Gradientenaktualisierungen vorgenommen werden sollen. Bei den maskierten Zügen handelt es sich in der Regel um System-Prompts und Benutzerzüge.[0, 1, 3]maskiert beispielsweise System-Prompts und Benutzernachrichten (die erste und dritte Nachricht). -
reward_categoryist eine Zeichenfolge, die angibt, welche Aspekte der Modellleistung bewertet werden sollen. Sie wird verwendet, um während des Trainings die passende Belohnungsmodellkategorie auszuwählen. Die folgenden Belohnungskategorien sind verfügbar:default,math,coding,if,ragundrai. -
meta_dataist ein optionales Objekt, das zusätzliche Kontext- oder Ground-Truth-Informationen enthält. Dies kann Identifikatoren, Quellinformationen oder Konversationskontext beinhalten. Die Struktur ist je nach Ihren Datensatzanforderungen flexibel.
Hier ist ein Beispieldatensatz:
{ "turns": ["You are a helpful AI assistant.", "User: What is ML? Bot:", "Machine learning is...", "User: Examples? Bot:", "Email spam filtering is..." ], "turns_to_mask": [0, 1, 3], "reward_category": "default", "meta_data": { "messages": [{ "role": "system", "content": "You are a helpful AI assistant." }, { "role": "user", "content": "What is ML?" }, { "role": "assistant", "content": "Machine learning is..." }, { "role": "user", "content": "Examples?" }, { "role": "assistant", "content": "Email spam filtering is..." } ] } }
Das Framework für die Belohnungsmodellierung implementiert eine mehrdimensionale Optimierung für unterschiedliche kategoriale Ziele, um eine robuste Modellkonvergenz zu ermöglichen. Die Belohnungskategorie sollte auf der Grundlage der Aufgabe ausgewählt werden, für die das Modell optimiert werden muss.
Wir empfehlen die folgenden Richtlinien zur Auswahl des richtigen Frameworks für Ihre Aufgaben:
-
default: Ein Allzweck-Optimierer für Standard-Konversationsaufgaben und grundlegende Interaktionen. Wird für allgemeine Konversationen und Diskussionen, grundlegende Schreibaufgaben, die Beantwortung einfacher Fragen und nicht spezialisierte Wissensabfragen verwendet.Ein Beispiel:
{ "turns": ["Write a summary of climate change"], "turns_to_mask": [0], "reward_category": "default" } -
math: Ein spezialisierter Optimierer für mathematische Berechnungen und numerische Überlegungen. Wird für mathematische Problemlösungen, arithmetische Berechnungen, algebraische Gleichungen, geometrische Probleme und statistische Analysen verwendet.Ein Beispiel:
{ "turns": ["Calculate the derivative of x²"], "turns_to_mask": [0], "reward_category": "math" } -
coding: Eine spezielle Kategorie für Abfragen im Zusammenhang mit der Programmierung und Softwareentwicklung. Wird für Codeimplementierung, Unterstützung beim Debuggen, Algorithmusdesign, technische Dokumentation und Fragen zur Systemarchitektur verwendet.Ein Beispiel:
{ "turns": ["Write a function to check if a string is palindrome"], "turns_to_mask": [0], "reward_category": "coding" } -
if: Eine Kategorie für Aufgaben, die eine präzise prozedurale Ausführung und eine schrittweise Anleitung erfordern. Wird für mehrstufige Verfahren, sequentielle Anweisungen, die Zerlegung komplexer Aufgaben und die Prozessdokumentation verwendet.Ein Beispiel:
{ "turns": ["Provide steps to deploy a web application"], "turns_to_mask": [0], "reward_category": "if" } -
rag: Eine Belohnungskategorie für Aufgaben, bei denen Abfragen speziell auf der Grundlage von abgerufenen Kontextinformationen beantwortet werden müssen. Wird verwendet, wenn Antworten direkt aus bereitgestellten Referenzmaterialien abgeleitet werden sollen, indem sachliche Inhalte zusammengefasst werden, ohne über die abgerufenen Informationen hinauszugehen. Dadurch wird sichergestellt, dass die Antworten auf dem bereitgestellten Kontext und nicht auf allgemeinem Wissen basieren.Ein Beispiel:
{ "turns": ["The Synthesis Report integrates findings from all six IPCC assessment cycles, revealing that global surface temperature has increased 1.1°C from 1850-1900 to 2011-2020, with human activities unequivocally identified as the cause of this warming. Alarmingly, current policies put the world on track for 3.2°C warming by 2100. The document identifies 5 key climate system "tipping points" approaching and emphasizes that greenhouse gas emissions must decline 43% by 2030 (compared to 2019 levels) to limit warming to 1.5°C. Climate-related risks will escalate with every increment of warming, with loss and damage disproportionately affecting vulnerable populations. Despite some progress, climate adaptation remains uneven with significant gaps, and financial flows continue to fall below levels needed for mitigation goals.", "What were the key findings of the latest IPCC climate report?"], "turns_to_mask": [0, 0], "reward_category": "rag" } -
rai: Eine Belohnungskategorie für Aufgaben, die die Anwendung von Prinzipien verantwortungsvoller KI wie Fairness, Transparenz und Ethik erfordern. Wird verwendet, um mögliche Vorurteile in KI-Systemen zu bewerten, Datenschutzaspekte sicherzustellen, ethische Dilemmas anzugehen und inklusive Gestaltungsprinzipien zu fördern.Ein Beispiel:
{ "turns": ["Identify potential bias concerns when developing a loan approval algorithm and suggest mitigation strategies"], "turns_to_mask": [0], "reward_category": "rai" }
Maskierung von Zügen
In Trainingsdatensätzen ist der Parameter turns_to_mask entscheidend, um zu steuern, welche Konversationszüge während des Trainings Gradientenaktualisierungen erhalten. Dieses Array von Indizes bestimmt, welche Teile des Dialogs das Modell generieren lernen soll und welche Teile nur als Kontext behandelt werden sollen. Durch die richtige Maskierung wird sichergestellt, dass das Modell geeignete Reaktionsmuster lernt, während das Training aufgrund von System-Prompts oder Benutzereingaben, die die Leistung beeinträchtigen könnten, vermieden wird.
Wir empfehlen, beim Maskieren Folgendes zu beachten:
-
Index 0 immer maskieren – System-Prompts sollten niemals Gradientenaktualisierungen erhalten.
-
Benutzerzüge immer maskieren – So wird verhindert, dass das Modell lernt, Benutzereingaben zu generieren.
-
Musterkonsistenz – Verwenden Sie identische Maskierungsmuster für ähnliche Konversationsstrukturen, z. B. (0, 1, 3, 5) für Dialoge mit mehreren Zügen.
-
Selektives Training – Maskieren Sie frühe Bot-Antworten, um das Training auf verbesserte Endreaktionen zu konzentrieren.
-
Beibehaltung der Gedankenkette – Maskieren Sie System- und Benutzerzüge nur beim Training mit Argumentationssequenzen.
-
Qualitätsfilterung – Maskieren Sie qualitativ minderwertige Assistentenantworten, um Leistungseinbußen zu vermeiden.
-
Kontextoptimierung – Stellen Sie sicher, dass durch maskierte Züge nicht der für nachfolgende Antworten benötigte Kontext entfernt wird.
Der Schlüssel zu einer effektiven Maskierung liegt in der Überwachung der Trainingsmetriken und der Validierungsleistung, um festzustellen, ob Ihre Maskierungsstrategie den erforderlichen Kontext beibehält, während Gradientenaktualisierungen auf die gewünschten Modellergebnisse ausgerichtet werden.
Aktivieren des KL-Divergenzverlusts
Um den KL-Divergenzverlust zu aktivieren, muss der Ankerserver aktiviert werden, um die Abweichung der aktuellen Richtlinie von der ursprünglichen Verteilung zu berechnen. Der KL-Verlusttyp muss angegeben werden und die Koeffizienten müssen einen anderen Wert als Null haben. Höhere Koeffizientenwerte tragen dazu bei, dass das Modell nicht wesentlich von der ursprünglichen Richtlinie abweicht, was zu geringeren Änderungen der allgemeinen Leistung führt. Niedrigere Koeffizientenwerte ermöglichen größere Abweichungen von der bisherigen Richtlinie, was zu einer besseren Leistung der Zielkennzahlen führt, sich jedoch auf die allgemeine Leistung auswirkt.
ppo_anchor: max_length: 8192 trainer: num_nodes: ${recipes.run.cm_replicas} model: global_batch_size: 32 ppo_actor_train: model: ######## Use KL in actor loss ######## kl_loss_type: low_var_kl kl_loss_coeff: 0.1 ######## Use KL in reward model ###### kl_reward_penalty_coeff: 0.1
Lernrate
Die Lernrate für kritische und Richtlinienmodelle kann angepasst werden, wobei 3e-6 der ausgewogene Standardwert ist. Höhere Lernraten führen in der Regel zu Instabilitäten beim Training, die sich anhand von Spitzenwerten der KL-Divergenz und unregelmäßigem Richtlinienverhalten erkennen lassen. Niedrigere Lernraten können zu Konvergenzproblemen und langsamem Lernen führen, was sich in stagnierenden Belohnungen und minimalen Richtlinienaktualisierungen äußert. Die regelmäßige Überwachung von KL-Divergenz, Belohnungswert und Wertverlust hilft bei der Entscheidung, ob die Lernrate während des Trainings angepasst werden sollte.
ppo_critic: model: optim: lr: 3e-6 ppo_actor_train: model: optim: lr: 3e-06
Globale Batch-Größe
Die globale Batchgröße wirkt sich erheblich auf die PPO-Leistung in Amazon Nova aus, wobei größere Batches im Allgemeinen die Trainingsstabilität und die Steigungsschätzung verbessern und gleichzeitig eine effizientere parallele Verarbeitung ermöglichen. Sehr große Batchgrößen können jedoch zu sinkenden Renditen führen und durch den verfügbaren Speicherplatz eingeschränkt sein, sodass ein sorgfältiges Gleichgewicht mit der Lernrate und anderen Hyperparametern erforderlich ist.
ppo_actor_train: model: global_batch_size: 160
Zu den Amazon-Nova-Parametern, die für die Optimierung mit PPO verfügbar sind, gehören:
-
Ausführungskonfiguration
-
actor_train_replicas: Die Anzahl der Datenverarbeitungs-Instances, die für das Akteurtrianingsmodell verwendet werden sollen. Die verfügbaren Werte variieren abhängig vom ausgewählten Modell. Amazon Nova Micro unterstützt 1 oder 2 Replikate. Amazon Nova Lite unterstützt 1, 2, oder 4 Replikate. Amazon Nova Pro unterstützt 3, 6 oder 12 Replikate. -
rm_replicas: Die Anzahl der Datenverarbeitungs-Instances, die für das Belohnungsmodell verwendet werden sollen. Wir empfehlen, bei beliebiger Modellgröße ein Replikat zu verwenden. -
cm_replicas: Die Anzahl der Datenverarbeitungs-Instances, die für das kritische Modell verwendet werden sollen. Wir empfehlen, bei beliebiger Modellgröße ein Replikat zu verwenden. -
actor_generation_replicas: Die Anzahl der Datenverarbeitungs-Instances, die für das Modell zur Akteurgenerierung verwendet werden sollen. Die verfügbaren Werte variieren abhängig vom ausgewählten Modell. Amazon Nova Micro unterstützt 1 Replikat. Amazon Nova Lite unterstützt 1 oder 2 Replikate. Amazon Nova Pro unterstützt 1 oder 2 Replikate. -
am_replicas: Die Anzahl der Datenverarbeitungs-Instances, die für das Ankermodell verwendet werden sollen. Wir empfehlen, bei beliebiger Modellgröße ein Replikat zu verwenden.
-
-
Akteurtrainingskonfiguration (Richtlinienkonfiguration)
-
max_steps: Die maximale Anzahl von Schritten zur Optimierung oder zum Trainieren des Akteurtrainingsmodells. Hier ist ein Schritt als Rollout definiert, gefolgt vom Training des Akteurtrainingsmodells anhand einer Anzahl von Stichproben gemäßglobal_batch_size. Eine Epoche ist alsglobal_batch_size * trajectory_buffer_scaledefiniert.Der hier gewählte Wert hängt von Ihrem Anwendungsfall und der Komplexität des Datensatzes ab. Wir empfehlen, mit 65 Epochen oder 520 Schritten zu beginnen, was der Anzahl der Epochen multipliziert mit dem Wert für
trajectory_buffer_scaleentspricht. Einige Aufgaben erfordern jedoch eine längere PPO-Trainingszeit, um dieselbe Leistung zu erzielen.Bei PPO können die Trainingsmetriken, wie z. B. der Sättigungsgrad des Belohnungsmodells und die durchschnittliche Aktionsdauer aus der ml-flow-Konsole, dabei helfen, die optimalen Bewertungspunkte zu ermitteln.
-
actor_model_max_length: Die maximale Länge der Eingabedaten, die an die Akteurgenerierungskomponente gesendet werden, um Vervollständigungen zu generieren. -
reward_model_max_length: Die maximale Länge der Eingabedaten, die an den Belohnungsserver gesendet werden, um Abschlüsse zu bewerten. -
trajectory_buffer_scale: Dieser Puffer stellt die Anzahl der mit dem alten Akteurtrainingsmodell (Richtlinienmodell) generierten Rollouts dar, bevor die Gewichtungen aktualisiert und die neuen Rollouts generiert wurden. Die unterstützten Werte sind 1, 2, 4, 8 und 16.Wenn
trajectory_buffer_scaleauf 1 festgelegt ist, entspricht das Training den Richtlinien. Das bedeutet, dass die Rollouts mit den neuesten Modellgewichtungen generiert werden, jedoch leidet der Durchsatz darunter. Bei einem Wert von 16 weicht das Modell leicht von der Richtlinie ab, der Durchsatz ist jedoch höher. Wir empfehlen, für jedes Modell mit 8 zu beginnen. -
kl_reward_penalty_coeff: Dieser KL-Divergenzbegriff stellt sicher, dass Aktualisierungen nicht zu drastisch sind und die Richtlinie nicht vom Basis- oder SFT-Modell abgeleitet wird. -
kl_loss_coeff: Dieser Wert bestimmt, wie stark sich die KL-Divergenzstrafe auf das allgemeine Trainingsziel in PPO auswirkt. -
kl_loss_type: Dieser Wert gibt an, wie die Divergenz zwischen aktuellen und Referenzrichtlinienverteilungen berechnet werden soll. Die verfügbarenkl_loss_typessindkl(Standard-KL-Divergenz),mse(mittlerer quadratischer Fehler),abs(absolute Differenz zwischen logarithmischen Wahrscheinlichkeiten) undlow_var_kl(KL-Approximation mit niedriger Varianz). -
model.clip_ratio: Das Akteur-Clipping-Verhältnis (ε) in PPO ist ein Hyperparameter, der begrenzt, wie stark sich die Richtlinie bei jeder Aktualisierung ändern kann. -
model.optim.lr: Die Lernrate, die für das Verlusttraining des Ersatzmodells im Akteurmodell verwendet wird. -
model.lam: Teil des Prozesses zur Schätzung des Vorteils. Ein höherer λ-Wert verleiht längerfristigen Belohnungen mit höherer Varianz mehr Gewicht, während ein niedrigerer λ-Wert sich mehr auf unmittelbare Belohnungen mit geringerer Varianz, aber stärkerer Verzerrung konzentriert. -
model.ent_coeff: Der Entropieverlust bei PPO fördert die Exploration, indem die Richtlinie bestraft wird, wenn sie zu deterministisch wird (d. h. immer dieselben Aktionen mit hohem Konfidenzwert auswählt).
-
-
Konfiguration des Belohnungsmodells
-
global_batch_size: Die Batchgröße für die Bewertung der Abschlüsse anhand des Belohnungsmodells. Wennppo_actor_train.model.global_batch_sizegrößer alsppo_reward.model.global_batch_sizeist, werden sie in mehreren Batches verarbeitet. Beachten Sie, dassppo_actor_train.model.global_batch_size % ppo_reward.model.global_batch_size0 entsprechen muss. -
max_length: Die maximale Kontextlänge des Belohnungsmodells. Dies sollte dieselbe sein wieppo_actor_train.model.max_length.
-
-
Konfiguration des kritischen Modells
-
global_batch_size: Die Batchgröße des kritischen Modellwerts. Das kritische Modell liefert Werteinschätzungen für jedes Token in den Antworten, die das Akteurmodell liefert. Die Batchgröße wird für die Inferenz und das Training verwendet.Beachten Sie, dass
ppo_actor_train.model.global_batch_size % ppo_critic.model.global_batch_size0 undppo_actor_train.model.global_batch_size * ppo_actor_train.model.trajectory_buffer_size % ppo_critic.model.global_batch_size == 0entsprechen muss. -
max_length: Die maximale Kontextlänge des kritischen Modells. Dies sollte dieselbe sein wieppo_actor_train.model.max_length. -
model.optim.lr: Die Lernrate, die für das Verlusttraining des Ersatzmodells im Akteurmodell verwendet wird.
-
-
Konfiguration des Ankermodells
-
global_batch_size: Die Batchgröße für die Generierung des logp des eingefrorenen SFT- oder Ankermodells. Beachten Sie, dassppo_actor_train.model.global_batch_size % ppo_anchor.model.global_batch_size0 entsprechen muss. -
max_length: Die maximale Kontextlänge des Belohnungsmodells. Dies sollte dieselbe sein wieppo_actor_train.model.max_length.
-
-
Konfiguration des Modells zur Akteurgenerierung
-
actor_model_max_length: Die maximale Kontextlänge der Komponente zur Generierung des Akteurmodells. Dies sollte dieselbe sein wieppo_actor_train.model.max_length.
-
PPO-Rezept
Das Folgende ist ein Rezept für PPO.
## Run config run: name: ndry-ppo-pro model_type: amazon.nova-pro-v1:0:300k model_name_or_path: nova-pro/prod data_s3_path: s3://testing/train.jsonl # Your training data S3 path actor_train_replicas: 6 # Actor train model replicas rm_replicas: 1 # Reward model replicas cm_replicas: 1 # Critic model replicas actor_generation_replicas: 2 # Actor generation model replicas am_replicas: 1 # Anchor model replicas ## Training config for each PPO component ppo_reward: max_length: 8192 # model architecture max length trainer: num_nodes: ${recipes.run.rm_replicas} model: global_batch_size: 16 ppo_critic: max_length: 8192 trainer: num_nodes: ${recipes.run.cm_replicas} model: global_batch_size: 16 optim: lr: 3e-6 name: distributed_fused_adam adam_w_mode: true eps: 1e-06 weight_decay: 0.0 betas: - 0.9 - 0.999 ppo_anchor: max_length: 8192 trainer: num_nodes: ${recipes.run.am_replicas} model: global_batch_size: 16 ppo_actor_generation: actor_model_max_length: 8192 trainer: num_nodes: ${recipes.run.actor_generation_replicas} ppo_actor_train: max_length: 8192 max_steps: 520 # Stopping criteria Desired epoch num * trajectory_buffer_scale actor_model_max_length: 8192 # truncate input data to max length reward_model_max_length: 8192 # truncate input data to max length trajectory_buffer_scale: 8 trainer: num_nodes: ${recipes.run.actor_train_replicas} model: global_batch_size: 160 ent_coeff: 0 clip_ratio: 0.2 lam: 1 kl_loss_coeff: 0.0 kl_loss_type: low_var_kl kl_reward_penalty_coeff: 0.0 hidden_dropout: 0.0 # Dropout probability for hidden state transformer. attention_dropout: 0.0 # Dropout probability in the attention layer. ffn_dropout: 0.0 # Dropout probability in the feed-forward layer. optim: lr: 3e-06 name: distributed_fused_adam # only this one is available for p0. adam_w_mode: true eps: 1e-08 weight_decay: 0.0 betas: - 0.9 - 0.999
Einschränkungen
Für PPO gelten folgende Einschränkungen:
-
Zwischen-Checkpoints werden nicht zur Bewertung gespeichert und Sie können nicht von einem Zwischen-Checkpoint aus fortfahren. Nur der letzte Checkpoint wird gespeichert.
-
Multimodale Datensätze werden nicht unterstützt.
-
Trainingsjobs werden nicht automatisch beendet. Sie müssen den Job mit der HyperPod-CLI beenden.
-
Die MLflow-Protokollierung wird nicht unterstützt.
-
Metriken für kritisches Training werden auf TensorBoard nicht unterstützt.
-
Folgen Sie den Anweisungen unter Auswählen von Hyperparametern, um die Hyperparameter anzupassen.