Parannuksia syvälle Q-oppimiseen: kaksinkertaisen DQN: n kaksintaistelu, priorisoitu kokemuksen uusinta ja kiinteä…

Tämä artikkeli on osa Deep Reinforcement Learning Course with Tensorflow? ️. Tarkista opetussuunnitelma täältä.

Viimeisessä artikkelissa Deep Q Learning with Tensorflow -sovelluksesta otimme käyttöön agentin, joka oppii pelaamaan yksinkertaista versiota Doomista. Videoversiossa koulutimme DQN-agentin, joka pelaa avaruuden hyökkääjiä.

Koulutuksen aikana huomasimme kuitenkin, että vaihtelua oli paljon.

Syvä Q-oppiminen otettiin käyttöön vuonna 2014. Siitä lähtien on tehty paljon parannuksia. Joten tänään näemme neljä strategiaa, jotka parantavat - dramaattisesti - DQN-agenttimme koulutusta ja tuloksia:

  • kiinteät Q-tavoitteet
  • kaksinkertainen DQN
  • kaksintaistelu DQN (alias DDQN)
  • Ensisijainen kokemuksen uusinta (alias PER)

Toteutamme agentin, joka oppii pelaamaan Doom Deadly -käytävää. Tekoälyn on navigoitava kohti perustavoitetta (liivi) ja varmistettava, että he selviävät samanaikaisesti tappamalla vihollisia.

Kiinteät Q-tavoitteet

Teoria

Näimme Deep Q Learning -artikkelissa, että kun haluamme laskea TD-virheen (alias tappion), laskemme eron TD-tavoitteen (Q_target) ja nykyisen Q-arvon (Q: n estimointi) välillä.

Mutta meillä ei ole aavistustakaan todellisesta TD-tavoitteesta. Meidän on arvioitava se. Bellman-yhtälön avulla huomasimme, että TD-tavoite on vain palkkio kyseisen toimenpiteen suorittamisesta kyseisessä tilassa plus diskontattu korkein Q-arvo seuraavalle tilalle.

Ongelmana on kuitenkin se, että käytämme samoja parametreja (painoja) kohteen ja Q-arvon arvioimiseksi . Tämän seurauksena TD-kohteen ja muutettavien parametrien (w) välillä on suuri korrelaatio.

Siksi se tarkoittaa, että jokaisessa harjoitteluvaiheessa Q-arvomme siirtyvät, mutta myös tavoitearvo muuttuu. Joten olemme lähestymässä tavoitettamme, mutta myös kohde liikkuu. Se on kuin liikkuvan kohteen jahtaaminen! Tämä johti suureen värähtelyyn harjoittelussa.

Se on kuin jos olisit cowboy (Q-arvio) ja haluat kiinni lehmän (Q-tavoite), sinun on päästävä lähemmäksi (vähennettävä virhettä).

Jokaisessa vaiheessa yrität lähestyä lehmää, joka myös liikkuu kullakin ajanjaksolla (koska käytät samoja parametreja).

Tämä johtaa hyvin outoon takaa-ajoihin (suuri värähtely harjoittelussa).

Sen sijaan voimme käyttää DeepMindin esittämän ajatuksen kiinteistä Q-kohteista:

  • Erillisen verkon käyttäminen kiinteällä parametrilla (kutsutaan sitä w-) TD-kohteen arvioimiseksi.
  • Jokaisessa Tau-vaiheessa kopioimme parametrit DQN-verkostostamme kohdeverkon päivittämiseksi.

Tämän menettelyn ansiosta meillä on vakaampi oppiminen, koska kohdetoiminto pysyy kiinteänä jonkin aikaa.

Toteutus

Kiinteiden q-tavoitteiden toteuttaminen on melko yksinkertaista:

  • Ensinnäkin luomme kaksi verkkoa ( DQNetwork, TargetNetwork)
  • Sitten luomme toiminnon, joka vie DQNetworkparametrit ja kopioi ne omaanTargetNetwork
  • Lopuksi lasketaan koulutuksen aikana TD-tavoite kohdeverkostomme avulla. Päivitämme kohdeverkon DQNetworkjokaisella tauaskeleella ( tauon määrittelemämme hyperparametri).

Kaksinkertaiset DQN: t

Teoria

Kaksinkertaiset DQN: t eli kaksinkertainen oppiminen otettiin käyttöön Hado van Hasselt. Tämä menetelmä käsittelee Q-arvojen yliarvioinnin ongelmaa.

Tämän ongelman ymmärtämiseksi muista, kuinka laskemme TD-tavoitteen:

