Hogyan működik a háttérpropagáció, és hogyan lehet a Python segítségével felépíteni egy neurális hálózatot

Az idegrendszeri hálózatok félelmetesek lehetnek, különösen a gépi tanulás előtt álló emberek számára. Ez az oktatóanyag azonban lebontja, hogy pontosan hogyan működik egy neurális hálózat, és a végére egy működő, rugalmas neurális hálózat lesz. Kezdjük el!

A folyamat megértése

Körülbelül 100 milliárd idegsejt mellett az emberi agy 268 mph sebességgel dolgozza fel az adatokat! Lényegében az idegi hálózat szinapszisokkal összekapcsolt neuronok gyűjteménye .

Ez a gyűjtemény három fő rétegre tagolódik: a későbbi bemenetre, a rejtett rétegre és a kimeneti rétegre.

Számos rejtett réteged lehet, itt lép életbe a mély tanulás kifejezés . Egy mesterséges neurális hálózatban több bemenet van, amelyeket funkcióknak nevezünk , amelyek legalább egy kimenetet hoznak létre - amelyet címkének hívnak .

A fenti rajzon a körök a neuronokat, míg a vonalak szinapszisokat képviselnek.

A szinapszis szerepe a bemenetek és a súlyok összegyűjtése és szorzása .

Gondolhat a súlyokra, mint az idegsejtek közötti kapcsolat „erősségére”. A súlyok elsősorban a neurális hálózat kimenetét határozzák meg. Ezek azonban rendkívül rugalmasak. Ezután aktiválási funkciót alkalmazunk a kimenet visszaadásához.

Itt egy rövid áttekintés arról, hogyan működik egy egyszerű előremenő neurális hálózat:

  1. A bemeneteket mátrixként vegye fel (2D számtömb)
  2. Szorozzuk meg a bemeneteket egy súlykészlettel (ezt mátrixszorzással, más néven a „dot szorzattal” végezzük)
  3. Aktiválási függvény alkalmazása
  4. Visszaad egy kimenetet
  5. A hibát úgy számolják, hogy elveszik a különbséget a kívánt kimenet és a várható kimenet között. Ez egy gradiens süllyedésnek nevezett folyamat, amelynek segítségével megváltoztathatjuk a súlyokat.
  6. Ezután a súlyokat az 5. lépésben talált hibának megfelelően állítjuk be.
  7. A képzés érdekében ezt a folyamatot több mint 1000-szer megismételjük. Minél jobban betanítják az adatokat, annál pontosabbak lesznek a kimeneteink.

Lényegükben az idegi hálózatok egyszerűek.

Csak mátrixszorzást hajtanak végre a bemenettel és a súlyokkal, és aktiválási funkciót alkalmaznak.

Amikor a súlyokat a veszteség gradiensének függvényében állítják be, a hálózat alkalmazkodik a változásokhoz, hogy pontosabb kimenetet eredményezzen.

Neurális hálózatunk egyetlen rejtett réteget fog modellezni, három bemenettel és egy kimenettel. A hálózatban meg fogjuk jósolni a vizsgánk pontszámát annak alapján, hogy hány órát tanultunk és hány órát aludtunk előző nap. A kimenet a „teszt pontszám”.

Íme a minta adataink arról, hogy mire fogjuk képezni a neurális hálózatunkat:

Amint észrevehette, ?ebben az esetben az jelenti azt, amit az ideghálózatunknak meg akarunk jósolni. Ebben az esetben megjósoljuk annak a tesztpontszámát, aki négy órát tanult és nyolc órát aludt korábbi teljesítménye alapján.

Előre terjedés

Kezdjük kódolni ezt a rossz fiút! Nyisson meg egy új python fájlt. Érdemes importálnia, numpymivel ez segítségünkre lesz bizonyos számításokban.

Először importáljuk adatainkat numerikus tömbökként a segítségével np.array. Az egységeinket is normalizálni szeretnénk, mivel a bemeneteink órákban vannak megadva, de a kimenetünk 0-100 tesztpontszámot jelent. Ezért adatainkat úgy kell méreteznünk, hogy elosztjuk az egyes változók maximális értékével.

Ezután definiáljunk egy pythont, classés írjunk egy initfüggvényt, ahol megadjuk a paramétereinket, például a bemeneti, a rejtett és a kimeneti rétegeket.

