de Thomas Simonini

O introducere în Deep Q-Learning: să jucăm Doom

O introducere in Deep Q Learning sa jucam Doom

Acest articol face parte din cursul de învățare cu întărire profundă cu Tensorflow? ️. Verificați programa here.

Ultima data, am aflat despre Q-Learning: un algoritm care produce un tabel Q pe care un agent îl folosește pentru a găsi cea mai bună acțiune pe care să o întreprindă într-o stare.

Dar, așa cum vom vedea, producerea și actualizarea unui tabel Q pot deveni ineficiente în medii spațiale mari de stat.

Acest articol este a treia parte a unei serii de postări pe blog despre Învățarea profundă a armăturii. Pentru mai multe informații și mai multe resurse, consultați programa cursului.

Astăzi, vom crea o rețea neuronală Deep Q. În loc să folosim un tabel Q, vom implementa o rețea neuronală care ia o stare și aproximează valorile Q pentru fiecare acțiune bazată pe acea stare.

Datorită acestui model, vom putea crea un agent care să învețe să joace Doom!

Scufundandu va mai profund in invatarea prin intarire cu Q Learning
Agentul nostru DQN

În acest articol veți afla:

  • Ce este Deep Q-Learning (DQL)?
  • Care sunt cele mai bune strategii de utilizat cu DQL?
  • Cum să gestionăm problema limitării temporale
  • De ce folosim reluarea experienței
  • Care sunt matematica din spatele DQL
  • Cum să-l implementați în Tensorflow

Adăugarea „Deep” la Q-Learning

În ultimul articol, am creat un agent care joacă Frozen Lake datorită algoritmului Q-learning.

Am implementat funcția Q-learning pentru a crea și actualiza un tabel Q. Gândiți-vă la aceasta ca la o „foaie de înșelăciune” care să ne ajute să găsim recompensa maximă viitoare așteptată a unei acțiuni, având în vedere starea actuală. Aceasta a fost o strategie bună – totuși, aceasta nu este scalabilă.

Imaginați-vă ce vom face astăzi. Vom crea un agent care să învețe să joace Doom. Doom este un mediu mare cu un spațiu gigantic de stat (milioane de state diferite). Crearea și actualizarea unui tabel Q pentru acel mediu nu ar fi deloc eficientă.

Cea mai bună idee în acest caz este de a crea un Retea neurala care va aproxima, având în vedere o stare, diferitele valori Q pentru fiecare acțiune.

1611508876 297 O introducere in invatarea prin intarire

Cum funcționează Deep Q-Learning?

Aceasta va fi arhitectura învățării noastre Deep Q:

1612105392 259 O introducere in Deep Q Learning sa jucam Doom

Acest lucru poate părea complex, dar voi explica arhitectura pas cu pas.

Rețeaua noastră neuronală Deep Q ia ca intrare un teanc de patru cadre. Acestea trec prin rețeaua sa și emit un vector de valori Q pentru fiecare acțiune posibilă în starea dată. Trebuie să luăm cea mai mare valoare Q a acestui vector pentru a găsi cea mai bună acțiune.

La început, agentul se descurcă foarte rău. Dar, în timp, începe să asocieze cadrele (stările) cu cele mai bune acțiuni de făcut.

Piesa de preprocesare

1612105392 994 O introducere in Deep Q Learning sa jucam Doom

Preprocesarea este un pas important. Vrem să reducem complexitatea statelor noastre pentru a reduce timpul de calcul necesar instruirii.

În primul rând, putem scala în tonuri de gri fiecare dintre statele noastre. Culoarea nu adaugă informații importante (în cazul nostru, trebuie doar să găsim inamicul și să-l ucidem și nu avem nevoie de culoare pentru a-l găsi). Aceasta este o economie importantă, deoarece ne reducem canalele de trei culori (RGB) la 1 (în tonuri de gri).

Apoi, decupăm cadrul. În exemplul nostru, a vedea acoperișul nu este cu adevărat util.

Apoi reducem dimensiunea cadrului și stivuim patru sub-cadre împreună.

