[ML-Aents] J'ai essayé l'apprentissage automatique en utilisant TensorFlow de Unity et Python (compatible v0.11β)

introduction

Je n'ai pas trouvé l'article japonais de la v0.11.0, j'ai donc un mémorandum.

Cet article est __pour les débutants __. Les débutants Unity imitent l'un des didacticiels officiels de ML-Agents fais le Il fait partie du machine learning, __Reinforcement Learning __.

Rollerball.gif __ Je vais faire quelque chose comme ça. : arrow_up: __

C'est pour les personnes qui n'ont pas encore fait de machine learning, bien qu'elles sachent comment faire fonctionner Unity facilement. Plutôt que de nous concentrer sur la théorie, nous l'introduisons afin que vous puissiez en faire l'expérience tout en bougeant vos mains.

* Cet article est à jour en date du 13 novembre 2019. </ b> Les ML-Agents sont en cours de mise à niveau rapide, donc vérifiez toujours les dernières informations. ~~ [Livre publié l'année dernière](https://www.amazon.co.jp/Unity%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82 % 8B% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 83% BB% E5% BC% B7% E5% 8C% 96% E5% AD% A6 % E7% BF% 92-Unity-ML-Agents% E5% AE% 9F% E8% B7% B5% E3% 82% B2% E3% 83% BC% E3% 83% A0% E3% 83% 97% E3 % 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0-% E5% B8% 83% E7% 95% 99% E5% B7% 9D-% E8% 8B% B1% E4% B8% 80 / dp / 48624648181) n'a pas aidé ~~ (Au fait, la transition de cette année ⇒ 19 janvier: * v0.6 * ➡ avril: * v0.8 * ➡ octobre: * v0.10 * ➡ à partir de novembre: * v0.11 *)

À peu près le point

Il existe quelques mots essentiels pour faire du machine learning dans Unity. C'est __ "Academy", "Brain" et "Agent" __.

Fondamentalement, "Brain" contrôle les actions entreprises par "Agent" dans l'environnement défini par "Academy" dans Unity. Cette fois, nous allons effectuer un apprentissage par renforcement via un TensorFlow externe (framework Python), charger le modèle de réseau neuronal généré dans Unity et l'exécuter. (Ceci est un tutoriel simple, donc je ne toucherai pas beaucoup à l'Académie.)

ML-Agents

Changements majeurs depuis la version 0.10.0

__ Si vous êtes nouveau dans ce domaine, vous pouvez l'ignorer. __ J'ai utilisé v0.8x et v0.9x, mais je ne suis pas sûr car je ne peux pas trouver les paramètres du cerveau, mais si vous regardez simplement ici, cela pourrait être bien.

    • Broadcast Hub * est supprimé.
    • Brain Scriptable Objects * est aboli. ⇒ Passer à l'élément * Paramètres de comportement * </ b> -Major des changements de configuration pour * Observation visuelle *.
  • Définition renouvelée de gRPC.
  • Abolition de la formation en ligne sur la Colombie-Britannique.

Environnement d'exécution

  • Windows10
  • Unity 2019.1.4f1
  • ML-Agents Beta 0.11.0
  • Python 3.6(Anaconda)

Préparation

Veuillez d'abord installer les éléments suivants.

Création de projet

    1. Lancez Unity et créez un projet appelé «Roller Ball».
    • Fichier-> Paramètres de construction ...-> Paramètres du lecteur ...-> Autres paramètres-> Configuration *
  • Scripting Runtime Version </ b> * et * Api Compatibility Level </ b> * sont respectivement * .NET 4.x Equivalent </ b> * et * .NET. 4. Assurez-vous qu'il s'agit bien de x </ b> *. YHN.png
    1. Chargez les ressources ML-Agents dans votre projet. Situé dans le fichier téléchargé ml-agents-master \ UnitySDK \ Assets
  • D & D * le dossier ML-Agents dans votre projet. ooop.png

Création scénique

Créer un sol

    • Objet 3D> Plan * pour créer un plan. --Nommez le * Avion * que vous avez créé comme Sol
    • Transformer * de Floor
    • Position = (0, 0, 0)
    • Rotation = (0, 0, 0)
    • Scale = (1, 1, 1) À -Jouez avec * Element * de * Inpector *> * Materials * pour le faire ressembler à vous. ppppp.png

Créer une boîte (cible)

    • Objet 3D> Cube * pour créer un cube.
  • Nommez le * Cube * créé en «Cible».
    • Transformer * de Target
    • Position = (3, 0.5, 3)
    • Rotation = (0, 0, 0)
    • Scale = (1, 1, 1) À
  • Similaire à Floor, vous pouvez changer l'apparence à votre guise. box.png

Créer un ballon de football (Agent)

    • Objet 3D> Sphère * pour éteindre une sphère.
  • Nommez la * Sphere * que vous avez créée en tant que «RollerAgent».
    • Transformer * de RollerAgent
    • Position = (0, 0.5, 0)
    • Rotation = (0, 0, 0)
    • Scale = (1, 1, 1) À ――Comme auparavant, changez l'apparence à votre guise. Si vous voulez qu'elle ressemble à une balle, choisissez le matériau CheckerSquare. -Ajouter * Rigidbody * à partir de * Ajouter un composant *. kkkkk.png

Créer un objet vide (Academy)

    • Create Empty * fera apparaître un * GameObject * vide.
  • Nommez le * GameObject * que vous avez créé ʻAcademy`. oooiiiii.png

Ensuite, je décrirai le contenu en C #.

Implémentation d'une académie

-Avec ʻAcademysélectionné dans la fenêtre * Hierarchy *, utilisez * Add Component-> New Script * pour créer un script nomméRollerAcademy.cs`.

  • Réécrivez le contenu de RollerAcademy.cs comme suit. Vous pouvez effacer le contenu original.

RollerAcademy.cs


using MLAgents;
public class RollerAcademy : Academy{ }

Dans cette description, Les fonctions de base telles que «observation-décision-action» (omises ici) sont héritées de la classe * Academy * vers la classe * RollerAcademy *. Donc ça va avec deux lignes.

Implémenter un agent

Sélectionnez RollerAgent dans la fenêtre * Hierarchy * et sélectionnez Créez un script nommé RollerAgent.cs avec * Ajouter un composant-> Nouveau script *.

Héritage de la * Base *

Réécrivez le contenu de RollerAgent.cs comme suit.

RollerAgent.cs


using MLAgents;
public class RollerAgent : Agent{ }

Comme * Academy *, il lit l'espace de noms * MLAgents * et spécifie * Agent * comme classe de base à hériter.

C'est la procédure de base pour incorporer des agents ML dans __Unity. Ensuite, nous ajouterons un mécanisme pour que la balle se précipite vers la boîte en renforçant l'apprentissage.

Initialisation et réinitialisation

Réécrivez le contenu de RollerAgent.cs comme suit.

RollerAgent.cs


using unityEngine;
using MLAgents;

public class RollerAgent:Agent
{
    Rigidbody rBody;
    void Start(){
        rBody = GetComponent<Rigidbody>();
    }

    public Transform Target;
    public override void AgentReset()
    {
        if (this.transform.position.y < 0)
        {
            //Accélération rotationnelle et réinitialisation de l'accélération
            this.rBody.angularVelocity = Vector3.zero;
            this.rBody.velocity = Vector3.zero;
            //Renvoyer l'agent à sa position initiale
            this.transform.position = new Vector3( 0, 0.5f, 0)
        }
        //Relocalisation cible
        Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
                                      Random.value * 8 - 4);
    }

}

ici,

--Suivant __ relocalisation et initialisation __ lorsque RollerAgent atteint la boîte ( Target) --__ Retour __ lorsque RollerAgent tombe du sol ( Floor)

Est en cours de traitement.

Rigidbody est un composant utilisé dans la simulation physique d'Unity. Cette fois, il sera utilisé pour exécuter l'agent. Les valeurs de * Position, Rotation, Scale * sont enregistrées dans Transform. En le définissant dans public, * Inpector * peut passer Transform de * Target *.

Observation de l'environnement

Ajoutez ce qui suit dans la classe de RollerAgent.cs.

public override void CollectObservations()
{
    //Emplacement de la cible et de l'agent
    AddVectorObs(Target.position);
    AddvectorObs(This.transform.position);

    //Vitesse de l'agent
    AddVectorObs(rBody.velocity.x);
    AddVectorObs(rBody.velocity.z);
}

ici, __ Traitement pour collecter les données observées en tant que vecteur caractéristique __ Je fais.

Les coordonnées 3D de * Target * et * Agent * et les vecteurs 8D totaux de * Agent * speed * x * et * z * sont transmises au réseau neuronal. ~~ La 8ème dimension est cool ~~

Actions et récompenses

Ajoutez le traitement suivant lié à la fonction ʻAgentAction () à RollerAgent.cs`.

public float speed = 10
public override void AgentAction(float[] vectorAction, string textAction)
{
    //action
    Vector3 controlSignal = Vector3.zero;
    controlSignal.x = vectorAction[0];
    controlSignal.z = vectorAction[1];
    rBody.AddForce(controlSignal * speed);

    
    //Récompense
    //Obtenez la distance de la boîte (cible) à partir de la distance de déplacement de la balle (agent)
   float distanceToTarget = Vector3.Distance(this.transform.position, 
                                             Target.position);

    //Lorsque la case (cible) est atteinte
    if (distanceToTarget < 1.42f)
    {
        //Récompensé et terminé
        SetReward(1.0f);
        Done();
    }

    //Si tu tombes du sol
    if (this.transform.position.y < 0)
    {
        Done();
    }
}

ici, __L'action de lire les deux types de forces (valeurs continues) appliquées dans les directions X et Z et d'essayer de déplacer l'agent Nous traitons un algorithme d'apprentissage qui donne une «récompense» lorsque l'agent atteint avec succès la boîte et récupère la «récompense» lorsqu'elle tombe.

La fonction ʻAddForce` est une fonction pour appliquer une force physique à un objet avec un composant * Rigidbody * et le déplacer. Ce n'est que lorsque la distance inférieure à la valeur de référence pour juger si l'objectif a été atteint est calculée, la récompense est donnée et la réinitialisation est effectuée.

Afin d'obtenir suffisamment d'apprentissage dans des situations plus compliquées, il est efficace d'écrire non seulement la récompense mais aussi la punition. ~~ (En v0,5x, c'était -1 quand il est tombé du sol, mais il semble que cela ait été jugé inutile dans la dernière version) ~~

