Ako funguje spätné šírenie a ako môžete pomocou Pythonu vytvoriť neurónovú sieť

Neurónové siete môžu byť zastrašujúce, najmä pre ľudí, ktorí sa v oblasti strojového učenia začínajú. Tento tutoriál však rozdelí, ako presne funguje neurónová sieť a na konci budete mať funkčnú flexibilnú neurónovú sieť. Začnime!

Pochopenie procesu

S približne 100 miliardami neurónov ľudský mozog spracováva údaje rýchlosťou až 268 mph! Neurónová sieť je v podstate súbor neurónov spojených synapsiami .

Táto kolekcia je organizovaná do troch hlavných vrstiev: vstupná neskoršia, skrytá vrstva a výstupná vrstva.

Môžete mať veľa skrytých vrstiev, kde práve vstupuje do hry pojem hlboké učenie . V umelej neurónovej sieti existuje niekoľko vstupov, ktoré sa nazývajú prvky , ktoré vytvárajú aspoň jeden výstup - ktorý sa nazýva štítok .

Na obrázku vyššie kruhy predstavujú neuróny, zatiaľ čo čiary synapsie.

Úlohou synapsie je brať a znásobovať vstupy a váhy .

Váhy si môžete predstaviť ako „silu“ spojenia medzi neurónmi. Váhy primárne definujú výstup neurónovej siete. Sú však vysoko flexibilné. Potom sa použije aktivačná funkcia na vrátenie výstupu.

Tu je stručný prehľad toho, ako funguje jednoduchá dopredná neurónová sieť:

  1. Ber vstupy ako maticu (2D pole čísel)
  2. Násobte vstupy množinou váh (to sa robí násobením matíc, alias použitím „bodového súčinu“)
  3. Použite aktivačnú funkciu
  4. Vrátiť výstup
  5. Chyba sa počíta z rozdielu medzi požadovaným výstupom z modelu a predpovedaným výstupom. Toto je proces zvaný gradientný zostup, ktorý môžeme použiť na zmenu váh.
  6. Váhy sa potom upravia podľa chyby zistenej v kroku 5.
  7. Na zaškolenie sa tento proces opakuje viac ako 1 000-krát. Čím viac údajov budeme trénovať, tým presnejšie budú naše výstupy.

V jadre sú neurónové siete jednoduché.

Iba vykonávajú násobenie matíc so vstupom a váhami a používajú aktivačnú funkciu.

Keď sa váhy upravujú pomocou funkcie gradientu straty, sieť sa prispôsobuje zmenám, aby produkovala presnejšie výstupy.

Naša neurónová sieť bude modelovať jednu skrytú vrstvu s tromi vstupmi a jedným výstupom. V sieti budeme predpovedať skóre našej skúšky na základe vstupov, koľko hodín sme sa učili a koľko hodín sme deň predtým spali. Výstupom je „skóre testu“.

Tu sú naše vzorové údaje o tom, na čom budeme trénovať našu neurónovú sieť:

Ako ste si mohli všimnúť, ?v tomto prípade predstavuje to, čo chceme, aby naša neurónová sieť predpovedala. V tomto prípade predikujeme skóre testu niekoho, kto sa učil štyri hodiny a osem hodín spal, na základe jeho predchádzajúceho výkonu.

Dopredné šírenie

Začnime kódovať tohto zlého chlapca! Otvorte nový súbor pythonu. Budete chcieť importovať, numpypretože nám pomôže s určitými výpočtami.

Najskôr importujme naše údaje ako početné polia pomocou np.array. Budeme tiež chcieť normalizovať naše jednotky, pretože naše vstupy sú v hodinách, ale náš výstup je testovacie skóre od 0 do 100. Preto musíme naše údaje škálovať vydelením maximálnej hodnoty pre každú premennú.

Ďalej definujeme python classa napíšeme initfunkciu, kde upresníme naše parametre ako vstupná, skrytá a výstupná vrstva.

Je čas na náš prvý výpočet. Pamätajte, že naše synapsie vykonávajú bodový súčin alebo maticové znásobenie vstupu a váhy. Váhy sa generujú náhodne v rozmedzí od 0 do 1.

