Johdanto Advantage-näyttelijäkriittisiin menetelmiin: pelataan Sonic the Hedgehogia!

Kurssin alusta lähtien olemme tutkineet kahta erilaista vahvistusoppimismenetelmää:

  • Arvoperusteiset menetelmät (Q-oppiminen, syvä Q-oppiminen): jossa opitaan arvofunktio, joka kartoittaa jokaisen tilatoimintaparin arvoon. Näiden menetelmien ansiosta löydämme parhaan toiminnan jokaiseen tilaan - toiminnan, jolla on suurin arvo. Tämä toimii hyvin, kun sinulla on rajallinen toiminto.
  • Politiikkapohjaiset menetelmät (REINFORCE Policy Gradients -sovelluksella): jossa optimoimme politiikan suoraan ilman arvofunktiota. Tämä on hyödyllistä, kun toimintatila on jatkuva tai stokastinen. Pääongelma on hyvän pisteytysfunktion löytäminen laskemaan kuinka hyvä politiikka on. Käytämme jakson kokonaispalkkioita.

Mutta molemmilla näillä menetelmillä on suuria haittoja. Siksi tutkimme tänään uuden tyyppistä vahvistusoppimismenetelmää, jota voimme kutsua ”hybridi-menetelmäksi”: näyttelijäkriitikko. Käytämme kahta hermoverkkoa:

  • kriitikko, joka mittaa suoritetun toiminnan hyvyyttä (arvopohjainen)
  • näyttelijä, joka hallitsee edustajamme käyttäytymistä (politiikkaperustainen)

Tämän arkkitehtuurin hallitseminen on välttämätöntä huipputeknisten algoritmien, kuten Proximal Policy Optimization (alias PPO), ymmärtämiseksi. PPO perustuu Advantage Actor Critic -sivustolle.

Ja otat käyttöön Advantage Actor Critic (A2C) -agentin, joka oppii pelaamaan Sonic the Hedgehog!

Ote agentistamme, joka pelaa Sonicia 10 tunnin harjoituksen jälkeen GPU: lla.

Pyrkimys parempaan oppimismalliin

Käytäntögradienttien ongelma

Policy Gradient -menetelmällä on suuri ongelma. Olemme Monte Carlo -tilanteessa, odottaen jakson loppuun laskemaan palkkion. Voimme päätellä, että jos meillä on korkea palkkio (R (t)), kaikki tekemämme toimet olivat hyviä, vaikka jotkut todellakin olisivat huonoja.

Kuten tässä esimerkissä voidaan nähdä, vaikka A3 olisi ollut huono toimi (johti negatiivisiin palkintoihin), kaikille toimille tehdään keskiarvo hyväksi, koska kokonaispalkkio oli tärkeä.

Seurauksena on, että saadaksemme optimaalisen politiikan tarvitsemme paljon näytteitä. Tämä tuottaa hidasta oppimista, koska lähentyminen vie paljon aikaa.

Entä jos sen sijaan voimme tehdä päivityksen kussakin vaiheessa?

Esittelyssä näyttelijäkriitikko

Näyttelijäkriittinen malli on parempi pisteytystoiminto. Sen sijaan, että odottaisimme jakson loppuun, kuten teemme Monte Carlo REINFORCE -teoksessa, teemme päivityksen jokaisessa vaiheessa (TD Learning).

Koska teemme päivityksen jokaisessa vaiheessa, emme voi käyttää kokonaishyötyjä R (t). Sen sijaan meidän on koulutettava kriittinen malli, joka lähentää arvofunktiota (muista, että arvofunktio laskee, mikä on suurin odotettavissa oleva tulevaisuuden palkkio tietyn tilan ja toiminnon perusteella). Tämä arvofunktio korvaa palkkiofunktion käytännöllisessä kaltevuudessa, joka laskee palkkiot vain jakson lopussa.

Kuinka näyttelijäkriitikko toimii

Kuvittele, että pelaat videopeliä ystävän kanssa, joka antaa sinulle palautetta. Olet näyttelijä ja ystäväsi on kriitikko.

Alussa et tiedä kuinka pelata, joten yrität jotain toimintaa satunnaisesti. Kriitikko tarkkailee toimintaasi ja antaa palautetta.

Tämän palautteen perusteella voit päivittää politiikkasi ja pelata sitä paremmin.

Toisaalta ystäväsi (kriitikko) päivittää myös oman tapansa antaa palautetta, jotta se voi olla parempi ensi kerralla.

Kuten näemme, näyttelijäkriitikon idea on saada kaksi hermoverkkoa. Arvioimme molemmat:

ACTOR: Toimintatapa, hallitsee edustajamme toimintaa.Kriittinen: Arvofunktio, mittaa kuinka hyvä nämä toimet ovat.

Molemmat kulkevat samanaikaisesti.

