Sunteți pe pagina 1din 34

Universitatea Politehnica Bucureşti

Facultatea de Automatică şi Calculatoare


Departamentul de Automatică şi Ingineria Sistemelor

LUCRARE DE LICENŢĂ

Parcare automată utilizând rețele neurale

Absolvent
Achim-Caranica Alexandru

Coordonator
Prof.dr.ing. Bogdan Dumitrescu

Bucureşti, 2021
CUPRINS

1. Introducere 1
2. Rețele neurale 2
2.1. Rețele neurale artificiale 3
2.2. Metode de învățare 4
2.3. Proximal policy optimization 6
3. Simularea Parcării 9

3.1. Unity 9
3.2. ML-Agents 11
3.3. Observații și acțiuni 13
3.4. Recompense și pedepse 16
3.5. Parametri și hiperparametri 17
4. Antrenarea rețelei 23
4.1. Încercări și rezultate 23
5. Concluzii 30
Bibliografie 31
Lista contribuţiilor personale 32
1. Introducere

Aproximativ 40% din accidentele auto în care se produc doar daune materiale
au loc în timpul parcării mașinii. Acest lucru se datorează în principal vizibilității
limitate în jurul mașinii și uneori și lipsei de experiență a șoferului sau neatenției
acestuia. Cea mai des întâlnită soluție este parcarea asistată, unde un set de senzori
oferă o vizibilitate mai buna șoferului necesară parcării în siguranță. Așa că am decis
să aleg o implementare care generează parcarea fără incidente folosind inteligența
artificială.

Inteligența artificială este un domeniu care este în rapidă creștere și folosire în


ultimii ani, așa că mi-am propus să încerc puterea unui astfel de algoritm într-o
aplicare reală. În general, inteligența artificială este folosită de obicei pentru
recunoașterea tiparelor în diferite domenii, de exemplu: recunoașterea vocii,
clasificarea imaginilor, generare de imagini folosind câțiva parametri de intrare,
reproducerea unor acțiuni într-un sistem real, etc. Pentru mine proiectul a fost unul de
cercetare în care am construit aplicația în timp ce învățam mai multe despre modelele
de simulare pentru antrenarea unei inteligențe artificiale. M-am bazat pe biblioteca
Unity ML-Agents Toolkit, scrisă în python, bazată pe PyTorch, folosind rețele neurale,
iar simularea am făcut-o în Unity 3D, utilizând C# ca limbaj de programare.

Scopul proiectului este să creez o simulare cât mai apropiată de modelul real în
care să antrenez un agent în cât mai scurt timp posibil să parcheze o mașină într-un
loc de parcare a cărui poziție este cunoscută de la început. Deciziile agentului care sunt
necesare pentru controlul mașinii sunt luate folosind o rețea neurală care în timp va fi
antrenată cu scopul de a maximiza performanța agentului. Unul dintre obiectivele
mele este să micșorez cât mai mult perioada de învățare. Pentru aceasta, am folosit un
modul de învățare (GAIL) care influențează rețeaua să treacă din nou prin stările
furnizate de o demonstrație făcută de un utilizator. Motivul pentru care am ales
această abordare este pentru a evita efectul de reproducere a comportamentului
utilizatorului, adică dacă inteligența artificială trebuie să imite acțiunile unei
demonstrații, atunci aceasta nu poate fi niciodată mai eficientă decât acea
demonstrație. Așa că obiectivul meu principal este ca agentul să fie antrenat în cât mai
scurt timp posibil și cu o performantă cel puțin egală cu cea a demonstrației.

În primă fază, am construit o parcare obișnuită cu 16 locuri de parcare dintre


care 8 sunt ocupate de alte mașini care sunt obiecte fizice cu coliziune. Mașina
controlată de agent are un sistem complet real de control cu accelerație și frânare
bazată pe frecare. Am ajustat parametrii mașinii în așa fel încât comportamentul
mașinii să semene cât mai mult cu cel a unei mașini reale. Locul în care mașina trebuie
să parcheze este ales aleatoriu de către program, iar poziția lui în mediul de simulare
este cunoscută de la începutul simulării, apoi peste loc se pune un marcaj roșu care își
schimbă culoarea în funcție de câte roți ale mașinii se află în acel moment în interiorul
marcajului. Agentul este influențat să evite locurile îndepărtate locului de parcare sau

1
coliziunea cu alte mașini parcate.

În continuare voi defini tehnologiile și algoritmii folosiți pentru realizarea


proiectului, iar la sfârșit voi descrie procesul prin care am ajuns la parametrii și
hiperparametrii optimi și variabile de mediu pentru o antrenare stabilă și efectuată
într-un timp cât mai scurt posibil.

În capitolul 2 am explicat conceptul de inteligență artificială, tehnologiile


folosite, adică rețele neurale artificiale și metoda de antrenare a acestora folosite.

Capitolul 3 conține o scurtă descriere legată de software-ul folosit la crearea


simulării și mediului de antrenare, biblioteca folosită care are grijă de rețeaua neurală
și antrenarea sa și modurile în care am configurat și parametrizat mediul de învățare
și antrenarea rețelei.

Deoarece proiectul a fost unul de cercetare, multe din rezultatele mele au fost
obținute prin testare și observare, iar în capitolul 4 am descris etapele parcurse pentru
a ajunge la o antrenare eficientă a agentului.

2. Rețele neurale

“O rețea neurală artificială este un grup interconectat de noduri, inspirat de o


simplificare a neuronilor din creier”[3]. În figura 1, este reprezentată o rețea neurală
artificială fiecare nod circular reprezintă un neuron artificial și o săgeată reprezintă o
conexiune de la ieșirea unui neuron artificial la intrarea altuia. Această rețea are un
strat cu neuroni de intrare (input - roșu), un strat cu neuroni ascunși (hidden - albastru)
și un strat cu neuroni de ieșire (output - verde). Ecuația matematică după care
funcționează este următoarea:

(2.1) 𝐼𝑛𝑡𝑟𝑎𝑟𝑒 → 𝑓(𝜔1 , 𝜔2 , … , 𝜔𝑛 ) → 𝐼𝑒ș𝑖𝑟𝑒,

unde 𝜔1 , 𝜔2 , … , 𝜔𝑛 sunt ponderile neuronilor.

2
Fig.2.1. Reprezentare vizuală a
unei rețele neurale simple[3]

Modul în care neuronii sunt conectați între ei definește tipul de rețea în care se
află. Rețeaua folosită este de tip feedforward (cu propagare a informației numai
dinspre intrare spre ieșire), adică pentru fiecare set de valori de intrare, valorile se
propagă prin structura rețelei neurale pentru a obține un set de valori de ieșire. Alte
tipuri de rețele neurale sunt: rețele neurale de convoluție folosite de obicei pentru
recunoașterea tiparelor în imagini și înregistrări video și rețelele neurale recurente
pentru audio și text.

2.1 Rețele neurale artificiale

Rețelele neurale artificiale (ANN) sunt numite și rețele “feedforward” deoarece


datele de intrare pot fi procesate într-o singură direcție, din spre intrare în spre ieșire.
Unul dintre avantajele ANN-urilor este capabilitatea să învețe orice funcție neliniară,
iar din acest motiv, sunt cunoscute ca și Aproximatori de Funcții Universale.

Rețeaua constă în conexiuni, fiecare conexiune oferind ieșirea unui neuron ca