Laskemalla TD-tavoite kohtaa yksinkertaisen ongelman: kuinka voimme olla varmoja siitä, että paras tila seuraavaa tilaa varten on toiminta, jolla on suurin Q-arvo?

Tiedämme, että q-arvojen tarkkuus riippuu siitä, mitä toimintoa yritimme ja mitä naapurivaltioita tutkimme.

Tämän seurauksena koulutuksen alussa meillä ei ole tarpeeksi tietoa parhaista toimenpiteistä. Siksi q-arvon (joka on meluisa) ottaminen parhaaksi toiminnaksi voi johtaa vääriä positiivisia tuloksia. Jos ei-optimaalisille toiminnoille annetaan säännöllisesti korkeampi Q-arvo kuin optimaaliselle parhaalle toiminnolle, oppiminen on monimutkaista.

Ratkaisu on: kun laskemme Q-tavoitteen, käytämme kahta verkkoa erottamaan toimintavalinnan Q-tavoitearvon luomisesta. Me:

  • käytä DQN-verkkoamme valitaksesi, mikä on paras toimenpide seuraavaan tilaan (toiminto, jolla on suurin Q-arvo).
  • käytä kohdeverkkoamme laskeaksesi tavoitteen Q-arvon suorittamalla toimen seuraavassa tilassa.

Siksi Double DQN auttaa meitä vähentämään q-arvojen yliarviointia ja sen seurauksena auttaa meitä harjoittelemaan nopeammin ja oppimisen vakautta.

Toteutus

Duel DQN (alias DDQN)

Teoria

Muista, että Q-arvot vastaavat sitä, kuinka hyvä on olla tässä tilassa ja toimia tässä tilassa Q (s, a).

Joten voimme hajottaa Q (s, a):

  • V (s) : siinä tilassa olemisen arvo
  • A (s, a) : etu, että teet kyseisen toimenpiteen tuossa tilassa (kuinka paljon parempi on tehdä tämä toimenpide verrattuna kaikkiin muihin mahdollisiin toimiin kyseisessä tilassa).

DDQN: n avulla haluamme erottaa näiden kahden elementin estimaattorin käyttämällä kahta uutta virtaa:

  • joka arvioi tilan arvon V (s)
  • joka arvioi kunkin toiminnon A (s, a) edun

Ja sitten yhdistämme nämä kaksi virtaa erityisen aggregaatiokerroksen läpi saadaksemme arvion Q: sta (s, a).

Odota? Mutta miksi meidän on laskettava nämä kaksi elementtiä erikseen, jos sitten yhdistämme ne?

Irrottamalla estimointi, DDQN-tietokoneemme voi intuitiivisesti oppia, mitkä tilat ovat (tai eivät) arvokkaita tarvitsematta oppia kunkin toiminnan vaikutusta kussakin tilassa (koska se laskee myös V (t)).

Normaalilla DQN: llä meidän on laskettava kunkin toiminnon arvo kyseisessä tilassa. Mutta mitä järkeä on, jos valtion arvo on huono? Mitä järkeä on laskea kaikki toimet yhdessä tilassa, kun kaikki nämä toimet johtavat kuolemaan?

Tämän seurauksena irrottamalla tuotannosta voimme laskea V (s). Tämä on erityisen hyödyllistä valtioille, joissa heidän toimintansa eivät vaikuta ympäristöön merkityksellisellä tavalla. Tässä tapauksessa ei ole tarpeen laskea kunkin toiminnon arvoa. Esimerkiksi oikealle tai vasemmalle liikkumisella on merkitystä vain, jos törmäysvaara on olemassa. Ja useimmissa osavaltioissa toiminnan valinnalla ei ole vaikutusta siihen, mitä tapahtuu.

Se on selvempi, jos otamme esimerkin artikkelista Dueling Network Architectures for Deep Reinforcement Learning.

Näemme, että arvoverkkovirrat kiinnittävät huomiota (oranssi epäselvyys) tielle ja erityisesti horisonttiin, jossa autoja syntyy. Se kiinnittää huomiota myös pisteisiin.

Toisaalta oikeanpuoleisen ensimmäisen kehyksen etuvirta ei kiinnitä paljon huomiota tielle, koska edessä ei ole autoja (joten toimintavalinnalla ei ole käytännössä merkitystä). Mutta toisessa kehyksessä se kiinnittää huomiota, koska heti sen edessä on auto, ja toimintavalinnan tekeminen on ratkaisevan tärkeää ja erittäin merkityksellistä.

Koontikerroksen osalta haluamme luoda q-arvot jokaiselle toiminnolle kyseisessä tilassa. Saatamme olla kiusaus yhdistää virrat seuraavasti:

