Bevezetés az Advantage Actor Critic módszerekbe: játsszuk a Sonic the Hedgehog-t!

A tanfolyam kezdete óta két különböző megerősítő tanulási módszert tanulmányoztunk:

  • Értékalapú módszerek (Q-tanulás, Mély Q-tanulás): ahol megtanulunk egy értékfüggvényt , amely az egyes állapot-cselekvési párokat egy értékhez fogja térképezni. Ezeknek a módszereknek köszönhetően megtaláljuk az egyes államok számára a legjobb intézkedéseket - a legnagyobb értékű cselekvést. Ez akkor működik jól, ha véges halmaza van.
  • Házirend-alapú módszerek (REINFORCE with Policy Gradients): ahol közvetlenül optimalizáljuk a házirendet értékfüggvény használata nélkül. Ez akkor hasznos, ha a cselekvési tér folyamatos vagy sztochasztikus. A fő probléma egy jó pontszámfüggvény megtalálása a politika jóságának kiszámításához. Az epizód teljes jutalmát felhasználjuk.

De mindkét módszernek nagy hátrányai vannak. Ezért ma egy új típusú megerősítő tanulási módszert fogunk tanulmányozni, amelyet „hibrid módszernek” is nevezhetünk: a színész kritikusát . Két neurális hálózatot fogunk használni:

  • egy kritikus, amely azt méri, hogy a tett mennyire jó (értékalapú)
  • színész, aki ellenőrzi ügynökünk viselkedését (házirend-alapú)

Ennek az architektúrának az elsajátítása elengedhetetlen a korszerű algoritmusok, például a Proximal Policy Optimization (más néven PPO) megértéséhez . A PPO alapja az Advantage Actor Critic.

És megvalósít egy Advantage Actor Critic (A2C) ügynököt, amely megtanulja a Sonic the Hedgehog játékát!

A jobb tanulási modellre való törekvés

A házirend-színátmenetekkel kapcsolatos probléma

A Policy Gradient módszernek nagy problémája van. Monte Carlóban vagyunk, és az epizód végéig várjuk a jutalom kiszámítását. Arra a következtetésre juthatunk, hogy ha magas a jutalmunk ( R (t) ), akkor minden tettünk jó volt, még akkor is, ha néhány nagyon rossz volt.

Amint ebben a példában láthatjuk, még akkor is, ha az A3 rossz akció volt (negatív jutalmakhoz vezetett), az összes akciót jónak fogják átlagolni, mert a teljes jutalom fontos volt.

Ennek eredményeként az optimális politika érdekébensok mintára van szükségünk. Ez lassú tanulást eredményez, mert a konvergáláshoz sok idő kell.

Mi lenne, ha ehelyett minden egyes lépésben elvégezhetünk egy frissítést?

Bemutatjuk a színészkritikust

A színészkritikus modell jobb pontszámfüggvény. Ahelyett, hogy megvárnánk az epizód végét, mint a Monte Carlo REINFORCE-ban, minden lépésnél frissítést hajtunk végre (TD Learning).

Mivel minden egyes lépésnél frissítést hajtunk végre, nem tudjuk felhasználni a teljes jutalmat (R). Ehelyett egy kritikus modellt kell kiképeznünk, amely közelíti az értékfüggvényt (ne felejtsük el, hogy az értékfüggvény kiszámítja, hogy mekkora a várható jövőbeni jutalom maximális értéke egy állapotnak és egy cselekvésnek). Ez az értékfunkció helyettesíti a jutalomfüggvényt a ház gradiensében, amely csak az epizód végén számítja ki a jutalmat.

Hogyan működik a színészkritikus

Képzelje el, hogy videojátékot játszik egy barátjával, amely visszajelzést ad Önnek. Te vagy a színész, és a barátod a kritikus.

Az elején nem tudod, hogyan kell játszani, ezért véletlenszerűen próbálsz meg valamilyen műveletet. A kritikus figyelemmel kíséri cselekedeteit és visszajelzést ad.

Ebből a visszajelzésből kiindulva frissíti az irányelveit, és jobban fog játszani a játékban.

Másrészt a barátod (Kritikus) is frissíti a visszajelzés módját, hogy legközelebb jobb lehessen.

Mint láthatjuk, az Actor Critic ötlete az, hogy két idegháló legyen. Becslésünk szerint mindkettő:

Mindkettő párhuzamosan fut.

Mivel két modellünk van (színész és kritikus), amelyeket ki kell képezni, ez azt jelenti, hogy két súlykészletet (cselekvésünkhöz és w kritikusunkhoz) külön-külön kell optimalizálni:

A színész kritikus folyamata

A t minden egyes lépésnél kivesszük a környezetből az aktuális állapotot (St), és ezt bemenetként továbbadjuk Színészünkön és kritikusunkon keresztül.

Politikánk átveszi az állapotot, végrehajt egy műveletet (At), és új állapotot (St + 1) és jutalmat (Rt + 1) kap.

Ennek köszönhetően:

  • a kritikus kiszámítja a cselekvés értékét abban az állapotban
  • az Actor frissíti házirend-paramétereit (súlyait) ezzel a q értékkel

Frissített paramétereinek köszönhetően a színész előállítja a következő műveletet, amelyet At + 1-nél kell végrehajtani, tekintettel az új St + 1 állapotra. Ezután a kritikus frissíti az értékparamétereit:

A2C és A3C

Az Advantage funkció bemutatása a tanulás stabilizálása érdekében

Amint azt a Deep Q Learning fejlesztéseiről szóló cikkben láttuk, az értékalapú módszerek nagyon változékonyak.

Ennek a problémának a csökkentése érdekében az előny függvény használatáról beszéltünk az érték függvény helyett.

Az előnyfüggvény a következőképpen definiálható:

Ez a funkció megmutatja számunkra a javulást az adott állapotban végrehajtott átlag átlagához képest. Más szavakkal, ez a függvény kiszámítja az extra jutalmat, amelyet akkor kapok, ha megteszem ezt a műveletet. Az extra jutalom az, hogy meghaladja az állam várható értékét.

Ha A (s, a)> 0: gradiensünk abba az irányba tolódik.

Ha A (s, a) <0 (cselekvésünk rosszabb, mint az állapot átlagos értéke), akkor gradiensünk ellenkező irányba tolódik.

Az előnyfüggvény megvalósításának problémája az, hogy két értékfüggvényre van szükség - Q (s, a) és V (s). Szerencsére a TD hibát jó becslésként használhatjuk az előnyfüggvényre.

Két különböző stratégia: aszinkron vagy szinkron

Két különböző stratégiánk van az Actor Critic ügynök megvalósítására:

  • A2C (más néven Advantage Actor Critic)
  • A3C (más néven Asynchronous Advantage Actor Critic)

Emiatt A2C-vel fogunk dolgozni, nem pedig A3C-val. Ha szeretné látni az A3C teljes megvalósítását, nézze meg Arthur Juliani kiváló cikkét és a Doom megvalósítását.

Az A3C-ben nem használjuk az élményismétlést, mivel ez sok memóriát igényel. Ehelyett aszinkron módon hajtunk végre különböző ügynököket párhuzamosan, a környezet több példányán. Minden dolgozó (a hálózat másolata) aszinkron módon frissíti a globális hálózatot.

Másrészt az egyetlen különbség az A2C-ben az, hogy szinkron módon frissítjük a globális hálózatot. Várjuk, amíg minden dolgozó befejezi a képzését, és kiszámítja a gradienseket az átlagoláshoz, hogy frissítse globális hálózatunkat.

Az A2C vagy az A3C választása?

Az A3C problémáját ebben a fantasztikus cikkben fejtik ki. Az A3C aszinkron jellege miatt néhány dolgozó (az Agent másolatai) a paraméterek régebbi verziójával fognak játszani. Így az összesítő frissítés nem lesz optimális.

Ezért várja az A2C, hogy minden szereplő befejezze tapasztalati szegmensét, mielőtt frissíti a globális paramétereket. Ezután újraindítjuk a tapasztalatok új szegmensét úgy, hogy az összes párhuzamos szereplő ugyanazokkal az új paraméterekkel rendelkezik.

Ennek eredményeként a képzés összetartóbb és gyorsabb lesz.

A Sonic the Hedgehogot játszó A2C ügynök megvalósítása

A2C a gyakorlatban

A gyakorlatban, amint azt ebben a Reddit-bejegyzésben kifejtettük, az A2C szinkron jellege azt jelenti , hogy nincs szükségünk az A2C különböző verzióira (különböző dolgozókra).

Az A2C minden dolgozójának ugyanaz a súlykészlete, mivel az A3C-vel ellentétben az A2C minden dolgozóját egyszerre frissíti.

Valójában a környezetek több változatát (mondjuk nyolcat) készítjük, majd párhuzamosan végrehajtjuk.

A folyamat a következő lesz:

  • N környezetek vektorát hozza létre a többprocesszoros könyvtár segítségével
  • Létrehoz egy futóobjektumot, amely párhuzamosan futtatja a különböző környezeteket.
  • Kétféle verziója van a hálózatnak:
  1. step_model: amely környezetekből tapasztalatokat generál
  2. vonat_modell: ez edzi az élményeket.