intrare către alt neuron. Fiecărei conexiuni i se atribuie o pondere (numit „weight” și
notat cu ω) care reprezintă importanța relativă a acesteia. Un singur neuron poate avea
mai multe conexiuni de intrare și de ieșire. Funcția de propagare calculează intrarea
într-un neuron din ieșirile neuronilor predecesori și conexiunile lor ca o sumă
ponderată. La rezultatul propagării se poate adăuga un bias pentru a reprezenta
caracteristici neliniare simple. Neuronii sunt de obicei organizați în mai multe straturi,

3
în special în „Deep Learning”. Neuronii unui strat se conectează numai la neuronii
straturilor imediat precedente și imediat următoare. Stratul care primește date externe
este stratul de intrare. Stratul care produce rezultatul final este stratul de ieșire. Între
două straturi, sunt posibile mai multe modele de conexiune. Ele pot fi complet
conectate, fiecare neuron dintr-un strat conectându-se la fiecare neuron din stratul
următor. Pot fi grupate, în cazul în care un grup de neuroni dintr-un strat se conectează
la un singur neuron din stratul următor, reducând astfel numărul de neuroni din acel
strat. Neuronii care au doar astfel de conexiuni formează un grafic aciclic direcționat.

Un hiperparametru este un parametru constant a cărui valoare este setată


înainte de începerea procesului de învățare. Valorile parametrilor sunt derivate prin
învățare. Exemple de hiperparametri includ rata de învățare, numărul de straturi
ascunse și dimensiunea lotului. Valorile unor hiperparametri pot fi dependente de cele
ale altor hiperparametri. De exemplu, dimensiunea unor straturi poate depinde de
numărul total de straturi. Ecuația pentru calculul ieșirii unui neuron în rețeaua neurală
artificială fără funcție de activare este

𝜔1 𝑥1
𝜔2 𝑥2
(2.2) 𝑓(𝑥) = 𝑏𝑖𝑎𝑠 + 𝑊 𝑇 ∗ 𝑋, 𝑊 = [ ⋮ ], 𝑋 = [ ⋮ ],
𝜔𝑛 𝑥𝑛

unde W este vectorul care conține ponderile conectate la intrarea neuronului iar X este
vectorul care conține ieșirile neuronilor precedenți.

2.2 Metode de învățare

Cele trei metode majore de învățare sunt învățarea supravegheată, învățarea


nesupravegheată și „reinforcement learning”. Fiecare corespunde unei anumite sarcini
de învățare.

Învățarea supravegheată folosește un set de intrări asociate și rezultatele dorite.


Sarcina de învățare este de a produce rezultatul dorit pentru fiecare intrare. În acest
caz, funcția de cost este legată de eliminarea prezicerilor incorecte. Un cost utilizat în
mod obișnuit este eroarea pătratică medie

(2.3) 𝑐𝑜𝑠𝑡 = (𝑖𝑒ș𝑖𝑟𝑒 − 𝑐𝑜𝑟𝑒𝑐𝑡)2 ,

care încearcă să minimizeze eroarea pătratică medie dintre ieșirea rețelei și


ieșirea dorită. Sarcinile potrivite pentru învățarea supravegheată sunt recunoașterea
tiparelor (cunoscută și sub denumirea de clasificare) și regresia (cunoscută și sub
denumirea de aproximare a funcțiilor). Învățarea supravegheată este, de asemenea,
aplicabilă datelor secvențiale (de exemplu, pentru scrierea manuală, recunoașterea

4
vorbirii și a gesturilor). Acest lucru poate fi gândit ca învățatul cu un „profesor”, sub
forma unei funcții care oferă feedback continuu cu privire la calitatea soluțiilor
obținute până acum.

Învățarea este adaptarea rețelei pentru a gestiona mai bine o sarcină luând în
considerare eșantionul de observații. Învățarea presupune ajustarea ponderilor (și a
pragurilor opționale) rețelei pentru a îmbunătăți acuratețea rezultatului. Acest lucru,
pentru învățarea supravegheată, se face prin minimizarea erorilor observate. Învățarea
este completă atunci când examinarea observațiilor suplimentare nu reduce în mod
util rata de eroare. Chiar și după învățare, rata de eroare nu ajunge de obicei la zero.
Dacă după învățare, rata de eroare este prea mare, rețeaua trebuie de obicei să fie
reproiectată. Practic, acest lucru se realizează prin definirea unei funcții de cost care
este evaluată periodic în timpul învățării. Atâta timp cât eroarea sa continuă să scadă,
învățarea continuă. Costul este frecvent definit ca o statistică a cărei valoare poate fi
doar aproximată. Ieșirile sunt de fapt numere, deci atunci când eroarea este mică,
diferența dintre ieșire (aproape sigur o pisică) și răspunsul corect (pisică) este mică.
Procesul de învățare încearcă să reducă totalul diferențelor între observații.
Majoritatea modelelor de învățare pot fi privite ca o aplicație simplă a teoriei
optimizării și a estimării statistice.

Rata de învățare definește mărimea etapelor de corectare pe care modelul le ia


pentru a ajusta eroarea la fiecare observație. O rată de învățare ridicată scurtează
timpul de antrenament, dar cu o precizie finală mai mică, în timp ce o rată de învățare
mai mică crește durata antrenării, dar cu potențialul unei precizii mai mari.
Optimizările, cum ar fi Quickprop, vizează în primul rând accelerarea minimizării
erorilor, în timp ce celelalte îmbunătățiri încearcă în principal să crească stabilitatea.
Pentru a evita oscilația în interiorul rețelei, cum ar fi schimbarea alternativă a
ponderilor și pentru a îmbunătăți rata de convergență, unele optimizări utilizează o
rată de învățare adaptivă care crește sau scade, după caz.

„Backpropagation” este o metodă utilizată pentru a regla ponderile conexiunii


pentru a compensa fiecare eroare găsită în timpul învățării. Valoarea erorii este efectiv
împărțită între conexiuni. Din punct de vedere tehnic, backpropagation calculează
gradientul (derivata) funcției de cost asociate cu o stare dată în raport cu ponderile.

În învățarea nesupravegheată, datele de intrare sunt date împreună cu funcția


de cost, o anumită funcție a datelor x și ieșirea rețelei. Funcția de cost depinde de
cerință (domeniul modelului) și de orice ipoteză inițială (proprietățile implicite ale
modelului, parametrii acestuia și variabilele observate). Ca un exemplu, se ia în
2
considerare modelul f(x) = a, unde a este o constantă, și costul 𝐶 = 𝐸 [(𝑥 − 𝑓(𝑥)) ] (2.3).
Minimizarea acestui cost produce o valoare a care este egală cu media datelor. Funcția
de cost poate fi mult mai complicată. Forma sa depinde de aplicație: de exemplu, în
compresie ar putea fi legată de informațiile reciproce dintre x și f(x). Sarcinile care sunt
potrivite pentru învățarea nesupravegheată sunt în general probleme de estimare;

5
aplicațiile includ clustering, estimarea distribuțiilor statistice, compresie și filtrare.

În aplicații precum jocurile video, un actor ia un șir de acțiuni, primind un


răspuns în general imprevizibil din mediu după fiecare acțiune. Scopul este de a
câștiga jocul, adică de a genera răspunsurile cele mai pozitive (cu cel mai mic cost). În
„Reinforcement learning”, scopul este de a ajusta ponderile rețelei pentru a efectua
acțiuni care să minimizeze costul pe termen lung (cumulativ așteptat). În fiecare
moment, agentul efectuează o acțiune, iar mediul generează o observație și un cost
instantaneu, conform unor reguli (de obicei necunoscute). Regulile și costul pe termen
lung, de obicei, pot fi doar estimate. În orice moment, agentul decide dacă să exploreze
noi acțiuni pentru a-și descoperi costurile sau să exploateze învățarea anterioară
pentru a ajunge la un maxim local mai repede.

