Vylepšenia v učení Deep Q: súboje s dvojitým DQN, opakovanie prioritných skúseností a opravené…

Tento článok je súčasťou kurzu hlbokého posilňovania s Tensorflow? ️. Tu si pozrite osnovy.

V našom poslednom článku o Deep Q Learning s Tensorflow sme implementovali agenta, ktorý sa naučí hrať jednoduchú verziu Doom. Vo verzii videa sme trénovali agenta DQN, ktorý hrá vesmírnych útočníkov.

Počas školenia sme však videli, že tu bola veľká variabilita.

Program Deep Q-Learning bol predstavený v roku 2014. Odvtedy došlo k mnohým vylepšeniam. Dnes teda uvidíme štyri stratégie, ktoré dramaticky zlepšia školenie a výsledky našich agentov DQN:

  • pevné Q-ciele
  • dvojité DQN
  • súboj DQN (aka DDQN)
  • Zopakovanie prioritného zážitku (aka PER)

Implementujeme agenta, ktorý sa naučí hrať na chodbe Doom Deadly. Naša AI musí smerovať k základnému cieľu (veste) a zabezpečiť, aby prežili súčasne tým, že zabijú nepriateľov.

Pevné Q-ciele

Teória

V článku Deep Q Learning sme videli, že keď chceme vypočítať chybu TD (aka stratu), vypočítame rozdiel medzi cieľovou hodnotou TD (Q_target) a aktuálnou hodnotou Q (odhad Q).

Ale my vôbec netušíme skutočný cieľ TD. Musíme to odhadnúť. Použitím Bellmanovej rovnice sme videli, že cieľ TD je iba odmenou za vykonanie tejto akcie v danom stave plus zľavnená najvyššia hodnota Q pre nasledujúci stav.

Problém však je, že na odhad cieľa a hodnoty Q používame rovnaké parametre (váhy) . V dôsledku toho existuje veľká korelácia medzi cieľom TD a parametrami (w), ktoré meníme.

Preto to znamená, že na každom kroku tréningu sa posúvajú naše hodnoty Q, ale aj cieľové hodnoty. Takže sa blížime k nášmu cieľu, ale cieľ sa tiež pohybuje. Je to ako prenasledovať pohyblivý cieľ! To viedlo k veľkej oscilácii v tréningu.

Je to ako keby ste boli kovboj (odhad Q) a chcete chytiť kravu (cieľ Q), musíte sa priblížiť (znížiť chybu).

V každom časovom kroku sa snažíte priblížiť ku krave, ktorá sa tiež pohybuje v každom časovom kroku (pretože používate rovnaké parametre).

To vedie k veľmi zvláštnej ceste prenasledovania (veľká oscilácia v tréningu).

Namiesto toho môžeme použiť myšlienku pevných Q-cieľov, ktorú predstavil DeepMind:

  • Použitie samostatnej siete s pevným parametrom (nazvime to w-) na odhad cieľovej hodnoty TD.
  • V každom kroku Tau kopírujeme parametre z našej siete DQN, aby sme aktualizovali cieľovú sieť.

Vďaka tomuto postupu budeme mať stabilnejšie učenie, pretože cieľová funkcia zostane na chvíľu nemenná.

Implementácia

Implementácia pevných cieľov q je dosť jednoduchá:

  • Najskôr vytvoríme dve siete ( DQNetwork, TargetNetwork)
  • Potom vytvoríme funkciu, ktorá prevezme naše DQNetworkparametre a skopíruje ich do našichTargetNetwork
  • Nakoniec počas tréningu vypočítame cieľ TD pomocou našej cieľovej siete. Cieľovú sieť aktualizujeme DQNetworkkaždým taukrokom ( tauje to hyper-parameter, ktorý definujeme).

Dvojité DQN

Teória

Dvojité DQN alebo dvojité učenie predstavil Hado van Hasselt. Táto metóda rieši problém nadhodnotenia hodnôt Q.

Aby sme tomuto problému porozumeli, nezabudnite, ako vypočítame cieľ TD:

Výpočtom cieľovej hodnoty TD čelíme jednoduchému problému: ako si môžeme byť istí, že najlepšou akciou pre nasledujúci stav je akcia s najvyššou hodnotou Q?

Vieme, že presnosť hodnôt q závisí od toho, akú akciu sme vyskúšali a aké susedné štáty sme preskúmali.

