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

A korábban ismertetett teljesen csatolt Neurális Hálózatokkal szemben a mai bejegyzésben egy részlegesen csatolt rendszerről fogunk beszélni: a Konvolúciós Neurális Hálózatról (angolul: Convolutional neural network). Ezeket a rendszereket leggyakrabban képelemzésre használják, de másra is lehet. Ebben a begyezésben mi egy idősoron fogjuk kipróbálni.


Bevezetés

Kezdjük azzal mi is az a “konvolúció”? Röviden egy matematikai művelet, amikor két függvény szorzatából egy harmadikat állítunk elő. Olyasmi, mint a keresztkorreláció, de itt az egyik függvényt tükrözzük[1] és úgy toljuk el. A Wikipedián van erről egy jó szemléltetés:

Konvolúció (convolution), Keresztkorreláció (Cross-correlation) és Autokorreláció szemléltetése

Jogos kérdés, hogy miért értelme van a tükrözésnek? Vegyük észre, hogy a konvolució esetén a tagok felcselérhetők. Vagyis  f*g = g*f.

Rendben,de miért erről a matematikai operációról lett elnevezve ez a Neurális Hálózat típus? Minden egyes Konvolúciós rendszernek van egy olyan rétege amiben ez a művelet fut le. Ennek során a réteg bemeneti adatain (jelöljük f-el) egy fix mag [2] (jelöljük mondjuk g-vel) függvényt léptetünk végig, és ennek eredményét továbbítjuk a következő rétegnek. Nézzük meg miért.

Miért?

Neurális Hálózatok tanításánál kulcs kérdés a rendelkezésünkre álló tananyag menyisége. Általában azt szokták mondani, hogy legalább tízszer[3] annyi megfigyelésünk legyen, mint ahány változó (súly) van a rendszerben. Ebből egyenesen következik, hogy összetettebb hálózatokhoz sokkal több adat kell, mint az egyszerűbbekhez.

Minél bonyolultabb a probléma annál összetettebb Hálózat kell, amihez pedig egyre nagyobb mennyiségű tanuló adat. Ez eddig tiszta sor. De ez csak az egyik eset, amikor sok adat kell. A másik az, amikor maguk a bemeneti adatok rendkívül összetettek. Erre tipikus példa egy kép. Még egy közepes méretű kép is rengeteg pixelből áll, ha mindegy egyes pixelt egy bemeneti neuronnal jelképezünk olyan bonyolult rendszert kapunk amihez nem nagyon fogunk tudni elegendő adatot gyűjteni. Ez az egyik oka, amiért képelemzésekre lényegében alkalmatlanok a teljesen csatolt neurális rendszerek.

A probléma felismerése után nem nagy logikai ugrással el lehet jutni két gondolathoz:

  1. Egyszerűsítsük a bemeneti adatokat
  2. Ne csatoljunk mindent mindennel. Például egy kép esetén a két ellentétes képsarok valószínűleg kevesebb hatással van egymásra, mint a mellettük lévő pixelek.

A fenti két pont magyarázza miért alkalmazzuk a konvolúciós réteget.

A Konvolúció réteg

Már tudjuk, hogy mi az a probléma amiért a Konvolúciós réteget alkalmazzuk, most nézzük meg egy kicsit részletesebben miért ez a művelet a válasz a fenti problémára (miért nem mondjuk a Keresztkorreláció?)

Legyen a bementi adatunk (f) a következő 3×3-ös mátrix:


f = \begin{bmatrix}
1&1&1\\
0&1&1\\
0&0&1\\
\end{bmatrix}

A mag (g) pedig, egy 2×2-as mátrix:


g = \begin{bmatrix}
1&0\\
1&1\\
\end{bmatrix}

Előrejátszás

Ha valaki odafigyelt a Bevezetésre, akkor észreveszi, hogy most tükrözni kell, ez ebben az esetben 180°-os forgatást jelent, tehát:


g^{t} = \begin{bmatrix}
1&1\\
0&1\\
\end{bmatrix}

Jefkine-nek van erről egy jó írása, amiben így ábrázolja ezt a műveletet:

A mag függvény celláinak elforgatása

Most léptessük végig ezt a g^t-t a f bemeneti adatokon. Ez lényegében azt jelenti, hogy a bal felső sarokból elindulva megszorozzuk a bemeneti és a mag függvényt. Ami eredménye:


f * g^{t} = \begin{bmatrix}
2&3\\
0&2\\
\end{bmatrix}

Ábrázolva pedig:

f * g^{t} számítása vizuálisan (forrás)

