de Jannes Klaas

Învățare profundă prin întărire: de unde să începem

Anul trecut, DeepMind‘s AlphaGo bate Du-te campion mondial Lee Sedol 4–1. Peste 200 de milioane de oameni au privit cum învățarea prin întărire (RL) a intrat pe scena mondială. Cu câțiva ani mai devreme, DeepMind făcuse valuri cu un bot care putea juca Jocuri Atari. Compania a fost în curând achiziționată de Google.

Mulți cercetători cred că RL este cea mai bună lovitură a noastră crearea inteligenței generale artificiale. Este un domeniu interesant, cu multe provocări nerezolvate și un potențial imens.

Deși poate părea provocator la început, a începe în RL nu este de fapt atât de dificil. În acest articol, vom crea un bot simplu cu Keras care poate juca un joc de Catch.

Jocul

Invatare profunda prin intarire de unde sa incepem
O versiune mai frumoasă a jocului pe care o vom antrena de fapt

Catch este un joc arcade foarte simplu, pe care probabil l-ai fi jucat în copilărie. Fructele cad din partea de sus a ecranului, iar jucătorul trebuie să le prindă cu un coș. Pentru fiecare fruct capturat, jucătorul înscrie un punct. Pentru fiecare fruct pierdut, jucătorul pierde un punct.

Scopul de aici este să lase computerul să joace Catch singur. Dar nu vom folosi frumosul joc de mai sus. În schimb, vom folosi o versiune simplificată pentru a ușura sarcina:

1611301208 888 Invatare profunda prin intarire de unde sa incepem
Jocul nostru de captură simplificat

În timp ce joacă Catch, jucătorul decide între trei acțiuni posibile. Pot muta coșul spre stânga, spre dreapta sau pot rămâne pe loc.

Baza acestei decizii este starea actuală a jocului. Cu alte cuvinte: pozițiile fructului care cade și ale coșului.

Scopul nostru este să creăm un model care, având în vedere conținutul ecranului jocului, alege acțiunea care duce la cel mai mare scor posibil.

Această sarcină poate fi privită ca o simplă problemă de clasificare. Am putea cere jucătorilor umani experți să joace jocul de mai multe ori și să-și înregistreze acțiunile. Apoi, am putea antrena un model pentru a alege acțiunea „corectă” care oglindește jucătorii experți.

Dar nu așa învață oamenii. Oamenii pot învăța singuri un joc ca Catch, fără îndrumare. Acest lucru este foarte util. Imaginați-vă dacă ar trebui să angajați o grămadă de experți pentru a îndeplini o sarcină de mii de ori de fiecare dată când ați dorit să învățați ceva la fel de simplu ca Catch! Ar fi scump și lent.

În învățarea prin întărire, modelul se antrenează din experiență, mai degrabă decât din date etichetate.

Învățare profundă de întărire

Învățarea prin întărire este inspirată de psihologia comportamentală.

În loc să oferim modelului acțiuni „corecte”, îi oferim recompense și pedepse. Modelul primește informații despre starea curentă a mediului (de exemplu, ecranul jocului pe computer). Apoi produce o acțiune, ca o mișcare cu joystick-ul. Mediul reacționează la această acțiune și oferă următoarea stare, alături de orice recompense.

Invatare profunda prin intarire de unde sa incepem

Modelul învață apoi să găsească acțiuni care să ducă la recompense maxime.

Există multe moduri în care acest lucru poate funcționa în practică. Aici, vom analiza Q-Learning. Q-Learning a făcut un efort atunci când a fost folosit pentru a instrui un computer pentru a juca jocuri Atari. Astăzi, este încă un concept relevant. Majoritatea algoritmilor moderni RL sunt o oarecare adaptare a Q-Learning.

Intuiția Q-learning

O modalitate bună de a înțelege Q-learning este de a compara jocul Catch cu jocul de șah.

În ambele jocuri ți se dă un stat, S. Cu șahul, aceasta este poziția figurilor pe tablă. În Catch, aceasta este locația fructului și a coșului.