Mutta jos teemme niin, me putoammetunnistettavuuden kysymys , eli - kun Q (s, a) emme löydä A (s, a) ja V (s).

Eikä se, että löydettäisiin V (s) ja A (s, a), annettu Q (s, a), on ongelma selkämme etenemiselle. Tämän ongelman välttämiseksi voimme pakottaa etufunktion estimaattorimme saamaan 0 etua valitulla toiminnolla.

Tätä varten vähennämme valtion kaikkien mahdollisten toimien keskimääräisen edun.

Siksi tämä arkkitehtuuri auttaa meitä nopeuttamaan koulutusta. Voimme laskea tilan arvon laskematta Q (s, a) jokaiselle toiminnolle kyseisessä tilassa. Ja se voi auttaa meitä löytämään paljon luotettavampia Q-arvoja kullekin toiminnolle irrottamalla estimaatin kahden virran välillä.

Toteutus

Ainoa tehtävä on modifioida DQN-arkkitehtuuria lisäämällä nämä uudet virrat:

Ensisijainen kokemusten uusinta

Teoria

Prioritized Experience Replay (PER) otettiin käyttöön vuonna 2015 Tom Schaulin toimesta. Ajatuksena on, että jotkut kokemukset voivat olla tärkeämpiä kuin toiset koulutuksellemme, mutta niitä voi esiintyä harvemmin.

Koska otamme erän tasaisesti (valitsemalla kokemukset satunnaisesti), näillä harvinaisilla kokemuksilla ei käytännössä ole mahdollisuutta valita.

Siksi yritämme PER: llä muuttaa näytteenottojakaumaa käyttämällä kriteeriä määrittelemään jokaisen kokemuksen prioriteetti.

Haluamme ottaa etusijalle kokemuksen, jossa ennustuksemme ja TD-tavoitteen välillä on suuri ero, koska se tarkoittaa, että meillä on paljon opittavaa siitä.

Käytämme TD-virheen suuruuden absoluuttista arvoa:

Ja asetimme tämän prioriteetin jokaisen toistopuskurin kokemuksiin.

Mutta emme voi tehdä vain ahneita priorisointikohteita, koska se johtaa aina samojen kokemusten (joilla on suuri prioriteetti) harjoittamiseen ja siten liian sopivaan.

Joten otamme käyttöön stokastisen priorisoinnin, joka luo todennäköisyyden tulla valituksi uusintalle.

Tämän seurauksena saamme jokaisen ajanvaiheen aikana anäyteerä tällä todennäköisyysjakaumalla ja kouluta verkkoamme siinä.

Mutta meillä on edelleen ongelma tässä. Muista, että normaalissa Experience Replay -ohjelmassa käytämme stokastista päivityssääntöä. Tämän seurauksena kokemusten näytteenottotavan on vastattava niiden taustalla olevaa jakaumaa, josta ne ovat peräisin.

Kun meillä on normaali kokemus, valitsemme kokemuksemme normaalijakaumassa - yksinkertaisesti sanottuna, valitsemme kokemuksemme satunnaisesti. Biasia ei ole, koska jokaisella kokemuksella on sama mahdollisuus ottaa huomioon, joten voimme päivittää painomme normaalisti.

Mutta koska käytämme ensisijaista näytteenottoa, puhtaasti satunnainen näytteenotto hylätään. Tämän seurauksena esitämme ennakkoluuloja korkean prioriteetin näytteille (enemmän mahdollisuuksia valita).

Ja jos päivitämme painomme normaalisti, meillä on riski ylimitoitumisesta. Näytteitä, joilla on suuri prioriteetti, käytetään todennäköisesti monta kertaa harjoitteluun verrattuna matalan prioriteetin kokemuksiin (= ennakkoluuloja). Tämän seurauksena päivitämme painomme vain pienellä osalla kokemuksia, joita pidämme todella mielenkiintoisina.

Tämän poikkeaman korjaamiseksi käytämme tärkeyden näytteenottopainoja (IS), jotka säätävät päivitystä vähentämällä usein nähtyjen näytteiden painoja.

Korkean prioriteetin näytteitä vastaavilla painoilla on hyvin vähän säätöjä (koska verkko näkee nämä kokemukset monta kertaa), kun taas matalan prioriteetin näytteitä vastaavat painot päivitetään täydellisesti.

Rooli b on valvoa, kuinka paljon nämä merkitys on painokertoimen vaikuttavat oppimiseen. Käytännössä b-parametri hehkutetaan 1: een koko harjoituksen ajan, koska nämä painot ovat tärkeämpiä oppimisen lopussa, kun q-arvomme alkavat lähentyä. Päivitysten puolueettomuus on tärkeintä lähellä lähentymistä, kuten tässä artikkelissa selitetään.