În mod formal, mediul este modelat ca un proces de decizie Markov (MDP) cu


stări 𝑠1 , … , 𝑠𝑛 ∈ 𝑆 și acțiuni 𝑎1 , … , 𝑎𝑛 ∈ 𝐴. Deoarece tranzițiile de stare nu sunt
cunoscute, se utilizează în schimb distribuții de probabilitate: distribuția instantanee a
costurilor 𝑃(𝑐𝑡 |𝑠𝑡 ), distribuția de observare 𝑃(𝑥𝑡 |𝑠𝑡 ) și distribuția de tranziție
𝑃(𝑠𝑡+1|𝑠𝑡 , 𝑎𝑡 ), în timp ce o politică este definită ca o distribuție condiționată asupra
acțiunilor având observațiile stării. Luate împreună, stările și acțiunile definesc un lanț
Markov (MC). Scopul este de a descoperi cel mai mic cost MC.

ANN-urile servesc ca componentă de învățare în astfel de aplicații.


Programarea dinamic cuplată cu ANN-uri (oferind programare neurodinamică) a fost
aplicată unor probleme precum cele implicate în rutarea vehiculelor, jocuri video,
gestionarea resurselor naturale și medicină datorită capacității ANN-urilor pentru a
atenua pierderile de precizie chiar și atunci când se reduce densitatea grilei de
discretizare pentru aproximarea numerică a soluției problemelor de control. Sarcinile
care se încadrează în paradigma învățării prin „reinforcement learning” sunt
problemele de control, jocurile și alte sarcini secvențiale de luare a deciziilor.

2.3 Proximal policy optimization

Proximal policy optimization (PPO) este un algoritm de învățare a rețelelor


neurale de tipul „Deep reinforcement learning”. Metodele care țin de gradientul
politicii sunt fundamentale pentru progresele recente în utilizarea rețelelor neurale
pentru control, de la jocuri video, la locomoție 3D. Însă obținerea de rezultate bune
prin metode care țin de gradientul politicii este o provocare, deoarece acestea sunt
sensibile la alegerea dimensiunii pașilor - prea mic, iar progresul este, fără îndoială,
lent; prea mare și semnalul este copleșit de zgomot sau s-ar putea observa scăderi
catastrofale ale performanței. De asemenea, au adesea o eficiență foarte redusă a
eșantionului, luând milioane (sau miliarde) de pași pentru a învăța sarcini simple.

6
PPO este o metodă cu gradient de politică în care politica este actualizată în
mod explicit. Putem scrie funcția obiectiv sau funcția de pierdere a gradientului
general al politicii cu funcția de avantaj [5]

(2.4) ∇𝐽(𝜃) = 𝐸𝜋𝜃 [∇𝜃 𝑙𝑜𝑔𝜋𝜃 (𝑎𝑡 |𝑠𝑡 )Â𝑡 ],


unde:
• 𝐽(𝜃) este funcția obiectiv,
• 𝐸𝜋𝜃 este un operator de mediere,
• 𝑠𝑡 este starea la pasul t,
• 𝑎𝑡 este acțiunea la pasul t,
• 𝜋𝜃 (𝑎𝑡 |𝑠𝑡 ) este politica stochastică parametrizată cu 𝜃,
• Ât este estimația acțiunii la pasul t.

Principala provocare a gradientului general al politicii „reinforcement


learning” este varianța gradientului. Abordarea standard pentru a reduce varianța în
estimarea gradientului este de a utiliza funcția de avantaj. Funcția de avantaj estimează
cât de bună este o acțiune în comparație cu acțiunea medie pentru o anumită stare.
Ideea aici este de a reduce varianța ridicată în estimarea gradientului dintre politica
veche și politica nouă. Reducerea varianței ajută la creșterea stabilității algoritmului
de „reinforcement learning”. Putem scrie funcția de avantaj după cum urmează [5]

(2.5) A(s, a) = Q(s, a) − V(s),


unde:
• A(s, a) este funcția de avantaj,
• V(s) este funcția stare-valoare care măsoară valoarea recompensei așteptată a
stării s,
• Q(s, a) este funcția acțiune-valoare care este similară cu V(s), dar măsoară
valoarea recompensei așteptată a unei perechi (a, s), unde a = acțiune, s = stare.

Dacă funcția de avantaj este pozitivă, atunci înseamnă că acțiunea întreprinsă


de agent este bună și putem obține o recompensă bună prin acțiune. Așadar, ideea de
aici este să îmbunătățim probabilitatea acțiunilor respective. Pe de altă parte, dacă
avantajul a rezultat negativ, atunci trebuie să scădem probabilitățile de acțiune.
Problema reală este că funcția de avantaj poate crea o estimare zgomotoasă care poate
deranja actualizarea politicii. Motivul este că V(e) este o altă rețea neurală și, în timpul
procesului de învățare, poate genera o estimare zgomotoasă pentru starea dată.

În 2015, TRPO (Trust Region Policy Optimisation) [5] introduce strategii de


regiune de încredere în „reinforcement learning” în loc de strategia de căutare pe linie.
TRPO adaugă constrângeri de divergență KL pentru a permite regiunea de încredere
pentru procesul de optimizare. Se asigură că noua politică de actualizări nu este
departe de cea veche sau putem spune că noua politică se află în regiunea de încredere
a vechii politici. Înseamnă că actualizarea politicii nu deviază în mare măsură. TRPO
este un algoritm relativ complicat. Constrângerea KL adaugă cheltuieli suplimentare

7
sub formă de constrângeri dure procesului de optimizare. De asemenea,
implementarea algoritmului TRPO nu este o sarcină suficient de directă.

Aici intervine PPO cu o abordare mult mai simplă. PPO este o optimizare de
primă ordine care simplifică implementarea sa. Similar funcției obiectiv TRPO,
definește raportul de probabilitate între noua politică și vechea politică și o putem
numi r(θ) [5]

𝜋𝜃 (𝑎 |𝑠)
(2.6) 𝑟(𝜃) = 𝜋 ,
𝜃𝑣𝑒𝑐ℎ𝑖 (𝑎 |𝑠 )
unde:
• 𝜃𝑣𝑒𝑐ℎ𝑖 conține parametri politicii înainte de actualizare.

Acum putem modifica funcția obiectiv TRPO [5]

(2.7) 𝐽(𝜃)𝑇𝑅𝑃𝑂 = 𝐸[𝑟(𝜃)Â𝜃𝑣𝑒𝑐ℎ𝑖 (𝑠, 𝑎)],


unde:
• Âθvechi(s,a) este estimația funcției de avantaj.

Fără a adăuga constrângeri, această funcție obiectiv poate duce la instabilitate sau
la o rată de convergență lentă, datorită actualizării dimensiunilor de pași mari și,
respectiv, mici. În loc să adauge o constrângere KL complicată, PPO impune raportul
de politică, r(θ) pentru a rămâne într-un interval mic în jurul valorii de 1. Acesta este
intervalul dintre 1-𝜖 și 1 + 𝜖. 𝜖 (epsilon) este un hiperparametru PPO și este setat în
fișierul de configurare, cu o valoare implicită setată la 0,2. Funcția obiectiv PPO are
forma [5]

(2.8) 𝐽𝐶𝐿𝐼𝑃 (𝜃) = 𝔼[𝑚𝑖𝑛(𝑟(𝜃)Â𝜃𝑣𝑒𝑐ℎ𝑖 (𝑠, 𝑎), 𝑐𝑙𝑖𝑝(𝑟(𝜃),1 − 𝜖, 1 + 𝜖)Â𝜃𝑣𝑒𝑐ℎ𝑖 (𝑠, 𝑎))].