En résumé, RollerAgents.cs ressemble à ceci:

RollerAgents.cs


using unityEngine;
using MLAgents;

public class RollerAgent:Agent
{
    Rigidbody rBody;
    void Start(){
        rBody = GetComponent<Rigidbody>();
    }

    public Transform Target;
    public override void AgentReset()
    {
        if (this.transform.position.y < 0)
        {
            //Accélération rotationnelle et réinitialisation de l'accélération
            this.rBody.angularVelocity = Vector3.zero;
            this.rBody.velocity = Vector3.zero;
            //Renvoyer l'agent à sa position initiale
            this.transform.position = new Vector3( 0, 0.5f, 0)
        }
        //Relocalisation cible
        Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
                                      Random.value * 8 - 4);
    }

    public override void CollectObservations()
    {
        //Emplacement de la cible et de l'agent
        AddVectorObs(Target.position);
        AddvectorObs(This.transform.position);

        //Vitesse de l'agent
        AddVectorObs(rBody.velocity.x);
        AddVectorObs(rBody.velocity.z);
    }

    public override void AgentAction(float[] vectorAction, string textAction)
    {
        //action
        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = vectorAction[0];
        controlSignal.z = vectorAction[1];
        rBody.AddForce(controlSignal * speed);

    
        //Récompense
        //Obtenez la distance de la boîte (cible) à partir de la distance de déplacement de la balle (agent)
        float distanceToTarget = Vector3.Distance(this.transform.position, 
                                                 Target.position);

        //Lorsque la case (cible) est atteinte
        if (distanceToTarget < 1.42f)
        {
            //Récompensé et terminé
            SetReward(1.0f);
            Done();
        }

        //Si tu tombes du sol
        if (this.transform.position.y < 0)
        {
            Done();
        }
    }
}

