Konvolúciós Neurális Hálózat – 2. rész

Az előző részben megnéztük, a Konvolúciós Neurális Hálózat (KNN) legjellemzőbb rétegét a Konvolúciós réteget. A mai részben megismerkedünk a Szűrő fogalmával, a Összevonó réteggel, a lapítással és a Lépésközzel.

Publihed in: sajozsattila
Category: Statisztika

Szűrők

Az előző részben megismerkedtünk a mag[1] függvénnyel, amit g-vel jelöltünk. Ugye ez nem más mint az a mátrix, amit végigléptetünk a megfigyelésen[2], amit pedig f-el jelöltünk. Maga a konvolúció pedig csak egy végső soron. Ez eddig rendben van, de gondolom azért felmerült néhány emberben, hogy mitől függ ennek a mag függvénynek a konkrét értéke.

Aki már végzett bármiféle képmanipulációt, az nagy valószínűséggel találkozott jó néhány szűrővel[3], például élkeresés vagy elmosás esetén. A Konvolúciós Neurális Hálózatoknál ezekhez nagyon hasonló szűrőket alkalmazunk, most tekintsük át, hogyan is működnek ezek. Tegyük fel, hogy van egy képünk, aminek a közepén egy függőleges vonal van:

Ugye mindenki látja a vonalat? Most próbáljuk ki ezen a „képen” két szűrőt. Az egyik legyen érzékeny a vízszintes vonalakra:

Mi lesz ebben az esetben a Konvolúciós réteg kimenete:[4]

Mi történt itt? Ez talán elsőre nem egyértelmű, ezért skálázzuk vissza az eredményt az eredeti kép 0–6-ig terjedő tartományára:

Most már jól látszik, hogy lényegében elmaszatoltuk a függőleges vonalunkat, mivel csökkent a kép széle és közepe közötti különbség. Most nézzünk meg egy másik szűrőt. Ez legyen érzékeny a függőleges vonalakra:

(1)

A konvolúció eredménye ebben az esetben:

Mint látható ez a szűrő megőrizte az eredeti függőleges vonalat.

Ez eddig azt mutatja, hogy más szűrő más konvolúciós eredményhez vezet. Ez eddig nem nagy újdonság. De még mindig nem tiszta, hogyan válasszunk szűrőt. Vegyük észre, hogy a fenti két példában nem is döntöttünk arról, hogy melyik a jobb a kettő közül. Ezt csak annak tudatában lehetne eldönteni, ha ismernénk mit szeretnénk megtanulni.

Mi van akkor, ha például azt szeretném megtudni, hogy az f képen szerepel-e a Fülig Jimmy egyetlen kagylóhéjból készült markolatú bicskája. Tudja valaki definiálni a szűrőt ehhez a feladathoz? Ha igen, akkor nincs szüksége Neurális Hálózatra, mert le tudja programozni a feladatot. Ha viszont nem, és komplexebb kérdések esetén általában ez a helyzet, akkor már látni fogja a Konvolúciós Hálózat egyik feladatát. Nevezetesen azt, hogy megtalálja számunkra ezt a szűrőt. Ennek megfelelően a bevett gyakorlat sok véletlenszerű szűrő létrehozása a tanulás során, és remélni, hogy a végére megtaláljuk a megfelelőt.

Ez a megfelelő pedig nem is feltételen egy szűrő, hanem ezek neuronjainak szabad kombinációja. Ezzel el is érkeztünk ahhoz a kérdéshez: mennyi paramétere van egy Konvolúciós rétegnek? Az előző részben megismert visszajátszás alapján nem meglepően minden egyes szűrő esetén a szűrő mérete plusz egy[5]. Értelemszerűen ha több szűrőt alkalmazunk, akkor ezt meg kell szorozni a szűrők számával. A fenti példánál maradva 9+1 a vízszintes szűrőre, ugyanennyi a függőlegesre, vagyis összesen 20.

Aki eddig kitartott, annak már valószínűleg kezd összeállni mi is történik a konvolúciós rétegben:

Képfeldolgozás a konvolúciós rétegben
Képfeldolgozás a konvolúciós rétegben

Összevonó réteg

A konvolúciós réteg nagyon hatékonynak bizonyult az optimális szűrő megtalálásához az adott képhez. Viszont van ezzel egy probléma: ez csak az adott képre vonatkozik. Kiderült, hogy ez a réteg nem tolerálja jól ha elkezdjük módosítani a megfigyeléseket. Ha a kutya jobbra néz bal helyet, ha tükrözve van a kép stb. Ugye ez probléma, mert a végső cél nem az optimális szűrők megtalálása, hanem az, hogy az adott megfigyeléseket jól osztályozzuk. Ha kutyákat keresünk a képeken akkor elvárjuk, hogy akkor is megtaláljuk őket ha jobbra, de akkor is ha balra néznek. Ennek a problémának a megoldására szokták alkalmazni az Összevonó réteget[6].

Ez a réteg nagy vonalakban nem más, mint egy mintavétel a a Konvolúciós réteg eredményén. Ebből az is következik, hogy a Konvolúciós réteg mögött szoktuk alkalmazni. Maga a definíciója lényegében: vegyél egy xy méretű ablakot, lépkedj végig a bemeneti képen ugyanúgy, mint a Konvolúciós rétege esetén, és alkalmazd a p() mintavételi függvényt az ablakban lévő adatokon átfedés nélkül.

A kulcsszavak a fenti definícióban a mintavétel és az átfedés nélkül. Vagyis itt nem a két mátrix elemszintű szorzása valósul meg, hanem az egész ablak egy számban való összegzése. Milyen összegzést alkalmazhatunk? Ez teljesen rajtunk áll, de a leggyakrabban átlagot, maximumot vagy minimumot szoktak keresni.