În ecuația (2.8), clip-ul funcțional trunchiază raportul politicii între intervalul


[1-ϵ, 1 + ϵ]. Funcția obiectiv a PPO ia valoarea minimă între valoarea inițială și valoarea
trunchiată. Similar gradientului general al politicii, funcția de avantaj pozitiv indică
faptul că acțiunea întreprinsă de agent este bună. Pe de altă parte, un avantaj negativ
indica o acțiune proastă. Pentru PPO, în ambele cazuri, operația de trunchiere se
asigură că nu se va abate în mare măsură prin trunchierea actualizării din interval.

8
3. Simularea parcării
3.1 Unity3D

Unity este un game engine, o unealtă folosită la crearea jocurilor video pentru
orice platformă. În cazul meu, folosesc Unity pentru sistemul de fizică avansat pe care
l-am folosit în simularea sistemului real al parcării. Dat fiind că este unul dintre cele
mai populare game engine-uri, are și o comunitate foarte dezvoltată cu ajutorul căreia
poți învăța rapid cum să construiești jocuri simple. Pentru simulare am construit o
parcare din modele 3D descărcate din Unity Asset Store în care am agentul,
reprezentat de mașina albastră, iar locul de parcare țintă este reprezentat de marcajul
roșu (inițial). Scopul mașinii este să se oprească cu toate roțile în interiorul marcajului
și cu orientarea corectă, în sensul săgeții (în imagine, mașina trebuie să parcheze cu
fața). Locurile de parcare au fost alese astfel încât să acopăr cât mai multe cazuri de
parcare posibile: din scurt, mai depărtate, cu mașini parcate deja pe ambele parți, pe o
singură parte sau cu nicio mașină în apropierea senzorilor de detectare.

Fig.3.1. Simularea parcării facută


în Unity

În figura 3.1 se poate observa modul în care am distribuit locurile de parcare,


iar mașina învăța să parcheze în toate locurile libere. Mașina include sistem complet
de fizică și control: accelerație, frână (bazată pe frecare), inerție, suspensii, direcție
(bazată pe poziția exactă a roților) și coliziuni cu celelalte corpuri.

Modelul matematic al mașinii este generat folosind sistemul de fizica Unity.


Pentru aceasta, am atașat fiecărei roți câte un modul numit “Wheel Colider” care este
un modul special de coliziune pentru simularea automobilelor. În funcție de numărul
de roți și poziția acestora relative la poziția centrului mașinii, modelul mașinii este
generat folosind câțiva parametri primiți din editorul de componente.

9
Fig.3.2. Componenta “Wheel
Collider” din Unity

În figura 3.2 sunt parametri folosiți în modelul meu. Parametrii au fost aleși prin
testarea diverselor valori până când comportamentul simulat se asemănă cu un
comportament al unei mașini reale. Parametrii componentei influențează modelul
mașinii în următorul mod:
• „Mass”
o reprezintă masa roții,
• „Radius”
o reprezintă raza roții,
• „Wheel Damping Rate”
o reprezintă o valoare de amortizare aplicată roții,
• „Suspension Distance”
o reprezintă distanța maximă a suspensiei roții,
• „Force App Point Distance”
o reprezintă punctul în care forța suspensiei este aplicată,
• „Center”
o reprezintă centrul roții în spațiul local al mașinii,
• „Suspension Spring”
o încearcă să ajungă la „Target Position” adăugând forța elastică și de
amortizare,
• „Spring
o reprezintă forța elastică a suspensiei,

10
• „Damper”
o reprezintă forța de amortizare a suspensiei,
• „Target Position”
o reprezintă poziția de repaus de-a lungul distanței suspensiei,
• „Forward/Sideways Friction”
o reprezintă proprietățile de frecare a mașinii

3.2 Unity Ml-agents Toolkit

Unity Ml-agents Toolkit este o bibliotecă open-source, codul se poate descarca


de pe Github [1], unde de asemenea se poate găsi o documentație completă legată de
toate tehnologiile implementate. Este făcut pentru Unity, iar acest lucru oferă
posibilități nelimitate în antrenarea de agenți pentru diferite task-uri. Faptul că este
bazat pe pytorch oferă foarte multe unelte și biblioteci, dintre care am folosit
TensorBoard, pentru vizualizarea progresului în antrenarea agentului și optimizarea
acestuia prin ajustarea parametrilor. Oferă suport pentru mai multe tipuri de învățare,
fiecare mod fiind mai avantajos pentru diferite medii. Astfel, am folosit învățare cu un
singur agent, dar puteam folosi și medii multi-agent care lucrează cooperativ sau
competitiv (simetrice). De asemenea, oferă mai mulți algoritmi de învățare, toți
pornind de la "Deep Reinforment learning" (PPO: Proximal Policy Optimization, SAC:
Soft Actor Critic, MA-POCA: MultiAgent Posthumous Credit Assignment și self-play
(competitiv simetrice)).

Algoritmul de învățare folosit de mine este PPO împreună cu modulul GAIL.


Aceasta este o metodă care s-a dovedit a fi mai generală și mai stabilă decât mulți alți
algoritmi de tipul „Reinforcement learning”.

ML-Agents conține 5 componente de nivel înalt:


• Mediul de învățare - care conține scena Unity și toate personajele jocului. Scena
Unity oferă mediul în care agenții observă, acționează și învață. Modul în care
este configurată scena Unity pentru a servi ca mediu de învățare depinde într-
adevăr de obiectiv;
• Python Low-Level API - care conține o interfață Python de nivel scăzut pentru
interacțiunea și manipularea unui mediu de învățare. Spre deosebire de mediul
de învățare, API-ul Python nu face parte din Unity, ci se află în afară și
comunică cu Unity prin intermediul Communicator. Acest API este conținut
într-un pachet dedicat „mlagents_envs” Python și este utilizat de procesul de
învățare Python pentru a comunica și controla agenții în timpul
antrenamentului. Cu toate acestea, poate fi folosit și în alte scopuri. De exemplu,
se poate folosi API-ul pentru a utiliza Unity ca motor de simulare pentru
algoritmii proprii de învățare automată;Communicator extern - care conectează
mediul de învățare cu API-ul Python Low-Level. Se afla în mediul de învățare;

11
• Python Trainers conține toți algoritmii de învățare automată care permit
antrenarea agenților. Algoritmii sunt implementați în Python și fac parte din
propriul pachet „mlagents” Python. Pachetul expune un singur utilitar de linie
de comandă mlagents-learn care acceptă toate metodele de formare și opțiunile
prezentate de ML-agents.

Mediul de învățare conține două componente Unity care ajută la organizarea


scenei Unity:
• Agenul - care este atașat la Unity GameObject (orice personaj dintr-o scenă)
și se ocupă de generarea observațiilor sale, efectuând acțiunile pe care le
primește și atribuind o recompensă (pozitivă / negativă) atunci când este
cazul. Fiecare agent este legat de un anumit comportament.
• Comportamentul - definește atributele specifice ale agentului, cum ar fi
numărul de acțiuni pe care agentul le poate întreprinde. Fiecare
comportament este identificat în mod unic printr-un câmp Nume
comportament. Un Comportament poate fi gândit ca o funcție care primește
observații și recompense de la Agent și returnează acțiuni. Un
comportament poate fi de trei tipuri: învățare, euristică sau inferență. Un
comportament de învățare este unul care nu este încă definit, dar pe cale să
fie instruit. Un comportament euristic este unul care este definit de un set
de reguli codificate în mod dur implementat în cod. Un comportament de
inferență este unul care include un fișier de rețea neurală instruit. În esență,
după ce un comportament de învățare este instruit, acesta devine un
comportament de inferență.