V dôsledku toho nemáme na začiatku školenia dostatok informácií o najlepších krokoch, ktoré je potrebné podniknúť. Preto prijatie maximálnej hodnoty q (ktorá je hlučná) ako najlepšej akcie, ktorá sa dá urobiť, môže viesť k falošným pozitívam. Ak sa neoptimálnym akciám bude pravidelne dávať vyššia hodnota Q ako optimálnym najlepším akciám, učenie bude komplikované.

Riešením je: keď vypočítame cieľ Q, použijeme dve siete na oddelenie výberu akcie od generovania hodnoty cieľa Q. My:

  • použite našu sieť DQN na výber toho, čo je najlepšie urobiť pre ďalší stav (akcia s najvyššou hodnotou Q).
  • použite našu cieľovú sieť na výpočet cieľovej hodnoty Q vykonania tejto akcie v ďalšom stave.

Preto nám Double DQN pomáha znižovať preceňovanie hodnôt q a v dôsledku toho nám pomáha trénovať rýchlejšie a mať stabilnejšie učenie.

Implementácia

Dueling DQN (alias DDQN)

Teória

Pamätajte, že hodnoty Q zodpovedajú tomu, aké dobré je byť v danom stave a konať v tomto stave Q (s, a).

Môžeme teda rozkladať Q (s, a) ako súčet:

  • V (s) : hodnota bytia v tomto stave
  • A (s, a) : výhoda uskutočnenia tejto akcie v danom štáte (o koľko je lepšie vykonať túto akciu v porovnaní so všetkými ostatnými možnými akciami v danom štáte).

Pomocou DDQN chceme oddeliť odhadovač týchto dvoch prvkov pomocou dvoch nových prúdov:

  • ten, ktorý odhaduje stavovú hodnotu V (s)
  • taký, ktorý odhaduje výhodu pre každú akciu A (s, a)

A potom spojíme tieto dva prúdy cez špeciálnu agregačnú vrstvu, aby sme získali odhad Q (s, a).

Počkať? Prečo však musíme tieto dva prvky počítať osobitne, ak ich potom skombinujeme?

Oddelením odhadu môže náš DDQN intuitívne zistiť, ktoré stavy sú (alebo nie sú) hodnotné, bez toho, aby ste sa museli učiť účinok každej akcie v každom štáte (pretože tiež počíta V (s)).

S našou normálnou DQN musíme vypočítať hodnotu každej akcie v danom stave. Aký to má však zmysel, ak je hodnota štátu zlá? Aký má zmysel vypočítať všetky akcie v jednom štáte, keď všetky tieto akcie vedú k smrti?

Dôsledkom toho je, že po oddelení môžeme vypočítať V (s). To je obzvlášť užitočné pre štáty, v ktorých ich konanie nemá významný vplyv na životné prostredie. V takom prípade nie je potrebné vypočítavať hodnotu každej akcie. Napríklad pohyb vpravo alebo vľavo je dôležitý iba vtedy, ak existuje riziko kolízie. Vo väčšine štátov nemá výber akcie žiadny vplyv na to, čo sa stane.

Bude to jasnejšie, ak si vezmeme príklad v príspevku Dueling Network Architectures for Deep Reinforcement Learning.

Vidíme, že hodnotové sieťové toky venujú pozornosť (oranžové rozostrenie) ceste, najmä horizontom, kde sú umiestnené autá. Dbá tiež na skóre.

Na druhej strane výhodný prúd v prvom ráme vpravo nevenuje vozovke veľkú pozornosť, pretože vpredu nie sú žiadne autá (takže akčná voľba je prakticky irelevantná). Ale v druhom ráme to venuje pozornosť, pretože bezprostredne pred ním je auto a výber opatrení je zásadný a veľmi dôležitý.

Pokiaľ ide o agregačnú vrstvu, chceme vygenerovať hodnoty q pre každú akciu v danom stave. Mohlo by nás lákať kombinovať streamy nasledovne:

Ale ak to urobíme, upadneme doproblém identifikovateľnosti , to znamená - vzhľadom na Q (s, a) nie sme schopní nájsť A (s, a) a V (s).