Itt az ideje az első számításnak. Ne felejtsük el, hogy szinapszisaink egy pont szorzatot, vagy a bemenet és a súly mátrixszorzását hajtják végre. Ne feledje, hogy a súlyokat véletlenszerűen generálják, 0 és 1 között.

A hálózatunk mögött álló számítások

Az adatkészletben a bemeneti adataink X3x2 mátrixok. Kimeneti adataink, y3x1 mátrix. A mátrix minden elemét meg Xkell szorozni egy megfelelő tömeggel, majd hozzá kell adni az összes többi eredménnyel együtt a rejtett réteg minden egyes neuronjára. Az első bemeneti adatelem (2 óra tanulás és 9 óra alvás) a következőképpen számítja ki a hálózat kimenetét:

Ez a kép lebontja, hogy ideghálózatunk tulajdonképpen mit csinál a kimenet előállításához. Először az egyes szinapszisokban a véletlenszerűen előállított súlyok (.2, .6, .1, .8, .3, .7) szorzatait és a megfelelő bemeneteket összegzik, hogy a rejtett réteg első értékeként megérkezzenek. Ezek az összegek kisebb betűtípusban vannak, mivel nem a rejtett réteg végső értékei.

A rejtett réteg végső értékének megszerzéséhez alkalmaznunk kell az aktiválási függvényt.

Az aktiválási funkció szerepe a nemlinearitás bevezetése. Ennek előnye, hogy a kimenetet 0 és 1 tartományból térképezzük fel, megkönnyítve ezzel a súlyok későbbi módosítását.

Sok aktiválási funkció létezik, sokféle felhasználási esetre. Ebben a példában ragaszkodunk az egyik legnépszerűbbhez - a sigmoid függvényhez.

Most újra fel kell használnunk a mátrix szorzást, egy másik véletlenszerű súlykészlettel a kimeneti réteg értékének kiszámításához.

Végül a kimenet normalizálásához csak újra alkalmazzuk az aktiválási funkciót.

És tessék! Elméletileg, ezekkel a súlyokkal a neuronhálózat kiszámítja .85a teszt pontszámunkat! Célunk azonban az volt .92. Eredményünk nem volt rossz, csak nem a legjobb. Most szerencsénk volt, amikor a véletlenszerű súlyokat választottam ehhez a példához.

Hogyan képezzük a modellünket a tanulásra? Nos, nagyon hamar megtudjuk. Most egyelőre folytassuk a hálózatunk kódolását.

Ha továbbra is zavart, javasoljuk, hogy nézze meg ezt az informatív videót, amely ugyanazzal a példával magyarázza a neurális hálózat szerkezetét.

A számítások végrehajtása

Most generáljuk véletlenszerűen a súlyainkat a segítségével np.random.randn(). Ne feledje, két súlykészletre lesz szükségünk. Az egyik a bemenetről a rejtett rétegre, a másik pedig a rejtettről a kimeneti rétegre kerül.

Miután az összes változót beállítottuk, készen állunk a forwardterjedési függvény megírására . Adjuk meg a bemenetünket, Xés ebben a példában a változó zsegítségével szimulálhatjuk a bemeneti és a kimeneti réteg közötti aktivitást.

Mint kifejtettük, meg kell vennünk a bemenetek és a súlyok ponttermékét, aktiválási függvényt kell alkalmaznunk, a rejtett réteg és a második súlykészlet egy másik ponttermékét kell felvennünk, végül pedig egy végső aktiválási függvényt kell alkalmaznunk a kimenetünk fogadásához:

Végül meg kell határoznunk a sigmoid függvényünket:

És itt van! Kimenet előállítására képes (képzetlen) neurális hálózat.

Mint észrevette, a pontosabb eredmények kiszámításához ki kell képeznünk hálózatunkat.

Backpropage - hálózatunk „tanulása”

Mivel véletlenszerű súlykészletünk van, meg kell változtatnunk őket, hogy a bemeneteink megegyezzenek az adatsorunk megfelelő kimeneteivel. Ez egy backpropagation nevű módszerrel történik.

A visszatenyésztés úgy működik, hogy egy veszteségfüggvény segítségével kiszámítja, hogy a hálózat milyen messze van a célkimenettől.

Számítási hiba