A konvolúciós réteg előrejátszása lényegében ennyi. Ok, ez eddig egyszerű, de talán nem egyértelmű, hogy itt lényegében egy részlegesen kapcsolt neurális hálózatot valósítunk meg. Vegyük észre, hogy nem minden egyes bemeneti cella (neuron) kerül minden egyes elemmel kapcsolatba a mag függvényből. A bal felső cellát például csak egyszer érinti a g^t, a legelső lépésben. Ha hagyományos neuronokon és súlyok rendszerében ábrázolnánk a fentieket, felhasználva Jefkine színkódolását, akkor a következő ábrát kapnánk:

Konvolúciós réteg kapcsolatai

Vegyük észre, hogy csak a bemenet közepét reprezentáló neuron van kapcsolatban minden egyes neuronnal a következő rétegben. Értelemszerűen ennek két következménye van: egyrészt csökkentettük a súlyok számát (ami a célunk volt). Ennek örülünk. Másrészt a Hálózat a bemeneti mátrix közepén elhelyezkedő adatokra érzékenyebb lesz. Ezt már nem annyira szeretjük. Ezért született meg a “kipárnázás” [4].

Kipárnázás

Szóval mit tehetünk, ha úgy gondoljuk a bemenet szélén lévő adatoknak szeretnénk nagyobb fontosságot tulajdonítani? A fő probléma ugye, hogy a mag függvénynek teljes egészében a bemenetre kell illeszkednie. Innen gyorsan el is lehet jutni az ötlethez, hogy mi lenne ha megnagyobbítanánk a képet? Például ha körbevennénk 0-al. Valahogy így:


f = \begin{bmatrix}
0&0&0&0&0\\
0&1&1&1&0\\
0&0&1&1&0\\
0&0&0&1&0\\
0&0&0&0&0\\
\end{bmatrix}

Voilà! Már is megoldottuk, hogy a szélső neuronoknak sokkal több kapcsolata legyen. Persze ez nem biztos, hogy jó nekünk, lévén a KNN egyik előnye, hogy nem teljesen kapcsolt, és így kevesebb súlyt kell optimalizálni.

Visszajátszás

Most nézzük meg mi történik a visszajátszás során. A teljesen kapcsolt hálózatról szóló bejegyzésben már megnéztük a visszajátszás matematikai lépéseit úgyhogy itt ezzel most nem foglalkoznék. Helyette koncentráljunk arra, hogy miben tér el a két rendszer. Ugye az egyértelmű, hogy a következő rétegtől megkapjuk, hogy mekkora mértékben járult a hibához az f*g^t. Jelöljük ezeket deltával:


\text{Hiba} = E = \begin{bmatrix}
\delta_{11}&\delta_{12}\\
\delta_{21}&\delta_{22}\\
\end{bmatrix}

De hogy, határozzuk meg, hogy melyik súly mekkora részben felelős a hibáért a bemeneti és a konvolúciós réteg között. A konkrét probléma, hogy ugye a Konvolúciós rétegben lévő értékek a bemeneti réteg különböző neuronjainak szorzatának összegei. De nekünk arra van szükségünk, hogy ezek a részek mekkora részben járultak a hibához. A trükk, hogy még egyszer készítünk egy konvolúciót, de ezúttal a mag függvény helyett a Hibát használjuk. Ehhez első lépésben elforgatjuk az E-t:

Hiba mátrix elforgatása

Majd ugyanúgy, mint korábban, végiglépkedünk a bemeneti adatokon:

Súlyok frissítése

Végezetül

Fentebb átnéztük a Konvolúciós Neurális Hálózatok legjellemzőbb rétegét, de nem ez az egyetlen típus. A hamarosan jövő következő részben megnézzük még milyen rétegek szoktak lenni egy KNN. Majd a minisorozat befejezéseként nézünk egy gyakorlati megvalósítást.

Irodalom

Endnotes

  1. Sajnos az internetes irodalom egy jelentős része nem veszi ezt észre, és összekeveri a keresztkorrelációt és a konvolúciót. ↩︎
  2. angolul kernel ↩︎
  3. Ez erősen a minimum, pl. a Is your dataset big enough? Sample size requirements when using artificial neural networks for discrete choice analysis kutatás szerzői ötvenszer több adatot javasolnak. ↩︎
  4. angolul: padding ↩︎

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés /  Módosítás )

Google kép

Hozzászólhat a Google felhasználói fiók használatával. Kilépés /  Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés /  Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés /  Módosítás )

Kapcsolódás: %s