Terminer sur l'éditeur Unity

-Sélectionnez RollerAgent dans la fenêtre * Hierarchy * et modifiez l'élémentRollerAgent (Script) de deux points.Decision Interval = 10 Target = Target(Transform)` sct.png

-Ajouter * Ajouter un composant> Paramètres de comportement * et modifier les paramètres comme suit.

Behavior Name = RollerBallBrain Vector Observation Space Size = 8 Vector Action Space Type = Continuous Vector Action Space Size = 2

Be.png

Aussi, selon la documentation officielle (https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md), si vous continuez à utiliser les paramètres par défaut 30 Il semble qu'il faut du temps pour apprendre 10 000 pas. Cette fois, ce n'est pas si compliqué, alors réécrivons certains des paramètres pour réduire le nombre d'essais à moins de 20 000 étapes.

-Ouvrez trainer_config.yaml dans * ml-agents-master-0.11> config> * avec un éditeur (VS code ou Notepad) et réécrivez les valeurs des éléments suivants.

aaaa.png

batch_size: 10
buffer_size: 100

Vous êtes maintenant prêt à vous entraîner.

Test manuel

Il est presque temps d'arriver ici. Avant de renforcer l'apprentissage, vérifions manuellement si l'environnement créé jusqu'à présent fonctionne correctement. Implémentez la méthode suivante en plus dans la classe de RollerAgent.cs.