Pentru a ușura învățarea rețelei, am adăugat modificat o componentă din Unity


numită ”Decision Requester”. Această componentă cere deciziile luate de modelul
antrenat cu ML-agents. Crescând valoarea parametrului „Decision Period” de la 1 la 3
am redus numărul de acțiuni noi pe care le aplică agentul. Astfel am redus perioada
de învățare deoarece deși folosesc un sistem fizic continuu, agentul poate vedea
mediul ca pe unul discret. În intervalul de timp dintre 2 acțiuni, agentul continuă să
folosească ultima acțiune primită până când va primi o altă acțiune. Atunci din
perspectiva rețelei neurale, durata maximă a unui episod este de 3 ori mai mică. Dacă
perioada dintre două cereri de acțiune este prea mare atunci agentul nu poate controla
mașina destul de bine deoarece, de exemplu, nu poate reacționa destul de rapid în
cazul în care senzorii de distantă detectează un obstacol în direcția de mers.

Fig.3.3. Componenta “Decision


Requester” din Unity

12
GAIL sau Generative Adversarial Imitation Learning, este un algoritm de
învățare fără imitație, care obține performanțe semnificative față de metodele existente
fără model în imitarea comportamentelor complexe în medii complexe, cu dimensiuni
ridicate. Anumite instanțieri ale cadrului vor face o analogie între învățarea imitată și
rețelele contradictorii generative. GAIL recompensează agentul pentru
comportamentul similar cu un set de demonstrații fără a-i influența în mod direct
acțiunile. GAIL poate fi utilizat cu sau fără recompense din mediu și funcționează bine
atunci când există un număr limitat de demonstrații. În acest cadru, o a doua rețea
neurală, discriminatorul, este învățat să distingă dacă o observație / acțiune este dintr-
o demonstrație sau este produsă de agent. Acest discriminator poate examina apoi o
nouă observație / acțiune și îi poate oferi o recompensă pe baza a cât de aproape crede
că această nouă observație / acțiune este de demonstrațiile furnizate. La fiecare pas de
antrenament, agentul încearcă să învețe cum să maximizeze această recompensă. Apoi,
discriminatorul este instruit pentru a distinge mai bine între demonstrații și starea /
acțiunile agentului. În acest fel, în timp ce agentul devine din ce în ce mai bun la
mimarea demonstrațiilor, discriminatorul continuă să devină din ce în ce mai strict și
agentul trebuie să încerce mai mult să-l „mulțumească”. Această abordare învață o
politică care produce stări și acțiuni similare demonstrațiilor, necesitând mai puține
demonstrații decât clonarea directă a acțiunilor. În plus față de învățarea pur din
demonstrații, semnalul de recompensă GAIL poate fi amestecat cu un semnal de
recompensă extrinsecă pentru a ghida procesul de învățare. Acest modul îi oferă
agentului ghidarea să se îmbunătățească cât mai repede, dar și libertatea ca acesta să
poată deveni mai bun decât demonstrațiile oferite inițial.

3.3 Observații si acțiuni

Agentul este reprezentat de o rețea neurală care, în funcție de observațiile făcute


de mașină, ia acțiuni corespunzătoare.

Observațiile sunt ceea ce agentul percepe despre mediu. Observațiile pot fi


numerice și / sau vizuale. Observațiile numerice măsoară atributele mediului din
punctul de vedere al agentului. Pentru agentul nostru, acestea ar fi atribute ale
câmpului de luptă care sunt vizibile pentru acesta. Pentru cele mai complicate medii,
un agent necesită mai multe observații numerice continue. Observațiile vizuale, pe de
altă parte, sunt imagini generate de camerele atașate agentului și reprezintă ceea ce
agentul vede în acel moment. Starea mediului reprezintă informații despre întreaga
scenă care conține toate personajele jocului. Cu toate acestea, observarea agenților
conține doar informații de care agentul este conștient și este de obicei un subset al stării
mediului. De exemplu, observația agentului nu poate include informații despre un
inamic ascuns de care agentul nu știe.

13
Agentul are un total de 13 observații: 5 observații care țin de poziția mașinii:
• Primele două - poziția relativă a mașinii față de locul de parcare

(3.1) 𝑂𝑏𝑠𝑒𝑟𝑣𝑎𝑡𝑖𝑖(0: 1) = (𝑝𝑜𝑧𝑖𝑡𝑖𝑒𝑀𝑎𝑠𝑖𝑛𝑎 − 𝑝𝑜𝑧𝑖𝑡𝑖𝑒𝑃𝑎𝑟𝑐𝑎𝑟𝑒)/5,


unde pozitieMasina si pozitieParcare reprezintă coordonatele x si y ale centrului
mașinii (x si z in Unity);

• Următoarele două - viteza mașinii

(3.2) 𝑂𝑏𝑠𝑒𝑟𝑣𝑎𝑡𝑖𝑖(2: 3) = 𝑣𝑖𝑡𝑒𝑧𝑎𝑀𝑎𝑠𝑖𝑛𝑎/10,


unde vitezaMasina reprezintă viteza mașinii pe axele x si y (x si z in Unity);

• Ultima - Orientarea mașinii relativă față de orientarea locului de parcare


normalizată la valori în intervalul (-1,1), unde 0 înseamnă că mașina are
aceeași orientare cu locul de parcare și -1 sau 1 înseamnă că este orientată în
direcția opusă

(3.3) 𝑂𝑏𝑠𝑒𝑟𝑣𝑎𝑡𝑖𝑖(4) = (𝑜𝑟𝑖𝑒𝑛𝑡𝑎𝑟𝑒𝑀𝑎𝑠𝑖𝑛𝑎 − 180)/180,


unde orientareMasina reprezintă unghiul mașinii în jurul axei z (y in Unity).

Observații: pentru a normaliza valorile observaților, le-am împărțit pe fiecare la un


număr în funcție de minimul și maximul la care pot ajunge în mediul de învățare. ML-
agents are o metodă de normalizare automată, dar am preferat să o fac manual pentru
a fi sigur că observațiile sunt citite corect. De exemplu, în urma testelor am observat că
poziția mașinii relativă la locul de parcare este limitat de intervalul (-5, 5), iar prin
împărțire, normalizez valoarea la (-1, 1) (la fel și pentru viteză, unde maximul este 10).

Figura 3.4.a Senzorii mașinii când nu detectează un obstacol

14
Figura 3.4.b Senzorii mașinii când detectează un obstacol

Figura 3.4 Senzorii mașinii

• Și încă 8 senzori de distanță atașați de centrul mașinii care returnează valori


analogice între 0 și 1 în funcție de cât de departe este obstacolul detectat de
centrul mașinii. Exemplu in figurile 3.5.

Acțiunile sunt instrucțiunile pe care le poate urmări agentul. Similar


observațiilor, acțiunile pot fi fie continue, fie discrete, în funcție de complexitatea
mediului și a agentului. În cazul agentului, dacă mediul este o lume simplă a rețelei în
care contează doar localizarea lor, atunci este suficientă o acțiune discretă care să ia
una din cele patru valori (nord, sud, est, vest). Cu toate acestea, dacă mediul este mai
complex și agentul se poate deplasa liber atunci este mai adecvat să utilizeze două
acțiuni continue (una pentru direcție și alta pentru viteză).

Agentul are trei acțiuni:


• Accelerația, care poate lua valori în intervalul (-1,1), unde 1 înseamnă o
accelerație pozitivă, adică mersul înainte

(3.4) 𝐴𝑐𝑐𝑒𝑙𝑒𝑟𝑎𝑡𝑖𝑒 = 𝐶𝑙𝑎𝑚𝑝(𝐴𝑐𝑡𝑖𝑢𝑛𝑖(0), −1,1);

