Mesterséges neurális hálózatot, ami evolúcióval tanul, hogyan lehet létrehozni? Milyen programozási nyelvvel?
Készítsek több virtuális "egyént" és azoknak a stratégiáit kombináljam, amiknek a leghatékonyabb volt az eredménye?
Milyen feladatot akarjanak megoldani az egyének?
A legegyszerűbb, ha valami karakterekkel kapcsolatos felatatra fogod megírni az evolúciós algoritmust. Például, hogy az egyedek kifejlődjek arra, hogy kitaláljanak egy jelszót.
Igen, azoknak a stratégiáit kombináljad, amiknek a leghatékonyabb volt az eredménye?
A legfontosabb, hogy az egyedeket pontozni kell, hogy milyen közel vannak a helyes úthoz. Pl: Aki kitalált több betűt a jelszóból, az több pontot kap, mint az aki kevés betűt talált el a jelszóból.
Ha kell még segítség, akkor írhatol privátban is.
A gyakorlatban ugyis az lesz, hogy felhasznalsz egy mar letezo libraryt a te sajat egyedi problemad megoldasara. Ha a kulonbozo neuralis halokat akarod osszehasonlitani/jatszani veluk, akkor van ertelme csak leprogramozni egyet 0-rol. (esetleg ha valami teljesen uj helyen akarod hasznalni, pl. mikrokontrolleren, vagy celhardware-en)
Egyebkent egy neuralis halot kb. ennyi leprogramozni, ha vannak matrixmuveleteid:
https://www.youtube.com/watch?v=h3l4qz76JhQ
Szinten ezen a csatornan vannak egyszerubb evolucios algoritmusok is. De persze ennek a tanulas a celja, szoval Siraj probalja annyira leegyszerusiteni, amennyire csak lehet. (neha kicsit jobban sikerul, pl. kivagja belole a biast/tresholdot, amire a kommentekben is panaszkodtak)
A súlyok kezdeti értékét mindegy hogy hogy generálod, csak működjön vele a tanulás, és minnél gyorsabban tanuljon, és minél pontosabban tanulja meg amit kell. Ezért érdemes kísérletezni külömböző kezdeti értékekkel.
Nekem például ezek a kezdeti értékek váltak be legjobban:
double Neuron::initRandomWeight(void)
{
// Initialize a weight to -0.1 or +0.1 randomly.
double w = 0.1;
if ((rand() % 2) == 0)
w = -w;
return w;
}
Itt van még egy másik példa is:
double Neuron::initRandomWeight(void)
{
// Initialize a weight to random values between -0.5 and +0.5
double d = 0.5;
double lo = -d;
double hi = +d;
return ((hi - lo) * (rand() / double(RAND_MAX))) + lo;
}
Nekem van erre egy saját Python könyvtáram, csekkold le:
Amúgy két megközelítés van. A legegyszerűbb, ha a háló súlyait akarod evolválni. Ha van összesen 30 súly egy hálóban és van 100 egyed a populációban, akkor van egy 100x30-as mátrixod, ez a populáció, amit evolválsz. A fitnesze az egyes egyedeknek pl. az osztályozási pontosság vagy az átlagos négyzetes hiba (MSE).
Bonyolultabb, ha az architektúrát is akarod evolválni, tehát hogy hány rejtett réteg van meg azokban hány neuron. Ekkor valahogy kódolnod kell magát az architektúrát is. Ez tényleg bonyás, erre már vannak komoly algoritmusok, mint pl. a NEAT vagy a hyperNEAT.
Van mostanság egy vicces feljövő terület, csak érdekességként, amikor neurális hálók tanítanak neurális hálókat
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!