Csak a példa kedvért nézzünk meg mi lesz egy 2x2-es átlagoló réteg kimenete az előző fejezetben függőleges szűrővel előállított Konvolúciós réteg eredményén, szintén normalizálás után:

Gondolom ez egyértelmű. de csak a rend kedvéért nézzük meg, hogy számítottuk ki. Ugye a bal felső (0,0 indexű) elem esetén:

A következő pedig:

És így tovább.

Vegyük észre az Összevonó rétegnek két jellemzőjét is. Egyrészt drasztikusan csökkenti a megfigyelések méretét. Másrészt egyáltalán nem növeli a hálózat paramétereinek menyiségét, mivel semmi tanítható része nincs.

Teljesen csatolt réteg

A fenti rétegek eddig nem tettek mást, mint egy két dimenziós megfigyelést átalakítottak egy másik két dimenziós adattá. Jogos a kérdés, hol van itt az osztályozási feladat megoldása? Eddig sehol. A Konvolúciós és Összevonó rétegeket nyugodtan tekinthetjük egyfajta adatelőkészítésnek a tényleges osztályozás számára. Az osztályozást magát pedig egy hagyományos teljesen csatolt neurális hálózat végzi. Ennek bemenete az utolsó „előkészítő” réteg kimenete. Ez ugye még mindig egy két dimenziós adat, amit a hagyományos neurális háló nem tud kezelni. Ezért szokták „kilapítani”[7] a képet:

Lapítás
Lapítás

Ezután már lehet is tanítani az adatainkat egy szokványos neurális hálózattal. Értelemszerűen ez lesz a teljes Konvolúciós Neurális Hálózat legutolsó rétege:

Egy komplet Konvolúciós Neurális Hálózat
Egy komplet Konvolúciós Neurális Hálózat

Ezzel nagyból meg is ismertük a KNN felépítést. Ebben a részben már csak egyetlen dologról szeretnék írni: a lépésközről.

Lépésköz

Gondolom a fentiek után egyértelmű, hogy egy Konvolúció Hálózat esetén a tanítandó paraméterek száma nagyon gyorsan tud növekedni. Minél több a szűrő, annál több paraméter kell. Viszont van ennek egy másik érdekessége is. A bemeneti képtől méretétől látszólag nem függ a tanítandó paraméterek száma. Ez igaz is, amíg csak Konvolúciós és Összegző rétegünk van. Viszont mint ahogy fentebb láttuk a hálózat végén egy teljesen csatolt rendszer figyel. Sajnos ennek egyáltalán nem mindegy mekkora a bemeneti kép mérete. Ennek megfelelően szeretnénk kisebb képeket az adatelőkészítés után. Erre eddig egy lehetséges eljárást láttunk az összevonást.[8] Van egy másik is, amivel most fogunk megismerkedni, ez a Lépésköz[9] növelése.

Alapesetben, ahogy az előző részben láttuk a mag függvényt egyetlen indexel mozgatjuk jobbra vagy le minden egyes lépés során. Ezt az alap viselkedést úgy nevezhetjük, hogy 1x1-es lépésközű. Viszont semmi nem gátol meg minket abban, hogy gyorsabban mozogjunk. Ha pedig így teszünk, akkor drasztikusan lecsökken a kimeneti kép mérete.

A példa kedvért vegyük elő függőleges szűrőt, de most 2x2 lépésközzel dolgozzuk fel az adatokat. Ennek az eredménye:

Ez talán elsőre nem teljesen egyértelmű. Hogy lett egy 8x8-as mátrixból 3x3-as, ráadásul nem is szimmetrikus függőlegesen, mint az eredeti kép? A kulcsa ennek a rejtélynek az, hogy ha növeljük a lépésközt, akkor csak azokat az eseteket dolgozza fel a konvolúciós réteg, ahol a mag függvény teljesen illeszkedik a bemenetre. Például 2x2 lépéskőz esetén, az alábbi ábrán -el (2. lépés a szűrőnél, sárga színnel jelölve) jelölt művelet értéke végre lesz hajtva, és szerepelni fog a Konvolúciós réteg kimenetében. Ezzel szemben a (a piros) nem lesz a kimenetben, helyette a lesz a következő lépés:

Lépésköz
Lépésköz

Végszó

A blog Git oldalalán megtalálható a fentiek Kerasban való szemléltetése. A következő részben gyakorlatibb témával fogunk foglalkozni és megnézünk egy valós példát Kerasban.

A cikk szintén letölthető PDF és ePuB változatban hála a μr² szerkesztőnek. Ez egy nyílt forráskódú online Markdown szerkesztő amit én fejlesztek, kifejezetten összetettebb írások készítésére.

Végjegyzetek

  1. Angolul: kernel ↩︎

  2. Általában egy kép. ↩︎

  3. Angolul: filter ↩︎

  4. Ugye ezt az egészet bonyolíthatja „igazi” Konvoluciós rétegnél az aktivációs függvény is, de most tegyük fel, hogy nincs (vagy hogy ReLU ami pozitív mintáknál, mint a miénk is, lényegében lineáris). ↩︎

  5. Ez ugye a szűrő eltolása. ↩︎

  6. Angolul: Pooling layer ↩︎

  7. Angolul: flattening ↩︎

  8. Ugyan egy újabb Konvolúciós réteg is csökkenti a teljesen csatolt réteg bemenetének méretét, de ez újabb paramétereket vezet be egy időben, tehát nem igazán jó a fenti célra. ↩︎

  9. Angolul: stride ↩︎