Koska meillä on kaksi mallia (näyttelijä ja kriitikko), jotka on koulutettava, se tarkoittaa, että meillä on kaksi painojoukkoa (𝜃 toiminnallemme ja w kriitikollemme), jotka on optimoitava erikseen:

Näyttelijän kriittinen prosessi

Jokaisessa aikavaiheessa t otamme ympäristön nykyisen tilan (St) ja välitämme sen syötteenä näyttelijämme ja kriitikkojemme kautta.

Politiikkamme ottaa tilan, antaa toiminnon (At) ja vastaanottaa uuden tilan (St + 1) ja palkinnon (Rt + 1).

Tämän ansiosta:

  • kriitikko laskee arvon siitä, että kyseinen toimenpide toteutetaan siinä tilassa
  • näyttelijä päivittää käytäntöparametrit (painot) käyttämällä tätä q-arvoa

Päivitettyjen parametriensa ansiosta näyttelijä tuottaa seuraavan toimenpiteen At +1: ssä, kun otetaan huomioon uusi tila St + 1. Kriitikko päivittää sitten arvoparametrit:

A2C ja A3C

Esittelyssä Advantage-toiminto oppimisen vakauttamiseksi

Kuten artikkelissa näimme Deep Q Learning -sovelluksen parannuksista, arvoperusteisilla menetelmillä on suuri vaihtelu.

Tämän ongelman vähentämiseksi puhuimme etutoiminnon käytöstä arvofunktion sijasta.

Etufunktio on määritelty seuraavasti:

Tämä toiminto kertoo parannuksen verrattuna keskimääräiseen toimintaan, joka tässä tilassa tehdään. Toisin sanoen tämä toiminto laskee ylimääräisen palkkion, jonka saan, jos teen tämän toimenpiteen. Lisäpalkkio on se, joka ylittää kyseisen valtion odotetun arvon.

Jos A (s, a)> 0: kaltevuutemme työnnetään siihen suuntaan.

Jos A (s, a) <0 (toimintamme on huonompi kuin kyseisen tilan keskiarvo), kaltevuutemme työntyy vastakkaiseen suuntaan.

Tämän etufunktion toteuttamisen ongelma on, että se vaatii kaksi arvofunktiota - Q (s, a) ja V (s). Onneksi voimme käyttää TD-virhettä hyväksi etufunktion arvioijana.

Kaksi erilaista strategiaa: asynkroninen tai synkroninen

Actor Critic -agentin toteuttamiseksi meillä on kaksi erilaista strategiaa:

  • A2C (tunnetaan myös nimellä Advantage Actor Critic)
  • A3C (tunnetaan myös nimellä Asynchronous Advantage Actor Critic)

Sen vuoksi teemme yhteistyötä A2C: n eikä A3C: n kanssa. Jos haluat nähdä A3C: n täydellisen toteutuksen, tutustu erinomaiseen Arthur Julianin A3C-artikkeliin ja Doom-toteutukseen.

A3C: ssä emme käytä kokeellista toistoa, koska tämä vaatii paljon muistia. Sen sijaan suoritamme asynkronisesti erilaisia ​​agentteja rinnakkain useissa ympäristön esiintymissä. Jokainen työntekijä (verkon kopio) päivittää globaalin verkon asynkronisesti.

Toisaalta A2C: n ainoa ero on, että päivitämme synkronisesti globaalia verkkoa. Odotamme, kunnes kaikki työntekijät ovat suorittaneet koulutuksensa ja laskeneet kaltevuutensa keskiarvon laskemiseksi, päivittääksemme globaalia verkostoamme.

Valitaanko A2C tai A3C?

A3C: n ongelma selitetään tässä upeassa artikkelissa. A3C: n asynkronisen luonteen takia jotkut työntekijät (Agentin kopiot) pelaavat parametrien vanhemmalla versiolla. Siksi aggregoiva päivitys ei ole optimaalinen.

Siksi A2C odottaa jokaisen toimijan suorittavan kokemuksen segmenttinsä loppuun ennen globaalien parametrien päivittämistä. Sitten aloitamme uuden segmentin kokemuksesta kaikilla rinnakkaisilla toimijoilla, joilla on samat uudet parametrit.

Tämä skeema on tämän artikkelin innoittama.

Seurauksena on, että koulutus on yhtenäisempi ja nopeampi.

Sonic Hedgehogia soittavan A2C-agentin toteuttaminen

A2C käytännössä

Käytännössä, kuten tässä Reddit-viestissä selitetään, A2C: n synkroninen luonne tarkoittaa sitä, että emme tarvitse A2C: n eri versioita (eri työntekijöitä).

Jokaisella A2C: n työntekijällä on sama painojoukko, koska toisin kuin A3C, A2C päivittää kaikki työntekijänsä samanaikaisesti.

Itse asiassa luomme ympäristöistä useita versioita (sanotaanpa kahdeksan) ja suoritamme ne sitten rinnakkain.

