Mar 22 2008
Neuronová síť Backpropagation v PHP
Jedná se o velmi triviální příklad dopředné neuronové sítě se třemi neurony a třemi vrstvami (vstupní vrstva, jedna skrytá vrstva a výstupní vrstva) a sigmoidou jako aktivační funkcí. Síť se dvěma vstupy a jedním výstupem lze naučit jednoduché logické funkce (např. XOR).
Moje krásná grafická reprezentace sítě:
Zdrojový soubor ke stažení: backpropagation PHP
Studijní zdroje:
- Graficky dobře zpracovaný a názorný příklad funkce a zpětného šíření chyby této neuronové sítě: Backpropagation, zde se však vyskytuje chyba v tom, že parciální derivace aktivační funkce podle vnitřní proměnné neuronu se musí použít při výpočtech hodnot delta a ne až při výpočtech vah …
- … takže se mrkněte třeba na The Backpropagation Algorithm kde už je to napsáno správně
05.04.2008, 16:20
Nejedná se ale o zpětné řetězení? (back propagation vs. věta na začátku článku).
06.04.2008, 21:37
Oba pojmy rozhodně nejdou proti sobě, jedná pouze o různé způsoby klasifikace téže neuronové sítě.
Backpropagation: klasifikace podle způsobu učení — to probíhá na základě zpětného šíření chyby.
Dopředná neuronová síť: klasifikace dle architektury sítě — propojední neuronů nevytváří cykl (nejsou zpětně propojení) ani neexistují propojení mezi neurony téže vrstvy.
viz také: Feedforward neural network alias „dopředná neuronová síť“ na wiki
11.01.2010, 21:47
Děkuji za tento příklad, na kterém jsem to pochopil, moc mi pomohl :) (zamotal jsem se v matematických vzorcích na back-propagation)
Jen bych se chtěl zeptat, zdá se mi že máte chybu ve změně vah:
$w[1][$i] += $lr * 1 * $d[$i];
$w[2][$i] += $lr * $v1 * $d[$i];
$w[3][$i] += $lr * $v2 * $d[$i];
kde bych podle obrázku čekal (prohozené rozměry u pole):
$w[$i][1] += $lr * 1 * $d[$i];
$w[$i][2] += $lr * $v1 * $d[$i];
$w[$i][3] += $lr * $v2 * $d[$i];
pokud tedy dobře chápu, že tím cyklem for se projíždí neuron po neuronu, a vždy se upravují váhy, které do neuronu vedou z jiných.
PS: u ochrany prosi spamu není jasné jestli mám psát slovně nebo číslo, napsal jsem číslo a smazalo mi to jednou celý příspěvek, psal jsem ho tudíž znovu :(
11.01.2010, 21:49
Omlouvám se za to PS, ochrany fungují jak mají číselně, akorát konkrétní příklad „Kolik je součet čísel 2 a 2?“ mi nefungoval
12.01.2010, 11:34
Já myslím že výpočet je to dobře, možná jen nevhodně zvolený komentář. Pokud se podíváte na obrázek a k němu odpovídající kód, zjistíte že jsou prohozené indexy pole (což vás zřejmě zmátlo), tedy:
potom výpočet opravdu funguje tak, že index $i udává index neuronu a nastavuje pro něho váhy, příklad pro váhy neuronu 1:
atd pro $i = 2 …
Tedy každý cykl upravý na základě vstupů (c1, c2, x1, x2) a výstupů (delta1,2,3) daného neuronu váhu jeho vstupů.