Problema limitării temporale

Arthur Juliani oferă o explicație minunată despre acest subiect în articolul său. Are o idee inteligentă: folosirea Rețele neuronale LSTM pentru rezolvarea problemei.

Cu toate acestea, cred că este mai bine pentru începători să folosească cadre stivuite.

Prima întrebare pe care o puteți pune este de ce stivuim cadre împreună?

Stivuim cadre împreună pentru că ne ajută să rezolvăm problema limitării temporale.

Să luăm un exemplu, în jocul Pong. Când vedeți acest cadru:

1612105392 953 O introducere in Deep Q Learning sa jucam Doom

Îmi puteți spune unde merge mingea?

Nu, pentru că un cadru nu este suficient pentru a avea un sentiment de mișcare!

Dar dacă mai adaug încă trei cadre? Aici puteți vedea că mingea merge spre dreapta.

1612105392 238 O introducere in Deep Q Learning sa jucam Doom

Acesta este același lucru pentru agentul nostru Doom. Dacă îi oferim un singur cadru la un moment dat, nu are idee de mișcare. Și cum poate lua o decizie corectă, dacă nu poate determina unde și cât de repede se mișcă obiectele?

Utilizarea rețelelor de convoluție

Cadrele sunt procesate de trei straturi de convoluție. Aceste straturi vă permit să exploatați relațiile spațiale din imagini. Dar, de asemenea, deoarece cadrele sunt stivuite împreună, puteți exploata unele proprietăți spațiale pe acele cadre.

Dacă nu sunteți familiarizați cu convoluția, vă rugăm să citiți acest lucru articol intuitiv excelent de Adam Geitgey.

Fiecare strat de convoluție va utiliza ELU ca funcție de activare. S-a dovedit că ELU este un bun funcție de activare pentru straturi de convoluție.

Folosim un strat complet conectat cu funcție de activare ELU și un strat de ieșire (un strat complet conectat cu o funcție de activare liniară) care produce estimarea valorii Q pentru fiecare acțiune.

Reluarea experienței: utilizarea mai eficientă a experienței observate

Reluarea experienței ne va ajuta să gestionăm două lucruri:

  • Evitați să uitați de experiențele anterioare.
  • Reduceți corelațiile dintre experiențe.

Voi explica aceste două concepte.

Această parte și ilustrațiile au fost inspirate de marea explicație din capitolul Deep Q Learning din Deep Learning Foundations Nanodegree by Udacity.

Evitați să uitați de experiențele anterioare

Avem o mare problemă: variabilitatea greutăților, deoarece există o corelație mare între acțiuni și stări.

Amintiți-vă în primul articol (Introducere în învățarea prin întărire), am vorbit despre procesul de învățare a întăririi:

1611508872 361 O introducere in invatarea prin intarire

La fiecare pas, primim un tuplu (stare, acțiune, recompensă, stat_nou). Învățăm din ea (hrănim tuplul din rețeaua noastră neuronală), apoi aruncăm această experiență.

Problema noastră este că dăm mostre secvențiale din interacțiunile cu mediul înconjurător rețelei noastre neuronale. Și tinde să uite experiențele anterioare, deoarece suprascrie cu experiențe noi.

De exemplu, dacă suntem la primul nivel și apoi la al doilea (ceea ce este total diferit), agentul nostru poate uita cum să ne comportăm în primul nivel.

1612105393 183 O introducere in Deep Q Learning sa jucam Doom
Învățând cum să se joace la nivelul apei, agentul nostru va uita cum să se comporte la primul nivel

În consecință, poate fi mai eficient să se utilizeze experiența anterioară, învățând cu ea de mai multe ori.

Soluția noastră: creați un „tampon de redare”. Acest depozit experimentează tupluri în timp ce interacționează cu mediul și apoi probăm un mic lot de tupluri pentru a ne hrăni rețeaua neuronală.

Gândiți-vă la memoria tampon de redare ca la un folder în care fiecare foaie este un tupl de experiență. O hrănești interacționând cu mediul. Și apoi luați o foaie aleatorie pentru a alimenta rețeaua neuronală

