Mar 22 2008

Neuronová síť Backpropagation v PHP

Tag: Nezařazené,PHPJens @ 23:00

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ě:

Backpropagation

Zdrojový soubor ke stažení: backpropagation PHP

Studijní zdroje:

  1. 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 …
  2. … takže se mrkněte třeba na The Backpropagation Algorithm kde už je to napsáno správně
  3. Google

5 komentáře k článku “Neuronová síť Backpropagation v PHP”

  1. szk napsal:

    Nejedná se ale o zpětné řetězení? (back propagation vs. věta na začátku článku).

  2. Jens napsal:

    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

  3. Arcanis napsal:

    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 :(

  4. Arcanis napsal:

    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

  5. Jens napsal:

    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:

    $w[1][1] -- je neuron 1, vstup 1 (na obrázku w11),
    $w[2][1] -- je neuron 1, vstup 2 (na obrázku w12),
    $w[3][1] -- je neuron 1, vstup 3 (na obrázku w13),
    

    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:

    // pro $i = 1 (prvni cykl)
    $w[1][1] += $lr * 1 * $d[1];   // w11 = learning_rate * c1 * delta1
    $w[2][1] += $lr * $v1 * $d[1]; // w12 = learning_rate * x1 * delta1
    $w[3][1] += $lr * $v2 * $d[1]; // w13 = learning_rate * x2 * delta1
    

    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ů.