• Frâna, care este o acțiune discretă, primește valori în intervalul (-1,1), iar
dacă această valoare este mai mare decât 0, mașina frânează

(3.5) 𝐹𝑟𝑎𝑛𝑎 = 𝐴𝑐𝑡𝑖𝑢𝑛𝑖(1) > 0? 𝑡𝑟𝑢𝑒: 𝑓𝑎𝑙𝑠𝑒.

• Frâna fiind o acțiune discretă, aceasta este transformată în variabilă de tipul


boolean, adică intensitatea frânării nu poate fi controlată de agent, doar

15
aplicarea ei;

• Direcția, care poate lua valori în intervalul (-1,1) și controlează unghiul de


rotație al roților

(3.6) 𝐷𝑖𝑟𝑒𝑐𝑡𝑖𝑒 = 𝐶𝑙𝑎𝑚𝑝(𝐴𝑐𝑡𝑖𝑢𝑛𝑖(2), −1,1).

Observații: Clamp(x, min, max) este o funcție care returnează valoarea x dacă se află
între min și max, min dacă x este mai mic decât min și max dacă x este mai mare decât
max.

3.4 Recompense și pedepse

Semnalele de recompensă sunt reprezentate de o valoare scalară care indică cât


de bine se descurcă agentul. Semnalul de recompensă nu trebuie să fie furnizat în
fiecare moment, ci numai atunci când agentul efectuează o acțiune bună sau rea. De
exemplu, poate primi o recompensă negativă mare dacă lovește alta mașină, o
recompensă pozitivă modestă ori de câte ori o roată intră în locul de parcare țintă și o
recompensă negativă modestă când o roată părăsește locul de parcare. Semnalul de
recompensă este modul în care obiectivele sarcinii sunt comunicate agentului, astfel
încât acestea trebuie configurate într-un mod în care maximizarea recompensei
generează comportamentul optim dorit.

Valoare Acțiune

0.1 O roată intră pe marcajul obiectiv

0.07*N Încheierea unui episod cu N roți pe


marcaj

(0.3,1.1) Încheierea unui episod cu toate roțile pe


marcaj

Tabelul 3.1. Recompense

16
Valoare Acțiune

-0.4 O roată părăsește marcajul obiectiv

-0.5 Coliziune cu altă mașină

(-0.1,-1) Încheierea unui episod fără nicio roată pe


marcaj (în funcție de distanța dintre mașină și
marcaj)

-0.1 Încheierea unui episod pe marcaj, dar cu


orientarea greșită

Tabelul 3.2. Pedepse

3.5 Parametri și Hiperparametri

„mlagents-learn” este principalul utilitar de instruire oferit de ML-Agents


Toolkit. Acceptă o serie de opțiuni CLI în plus față de un fișier de configurare YAML
care conține toate configurațiile și hiperparametrii care vor fi utilizate în timpul
antrenamentului. Setul de configurații și hiperparametri incluși în acest fișier depinde
de agenții din mediul de învățare și de metoda de antrenament specifică pe care doriți
să o utilizați. Valorile hiperparametrilor pot avea un impact mare asupra performanței
antrenamentului (adică capacitatea agentului de a învăța o politică care rezolvă
sarcina).

Antrenarea se pornește din linia de comandă Windows folosind un fișier de


configurare cu extensia “.yaml” [2]. Pachetul Ml-Agents pornește un local host pentru
comunicarea cu Unity. Unity are grijă de simulare, iar Ml-Agents are grijă de
antrenarea propriu-zisă a rețelei neurale.

Fișierul de configurare YAML conține majoritatea parametrilor,


hiperparametrilor și modulele pentru învățare. O parte din parametri pot fi adaugați
printr-o serie de opțiuni CLI din linia de comandă. Exemplu de comandă pentru
începerea antrenării:

“mlagents-learn trainer_config2-R.yaml --run-id=Parking-curriculum-A2 --


env=../Build2-9/MachineLearning.exe --time-scale=100000 --quality-level=0 --
width=512 --height=512”

17
Unde:
• “mlagents-learn” este comanda pentru începerea învățării;
• “trainer_config2-R.yaml” este numele fișierului de configurare necesar
pentru învățare;
• “--run-id=Parking-curriculum-A2” este numele fișierului în care se
generează fișierele de învățare și se salvează fișierul de configurare
împreună cu rețeaua neurală după învățare;
• “--env=../Build2-9/MachineLearning.exe” este calea către executabilul creat
de Unity care conține mediul de antrenare;
• “--time-scale=100000” este un coeficient de scalare pentru timp. O valoare
mică (1) a acestui parametru pornește o antrenare în timp real și va consuma
puține resurse, iar o valoare mai mare începe o antrenare mai rapidă, dar va
consuma și mai multe resurse necesare pentru calculul a mai multor pași în
același timp. O limitare pentru acest parametru poate fi puterea
componentelor care rulează învățarea (în cazul meu, placa video);
• “--quality-level=0” este un parametru care setează calitatea graficelor
pentru simulare în timpul învățării. Zero este valoarea minimă acceptată și
va consuma cele mai puține resurse;
• “width=512 --height=512” sunt dimensiunile ferestrei create cu instanța
jocului pentru simularea mediului de antrenare.
• “—resume” este un alt parametru care poate fi adăugat, acesta fiind adăugat
cu scopul continuării unei antrenări deja începute. Pentru aceasta valoarea
parametrului “run-id” trebuie să fie regăsită în fișiererul de antrenamente
deja create.

Restul parametrilor pot fi adaugați sau modificați direct din cod, cum ar fi:

• Durata maximă a unui episod : 1000 pași


o Reprezintă numărul de pași după care un episod se va termina în
mod forțat, adică agentului i-a trebuit prea mult să parcheze;
• Durata pentru completare: 100 pași
o Reprezintă numărul de pași necesari pentru care mașina trebuie să
rămână în interiorul marcajului ca episodul să se termine cu
obiectivul completat.

18
Parametrii si hiperparametrii din fișierul de configurare folosiți sunt:

Fig. 3.3. Fișierul de configurare „.yaml”

• trainer_type: ppo;
o Valoare implicită: ppo
o Modul de învățare folosit pentru antrenarea agentului
o Alegeri: “ppo” (Proximal Policy Optimization), “sac” (Soft Actor-
Critic) sau “poca” (MultiAgent POsthumous Credit Assignment)
• summary_freq: 50 000
o Valoare implicită: 50 000
o Numărul de experiențe care trebuie sa fie colectate înainte de a