Jucătorul trebuie să acționeze, A. În șah, aceasta mișcă o figură. În Catch, aceasta este pentru a muta coșul spre stânga sau spre dreapta sau pentru a rămâne în poziția curentă.

Drept urmare, vor exista unele recompense R, și un nou stat S’.

Problema atât cu Catch, cât și cu șahul este că recompensele nu apar imediat după acțiune.

În Catch, câștigi recompense numai atunci când fructele lovesc coșul sau cad pe podea, iar în șah câștigi o recompensă doar atunci când câștigi sau pierzi jocul. Aceasta înseamnă că recompensele sunt repartizat slab. De cele mai multe ori, R va fi zero.

Atunci când există o recompensă, aceasta nu este întotdeauna rezultatul acțiunii întreprinse imediat înainte. Unele acțiuni întreprinse cu mult înainte ar fi putut provoca victoria. Determinarea acțiunii care este responsabilă pentru recompensă este adesea denumită problema atribuirii creditului.

Deoarece recompensele sunt întârziate, jucătorii de șah buni nu își aleg piesele doar prin recompensa imediată. În schimb, ei aleg prin recompensa viitoare așteptată.

De exemplu, nu se gândesc doar dacă pot elimina figura unui adversar în următoarea mutare. De asemenea, ei iau în considerare modul în care luarea unei anumite acțiuni acum îi va ajuta pe termen lung.

În Q-learning, ne alegem acțiunea pe baza celei mai mari recompense viitoare așteptate. Folosim o „funcție Q” pentru a calcula acest lucru. Acesta este un funcția matematică care ia două argumente: starea actuală a jocului și o acțiune dată.

Putem scrie asta ca: Q(state, action)

În timp ce se afla în stare S, estimăm recompensa viitoare pentru fiecare acțiune posibilă A. Presupunem că după ce am luat măsuri A și s-a mutat în starea următoare S’, totul funcționează perfect.

Recompensa viitoare așteptată Q(S,A) pentru un stat dat S și acțiune A este calculat ca recompensă imediată R, plus recompensa viitoare așteptată după aceea Q(S',A'). Ne asumăm următoarea acțiune A' este optim.

Deoarece există incertitudine în ceea ce privește viitorul, reducem Q(S’,A’) prin factorul gamma γ.

Q(S,A) = R + γ * max Q(S’,A’)

Jucătorii de șah buni sunt foarte buni în estimarea recompenselor viitoare în capul lor. Cu alte cuvinte, funcția lor Q Q(S,A) este foarte precis.

Cele mai multe practici de șah se învârt în jurul dezvoltării unei funcții Q mai bune. Jucătorii parcurg multe jocuri vechi pentru a afla cum s-au jucat mișcări specifice în trecut și cât de probabil este o acțiune dată să ducă la victorie.

Dar cum poate o mașină să estimeze o funcție Q bună? Aici intră în joc rețelele neuronale.

Regresia la urma urmei

Când jucăm un joc, generăm o mulțime de „experiențe”. Aceste experiențe constau în:

  • starea inițială, S
  • acțiunea întreprinsă, A
  • recompensa câștigată, R
  • și statul care a urmat, S’

Aceste experiențe sunt datele noastre de formare. Putem încadra problema estimării Q(S,A) ca problema de regresie. Pentru a rezolva acest lucru, putem folosi un Retea neurala.

Având în vedere un vector de intrare format din S și A, se presupune că rețeaua neuronală prezice valoarea lui Q(S,A) egal cu ținta: R + γ * max Q(S’,A’).

Dacă suntem buni la prezicere Q(S,A) pentru diferite state S și acțiuni A, avem o bună aproximare a funcției Q. Rețineți că estimăm Q(S’,A’) prin aceeași rețea neuronală ca Q(S,A).

Procesul de instruire

