Apprentissage amélioré Python + Unity (apprentissage)

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

Conditions préalables

Certaines connaissances de base de Unity sont requises (comment créer et nommer des objets)

Objectif

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

Constitution

É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

Préparer l'environnement d'apprentissage

1. Placez la sphère bleue, nom = RollerAgent

スクリーンショット 2020-09-17 130159.png

2. Placez le nom de la boîte jaune = Cible

スクリーンショット 2020-09-17 130710.png

3. Placez le nom de l'étage = Floor

スクリーンショット 2020-09-17 130728.png

4. caméra principale: définissez la position et l'angle de la caméra comme un cercle rouge (pour ajuster à une position où vous pouvez bien voir le tout)

スクリーンショット 2020-09-17 131155.png

5. Créez un matériau pour colorer chaque objet (Actif> Créer)

スクリーンショット 2020-09-17 131256.png

6. Sélectionnez Package Manager dans Window dans le menu (Import ML-Agent)

スクリーンショット 2020-09-17 131422.png

Appuyez sur le bouton «+» en haut à gauche et sélectionnez Ajouter un package à partir du disque

スクリーンショット 2020-09-17 131435.png

Accédez au répertoire que vous avez créé la dernière fois et sélectionnez ml-agents / com.unity.ml-agents / package.json

スクリーンショット 2020-09-17 131629.png

7. Ajouter un composant (fonction) au RollerAgent (sphère bleue)

・ 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 スクリーンショット 2020-09-17 140104.png


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) スクリーンショット 2020-09-17 140130.png


Decision Requester スクリーンショット 2020-09-17 140311.png

8. Créer un script RollerAgents.cs

・ 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
        }
    }
}

9. Définir les propriétés RollerAgent

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

10. Création d'un fichier de paramétrage élevé

-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

Commencez à apprendre Roller Agent

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

1. Appuyez sur le bouton de lecture Unity pour démarrer l'entraînement.

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

Apprentissage amélioré Python + Unity (apprentissage)
Construction d'un environnement d'apprentissage amélioré Python + Unity
Apprentissage amélioré 1 installation de Python
Apprentissage amélioré à partir de Python
apprentissage de python
[Introduction] Renforcer l'apprentissage
[Python] Note d'apprentissage 1
Notes d'apprentissage Python
sortie d'apprentissage python
Site d'apprentissage Python
Apprentissage Python jour 4
Apprentissage par renforcement futur_2
Apprentissage par renforcement futur_1
Apprentissage en profondeur Python
apprentissage python (supplément)
Apprentissage profond × Python
notes d'apprentissage python
[Python] Essayez facilement l'apprentissage amélioré (DQN) avec Keras-RL
Classe Python (mémo d'apprentissage Python ⑦)
Apprendre Python avec ChemTHEATER 03
"Orienté objet" appris avec python
Module Python (mémo d'apprentissage Python ④)
Apprendre Python avec ChemTHEATER 05-1
Renforcer l'apprentissage 3 Installation d'OpenAI
Python ~ Apprentissage rapide de la grammaire ~
Python: apprentissage non supervisé: principes de base
Renforcer l'apprentissage de la troisième ligne
Procédure d'apprentissage privée Python
Apprendre Python avec ChemTHEATER 02
[Renforcer l'apprentissage] Tâche de bandit
Apprendre Python avec ChemTHEATER 01
Python: réglage du Deep Learning
Python: apprentissage supervisé (retour)
Renforcer l'apprentissage 1 édition introductive
Python: apprentissage supervisé (classification)
Renforcer l'apprentissage 18 Colaboratory + Acrobat + ChainerRL
Gestion des exceptions Python (mémo d'apprentissage Python ⑥)
Apprentissage amélioré 7 Sortie du journal des données d'apprentissage
Mémo d'apprentissage O'Reilly python3 Primer
Renforcer l'apprentissage 17 Colaboratory + CartPole + ChainerRL
Renforcer l'apprentissage 28 collaboratif + OpenAI + chainerRL
Python: Apprentissage supervisé: Hyper Paramètres Partie 1
Renforcement de l'apprentissage 2 Installation de chainerrl
[Renforcer l'apprentissage] Suivi par multi-agents
Renforcer l'apprentissage 20 Colaboratoire + Pendule + ChainerRL
Apprentissage automatique avec Python! Préparation
Apprentissage par renforcement 5 Essayez de programmer CartPole?
Apprentissage par renforcement 9 Remodelage magique ChainerRL
Renforcer l'apprentissage Apprendre d'aujourd'hui
Notes d'apprentissage sur l'analyse des données Python
Programmation Python Machine Learning> Mots-clés
Python: apprentissage supervisé: Hyper Paramètre partie 2