1612105393 429 O introducere in Deep Q Learning sa jucam Doom

Acest lucru împiedică rețeaua să afle doar despre ceea ce a făcut imediat.

Reducerea corelației dintre experiențe

Avem o altă problemă – știm că fiecare acțiune afectează următoarea stare. Aceasta produce o secvență de tupluri de experiență care pot fi foarte corelate.

Dacă instruim rețeaua în ordine secvențială, riscăm ca agentul nostru să fie influențat de efectul acestei corelații.

Prin eșantionarea din buffer-ul de redare la întâmplare, putem rupe această corelație. Acest lucru împiedică oscilarea sau divergența catastrofală a valorilor acțiunii.

Va fi mai ușor să înțelegeți acest lucru cu un exemplu. Să presupunem că jucăm un shooter la prima persoană, unde un monstru poate apărea în stânga sau în dreapta. Scopul agentului nostru este de a împușca monstrul. Are două arme și două acțiuni: trage la stânga sau trage la dreapta.

1612105393 70 O introducere in Deep Q Learning sa jucam Doom
Tabelul reprezintă aproximările valorilor Q

Învățăm cu experiență ordonată. Să presupunem că știm că, dacă tragem un monstru, probabilitatea ca următorul monstru să provină din aceeași direcție este de 70%. În cazul nostru, aceasta este corelația dintre tuplurile experiențelor noastre.

Să începem antrenamentul. Agentul nostru vede monstrul în dreapta și îl împușcă folosind arma potrivită. Asta e corect!

Apoi, următorul monstru vine și din dreapta (cu 70% probabilitate), iar agentul va trage cu arma potrivită. Din nou, acest lucru este bun!

Și așa mai departe și așa mai departe …

1612105393 445 O introducere in Deep Q Learning sa jucam Doom
Pistolul roșu este acțiunea luată

Problema este că această abordare crește valoarea utilizării pistolului potrivit prin întreg spațiul de stat.

1612105394 899 O introducere in Deep Q Learning sa jucam Doom
Putem vedea că valoarea Q pentru un monstru aflat la stânga și a trage cu arma dreaptă este pozitivă (chiar dacă nu este rațională)

Și dacă agentul nostru nu vede o mulțime de exemple din stânga (deoarece doar 30% vor veni probabil din stânga), agentul nostru va termina alegând corect, indiferent de unde provine monstrul. Acest lucru nu este deloc rațional.

1612105394 632 O introducere in Deep Q Learning sa jucam Doom
Chiar dacă monstrul vine în stânga, agentul nostru va trage cu arma dreaptă

Avem două strategii paralele pentru a rezolva această problemă.

În primul rând, trebuie să oprim învățarea în timp ce interacționăm cu mediul. Ar trebui să încercăm lucruri diferite și să ne jucăm puțin la întâmplare pentru a explora spațiul de stare. Putem salva aceste experiențe în memoria tampon de redare.

Apoi, putem aminti aceste experiențe și învăța de la ele. După aceea, reveniți la joc cu funcția de valoare actualizată.

În consecință, vom avea un set mai bun de exemple. Vom putea generaliza tiparele din aceste exemple, amintindu-le în orice ordine.

Acest lucru ajută la evitarea fixării pe o regiune a spațiului de stat. Acest lucru împiedică întărirea aceleiași acțiuni din nou și din nou.

Această abordare poate fi văzută ca o formă de învățare supravegheată.

Vom vedea în articolele viitoare că putem folosi și „reluarea experienței prioritare”. Acest lucru ne permite să prezentăm mai frecvent tupluri rare sau „importante” în rețeaua neuronală.

Algoritmul nostru Deep Q-Learning

Mai întâi un pic de matematică:

Amintiți-vă că ne actualizăm valoarea Q pentru o stare și acțiune date folosind ecuația Bellman:

1612105394 911 O introducere in Deep Q Learning sa jucam Doom

În cazul nostru, dorim să ne actualizăm greutățile plaselor neuronale pentru a reduce eroarea.