A to, že nebudeme schopní nájsť V (s) a A (s, a) dané Q (s, a), bude problémom pre naše spätné šírenie. Aby sme sa vyhli tomuto problému, môžeme vynútiť, aby náš odhad funkcie výhod mal pri vybranej akcii výhodu 0.

Aby sme to dosiahli, odčítame priemernú výhodu všetkých možných krokov štátu.

Preto nám táto architektúra pomáha zrýchliť výcvik. Môžeme vypočítať hodnotu stavu bez výpočtu Q (s, a) pre každú akciu v danom stave. A to nám môže pomôcť nájsť oveľa spoľahlivejšie hodnoty Q pre každú akciu oddelením odhadu medzi dvoma prúdmi.

Implementácia

Jediná vec, ktorú musíte urobiť, je upraviť architektúru DQN pridaním týchto nových streamov:

Prioritné prehrávanie zážitkov

Teória

Prioritized Experience Replay (PER) predstavil v roku 2015 Tom Schaul. Myšlienka je taká, že niektoré skúsenosti môžu byť pre náš tréning dôležitejšie ako iné, ale môžu sa vyskytovať menej často.

Pretože dávku vzorkujeme jednotne (náhodný výber zážitkov), tieto bohaté skúsenosti, ktoré sa vyskytujú zriedka, nemajú prakticky žiadnu šancu na výber.

Preto sa s PER snažíme zmeniť distribúciu vzorkovania pomocou kritéria na definovanie priority každej n-tice zážitku.

Chceme využiť prioritné skúsenosti, kde je veľký rozdiel medzi našou predikciou a cieľovou hodnotou TD, pretože to znamená, že sa o tom musíme veľa učiť.

Používame absolútnu hodnotu veľkosti našej chyby TD:

A túto prioritu sme dali do skúsenosti s každou vyrovnávacou pamäťou pre prehrávanie.

Nemôžeme však robiť iba chamtivé stanovovanie priorít, pretože to povedie k tomu, že budeme trénovať stále rovnaké skúsenosti (ktoré majú veľkú prioritu), a teda prehnane ladiť.

Takže predstavíme stochastické stanovenie priorít, ktoré generuje pravdepodobnosť, že budú vybrané pre opakované prehrávanie.

V dôsledku toho počas každého časového kroku dostaneme adávka vzoriek s týmto rozdelením pravdepodobnosti a trénujte na nej našu sieť.

Stále tu však máme problém. Pamätajte, že pri bežnom hraní Experience Replay používame pravidlo náhodnej aktualizácie. V dôsledku toho sa spôsob vzorkovania skúseností musí zhodovať so základnou distribúciou, z ktorej pochádzajú.

Keď máme normálne skúsenosti, vyberáme ich v normálnom rozdelení - zjednodušene povedané, vyberáme ich náhodne. Neexistuje zaujatosť, pretože každá skúsenosť má rovnakú šancu využiť, takže môžeme svoje váhy normálne aktualizovať.

Ale , pretože používame prioritné vzorkovanie, čisto náhodný výber je opustený. V dôsledku toho zavádzame skreslenie smerom k vzorkám s vysokou prioritou (viac šancí na výber).

A ak svoje váhy upravíme normálne, riskujeme nadmerné vybavenie. Vzorky, ktoré majú vysokú prioritu, sa pravdepodobne použijú na tréning mnohokrát v porovnaní so skúsenosťami s nízkou prioritou (= zaujatosť). V dôsledku toho aktualizujeme svoje váhy iba s malou časťou skúseností, ktoré považujeme za skutočne zaujímavé.

Na opravu tohto skreslenia používame váhy dôležitosti vzorkovania (IS), ktoré upravia aktualizáciu znížením váh často videných vzoriek.

Váhy zodpovedajúce vzorkám s vysokou prioritou majú veľmi malú úpravu (pretože sieť tieto skúsenosti uvidí mnohokrát), zatiaľ čo váhy zodpovedajúce vzorkám s nízkou prioritou budú mať úplnú aktualizáciu.

Úlohou b je kontrolovať, ako veľmi tieto váhy na vzorkovanie ovplyvňujú učenie. V praxi je parameter b žíhaný až na 1 počas celého tréningu, pretože tieto váhy sú dôležitejšie na konci učenia, keď sa naše hodnoty q začnú zbližovať. Objektívna povaha aktualizácií je najdôležitejšia blízko konvergencie, ako je vysvetlené v tomto článku.