A veszteségfüggvény ábrázolásának egyik módja az átlagos összegű négyzet veszteségfüggvény használata :

Ebben a függvényben oa megjósolt kimenetünk és ya tényleges kimenetünk. Most, hogy megvan a veszteségfüggvény, az a célunk, hogy azt a lehető legközelebb állítsuk a 0-hoz. Ahogy a hálózatunkat képezzük, csak annyit teszünk, hogy minimalizáljuk a veszteséget.

Hogy kitaláljuk, melyik irányba változtassuk a súlyokat, meg kell találnunk a veszteségünk változásának sebességét a súlyainkhoz képest. Más szavakkal, a veszteség függvény deriváltját kell használnunk annak megértéséhez, hogy a súlyok hogyan hatnak a bemenetre.

Ebben az esetben részleges derivatívát fogunk használni, hogy egy másik változót figyelembe vehessünk.

Ez a módszer gradiens süllyedés néven ismert . A kimeneteink csak pontosabbá válhatnak, ha tudjuk, hogy a súlyunk melyik módon változtatható meg.

Így számoljuk ki a súlyunk növekményes változását:

  1. Keresse meg a kimeneti réteg (o) hibahatárát a megjósolt kimenet és a tényleges kimenet (y) különbségének figyelembe vételével
  2. Alkalmazzuk a szigmoid aktiválási függvényünk deriváltját a kimeneti réteg hibájára. Ezt az eredményt nevezzük delta kimeneti összegnek .
  3. Használja a kimeneti réteg hiba delta kimeneti összegét, hogy kitaláljuk, hogy a z² (rejtett) rétegünk mennyiben járult hozzá a kimeneti hibához azáltal, hogy egy pont szorzatot hajtott végre a második súlymátrixunkkal. Nevezhetjük ezt z² hibának.
  4. Számítsa ki a z2 réteg delta kimeneti összegét a sigmoid aktivációs függvény deriváltjának alkalmazásával (akárcsak a 2. lépés).
  5. Állítsa be a súlyokat az első réteg elvégzésével skalárszorzatára a bemeneti réteg a rejtett ( ZZ ) delta kiadási összeget . A második súlyhoz végezze el a rejtett (z²) réteg és a kimeneti (o) delta kimeneti összeg pontszorzatát .

A delta kimeneti összeg kiszámítása, majd a sigmoid függvény deriváltjának alkalmazása nagyon fontos a backpropagation szempontjából. A szigmoid származéka, más néven sigmoid prím , megadja nekünk az aktivációs függvény változásának sebességét vagy meredekségét a kimeneti összegnél.

Folytassuk az Neural_Networkosztályunk kódolását egy sigmoidPrime (a sigmoid származéka) függvény hozzáadásával:

Ezután létre akarjuk hozni a backwardterjesztési függvényünket, amely mindent elvégez a fenti négy lépésben:

Most definiálhatjuk a kimenetünket az előremenő terjedés megkezdésével, és a visszafelé függvényt meghívhatjuk a függvény meghívásával train:

A hálózat működtetéséhez csak a trainfüggvény futtatását kell tennünk . Természetesen ezt többször, esetleg több ezerszer meg akarjuk csinálni. Tehát használunk egy forhurkot.

Itt van a félelmesség teljes 60 sora:

Tessék, itt van! Teljes értékű neurális hálózat, amely tanulhat a bemenetekből és az outputokból.

Miközben úgy gondoltuk, hogy a bemenetünk óránkénti tanulás és alvás, valamint a kimenetünk mint teszteredmény, bátran változtassuk ezeket tetszés szerint, és figyeljük meg a hálózat alkalmazkodását!

Végül is a hálózat csak a számokat látja. Az elvégzett számítások, bármennyire is bonyolultnak tűntek, mind nagy szerepet játszottak tanulási modellünkben.

Ha meg szeretné jósolni a kimenetet képzett adataink alapján, például megjósolni a teszt pontszámát, ha négy órán át tanult és nyolcat aludt, nézze meg a teljes oktatóanyagot itt.

Bemutató és forrás

Hivatkozások

Steven Miller

Welch Labs

Kabir Shah

Ezt az oktatóanyagot eredetileg az Enlight webhelyre tették közzé, amely különféle oktatóanyagokat és projekteket tárol, amelyeket építkezés közben kell megtanulni! Nézze meg további hasonló projekteknél :)