Amikor a futó megtesz egy lépést (egylépcsős modell), ez végrehajt egy lépést az n környezet mindegyikéhez. Ez rengeteg tapasztalatot ad ki.

Ezután egyszerre kiszámoljuk a színátmenetet a train_model és a sok tapasztalat segítségével.

Végül frissítjük a lépésmodellt az új súlyokkal.

Ne feledje, hogy a gradiens egyszerre történő kiszámítása ugyanaz, mint az adatok gyűjtése, az egyes munkavállalók gradiensének kiszámítása, majd az átlagolás. Miért? Mivel a deriváltak összegzése (gradiensek összegzése) ugyanaz, mint az összeg deriváltjainak felvétele . De a második elegánsabb és jobb módja a GPU használatának.

A2C Sonic the Hedgehog-nal

Tehát most, hogy megértettük az A2C működését általában, megvalósíthatjuk a Sonicot játszó A2C ügynökünket! Ez a videó az ügynökünk viselkedési különbségét mutatja 10 perc edzés (balra) és 10 óra edzésre (jobbra).

A megvalósítás itt a GitHub repóban található, és a jegyzetfüzet elmagyarázza a megvalósítást. Adok neked egy mentett modellt, amely körülbelül 10 órával + képzett GPU-n.

Ez a megvalósítás sokkal összetettebb, mint a korábbi megvalósítások. Elkezdjük a legmodernebb algoritmusok megvalósítását, ezért egyre hatékonyabbnak kell lennünk a kódunkkal. Ezért ebben a megvalósításban különválasztjuk a kódot különböző objektumokra és fájlokra.

Ez minden! Most létrehozott egy ügynököt, aki megtanulja játszani a Sonic the Hedgehog-t. Ez elképesztő! Láthatjuk, hogy 10 órás képzéssel ügynökünk nem érti például a hurkolást, ezért stabilabb architektúrát kell használnunk: a PPO-t.

Szánjon időt arra, hogy áttekintse a kurzus első fejezete óta elért összes eredményt: az egyszerű szöveges játékoktól (OpenAI taxi-v2) olyan komplex játékokig mentünk át, mint a Doom és a Sonic the Hedgehog, egyre erősebb architektúrák felhasználásával. És ez fantasztikus!

Legközelebb megismerjük a Proximal Policy Gradients nevű architektúrát, amely megnyerte az OpenAI Retro Contest versenyt. Megtanítjuk ügynökünket, hogy játsszon Sonic the Hedgehog 2 és 3 játékkal, és ezúttal, és ez teljes szinteket fog befejezni!

Ne felejtse el egyedül végrehajtani a kód egyes részeit. Nagyon fontos megpróbálni módosítani az általam megadott kódot. Próbáljon korszakokat hozzáadni, változtassa meg az architektúrát, változtassa meg a tanulási sebességet stb. A kísérletezés a legjobb módja a tanulásnak, ezért érezd jól magad!

Ha tetszett a cikkem, kérjük, kattintson a? annyiszor, ahányszor tetszett a cikk, így mások láthatják ezt itt a Médiumon. És ne felejtsd el követni!

Ez a cikk a TensorFlow segítségével végzett mélymegerősítő tanfolyamom része. Nézze meg a tantervet itt.

Ha bármilyen gondolata, észrevétele, kérdése van, nyugodtan írjon megjegyzést alább, vagy küldjön nekem egy e-mailt: hello [at] simoninithomas [dot] com, vagy tweeteljen @ThomasSimonini.

Mély megerősítésű tanfolyam:

Csinálunk egy videó változata a mély megerősítése oktatási módszereket Tensorflow ? ahol itt a végrehajtási részre összpontosítunk.

1. rész: Bevezetés a megerősítő tanulásba

2. rész: Merüljön el mélyebben a megerősítő tanulásban a Q-tanulással

3. rész: Bevezetés a mély Q-tanulásba: játsszuk a Doom-ot

3+ rész: Fejlesztések a mély Q tanulásban: Dupla DQN párbaj, prioritásos tapasztalatok visszajátszása és fix Q-célok

4. rész: Bevezetés a házirend-színátmenetekbe a Doom és Cartpole segítségével

6. rész: Proximal Policy Optimization (PPO) Sonic the Hedgehog 2 és 3 alkalmazással

7. rész: A kíváncsiság által vezérelt tanulás megkönnyítette az I. részt