Après la dernière construction de l'environnement, nous effectuerons un apprentissage amélioré avec Unity! Cliquez ici pour l'article précédent, https://qiita.com/nol_miryuu/items/32cda0f5b7172197bb09
Certaines connaissances de base de Unity sont requises (comment créer et nommer des objets)
Entraînez l'IA pour que la sphère bleue (AI Agent) puisse s'approcher rapidement de la boîte jaune (cible) sans tomber du sol
État: observation vectorielle (taille = 8) ・ Trois coordonnées X, Y, Z de la cible ・ Trois des coordonnées X, Y, Z de RollerAgent -Vitesses de direction X et Z de Roller Agent (exclues car il ne se déplace pas dans la direction Y)
Action: continue (taille = 2) ・ 0: la force appliquée à l'agent de rouleau dans la direction X ・ 1: la force appliquée au Roller Agent dans la direction Z
Récompense: ・ Lorsque l'agent Roller s'approche de la cible (la distance entre l'agent Roller et la cible approche 0), une récompense (+1.0) est donnée et l'épisode est terminé. -Si le Roller Agent tombe du sol (lorsque la position de Roller Agent dans la direction Y est inférieure à 0), l'épisode est terminé sans aucune récompense.
Décision: ・ Toutes les 10 étapes
Cycle d'apprentissage amélioré (processus exécuté étape par étape) Acquisition de statut → Décision d'action → Exécution de l'action et acquisition de récompense → Mise à jour de la politique
Appuyez sur le bouton «+» en haut à gauche et sélectionnez Ajouter un package à partir du disque
Accédez au répertoire que vous avez créé la dernière fois et sélectionnez ml-agents / com.unity.ml-agents / package.json
・ Rigidbody: mécanisme de simulation physique ・ Paramètres de comportement: définir l'état de l'agent de rouleau et les données de comportement ・ Demandeur de décision: définissez le nombre d'étapes pour demander une «décision» `` Fondamentalement, l'étape est exécutée toutes les 0,02 secondes. Si la période de décision est "5", alors toutes les 5 x 0,02 = 0,1 seconde, Dans le cas de "10", "décision" est exécutée toutes les 10 x 0,02 = 0,2 seconde. Pour le Roller Agent, définissez finalement comme indiqué dans la figure ci-dessous.
Rigidbody
Behavior Paramenters -Nom du comportement: RollerBall (le modèle est généré avec ce nom) ・ Taille de l'espace d'observation vectorielle: 8 (type d'état d'observation) ・ Type d'espace: Continu (type d'action) ・ Taille de l'espace de l'action vectorielle: 2 (type d'action)
Decision Requester
・ Annulation d'initialisation () ・ ・ ・ Appelé une seule fois lorsque l'objet de jeu de l'agent est créé ・ OnEpisodeBegin () ・ ・ ・ Appelé au début de l'épisode -Collect Observations (Vector Sensor Sensor) -Définit les données d'état à transmettre à l'agent. ・ OnActionReceived (float [] vactorAction) ・ ・ ・ Exécutez l'action déterminée, obtenez la récompense et terminez l'épisode
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>();
}
//Appelé au début de l'épisode
public override void OnEpisodeBegin()
{
if (this.transform.position.y < 0) //Réinitialisez les éléments suivants lorsque le RollerAgent (sphère) tombe du sol
{
this.rBody.angularVelocity = Vector3.zero; //Réinitialiser l'accélération de rotation
this.rBody.velocity = Vector3.zero; //Réinitialiser la vitesse
this.transform.position = new Vector3(0.0f, 0.5f, 0.0f); //Réinitialiser la position
}
//Réinitialiser la position de la cible (cube)
target.position = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);
}
//Définir les données d'observation (8 éléments) à transmettre à l'agent
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(target.position); //Coordonnées XYZ de la cible (cube)
sensor.AddObservation(this.transform.position); //Coordonnées XYZ de Roller Agent
sensor.AddObservation(rBody.velocity.x); //Vitesse de l'axe X de l'agent de rouleau
sensor.AddObservation(rBody.velocity.z); //Vitesse de l'axe Z de l'agent de rouleau
}
//Appelé lors de l'exécution d'une action
public override void OnActionReceived(float[] vectorAction)
{
//Alimentez l'agent Roller
Vector3 controlSignal = Vector3.zero;
controlSignal.x = vectorAction[0]; //Définir les données de comportement déterminées par la stratégie
// vectorAction[0]La force est-elle appliquée dans la direction X(-1.0 〜 +1.0)
controlSignal.z = vectorAction[1]; //Définir les données de comportement déterminées par la stratégie
// vectorAction[1]La force est-elle appliquée dans la direction Y(-1.0 〜 +1.0)
rBody.AddForce(controlSignal * 10);
//Mesurer la distance entre Roller Agent et Target
float distanceToTarget = Vector3.Distance(this.transform.position, target.position);
//Lorsque l'agent Roller arrive à la position cible
if(distanceToTarget < 1.42f)
{
AddReward(1.0f); //Offrez une récompense
EndEpisode(); //Terminez l'épisode
}
//Quand le Roller Agent tombe du sol
if(this.transform.position.y < 0)
{
EndEpisode(); //Terminer des épisodes sans récompense
}
}
}
Max Step: l'épisode est terminé lorsque le nombre maximal d'étapes de l'épisode et le nombre d'étapes de l'épisode dépassent les valeurs définies. Sélectionnez Max Step 1000, boîte jaune "Target" dans le champ Target
-Créer un exemple de répertoire dans ml-agents / config / -Créez un fichier RollerBall.yaml dedans, le contenu du fichier est comme suit
`Hyper paramètres (extension de fichier de configuration d'entraînement .yaml [lu comme yamuru]) --Paramètres utilisés pour l'apprentissage --L'humain doit s'adapter
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
Exécutez l'environnement virtuel créé dans la Qitta précédente
terminal
poetry shell
Exécutez la commande suivante dans le répertoire ml-agents
terminal
mlagents-learn config/sample/RollerBall.yaml --run-id=model01
Le dernier model01 donne un alias à chaque fois qu'il est nouvellement formé
terminal
Start training by pressing the Play button in the in the Unity Editor.
Lorsque le code ci-dessus est écrit dans le terminal, revenez à Unity et appuyez sur le bouton de lecture pour l'exécuter
Les informations sont affichées sur le terminal toutes les 50000 étapes. Récompense moyenne: points de récompense moyens ... Plus la valeur est élevée, plus la précision est élevée. Lorsqu'elle atteint 1,0, terminons la formation.
Recommended Posts