Nach dem letzten Umgebungsaufbau werden wir tatsächlich verbessertes Lernen mit Unity durchführen! Klicken Sie hier für den vorherigen Artikel, https://qiita.com/nol_miryuu/items/32cda0f5b7172197bb09
Grundkenntnisse in Unity sind erforderlich (Erstellen und Benennen von Objekten)
Trainiere die KI so, dass sich die blaue Kugel (AI Agent) schnell der gelben Box (Ziel) nähern kann, ohne vom Boden zu fallen
Zustand: Vektorbeobachtung (Größe = 8) ・ Drei X-, Y- und Z-Koordinaten des Ziels ・ Drei der X-, Y- und Z-Koordinaten von RollerAgent -Roller Agent Geschwindigkeit in X- und Z-Richtung (ausgeschlossen, da er sich nicht in Y-Richtung bewegt)
Aktion: Kontinuierlich (Größe = 2) ・ 0: Die Kraft, die in X-Richtung auf das Walzenmittel ausgeübt wird ・ 1: Die Kraft, die in Z-Richtung auf das Walzenmittel ausgeübt wird
Belohnung: ・ Wenn sich der Roller Agent dem Ziel nähert (der Abstand zwischen dem Roller Agent und dem Ziel nähert sich 0), wird eine Belohnung (+1,0) vergeben und die Episode ist abgeschlossen. -Wenn der Roller Agent vom Boden fällt (wenn die Position des Roller Agent in Y-Richtung kleiner als 0 ist), wird die Episode ohne Belohnung abgeschlossen.
Entscheidung: ・ Alle 10 Schritte
Erweiterter Lernzyklus (Prozess Schritt für Schritt ausgeführt) Statuserfassung → Aktionsentscheidung → Aktionsausführung und Belohnungserfassung → Richtlinienaktualisierung
Drücken Sie die Taste "+" oben links und wählen Sie "Paket von Festplatte hinzufügen"
Wechseln Sie in das Verzeichnis, das Sie zuletzt erstellt haben, und wählen Sie ml-Agents / com.unity.ml-Agents / package.json aus
・ Rigidbody: Mechanismus der physikalischen Simulation ・ Verhaltensparameter: Legen Sie den Status und die Verhaltensdaten des Walzenagenten fest ・ Entscheidungsanforderer: Legen Sie fest, wie viele Schritte erforderlich sind, um "Entscheidung" anzufordern. `` Grundsätzlich wird der Schritt alle 0,02 Sekunden ausgeführt. Wenn der Entscheidungszeitraum "5" ist, dann alle 5 x 0,02 = 0,1 Sekunden, Im Fall von "10" wird "Entscheidung" alle 10 x 0,02 = 0,2 Sekunden ausgeführt. Stellen Sie für den Walzenagenten schließlich wie in der folgenden Abbildung gezeigt ein.
Rigidbody
Behavior Paramenters -Verhaltensname: RollerBall (Modell wird mit diesem Namen generiert) ・ Raumgröße der Vektorbeobachtung: 8 (Art des Beobachtungszustands) ・ Raumtyp: Kontinuierlich (Art der Aktion) ・ Raumgröße der Vektoraktion: 2 (Art der Aktion)
Decision Requester
・ Void Initialize () ・ ・ ・ Wird nur einmal aufgerufen, wenn das Agentenspielobjekt erstellt wird ・ OnEpisodeBegin () ・ ・ ・ Wird zu Beginn der Episode aufgerufen
RollerAction
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
public class RollerAgent : Agent
{
public Transform target;
Rigidbody rBody;
public override void Initialize()
{
this.rBody = GetComponent<Rigidbody>();
}
//Wird zu Beginn der Episode aufgerufen
public override void OnEpisodeBegin()
{
if (this.transform.position.y < 0) //Setzen Sie Folgendes zurück, wenn der RollerAgent (Kugel) vom Boden fällt
{
this.rBody.angularVelocity = Vector3.zero; //Rotationsbeschleunigung zurücksetzen
this.rBody.velocity = Vector3.zero; //Geschwindigkeit zurücksetzen
this.transform.position = new Vector3(0.0f, 0.5f, 0.0f); //Position zurücksetzen
}
//Setzen Sie die Position des Ziels (Würfels) zurück.
target.position = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);
}
//Stellen Sie die Beobachtungsdaten (8 Elemente) ein, die an den Agenten übergeben werden sollen
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(target.position); //XYZ-Koordinaten des Ziels (Würfel)
sensor.AddObservation(this.transform.position); //Roller Agent XYZ-Koordinaten
sensor.AddObservation(rBody.velocity.x); //Geschwindigkeit der X-Achse des Walzenagenten
sensor.AddObservation(rBody.velocity.z); //Geschwindigkeit der Z-Achse des Walzenmittels
}
//Wird beim Ausführen einer Aktion aufgerufen
public override void OnActionReceived(float[] vectorAction)
{
//Schalten Sie den Roller Agent ein
Vector3 controlSignal = Vector3.zero;
controlSignal.x = vectorAction[0]; //Legen Sie die durch die Richtlinie festgelegten Verhaltensdaten fest
// vectorAction[0]Wird die Kraft in X-Richtung ausgeübt?(-1.0 〜 +1.0)
controlSignal.z = vectorAction[1]; //Legen Sie die durch die Richtlinie festgelegten Verhaltensdaten fest
// vectorAction[1]Wird die Kraft in Y-Richtung ausgeübt?(-1.0 〜 +1.0)
rBody.AddForce(controlSignal * 10);
//Messen Sie den Abstand zwischen Walzenmittel und Ziel
float distanceToTarget = Vector3.Distance(this.transform.position, target.position);
//Wenn der Roller Agent an der Zielposition ankommt
if(distanceToTarget < 1.42f)
{
AddReward(1.0f); //Gib eine Belohnung
EndEpisode(); //Beende die Episode
}
//Wenn der Roller Agent vom Boden fällt
if(this.transform.position.y < 0)
{
EndEpisode(); //Schließe Episoden ohne Belohnung ab
}
}
}
Maximaler Schritt: Die Episode ist abgeschlossen, wenn die maximale Anzahl von Schritten der Episode und die Anzahl der Schritte der Episode die festgelegten Werte überschreiten. Wählen Sie Max Step 1000, gelbes Feld "Target" im Feld Target
-Erstellen Sie ein Beispielverzeichnis in ml-agent / config / -Erstellen Sie eine RollerBall.yaml-Datei darin, der Dateiinhalt ist wie folgt
`Hyperparameter (Trainingseinstellungsdateierweiterung .yaml [als yamuru gelesen])
RollerBall.yaml
behaviors:
RollerBall:
trainer_type: ppo
summary_freq: 1000
hyperparameters:
batch_size: 10
buffer_size: 100
learning_rate: 0.0003
learning_rate_schedule: linear
beta: 0.005
epsilon: 0.2
lambd: 0.95
num_epoch: 3
network_settings:
normalize: true
hidden_units: 128
num_layers: 2
vis_encode_type: simple
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
keep_checkpoints: 5
Führen Sie die im vorherigen Qitta erstellte virtuelle Umgebung aus
terminal
poetry shell
Führen Sie den folgenden Befehl im ml-Agentenverzeichnis aus
terminal
mlagents-learn config/sample/RollerBall.yaml --run-id=model01
Das letzte Modell01 gibt jedes Mal einen Alias, wenn es neu trainiert wird
terminal
Start training by pressing the Play button in the in the Unity Editor.
Wenn der obige Code in das Terminal geschrieben wurde, kehren Sie zu Unity zurück und drücken Sie die Wiedergabetaste, um ihn auszuführen
Alle 50000 Schritte werden Informationen auf dem Terminal angezeigt. Mittlere Belohnung: Durchschnittliche Belohnungspunkte ... Je höher der Wert, desto höher die Genauigkeit. Wenn er 1,0 erreicht, beenden wir das Training.
Recommended Posts