public override float[] Heuristic()
{
    var action = new float[2];
    action[0] = Input.GetAxis("Horizontal");
    action[1] = Input.GetAxis("Vertical");
    return action;
}

Axe d'entrée horizontal (horizontal) avec "Horizontal", Permet à «Vertical» d'accepter les axes d'entrée verticaux (verticaux).

Vous pouvez maintenant utiliser les touches "W", "A", "S", "D" ou flèches.

Enfin, dans * l'Inspecteur * de Roller Agent, Cochez la case * Use Heuristic * sous * Behavior Parameters *.

he.png

Appuyez sur Lecture pour l'exécuter. Si vous pouvez confirmer que cela fonctionne par entrée de clé, cela réussit.

S'entraîner avec TensorFlow

Maintenant, passons à l'étape d'apprentissage.

Construction de l'environnement / installation de la bibliothèque

Tout d'abord, lancez Anaconda Prompt. Vous pouvez le trouver immédiatement en effectuant une recherche dans le menu Démarrer (touche Win). an.png

conda create -n ml-agents python=3.6

Entrez pour créer un environnement virtuel. [^ 1] on.png

Proceed([y]/n)?

Il vous sera demandé si vous souhaitez l'installer, alors entrez y. continuer,

activate ml-agents

Entrez pour passer à l'environnement virtuel. [^ 2] Assurez-vous que vous voyez le (ml-agents) au début de la ligne de commande. aaaa.png

cd <ml-dossier de l'agent >

Aller à. [^ 3]

pip install mlagents

Installez la bibliothèque que ML-Agents utilise indépendamment. (Cela prend quelques minutes) Cette installation crée des dépendances telles que TensorFlow / Jupyter.

Après un moment, C'est OK si un écran comme celui-ci apparaît. wewe.png

cd <ml-dossier agents >\ml-agents-envs

Aller à.

pip install -e .

Pour installer le package. konnna.png Ce n'est pas grave si l'écran ressemble à ceci. Et

cd <ml-dossier agents >\ml-agents

Aller à.

pip install -e .

Pour installer le package. www.png

Ceci termine la préparation côté Python.

__ : collision: [Remarque]: le plug-in TensorFlowSharp n'est pas utilisé dans la version 0.6.x ou ultérieure. __ Si vous avez fait référence à d'anciens livres, nous vous recommandons de recréer un nouvel environnement virtuel.

Jusqu'à ML-Agents ver0.5.0, TensorFlowSharp était utilisé pour communiquer avec Python, mais veuillez ne pas l'utiliser dans la dernière version. Si vous l'utilisez, l'erreur suivante se produira.

No model was present for the Brain 3DBallLearning. UnityEngine.Debug:LogError(Object) MLAgents.LearningBrain:DecideAction() (at Assets/ML-Agents/Scripts/LearningBrain.cs:191) MLAgents.Brain:BrainDecideAction() (at Assets/ML-Agents/Scripts/Brain.cs:80) MLAgents.Academy:EnvironmentStep() (at Assets/ML-Agents/Scripts/Academy.cs:601) MLAgents.Academy:FixedUpdate() (at Assets/ML-Agents/Scripts/Academy.cs:627)

(Source)


Apprentissage par renforcement

Enfin, nous allons commencer à apprendre. L'expérience IA de rêve approche à grands pas. faisons de notre mieux.

cd <ml-agents> dossier

Entrez pour passer à la hiérarchie des dossiers téléchargés.

mlagents-learn config/trainer_config.yaml --run-id=firstRun --train

Éxécuter. [^ 4] aaaaw.png Au bas de la ligne de commande, __INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor. (Revenez à l'éditeur Unity et appuyez sur le bouton Lecture pour démarrer l'entraînement.) __ Est affiché.

Revenez à l'écran Unity et décochez * Use Heuristic * dans __ * Behavior Parameters * et appuyez sur le bouton __ ,: arrow_forward:.

Lorsque la balle a commencé à chasser la boîte, l'apprentissage a commencé normalement.

__ Si vous n'appuyez pas sur le bouton Lecture pendant un certain temps, une erreur de temporisation se produira, veuillez donc réexécuter la même commande. __