Prosessi on seuraava:

  • Luo n-ympäristöjen vektorin monikäsittelykirjastoa käyttämällä
  • Luo juoksijaobjektin, joka käsittelee erilaisia ​​ympäristöjä suorittaen samanaikaisesti.
  • Verkossa on kaksi versiota:
  1. step_model: joka tuottaa kokemuksia ympäristöistä
  2. train_model: joka kouluttaa kokemuksia.

Kun juoksija ottaa askeleen (yksivaiheinen malli), tämä suorittaa vaiheen jokaiselle n ympäristölle. Tämä tuottaa erän kokemusta.

Sitten laskemme kaltevuuden kerralla käyttämällä train_model-mallia ja erä kokemustamme.

Lopuksi päivitämme askelmallin uusilla painoilla.

Muista, että kaltevuuden laskeminen kerralla on sama asia kuin tietojen kerääminen, kaltevuuden laskeminen kullekin työntekijälle ja sitten keskiarvon laskeminen. Miksi? Koska johdannaisten summaaminen (kaltevuuksien summaaminen) on sama asia kuin summan johdannaisten ottaminen. Mutta toinen on tyylikäs ja parempi tapa käyttää GPU: ta.

A2C Sonic the Hedgehogin kanssa

Joten nyt kun ymmärrämme kuinka A2C toimii yleensä, voimme toteuttaa A2C-agenttimme soittaen Sonicia! Tämä video näyttää edustajamme käyttäytymiseron 10 minuutin harjoituksen (vasen) ja 10 tunnin harjoituksen (oikealla) välillä.

Toteutus on täällä GitHub-repo-tilassa, ja kannettava tietokone selittää toteutuksen. Annan sinulle tallennetun mallin, joka on koulutettu noin 10 h + GPU: lla.

Tämä toteutus on paljon monimutkaisempi kuin aiemmat toteutukset. Aloitamme uusimpien algoritmien toteuttamisen, joten meidän on oltava entistä tehokkaampia koodillamme. Siksi erotamme koodin tässä toteutuksessa koodiin eri kohteina ja tiedostoina.

Siinä kaikki! Olet juuri luonut agentin, joka oppii pelaamaan Sonic the Hedgehogia. Se on mahtavaa! Voimme nähdä, että 10 tunnin koulutuksella edustajamme ei ymmärrä esimerkiksi kiertoa, joten meidän on käytettävä vakaampaa arkkitehtuuria: PPO.

Ota aikaa harkitaksesi kaikkia saavutuksia, jotka olet saavuttanut kurssin ensimmäisen luvun jälkeen: Siirryimme yksinkertaisista tekstipeleistä (OpenAI taxi-v2) monimutkaisiin peleihin, kuten Doom ja Sonic the Hedgehog, käyttämällä entistä tehokkaampia arkkitehtuureja. Ja se on upeaa!

Seuraavan kerran opimme Proximal Policy Gradients -arkkitehtuurista, joka voitti OpenAI-retro-kilpailun. Koulutamme edustajamme pelaamaan Sonic the Hedgehog 2 ja 3: ta ja tällä kertaa, ja se suorittaa kokonaiset tasot!

Älä unohda toteuttaa koodin kaikkia osia itse. On todella tärkeää yrittää muuttaa koodia, jonka annoin sinulle. Yritä lisätä aikakautta, muuttaa arkkitehtuuria, muuttaa oppimisnopeutta ja niin edelleen. Kokeilu on paras tapa oppia, joten pidä hauskaa!

Jos pidit artikkelissani, napsauta alla olevaa -kohtaa niin monta kertaa kuin pidit artikkelista, niin muut ihmiset näkevät tämän täällä Mediumissa. Ja älä unohda seurata minua!

Tämä artikkeli on osa syvävahvistusoppimiskurssini TensorFlowin kanssa . Tutustu opetussuunnitelmaan täällä.

Jos sinulla on ajatuksia, kommentteja, kysymyksiä, voit kommentoida alla tai lähettää minulle sähköpostia: hei [at] simoninithomas [dot] com, tai twiitti minua @ThomasSimonini.

Syvävahvistusoppimiskurssi:

Teemme videversion syvävahvistusoppimiskurssista Tensorflowin kanssa , jossa keskitymme toteutuksen osaan tensorflowin kanssa täällä.

Osa 1: Johdatus vahvistusoppimiseen

Osa 2: Sukellus syvemmälle vahvistusoppimiseen Q-oppimisen avulla

Osa 3: Johdatus syvään Q-oppimiseen: pelataan Doom

Osa 3+: Parannukset syvässä Q-oppimisessa: Tupla-DQN: n kaksintaistelu, priorisoitu kokemuksen toisto ja kiinteät Q-tavoitteet

Osa 4: Johdanto politiikan muuttujiin Doomin ja Cartpolen kanssa

Osa 6: Proksimaalinen politiikan optimointi (PPO) Sonic the Hedgehog 2 ja 3 -sovelluksella

Osa 7: uteliaisuuteen perustuva oppiminen on helppoa, osa I