Implementácia

Tentokrát bude implementácia trochu viac vkusná.

Najskôr nemôžeme implementovať iba PER triedením všetkých vyrovnávacích pamätí Experience Replay podľa ich priorít. To nebude vôbec efektívne kvôli O (nlogn) pre vkladanie a O (n) pre vzorkovanie.

Ako je vysvetlené v tomto skutočne dobrom článku, namiesto triedenia poľa musíme použiť inú dátovú štruktúru - netriedený súhrn stromov.

Sumtree je Binárny strom, čo je strom, ktorý má pre každý uzol iba maximálne dve deti. Listy (najhlbšie uzly) obsahujú hodnoty priority a dátové pole, ktoré ukazuje na listy, obsahuje skúsenosti.

Aktualizácia stromu a vzorkovanie budú skutočne efektívne (O (log n)).

Potom vytvoríme pamäťový objekt, ktorý bude obsahovať náš súčet a dáta.

Ďalej, aby sme vybrali minibatch veľkosti k, rozsah [0, total_priority] sa rozdelí na k rozsahov. Hodnota je jednotne vzorkovaná z každého rozsahu.

Nakoniec sa prechody (skúsenosti), ktoré zodpovedajú každej z týchto vzorkovaných hodnôt, načítajú zo súčtu stromov.

Bude to oveľa jasnejšie, keď sa ponoríme do úplných detailov v notebooku.

Agent Doom Deathmatch

Tento agent je Dueling Double Deep Q Learning s PER a pevnými q-cieľmi.

Z implementácie sme vytvorili videonávod: Notebook je tu

To je všetko! Práve ste vytvorili inteligentnejšieho agenta, ktorý sa naučí hrať Doom. Úžasné! Pamätajte, že ak chcete mať agenta so skutočne dobrým výkonom, potrebujete oveľa viac hodín GPU (asi dva dni tréningu)!

Avšak s iba 2–3 hodinami tréningu na CPU (áno CPU) náš agent pochopil, že skôr ako sa budú môcť pohybovať vpred, musia zabiť nepriateľov. Ak sa pohnú vpred bez zabíjania nepriateľov, budú zabití skôr, ako dostanú vestu.

Nezabudnite implementovať každú časť kódu svojpomocne. Je skutočne dôležité pokúsiť sa upraviť kód, ktorý som vám dal. Pokúste sa pridať epochy, zmeniť architektúru, pridať pevné hodnoty Q, zmeniť rýchlosť učenia, použiť tvrdšie prostredie ... atď. Experimentujte, bavte sa!

Pamätajte, že to bol veľký článok, takže určite pochopte, prečo tieto nové stratégie používame, ako fungujú a aké sú výhody ich použitia.

V nasledujúcom článku sa dozvieme o úžasnej hybridnej metóde medzi algoritmami učenia sa posilnenia na základe hodnoty a politiky. Toto je základná línia pre moderné algoritmy : Advantage Actor Critic (A2C). Implementujete agenta, ktorý sa naučí hrať Outrun!

Ak sa vám môj článok páčil, kliknite prosím na? toľko krát, koľko sa vám článok páčil, aby to ostatní videli tu na médiu. A nezabudni ma nasledovať!

Ak máte nejaké pripomienky, pripomienky, otázky, neváhajte komentovať nižšie alebo mi pošlite e-mail: [email protected] alebo mi pošlite tweet na adresu @ThomasSimonini.

Stále sa učte, zostaňte úžasní!

Kurz hlbokého posilňovania s Tensorflow? ️

? Osnovy

? Video verzia

Časť 1: Úvod do vzdelávania o posilňovaní

Časť 2: Hlbšie ponorenie do Výučby posilňovania pomocou Q-učenia

Časť 3: Úvod do hry Deep Q-Learning: zahrajme si Doom

Časť 3+: Vylepšenia v učení Deep Q: Dueling Double DQN, Prioritized Experience Replay a pevné Q-ciele

Časť 4: Úvod do prechodov politík s Doom a Cartpole

Časť 5: Úvod do výhodných hercových kritických metód: zahrajme si Sonic the Hedgehog!

Časť 6: Proximal Policy Optimization (PPO) with Sonic the Hedgehog 2 and 3

Časť 7: Učenie sa zvedavosťou je ľahké I. časť