Le journal est sorti dans le journal de la console toutes les 1000 étapes. Si vous souhaitez interrompre au milieu, vous pouvez interrompre avec Ctrl + C. (Si vous osez finir tôt, vous pouvez faire une "IA faible") おー!!!!.png

__Step est le nombre d'essais (apprentissage), __ __Mean Reward gagné en moyenne, __ __Std of Reward est l'écart type __ (valeur représentant la variation des données) Représente.

Après l'apprentissage, un fichier RollerBallBrain.nn sera créé sous <dossier ml-agents> \ models \ <id name ~>.

hyhy.png

Réflexion sur l'apprentissage

Il est maintenant temps de tester le modèle du réseau neuronal généré.

Copiez le fichier RollerBallBrain.nn antérieur dans le dossier * Assets * du projet Unity. (L'emplacement peut être n'importe où dans le projet) wwqqqq.png

Cliquez ensuite sur le bouton: radio_button: à l'extrême droite de l'élément * Model * dans * Inspector * du RollerAgent et sélectionnez le fichier importé .nn. (* À ce stade, veillez à ne pas confondre s'il existe un fichier d'extension .nn avec le même nom.)

De plus, si * Use Heuristic * dans * Behavior Parameters * est laissé coché, cela ne fonctionnera pas correctement. __ Assurez-vous de le décocher après le test. __ aaaqqqq.png

Maintenant, appuyons sur: arrow_forward: Play.

__ Si la balle commence à vous poursuivre en toute sécurité, vous réussissez. __ 30fps.gif

(Bonus) Observez le graphe de transition avec TensorBoard

Dans Anaconda Prompt, procédez comme suit:

tensorboard --logdir=summaries --port=6006

Si vous ouvrez [localhost: 6006](http: // localhost: 6006 /) dans votre navigateur, vous pouvez voir la transition d'apprentissage __ dans un graphique __. ほほう、TensorBoardですか。(ニチャア・・・.png

Résumé

――Si vous pouvez lire plus Gorigori C #, vous pourrez affiner l'algorithme vous-même __

  • Dans l'apprentissage amélioré, la sagesse de __AI peut être classée en faible, moyenne, forte, etc. en fonction du nombre d'apprentissages __ --Ver est fréquemment renouvelé, __ l'information est susceptible de se détériorer __ ―― ~~ L'apprentissage est beaucoup plus rapide que les humains. Le pouvoir de la science est incroyable! !! ~~

Même les débutants peuvent utiliser des ressources pour créer un monde pratique où l'apprentissage automatique simple peut être imité en une journée. Comment était-ce quand vous l'avez réellement touché? J'espère que ce sera une opportunité pour vous de vous intéresser à l'apprentissage automatique.

Si vous trouvez des expressions ou des erreurs typographiques qui vous intéressent, nous vous serions reconnaissants de bien vouloir les signaler. Aussi, si vous avez trouvé cet article utile, je l'aime bien __! Ce sera __encouragement si vous me donnez.

Merci de votre collaboration.

référence

Vous trouverez ci-dessous des articles de nos ancêtres qui ont été très utiles dans l'apprentissage. Je voudrais profiter de cette occasion pour vous dire __merci __.

Document officiel Unity-Technologies (GitHub) Guide de migration ml-agents (GitHub) [Unity: Comment utiliser ML-Agents en septembre 2019 (ver0.9.0 /0.9.1/0.9.2)](https://www.fast-system.jp/unity-ml-agents-version-0- 9-0-comment /) [Unity] J'ai essayé un tutoriel sur l'apprentissage amélioré (ML-Agents v0.8.1) [Créez un nouvel environnement d'apprentissage avec les agents ML d'Unity (version 0.6.0a)](http://am1tanaka.hatenablog.com/entry/2019/01/18/212915#%E5%AD%A6%E7 % BF% 92% E5% 8A% B9% E6% 9E% 9C% E3% 82% 92% E9% AB% 98% E3% 82% 81% E3% 82% 8B% E3% 81% 8A% E3% 81 % BE% E3% 81% 91)

[^ 1]: * Vous pouvez changer la partie de "ml-agents" * en n'importe quel nom que vous voulez. [^ 2]: activer avec le nom d'environnement virtuel que vous avez défini [^ 3]: Répertoire où * ml-agents-master * a été téléchargé dans Préparation [^ 4]: * Vous pouvez changer la partie de "firstRun" * en n'importe quel nom de votre choix.

Recommended Posts