Având în vedere o serie de experiențe < S, A, R, S‘>, procesul de formare arată apoi după cum urmează:

  1. Pentru fiecare acțiune posibilă A’ (stânga, dreapta, rămâneți), preziceți recompensa viitoare așteptată Q(S’,A’) folosind rețeaua neuronală
  2. Alegeți cea mai mare valoare dintre cele trei predicții ca max Q(S’,A’)
  3. calculati r + γ * max Q(S’,A’). Aceasta este valoarea țintă pentru rețeaua neuronală
  4. Antrenează rețeaua neuronală folosind o funcție de pierdere. Aceasta este o funcție care calculează cât de aproape sau de departe este valoarea estimată de valoarea țintă. Aici, vom folosi 0.5 * (predicted_Q(S,A) — target)² ca funcție de pierdere.

În timpul jocului, toate experiențele sunt stocate într-un reluați memoria. Aceasta acționează ca un simplu tampon în care stocăm < S, A, R, S‘> perechi. Clasa de reluare a experienței se ocupă și de pregătirea datelor pentru antrenament. Verificați codul de mai jos:

Definirea modelului

Acum este timpul să definiți modelul care va învăța o funcție Q pentru Catch.

Folosim Keras ca front-end pentru Tensorflow. Modelul nostru de bază este o rețea densă simplă cu trei straturi.

Deja, acest model funcționează destul de bine pe această versiune simplă de Catch. Mergeți la GitHub pentru implementare completă. Puteți experimenta cu modele mai complexe pentru a vedea dacă puteți obține performanțe mai bune.

Explorare

Un ultim ingredient pentru Q-Learning este explorarea.

Viața de zi cu zi arată că uneori trebuie să faci ceva ciudat și / sau aleatoriu pentru a afla dacă există ceva mai bun decât trapul tău zilnic.

Același lucru este valabil și pentru Q-Learning. Alegerea întotdeauna a celei mai bune opțiuni înseamnă că ați putea pierde unele căi neexplorate. Pentru a evita acest lucru, cursantul va alege uneori o opțiune aleatorie și nu neapărat cea mai bună.

Acum putem defini metoda de instruire:

Am lăsat jocul să se antreneze pentru 5.000 de epoci și acum merge destul de bine!

Invatare profunda prin intarire de unde sa incepem
Jucătorul nostru Catch în acțiune

După cum puteți vedea în animație, computerul prinde merele care cad din cer.

Pentru a vizualiza modul în care a învățat modelul, am trasat medie mobilă de victorii asupra epocilor:

1611301210 152 Invatare profunda prin intarire de unde sa incepem

Unde să merg de aici

Acum ați câștigat o primă imagine de ansamblu și o intuiție a RL. Vă recomand să aruncați o privire la cod complet pentru acest tutorial. Puteți experimenta cu el.

Ați putea dori, de asemenea, să verificați Seria lui Arthur Juliani. Dacă doriți o introducere mai formală, aruncați o privire la CS 234 al lui Stanford, CS 294 al lui Berkeley sau Prelegerile lui David Silver de la UCL.

O modalitate excelentă de a vă exersa abilitățile de RL este Gimnaziul OpenAI, care oferă un set de medii de instruire cu un API standardizat.

Mulțumiri

Acest articol se bazează pe Eder Santana‘s exemplu simplu RL, din 2016. I-am refactorizat codul și am adăugat explicații într-un caiet Am scris mai devreme în 2017. Pentru lizibilitate pe mediu, afișez doar cel mai relevant cod aici. Mergeți la caiet sau Postarea originală a lui Eder pentru mai mult.

Despre Jannes Klaas

Acest text face parte din Material de curs de învățare automată în context financiar, care ajută studenții la economie și afaceri să înțeleagă învățarea automată.

Am petrecut un deceniu construind software și acum sunt în călătorie, aduc ML în lumea financiară. Studiez la Școala de Management din Rotterdam și am făcut cercetări cu Institutul pentru Studii de Locuință și Dezvoltare Urbană.

Poți să mă urmărești mai departe Stare de nervozitate. Dacă aveți întrebări sau sugestii, vă rugăm să lăsați un comentariu sau să-mi trimiteți un ping Mediu.