19
genera și afișa informații despre învățare
o Din cauză că se afișează și recompensa cumulativă, este necesar că
acest număr să fie mai mare decât numărul maxim de pași pentru un
episod înmulțit cu numărul de agenți care se antrenează simultan
• time_horizon: 128
o Valoare implicită: 64
o Numărul de experiențe care trebuiesc să fie colectate înainte de a le
adaugă în coada de experiențe
o Am setat această valoare aproape de numărul de pași necesari
agentului pentru a realiza o parcare perfecta
• max_steps: 30 000 000
o Valoare implicită: 500 000
o Numărul total de pași care trebuie făcuți în mediul de învățare pentru
încheierea procesului de învățare, indiferent de numărul de numărul
de episoade. Dacă în mediul de învățare exista mai mulți agenți,
atunci se ia cumulul tuturor pașilor
• keep_checkpoints: 2
o Valoare implicită: 5
o Numărul maxim de modele salvate pe parcursul învățării cu scopul
siguranței că daca învățarea se întrerupe, procesul nu pierde mult
progres. Sunt salvate toate informațiile necesare continuării
antrenamentului inclusiv starea modelului actual. Odată ce numărul
maxim de salvări este atins, se șterge cea mai veche salvare și se
adaugă cea nouă
• checkpoint_interval: 1 000 000
o Valoare implicită: 500 000
o Numărul de pași dintre 2 salvări de pe parcurs a modelului
• threaded: true
o Valoare implicită: false
o Permite mediului să continue învățarea în timp ce modelul rețelei
este actualizat folosind experiențele dobândite
• learning_rate: 0.0003
o Valoare implicită: 0.0003
o Rata de învățare inițială pentru propagarea gradientului
• batch_size: 256
o Valori recomandate pentru ppo continu: 512-5120
o o Numărul de experiențe în fiecare iterație din propagarea
gradientului. Trebuie să fie un divizor al lui “buffer_size”
o o Motivul pentru care m-am abătut de la valorile recomandate este
că deși am folosit un model continuu pentru simulare, o nouă acțiune
este cerută de mediu odată la 3 pași. Asta înseamnă că din
perspectiva modelului, controlul se aproprie de unul discret, adică
antrenarea este mai rapidă, iar un “batch_size” puțin mai mic este
mai optim
• buffer_size: 2048

20
o Valoare inițială: 10240
o Valori recomandate ppo: 2048 – 409600
o Numărul de experiențe care trebuiesc acumulate înainte de a
actualiza modelul
• learning_rate_schedule: linear
o Valoare implicită: linear
o Valori posibile: linear, constant
o Determina dacă rata de învățare se schimbă în timp sau rămâne
constantă. Pentru “linear” rata de învățare scade liniar, la început
având valoarea inițială cea setată coborând până la 0 la sfârșitul
antrenamentului
• beta: 0.005
o Valoare implicită: 0.005
o Coeficientul regularizării entropiei, ceea ce face politica să fie “mai
aleatoare”. Acesta are grijă ca agentul să exploreze destul de bine
mediul de învățare înainte să înceapă să profite de experiențele
acumulate
• epsilon: 0.2
o Valoare implicită: 0.2
o Influențează cât de rapid poate evolua politica în timpul antrenării.
Adică corespunde maximului diferenței dintre politica actualizată și
cea veche
• lambd: 0.95
o Valoare implicită: 0.95
o o Este un parametru de regularizare folosit pentru calcularea lui
“GAE” [4]. O valoare mai mare a acestui parametru influențează
agentul să urmărească recompensele imediate mai mult, iar o valoare
mai mică influențează agentul să urmărească estimarea
recompenselor posibile din acea stare
• num_epoch: 3
o Valoare implicită: 3
o Numărul de treceri pe care o face coada de experiențe prin model
atunci când se actualizează modelul

• hidden_units: 256
o Valoare implicită: 128
o Numărul de noduri conținute de fiecare strat ascuns de neuroni din
model
• num_layerys: 2
o Valoare implicită: 2
o Numărul de straturi de neuroni ascunși din model. Pentru modele
simple, este suficient un model mai mic, dar pentru modelul meu am
observat prin testare că un număr mic de straturi cu un număr mare
de neuroni pe strat oferă cel mai bun rezultat
• normalize: false

21
o Valoarea inițială: false
o Dacă normalizarea să fie aplicată vectorului de observații sau nu.
Motivul pentru care am optat să nu folosesc normalizarea automată
este că o normalizare manuală ar fi mai eficientă, cunoscând limitele
mediului de antrenare

GAIL:
• gamma: 0.99
o Valoare implicită: 0.99
o Factor de reducere pentru recompensele viitoare
• strength: 1
o Valoare implicită: 1.0
o Factorul cu care se înmulțește recompensa primită de la modulul
GAIL
• learning_rate: 0.0003
o Valoare implicită: 0.0003
o Rata de învățare pentru rețeaua neurală folosită de GAIL numită și
discriminator
• use_actions: false
o Valoare implicită: false
o Determină dacă discriminatorul să își bazeze recompensele doar pe
stări sau pe stări și acțiuni
• use_vail: false
o Valoare implicită: false
o Activează un blocaj variațional în cadrul discriminatorului GAIL.
Acest lucru îl obligă pe discriminator să învețe o reprezentare mai
generală și îi reduce tendința de a fi „prea bun” la discriminare,
făcând învățarea mai stabilă
• demo_path: ../demos/Parking.demo
o Fără valoare implicită
o Reprezintă calea către demonstrația făcută. O demonstrare se
înregistrează folosind componenta “Demonstration recorder” din
Unity, se pornește simularea din editor iar experiențele făcute de
utilizator vor fi colectate și salvate.

Observație: Acestea sunt valorile finale ale parametrilor și hiperparametrilor cu care


am obținut cea mai buna performanță. Pe parcurs am testat multe alte valori despre
care am scris informații în secțiunea 4.1.

22
4. Antrenarea rețelei
4.1 Încercări și rezultate

Pe parcursul antrenării rețelei, am făcut destul de multe încercări cu parametri


diferiți pentru a observa comportamentul agentului și timpul necesar acestuia să
ajungă la o recompensă cumulativă maximă pentru acea încercare.

Prima încercare constă în folosirea modulului „Curriculum”. Modulul constă


în adăugarea unor nivele de dificultate mediului de învățare, iar odată ce agentul poate
acumula o recompensă cumulativă peste un anumit prag, atunci poate avansa la
următorul nivel de dificultate. Acel prag este o valoare numerică care poate fi setată
individual pentru fiecare nivel de dificultate în parte.

Am definit următorii parametrii din mediu pentru ajustarea ușoară a


dificultății:
• Obstacole – Parcarea conține sau nu alte mașini deja parcate care trebuiesc
evitate;
• Indexul locului de parcare – Fiecare loc de parcare liber are un index stabilit, iar
el poate fi ales cu ușurință pentru schimbarea locului de parcare țintă. Pentru
locurile de pe partea dreaptă, este necesară rotirea marcajului cu 180°;
• Poziția inițială a mașinii – Se poate activa sau dezactiva poziția variabilă inițială
a mașinii prin setarea unei variabile de tipul „boolean”. Poziția poate varia doar
în interiorul unor intervale prestabilite și doar pe axele x și y.

Am antrenat agentul pentru o dificultate cât mai mică și în funcție de performanță,


să avansez și să optimizez parametrii pentru o durată de antrenare cât mai mică.

Figura 4.1 Progresul agentului


folosind modulul curriculum

23
Graficele au fost generate folosind TensorBoard, care citește datele de antrenare
salvate și poate afișa istoricul tuturor antrenărilor făcute. În figura 4.1 am afișat
progresul agentului în funcție de numărul de pași, în figura din stânga este afișat
progresul recompensei cumulative, în centru este afișat progresul duratei unui episod,
iar în dreapta este afișat progresul nivelului de dificultate. Aceasta a fost cea mai
performantă antrenare folosind modulul de antrenare “Curriculum”. Agentul a fost
supus la 6 nivele de dificultate pe parcursul la un maxim de 70 de milioane de pași și
o durată totală de o zi, 16 ore și 8 minute. Agentul nu a avut timp să parcurgă toate
nivelele de dificultate, iar progresul acestuia de-a lungul antrenării a fost instabil (pe
parcursul nivelului 5, a avut o creștere a recompensei cumulative medii până la
valoarea 0.6, dar mai târziu a scăzut până la un minim de -0.8, crescând înapoi și
trecând de pragul pentru avansarea la următorul nivel abia la sfârșitul procesului de
antrenare). În concluzie, diferența de complexitate de la primul nivel (parcare doar pe
stânga fără obstacole) până la ultimul (parcare pe ambele părți cu obstacole) este prea
mare, iar o posibilă problemă ar putea fi rata de învățare care scade liniar pe parcursul
învățării indiferent de progresul nivelelor (o rată de învățare constantă a dus la o
creștere instabilă a recompensei cumulative).

