-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[2022] Simulacije muve #9
base: master
Are you sure you want to change the base?
Changes from 1 commit
7770609
876efdb
7007ffd
1115fe8
d370f5c
abc8624
f0d987c
720598a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,3 +2,147 @@ | |
title: Simulacija muve | ||
summary: Simulacija muve je projekat rađen na letnjem kampu za stare polaznike 2022. godine od Aleksandra Raškovića i Tadeja Ristića. | ||
--- | ||
|
||
### Apstrakt | ||
- | ||
### Apstrakt na engleskom | ||
- | ||
### Uvod | ||
- | ||
- Sada kada imamo fizičku simulaciju muve, na red je došlo da je naučimo da leti. Naš cilj je bio da muva postigne što veću visinu za određeno vreme. | ||
Za treniranje muve sam odlučio da koristim genetski algoritam u kombinaciji sa veštačkom neuralnom mrežom. | ||
- Odlučio sam da iskucam sam svoju neuralnu mrežu, kao i genetski algoritam. Jedina biblioteka koju sam koristio je NumPy da mi omogući rad sa matricama, vektorima i ostale matematičke operacije. | ||
|
||
### Aparatura i metoda - Simulacija fizike | ||
|
||
#### Kinematika | ||
|
||
Sam model muve predstavljen je pozicijama karakterističnih tačaka u lokalnom 3D prostoru. Klasu muve možemo smatrati jednim lokalnim koordinatnim sistemom. Taj lokalni koordinatni sistem ima svoju poziciju, i brzinu u globalnom koordinatnom sistemu i na njemu primenjujemo zakone pravolinijskog i rotacionog ravnomernog ubrzanog (ili usporenog) kretanja. Lokalne koordinate muve konvertujemo u globalni koordinatni sistem pomoću *homogenous transformation matrices*, radi prikaza u 3D prostoru i daljeg računanja u dinamici. | ||
Aleksandar204 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
**Voditi računa o redosledu operacija množenja matrica!** $M = T \times R\times S$ , gde je $T$ matrica translacije, $R$ matrica rotacije i $S$ matrica skaliranja. | ||
Aleksandar204 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Simulacija kinematike se vrši sa vremenskim stepenom od 1ms. Radi preciznije simulacije bržih pokreta mougće je još smanjiti $dt$, ali time se usporava brzina treniranja simulacije. | ||
Aleksandar204 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
#### Dinamika | ||
Aleksandar204 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Drugi deo fizičke simulacije jeste dinamika. Originalna zamisao je bila da simuliramo vazduh kao fluid, ali zbog kompleksnosti programa i brzine treniranja neuralne mreže smo odustali od te ideje. Umesto toga, koristili smo jednačinu sile otpora sredine. | ||
|
||
$$\overrightarrow{F} = \frac{1}{2}\rho \overrightarrow{v}|v|C_DA$$ | ||
Aleksandar204 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
$C_D$ je koeficijent sile otpora, On je konstanta koja zavisi od oblika tela i njegovog ugla u odnosu na pravac kretanja. Umesto računanja tog koeficijenta za svaki ugao, ili uzimanja poznatih tabličnih vrednosti, u formulu smo dodali kosinus od ugla krila kao aproksimaciju. | ||
Aleksandar204 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Druga aproksimacija koja je korištena je kod računanja momenata sila i ugaonog ubrzanja. Umesto da se uvek izračunava osa oko koje se rotira muva, za osu rotacije uvek uzimamo centar mase muve. | ||
|
||
|
||
### Aparatura i metoda - ML | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Implementirana je neuralna mreža i genetski algoratam tako da se jednostavnim interfejsom može primeniti za razne ML probleme. Takođe je implementiran i kod koji koristi ove biblioteke za treniranje muve da leti. Više o interfejsu između muve i genetskog algoritma malo kasnije. | ||
|
||
Kod je podeljen u dva dela | ||
- network.py - ovde je implementirana mreža | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Možeš malo da pojasniš ovo @basicskill There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ispravka, nema potrebe za naglašavanjem u koje fajlove je kod podeljen. |
||
- geneticAlgo.py - ovde je implementiran genetski algoritam | ||
|
||
Implementacija svega je bila u jeziku python3 Za implementaciju mreže je potrebna samo biblioteka NumPy. | ||
|
||
Napravljene su dve verzije mreže, jedna vektorizovana i druga ne vektorizovana. Ovde ću opisati implementaciju vektorizovane mreže i algoritama koji su prilagođeni takvoj implementaciji. | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
#### Opis interfejsa za treniranje | ||
Algorigam funkcioniše tako što traži da korisnik inicijalizuje populaciju tipa Population nad kojom će posle pozvati funkciju run. Pri pravljenju populacije treba da prosledi broj jedinki u populaciji i arhitekturu mreže. Pri pozivu funkcije run nad populacijom treba da se proslede fitnes funkcija i ostali parametri kao što su šansa za mutaciju gena, nazivi fajlova u kojima će se čuvati geni najboljih mreža, način na koji će se čuvati itd. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
||
Fitnes funkcija je funkcija koju implementira korisnik koja treba da odredi koliko je dobar svaki gen tj. mreža za određeni zadatak. Ona će biti pozvana jednom za svaku generaciju. biće joj prosleđena lista gena. Korisnik pomoću svakog gena može da generiše neuralnu mrežu koristeći funkciju koju smo implementirali. Fitnes funkcija treba da promeni fitness član genoma u listi za svaki genom prema želji korisnika. Korisnik može da odabere na koji način će oceniti svaku mrežu. Kako bi koristio mreže korisnik može na objektu mreže koji je inicijalizovao pomoću gena da pozove funkciju Activate i da joj prosledi ulazne podatke za mrežu formata NumPy matrice. U svakoj koloni matrice je zaseban set ulaznih podataka mreže (input features). Imamo više kolona u slučaju da kroz istu mrežu želimo odjednom da prosledimo više setova aktivacija. U našem slučaju imaćemo samo jednu kolonu jer obrađujemo samo ulazne podatke od jedne bube za svaku mrežu. Funkcija Activate nam vraća vektor sličnog formata kao na ulazu sa izlaznim vrednostima mreže za svaki set. | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Označimo sa $X_{j}^{i}$ j-ti ulazni podatak (input feature) od i-tog seta ulaznih podataka. Onda format matrice ulaznih podataka za funkciju Activate izgleda ovako: | ||
|
||
| Set 1 | Set 2 | ... | Set m | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Šta je poenta ove tabele? |
||
| ----- | ----- | ----- | ----- | | ||
| $X_{1}^{1}$ | $X_{1}^{2}$ | ... | $X_{1}^{m}$ | | ||
| $X_{2}^{0}$ | $X_{2}^{2}$ | ... | $X_{2}^{m}$ | | ||
| ... | ... | ... | ... | | ||
| $X_{n}^{1}$ | $X_{n}^{2}$ | ... | $X_{n}^{m}$ | | ||
|
||
Ovde imamo n ulaznih podataka za svaki set. Imamo m setova. Ovo znači da naša mreža u prvom sloju ima n neurona i da će u ovom slučaju obrađivati m setova ulaznih podataka paralelno. Vrednost m ne mora da bude ista za svaki poziv Activate funkcije dok n mora jer je već definisana arhitekturom mreže. | ||
|
||
**bitno je voditi računa o orijentacijama vektora u implementaciji!** | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Izveštaj nije uputstvo za korišćenje koda, već objašnjenje metodologije i pregled rezultata. Hajde da ne pišemo ove boldovane komentare |
||
|
||
#### Funkcionisanje genetskog algoritma | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Sve informacije o nekoj mreži nam se nalaze u njenom genu. Objekat gena sadrži razne podatke o mreži u sebi, kao i sve parametre mreže. Pri pravljenju populacije svi parametri dobijaju nasumične vrednosti po gausovoj (normalnoj) raspodeli sa standardnom devijacijom koja se prosleđuje konstruktoru. | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Algoritam se sastoji iz 3 faze | ||
- selection | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- crossover | ||
- mutation | ||
|
||
##### Selection faza: | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Nakon što se završi fitnes funkcija program bira najboljih 10% gena. Od njih pravi 'mating pool'. | ||
|
||
##### Crossover faza: | ||
Novi geni se generišu tako što se biraju nasumično dva 'rotitelja' iz 'mating poola'. Parametri nove mreže mogu da se dobiju na razne načina. Konkretno u našem slučaju za svaki parametar mreže ima $x$ šanse da bude iz prvog roditelja i $1-x$ šanse da bude iz drugog ($x$ je jedan od parametara koji prosleđujemo run funkciji). | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
##### Mutation faza: | ||
Nakon ovog dela vrše se nasumične mutacije na svakom od novih gena. Učestalost ovih mutacija takođe može da se prosledi u run funkciji. | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
##### Dodatna faza: | ||
Program takođe čuva 5% najboljih gena iz prošle generacije bez promena. | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
#### Implementacija mreže | ||
U kodu za neuralnu mrežu je implementirana samo feedforward funkcija, tj. funkcija propagacije u napred, jer nam za genetski algoritam propagacija u nazad nije potrebna. Za svaki sloj mreže osim ulaznog imamo dve matrice parametara. Jedna je matrica težina, dok je druga matrica zapravo vektor sklonosti (bias). Sve parametre čuvamo u rečniku. Slojeve mreže indeksiramo od nula tako da su nam parametri u rečniku sačuvani kao "W1", "b1", "W2", "b2", ..., "Wn-1", "bn-1", ako je n broj slojeva mreže. Obratite pažnju na to da indeksiranje kreće od nule i da prvi (ulazni) sloj u mrežu nema parametre. | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Označimo sa $W[k]_{ij}$ težinu veze između i-tog čvora iz trenutnog (k-tog) sloja mreže sa j-tim čvorem iz prethodnog (k-1) sloja. Onda format za težine k-tog sloja neurelne mreže izgleda ovako: | ||
|
||
| | | | | | ||
| ----- | ----- | ----- | ----- | | ||
| $W[k]_{00}$ | $W[k]_{01}$ | ... | $W[k]_{0m}$ | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Čemu služi ova tabela? |
||
| $W[k]_{10}$ | $W[k]_{11}$ | ... | $W[k]_{1m}$ | | ||
| ... | ... | ... | ... | | ||
| $W[k]_{n0}$ | $W[k]_{n1}$ | ... | $W[k]_{nm}$ | | ||
|
||
Ovde imamo n neurona u trenutnom (k-tom) sloju neuralne mreže i m neurona u prethodnom (k-1) sloju. | ||
|
||
Označimo sa $b[k]_{i}$ sklonost tj. bias i-tog čvora trenutnog (k-tog) sloja neuronske mreže. Onda format za sklonosti tj. bias-ove k-tog sloja neuralne mreže izgleda ovako: | ||
|
||
| | | ||
| ----- | | ||
| $b[k]_{0}$ | | ||
| $b[k]_{1}$ | | ||
| ... | | ||
| $b[k]_{n}$ | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Čemu služi ova tabela? |
||
|
||
Ovde imamo n neurona u trenutnom (k-tom) sloju neuralne mreže. | ||
|
||
Glavna funkcija u mreži je Activate. Njoj se kao parametar zadaje matrica ulaznih podataka koja je ranije opisana u zaglavlju opis interfejsa za treniranje. Funkcija radi propagaciju unapred. Za svaki sloj k (bez prvog, tj. ulaznog) radi sledeće operacije: | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
$$ | ||
Z[k] = W[k] \times A[k-1] + b[k] | ||
$$ | ||
$$ | ||
A[k] = tanh(Z[k]) | ||
$$ | ||
|
||
**Imati na umu da je $\times$ operacija množenja matrica** | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Znamo, nema potrebe za ovim boldovanim tekstom |
||
|
||
Aktivaciona funkcija može da bude i neka druga nelinearna funkcija unesto tanh, kao što su sigmoid ili ReLU | ||
|
||
Ovime smo vektorski implementirali izračunavanje aktivacija trenutnog (k-tog) sloja mreže iz aktivacija prethodnog (k-1) sloja. | ||
|
||
Funkcija Activate na kraju vraća matricu aktivacija $A[n-1]$, gde je n broj slojeve u neuralnoj mreži. Voditi računa o tome da su slojevi indeksirani od 0. | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
|
||
#### Čuvanje podataka | ||
Tadiorn marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Za čuvanje podataka kao što su najbolji gen muve za određene generacije ili cela populacija u nekom trenutku treniranja, koristimo biblioteku pickle. Ova biblioteka nam omogućava da u fajlovima sa .pickle ekstenzijom sačuvamo python objekat kome posle lako možemo da pristupimo. | ||
|
||
Mehanizam čuvanja najboljeg gena generacije koji je implementiran u geneticAlgo.py fajlu je sledeći. Kada fitnes najboljeg gena pređe neku zadatu vrednost fitness_treshold, onda program čuva najbolji gen u fajl. Onda povećava fitness_treshold za delta_fitness kako bi čuvao samo fajlove kada algoritam napravi neki pomak. Nakon što fitness_treshold dostigne vrednost max_fitness_treshold, više se ne povećava. | ||
|
||
Naziv fajla u koji čuvamo podatke počinje stringom koji je sačuvan u parametru savefile_prefix. Ostatak naziva fajla zavisi od broja generacije u kojoj je sačuvan kao i ostalih vrednosti koje su bitne. | ||
|
||
Nakon što završimo treniranje na zadatom broju generacija, program sačuva celu populaciju u fajl koji se završava stringom koji je sačuvan u parametru savefile_suffix. Ostatak naziva sadrži ostale bitne podatke o populaciji. Fajl koji dobijemo ovde nam je bitan ukoliko želimo da treniramo mrežu iz više puta, uz možda menjanje nekih stvari kao što su fitnes funkcija i ostali parametri u međuvremenu. | ||
|
||
Može da se desi da nam je fitnes funkcija komplikovana i da ne predstavlja lepo nešto kao što je npr. score u nekoj igri. U tom slučaju za svaki gen postoji i član score kome možemo dodeliti bilo koju vrednost u našoj fitnes funkciji. Pomoću score člana možemo da čuvamo fajlove isto kao i sa fitnesom. Samo zamenime reč fitness sa score u promenjivima. | ||
|
||
Parametri fitness_treshold, delta_fitness, max_fitness_treshold, score_treshold, delta_score, max_score_treshold, savefile_prefix, savefile_suffix parametri koje opciono možemo prosledidi kada pozivamo funkciju run nad našom populacijom na početku programa. | ||
|
||
#### Treniranje muve | ||
Jedan deo veze između genetskog algoritma i fizike je implementiran u fajlu bugControll.py. Za naš projekat se u njemu generiše populacija p od 100 jedinki čija arhitektura mreže je \[15, 20, 20, 3]. Ovo znači da u ulaznom sloju u mrežu postoji 15 neurona, u dva skrivena sloja po 20 neurona i u izlaznom sloju postoji 3 neurona. Ulaznih 15 neurona predstavljaju trodimenzionalne vektore pozicije bube, rotacije bube, brzine bube, brzine rotacije bube i rotacije jednog krila. Mreža na izlazu izbacuje novu rotaciju krila u sledećem trenutku. Krila su simetrična tako da su dovoljni podaci samo za jedno krilo. Ukoliko se aktivira opcija za ne simetrična krila, bilo bi potrebno 18 ulaznih čvorova i 6 izlaznih. | ||
|
||
Zatim se poziva funkcija run nad populacijom i prosledjuju joj se fitnes funkcija, broj generacija, šansa za preuzimanje gena od drugog roditalja umesto prvog u crossover fazi, šansa da se desi mutacija za svaki parametar neuralne mreže u mutation fazi. Takođe se prosleđuju i parametri vezani za čuvanje fajlova najboljih gena ili celih populacija u slučaju da želimo da treniramo mreže iz više puta. | ||
|
||
U ovom fajlu je takođe implementirana i fitnes funkcija koju smo nazvali main. Ona ima listu gena kao parametar. Na osnovu te liste generiše listu neuralnih mreža. Za svaku muvu, tj. gen, program poziva funkciju iz drugog fajla physics.py kojoj prosleđuje mrežu. Ta funkcija vrši simulaciju kretanja muve pomoću mreže koju je dobila i vraća nazad podatke o poziciji, rotaciji i ostalim parametrima muve u svakom trenutku simulacije. | ||
|
||
Za svaki gen nakon izvršavanja pomenute funkcije računamo fitnes tako što uzmemo da je fitnes jednak visini bube u poslednjem trenutku simulacije. Nakon što ovo uradimo za svaku bubu, funkcija se završava. Zatim se u fajlu geneticAlgo.py dešava stvaranje nove generacije gena za muve i zatim se opet pokreće naša fitnes funkcija sa novim genima. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.