Výpočty za našou sieťou

V množine údajov sú naše vstupné údaje Xmatica 3x2. Naše výstupné údaje ysú matica 3x1. Každý prvok v matici Xje potrebné vynásobiť zodpovedajúcou váhou a potom pridať k všetkým ďalším výsledkom pre každý neurón v skrytej vrstve. Tu je príklad, ako by prvý vstupný dátový prvok (2 hodiny štúdia a 9 hodín spánku) vypočítal výstup v sieti:

Tento obrázok rozkladá, čo naša neurónová sieť v skutočnosti robí, aby produkovala výstup. Najskôr sa produkty náhodne generovaných váh (.2, .6, .1, .8, .3, .7) na každej synapse a príslušné vstupy spočítajú, aby sa získali ako prvé hodnoty skrytej vrstvy. Tieto sumy sú malým písmom, pretože to nie sú konečné hodnoty pre skrytú vrstvu.

Aby sme získali konečnú hodnotu pre skrytú vrstvu, musíme použiť aktivačnú funkciu.

Úlohou aktivačnej funkcie je zaviesť nelinearitu. Výhodou toho je, že výstup je mapovaný z rozsahu 0 a 1, čo uľahčuje zmenu váh v budúcnosti.

Existuje veľa aktivačných funkcií pre rôzne prípady použitia. V tomto príklade sa budeme držať jednej z najpopulárnejších - funkcie sigmoidu.

Teraz musíme na výpočet hodnoty výstupnej vrstvy znova použiť násobenie matíc s ďalšou sadou náhodných váh.

Na záver, aby sme normalizovali výstup, stačí znova použiť aktivačnú funkciu.

A je to! Teoreticky s týmito váhami sa vonkajšia neurónová sieť vypočíta .85ako naše testovacie skóre! Náš cieľ však bol .92. Náš výsledok nebol zlý, jednoducho nebol najlepší, aký mohol byť. Len sme mali trochu šťastia, keď som pre tento príklad vybral náhodné závažia.

Ako trénujeme náš model, aby sa učil? No to sa dozvieme veľmi skoro. Zatiaľ počítajme s kódovaním našej siete.

Ak ste stále zmätení, veľmi vám odporúčam pozrieť si toto informatívne video, ktoré s rovnakým príkladom vysvetľuje štruktúru neurónovej siete.

Vykonávanie výpočtov

Teraz si vygenerujme svoje váhy náhodne pomocou np.random.randn(). Pamätajte, že budeme potrebovať dve sady závaží. Jeden prechádza zo vstupnej do skrytej vrstvy a druhý zo skrytej do výstupnej vrstvy.

Keď máme všetky premenné nastavené, sme pripravení napísať našu forwardpropagačnú funkciu. Poďme odovzdať náš vstup Xa v tomto príklade môžeme pomocou premennej zsimulovať aktivitu medzi vstupnou a výstupnou vrstvou.

Ako bolo vysvetlené, musíme zobrať bodový súčin vstupov a váh, použiť aktivačnú funkciu, vziať ďalší bodový súčin skrytej vrstvy a druhej sady váh a nakoniec použiť konečnú aktivačnú funkciu na príjem nášho výstupu:

Nakoniec musíme definovať našu funkciu sigmoidu:

A máme to! (Netrénovaná) neurónová sieť schopná produkovať výstup.

Ako ste si mohli všimnúť, musíme našu sieť trénovať, aby sme mohli vypočítať presnejšie výsledky.

Backpropagation - „učenie“ sa našej siete

Pretože máme náhodnú množinu váh, musíme ich zmeniť, aby sa naše vstupy rovnali zodpovedajúcim výstupom z našej množiny údajov. To sa deje pomocou metódy nazývanej spätné šírenie.

Backpropagation funguje pomocou funkcie straty na výpočet vzdialenosti od cieľového výstupu.

Chyba vo výpočte

Jedným zo spôsobov predstavovania stratovej funkcie je použitie funkcie priemerného súčtu štvorcových strát :