Pentru a rezolva această problemă, am renunțat la modulul “Curriculum” și am


împărțit antrenarea în mai multe antrenări mai mici, fiecare având o rată de învățare
care scade liniar.

În figura 4.2 am arătat progresul agentului de-a lungul mai multor serii de
antrenament, fiecare având un nivel de dificultate diferit. Durata totală a tuturor
antrenărilor afișate în figura 4.2 este de 3 zile 19 ore și 10 minute. Fiecare agent
începând de la 4.2.b este inițializat cu modelul antrenarea precedentă. Procesul de
antrenare se împarte în mai multe secțiuni:

Figura 4.2.a

24
• Figura 4.2.a
o Parcare fără obstacole, doar un loc din partea stângă
o Recompensa cumulativă maximă: 0.5

Figura 4.2.b

• Figura 4.2.b
o Parcare fără obstacole, pe toate locurile din partea stânga
o Recompensă cumulativă maximă: 1.0
o Progresul trecerii de la o dificultate la alta a fost foarte bun continuând
cu rețeaua antrenată de la 4.2.a așa că am decis să continui dificultatea
deși antrenarea devine ușor instabilă spre sfârșit

Figura 4.2.c

25
• Figura 4.2.c
o Parcare fără obstacole, doar un loc din partea dreaptă
o Recompensă cumulativă maximă: 0.5

Figura 4.2.d

• Figura 4.2.d
o Parcare fără obstacole, pe toate locurile din partea dreaptă
o Recompensă cumulativă maximă: 1.0

Figura 4.2.e

26
• Figura 4.2.e
o Parcare fără obstacole, pe toate locurile de parcare
o Recompensă cumulativă maximă: 1.08

Figura 4.2.f

• Figura 4.2.f
o Parcare cu obstacole, pe toate locurile de parcare
o Recompensă cumulativă maximă: 1.15

Figura 4.2.g

• Figura 4.2.g
o Parcare cu obstacole, pe toate locurile de parcare
o Recompensă cumulativă maximă: 1.11

27
o Această antrenare a fost făcută cu o rată de învățare mai mică pentru o
învățare mai stabilă și pentru a ajunge la un model cu performanță
maximă pentru această configurație. Deși recompensa cumulativă
maximă este puțin mai mică decât 4.2.f, performanța agentului într-o
demonstrație este puțin mai mare

În concluzie, am ajuns la un model mai performant decât în prima încercare,


dar antrenarea acestuia durează mult prea mult.

În continuare, am modificat numărul maxim de pași pentru agent de la 2000 la


1000 și numărul de pași pentru completarea episodului de la 200 la 100 pentru a-i oferi
agentului mai puțin timp să “cerceteze”. De asemenea, am renunțat la antrenarea
bazată pe nivele de dificultate.

Figura 4.3.a

Figura 4.3.b

Figura 4.3 Progresul celui mai performant agent antrenat

28
Antrenarea agentului a fost făcută direct într-un mediu cu toate obstacolele,
toate locurile de parcare și poziția inițială variabilă a mașinii. Durata totală a
antrenării a fost de 12 ore și 23 de minute, iar recompensa cumulativă finală este de
aproximativ 1.2 cu o rată de parcare reușită de aproximativ 98% (calculată prin
testare). Prima antrenare (4.3.a) a fost făcută cu parametri descriși în secțiunea 3.5 și a
durat 8 ore și 4 minute, iar pentru a doua antrenare (4.3.b) am scăzut rata de învățare
și parametrul “strength” al modulului GAIL pentru a influența agentul să
maximizeze recompensa primită din mediu și nu cea de la modulul de imitare și a
durat 4 ore și 19 minute.

În figura 4.4 am afișat traiectoria mașinii în timpul parcării în diferite locuri de


parcare folosind o linie de culoare albastră.

a b c

d e f

Figura 4.4 Traiectoria mașinii

29
5. Concluzii

În concluzie, deși a fost unul de cercetare, proiectul s-a dovedit un succes în


care am obținut un agent care este capabil să parcheze mașina în locul de parcare
marcat cu o performanță de aproximativ 98%. Procentul de 2% șansă să nu parcheze
în siguranță și corect este din cauza poziției inițiale variabile a mașinii care poate
pune mașina într-o poziție inadecvată parcării fără a fi nevoie să facă mai multe
manevre. Deși procentul de coliziune cu un obstacol este foarte mic, se pot aduce
îmbunătățiri prin crearea unei verificări simple folosind valorile senzorilor și viteza
mașinii pentru a opri mașina înaintea oricărei coliziuni cu un obstacol.

Folosind Tenserboard, am putut să colectez toate datele de antrenare a


încercărilor care au fost mai semnificative pentru progresul învățării. Durata totală a
tuturor încercărilor colectate este de aproximativ 18 zile. Estimez că în total, și cu cele
șterse (din cauza faptului că nu am considerat că reprezintă un progres semnificativ),
durata ajunge la o valoare de aproximativ 30 de zile de antrenament constant pe
parcursul a aproape 3 luni pentru a ajunge la performanță actuală.

Eu consider că în forma actuală a proiectului, acesta nu poate fi implementat


într-un sistem real din cauza faptului că eu am presupus că poziția locului de parcare
țintă este cunoscută încă de la început, lucru care în realitate nu ar fi posibil. Folosind
un sistem de camere video atașate mașinii, propun două posibile rezolvări pentru
această problemă: implementarea unui sistem separat care determină poziția
aproximativă a locului de parcare sau reantrenarea rețelei folosind informațiile date
de camerele video ca date de intrare.

Consider că o implementare reală a proiectului meu ar aduce multe beneficii și


o scădere foarte mare a procentului de accidente cu daune materiale din parcări.

30
Bibliografie

[1] Unity ML-Agents Toolkit. https://github.com/Unity-Technologies/ml-agents


[2] Fișierul de configurare YAML. https://github.com/Unity-Technologies/ml-
agents/blob/main/docs/Training-Configuration-File.md#gail-intrinsic-reward
[3] Rețele neurale. https://ro.wikipedia.org/wiki/Re%C8%9Bea_neural%C4%83
[4] Schulman J., Moritz P., Levine S., Jordan M., Abbeel P. 8 Jun 2015. Generalized
Advantage Estimate. https://arxiv.org/abs/1506.02438
[5] Weng L. Apr 8, 2018. Proximal Policy Optimization. https://lilianweng.github.io/lil-
log/2018/04/08/policy-gradient-algorithms.html#trpo

31
Lista contribuțiilor personale

Parcare automată utilizând rețele neurale


Student: Achim-Caranica Alexandru
Coordonator: Prof.dr.ing. Bogdan Dumitrescu

Activitate Durată
[zile]
1 Familiarizarea cu Unity3D 2
2 Documentare și cercetare în domeniul inteligenței 4
artificiale
3 Familiarizarea cu ML-Agents 2
4 Construirea mediului de simulare și antrenare a 7
agentului
5 Alegerea parametrilor și hiperparametrilor inițiali 2
pentru antrenare
6 Antrenare și ajustarea parametrilor și 35
hiperparametrilor în funcție de rezultatele obținute
la antrenare
7 Refacerea și perfecționarea agentului cu 3
parametrilor și hiperparametrilor optimi
8 Finalizare proiect și pregătire pentru prezentare 2
9 Redactarea lucrării de licență 10
Total 67

32

S-ar putea să vă placă și