Eroarea (sau eroarea TD) se calculează luând diferența dintre Q_target (valoarea maximă posibilă din starea următoare) și Q_value (predicția noastră actuală a valorii Q)

1612105394 78 O introducere in Deep Q Learning sa jucam Doom
Initialize Doom Environment EInitialize replay Memory M with capacity N (= finite capacity)Initialize the DQN weights wfor episode in max_episode:    s = Environment state    for steps in max_steps:         Choose action a from state s using epsilon greedy.         Take action a, get r (reward) and s' (next state)         Store experience tuple <s, a, r, s'> in M         s = s' (state = new_state)                  Get random minibatch of exp tuples from M         Set Q_target = reward(s,a) +  γmaxQ(s')         Update w =  α(Q_target - Q_value) *  ∇w Q_value

Există două procese care se întâmplă în acest algoritm:

  • Probăm mediul în care efectuăm acțiuni și stocăm tuplurile din experiențele observate într-o memorie de reluare.
  • Selectați lotul mic de tupluri aleatoriu și învățați din acesta folosind un pas de actualizare a coborârii în gradient.

Să implementăm rețeaua noastră neuronală Deep Q

Am realizat un videoclip în care implementăm un agent Deep Q-learning cu Tensorflow care învață să joace Atari Space Invaders? ️ ?.

Acum, că știm cum funcționează, vom implementa rețeaua noastră neuronală Deep Q pas cu pas. Fiecare pas și fiecare parte a codului este explicată direct în caietul Jupyter legat mai jos.

Îl puteți accesa în Repoare cursuri de învățare cu întărire profundă.

Asta e tot! Tocmai ai creat un agent care învață să joace Doom. Minunat!

Nu uitați să implementați fiecare parte a codului de unul singur. Este foarte important să încerci să modifici codul pe care ți l-am dat. Încercați să adăugați epoci, să schimbați arhitectura, să adăugați valori Q fixe, să schimbați rata de învățare, să folosiți un mediu mai dur (cum ar fi Health Gathering) … și așa mai departe. Distrați-vă!

În articolul următor, voi discuta despre ultimele îmbunătățiri în învățarea profundă Q:

  • S-au remediat valorile Q
  • Reluarea experienței cu prioritate
  • DQN dublu
  • Rețele duelante

Dar data viitoare vom lucra la Gradienții de politici prin instruirea unui agent care joacă Doom și vom încerca să supraviețuim într-un mediu ostil prin colectarea sănătății.

1612094825 593 An introduction to Policy Gradients with Cartpole and Doom

Dacă ți-a plăcut articolul meu, vă rugăm să faceți clic pe? mai jos de câte ori ți-a plăcut articolul deci alte persoane vor vedea asta aici pe Medium. Și nu uitați să mă urmați!

Dacă aveți gânduri, comentarii, întrebări, nu ezitați să comentați mai jos sau trimiteți-mi un e-mail: hello@simoninithomas.com, sau trimiteți-mi un tweet @ThomasSimonini.

1611508876 708 O introducere in invatarea prin intarire
1611508876 483 O introducere in invatarea prin intarire
1611508876 50 O introducere in invatarea prin intarire

Continuați să învățați, rămâneți minunat!

Curs de învățare cu întărire profundă cu Tensorflow? ️

? Silabus

? Vversiunea ideo

Partea 1: O introducere în învățarea prin întărire

Partea 2: Scufundându-vă mai profund în învățarea prin întărire cu Q-Learning

Partea 3: O introducere în Deep Q-Learning: să jucăm Doom

Partea 3+: Îmbunătățiri în învățarea profundă Q: dublare DQN dublă, reluare a experienței prioritare și obiective Q fixe

Partea 4: O introducere la Gradienții de politici cu Doom și Cartpole

Partea 5: O introducere în metodele critice ale actorului avantaj: să jucăm Sonic the Hedgehog!

Partea 6: Optimizarea politicii proximale (PPO) cu Sonic the Hedgehog 2 și 3

Partea 7: Învățarea bazată pe curiozitate a ușurat partea I