Toteutus

Tällä kertaa toteutus on hiukan hienompaa.

Ensinnäkin, emme voi toteuttaa PER: ää vain lajittelemalla kaikki Experience Replay -puskurit prioriteettiensa mukaan. Tämä ei ole ollenkaan tehokasta johtuen O: n (nlogn) lisäyksestä ja O (n): n näytteenotosta.

Kuten tässä todella hyvässä artikkelissa on selitetty, meidän on käytettävä matriisin lajittelun sijaan toista tietorakennetta - lajittelematon summa.

Summa on binääripuu, joka on puu, jossa on enintään kaksi lasta kullekin solmulle. Lehdet (syvimmät solmut) sisältävät prioriteettiarvot, ja lehtiin osoittava tietoryhmä sisältää kokemukset.

Puun päivittäminen ja näytteenotto ovat todella tehokkaita (O (log n)).

Sitten luomme muistiobjektin, joka sisältää puumme ja datamme.

Seuraavaksi ottaaksesi pienikokoisen k-koon alue [0, kokonaisprioriteetti] jaetaan k-alueisiin. Arvo näytetään tasaisesti jokaisesta alueesta.

Lopuksi kutakin näistä otokseen kuuluvista arvoista vastaavat siirtymät (kokemukset) haetaan summasta.

Se on paljon selkeämpää, kun sukelamme täydellisiin yksityiskohtiin muistikirjassa.

Doom Deathmatch -agentti

Tämä agentti on Dueling Double Deep Q Learning, jossa on PER ja kiinteät q-tavoitteet.

Teimme video-opetusohjelman toteutuksesta: Muistikirja on täällä

Siinä kaikki! Olet juuri luonut älykkäämpiä agentteja, jotka oppivat pelaamaan Doomia. Mahtava! Muista, että jos haluat agentin, jolla on todella hyvä suorituskyky, tarvitset paljon enemmän GPU-tunteja (noin kaksi päivää koulutusta)!

Agenttimme ymmärsi kuitenkin, että vain 2-3 tuntia CPU-koulutusta (kyllä ​​CPU) tarvitsi tappaa viholliset ennen kuin he voisivat edetä. Jos he liikkuvat eteenpäin tappamatta vihollisia, ne tapetaan ennen liivin hankkimista.

Älä unohda toteuttaa koodin jokaista osaa itse. On todella tärkeää yrittää muokata antamaasi koodia. Yritä lisätä aikakausia, muuttaa arkkitehtuuria, lisätä kiinteitä Q-arvoja, muuttaa oppimisnopeutta, käyttää kovempaa ympäristöä ... ja niin edelleen. Kokeile, pidä hauskaa!

Muista, että tämä oli iso artikkeli, joten muista ymmärtää todella, miksi käytämme näitä uusia strategioita, niiden toimintaa ja niiden käytön etuja.

Seuraavassa artikkelissa kerrotaan mahtavasta hybridimenetelmästä arvo- ja käytäntöpohjaisten vahvistusoppimisalgoritmien välillä. Tämä on lähtötaso huipputason algoritmeille : Advantage Actor Critic (A2C). Toteutat agentin, joka oppii pelaamaan Outrunia!

Jos pidit artikkelistani, napsauta? alle niin monta kertaa kuin pidit artikkelista, joten muut ihmiset näkevät tämän täällä Mediumissa. Ja älä unohda seurata minua!

Jos sinulla on ajatuksia, kommentteja, kysymyksiä, voit kommentoida alla tai lähettää minulle sähköpostia: [email protected] tai twiittaa minua @ThomasSimonini.

Jatka oppimista, pysy mahtavana!

Syvän vahvistuksen oppimiskurssi, Tensorflow? ️

? Opetussuunnitelma

? Videoversio

Osa 1: Johdatus vahvistusoppimiseen

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

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

Osa 3+: Parannukset syvälle Q-oppimiseen: kaksinkertaisen DQN-taistelun, priorisoidun kokemuksen uusinta ja kiinteät Q-tavoitteet

Osa 4: Johdanto politiikan kaltevuuksiin, joissa on Doom ja Cartpole

Osa 5: Johdanto Advantage Actor Critic -menetelmiin: soitetaan Sonic the Hedgehog!

Osa 6: Proximal Policy Optimization (PPO) Sonic the Hedgehog 2: n ja 3: n kanssa

Osa 7: Uteliaisuuteen perustuva oppiminen helpotti osaa I