V tejto funkcii oje náš predpokladaný výstup a ynáš skutočný výstup. Teraz, keď máme stratovú funkciu, naším cieľom je dostať ju čo najbližšie k 0. To znamená, že budeme musieť mať stratu takmer nulovú. Keď trénujeme našu sieť, robíme iba to, aby sme minimalizovali straty.

Aby sme zistili, ktorým smerom meniť váhy, musíme nájsť mieru zmeny našej straty vzhľadom na naše váhy. Inými slovami, aby sme pochopili, ako váhy ovplyvňujú vstup, musíme použiť deriváciu stratovej funkcie.

V takom prípade použijeme čiastočnú deriváciu, ktorá nám umožní zohľadniť inú premennú.

Táto metóda je známa ako gradientný zostup . Keď vieme, akým spôsobom môžeme zmeniť svoju váhu, naše výstupy môžu byť iba presnejšie.

Tu je postup, ako vypočítame prírastkovú zmenu našich váh:

  1. Nájdite mieru chyby výstupnej vrstvy (o) tak, že vezmete rozdiel medzi predpokladaným výstupom a skutočným výstupom (y)
  2. Použite deriváciu našej funkcie aktivácie sigmoidu na chybu výstupnej vrstvy. Tento výsledok nazývame delta výstupný súčet .
  3. Použite delta výstupný súčet chyby výstupnej vrstvy na to, aby ste zistili, koľko naša vrstva z² (skrytá) prispela k výstupnej chybe vykonaním bodového súčinu s našou druhou váhovou maticou. Môžeme to nazvať chybou z².
  4. Vypočítajte delta výstupný súčet pre vrstvu z² použitím derivácie našej funkcie aktivácie sigmoidu (rovnako ako v kroku 2).
  5. Váhy pre prvú vrstvu upravte vykonaním bodového súčinu vstupnej vrstvy so skrytým () delta výstupným súčtom . Pre druhú váhu vykonajte bodový súčin skrytej (z²) vrstvy a výstupného (o) delta výstupného súčtu .

Výpočet delta výstupného súčtu a následné použitie derivácie sigmoidnej funkcie sú pre spätné šírenie veľmi dôležité. Derivát sigmoidu, tiež známy ako sigmoid prime , nám dá rýchlosť zmeny alebo sklon aktivačnej funkcie pri výstupnom súčte.

Pokračujme v kódovaní našej Neural_Networktriedy pridaním funkcie sigmoidPrime (derivácia sigmoidu):

Potom budeme chcieť vytvoriť našu backwardpropagačnú funkciu, ktorá urobí všetko, čo je uvedené v štyroch vyššie uvedených krokoch:

Teraz môžeme definovať náš výstup iniciovaním šírenia smerom nadol a spätnú funkciu vyvolať volaním vo trainfunkcii:

Ak chcete spustiť sieť, musíme spustiť iba túto trainfunkciu. Samozrejme, budeme to chcieť urobiť viackrát, alebo možno tisíckrát. Použijeme teda forslučku.

Tu je celých 60 riadkov úžasnosti:

Tu to máte! Plnohodnotná neurónová sieť, ktorá sa môže učiť zo vstupov a výstupov.

Aj keď sme naše vstupy považovali za hodiny štúdia a spánku a naše výstupy za výsledky testov, môžete ich ľubovoľne zmeniť a sledovať, ako sa sieť prispôsobuje!

Koniec koncov, všetko, čo sieť vidí, sú čísla. Všetky naše výpočty, ktoré sa zdali zložité, hrali v našom modeli učenia veľkú úlohu.

Ak chcete predpovedať výstup na základe našich trénovaných údajov, napríklad predpovedanie skóre testu, ak ste študovali štyri hodiny a spali osem, pozrite si celý návod tu.

Demo a zdroj

Referencie

Steven Miller

Welch Labs

Kabir Shah

Tento tutoriál bol pôvodne zverejnený na webe Enlight, ktorý je hostiteľom rôznych tutoriálov a projektov, ktoré sa môžete naučiť budovaním! Vyskúšajte ďalšie projekty, ako sú tieto :)