A konvolúciós neurális hálózatok alapjainak megjelenítése

A konvolúciós neurális hálózatok mögött rejlő főbb fogalmak megértése vizuális példákkal

Mi az a konvolúciós neurális hálózat?

A konvolúciós neurális hálózatok (CNN-ek) a mesterséges neurális hálózatok (ANN) altípusai, amelyeket többnyire képosztályozásra használnak. A CNN-ek egy olyan struktúra replikációjának biológiai elvét követik, amely képes azonosítani a mintákat, hogy azonosítsa ezeket a mintákat különböző helyeken. „Ihlette” a macskák látórendszerének modelljét, amelyet a Nobel-díjasok, Hubel és Wiesel javasoltak a „Receptív mezők, binokuláris interakció és funkcionális architektúra a macska látókérgében” című 1962-ben megjelent kiadványban. Ezt az inspirációt a fukusimai „Neocognitron” használta 1980-ban, bár a Konvolúció szót akkoriban nem használták. Ezért nem véletlen, hogy a CNN-ek nagyon sikeresek a képfelismerésben. Ugyanakkor jó eredményeket értek el az olyan időbeli adatokkal kapcsolatban is, mint az "idősorok" és a "beszédfelismerés", vagy még akkor is, ha "grafikonokon" alkalmazták őket.

A CNN-ek a 2012-es díj elnyerése után váltak nagyon népszerűvé. Az Imagenet Large Scale Visual Recognition Challenge (ILSVRC) verseny nagyjából 10%-os különbséggel. Alex Krizhevsky és Ilya Sutskever Geoffrey Hinton irányítása alatt nyújtották be a CNN-architektúrát, amely AlexNet néven vált híressé. Geoffrey Hinton akkoriban már jelentős tudományos hozzájárulást tett az ANN-ok területén. 1986-ban a Backpropagation algoritmus, 1983-ban pedig a Boltzmann Machines egyik közreműködője volt. Ez néhány oka annak, hogy Geoffrey Hintont a mély tanulás atyjaként ismerték el.

Konvolúció vagy keresztkorreláció

Egy tipikus CNN konvolúciós rétegekből áll, amelyek jellemzők kivonóként működnek, majd egy osztályozó, általában egy „Multlayyer Perceptron (MLP)”, más néven teljesen összekapcsolt rétegek (FC rétegek) következik, amint azt az 1. ábra mutatja.

Az első réteg három színcsatornában, az RGB csatornákban reprezentált bemeneti képet kapja. Ezután az első réteg végrehajtja a bemeneti kép konvolúcióit több kernellel, ami az első réteg szolgáltatástérképeinek készletét eredményezi. Minden tereptérkép meghatározza egy adott tereptárgy intenzitását és helyét. A konvolúciós réteg által kinyert jellemzőtérkép alávethető a Pooling néven ismert lemintavételezési műveletnek. A Pooling művelet nem kötelező, ezért előfordulhat, hogy nem követ minden konvolúciós réteget. A Pooling réteg eredménye egy másik tereptérkép-készlet, ugyanannyi térképpel, de csökkentett felbontással. A következő konvolúciós réteg az előző réteg jellemzőtérképét használja további konvolúciók végrehajtására és új jellemzőtérképek létrehozására. Az utolsó rétegek jellemzőtérképei az osztályozó bemenete, az FC rétegek.

A konvolúciós művelet, amelyet ∗ (csillag) jelöl, a következőképpen írható le:

𝑥 valamilyen bemenet, például érzékelő jel, 𝑡 adott idő és 𝑘 az alkalmazott kernel.

A konvolúciós művelet egyik fontos tulajdonsága, hogy kommutatív, ami azt jelenti, hogy (𝑥∗ 𝑘)=( 𝑘∗𝑥) a következőképpen:

Másrészt a keresztkorrelációs művelet, amelyet ⋆ (ötágú csillag) jelöl, nem kommutatív, és így írható le:

A konvolúció kommutatív tulajdonsága abból adódik, hogy a kernel a bemenethez képest megfordul. A flip az index-manipuláció eredményeként következik be. Vegye figyelembe, hogy a 𝑥 bemenet indexe 𝑎, a kernel indexe pedig 𝑡−𝑎. Annak ellenére, hogy a kommutatív értéke értékes tulajdonság a matematikai bizonyítások írásához, nem annyira releváns a neurális hálózat megvalósításához. Valójában sok gépi tanulási könyvtár a keresztkorrelációt valósítja meg a konvolúció helyett, és mindkét műveletet konvolúciónak nevezi. Következésképpen a betanítás során megtanult kernel megfordul egy olyan könyvtárhoz képest, amely ténylegesen megvalósítja az 1. egyenletben leírt konvolúciót. Ebben a szövegben ugyanezt a konvenciót követjük, és keresztkorrelációs konvolúciónak nevezzük.

A 3-as egyenletet adaptálhatjuk a konvolúcióhoz 2D adatokkal, például szürkeárnyalatos képekkel:

amely 𝑟[𝑖,𝑗] a konvolúció diszkrét kimenete, ℎ a kernel magassága, 𝑤 a kernel szélessége, 𝑥[𝑎,𝑏] a szürkeárnyalatos kép foltja és 𝑘[𝑖+𝑎, 𝑗+𝑏] a kernelt.

Más szavakkal, a konvolúciós művelet több pixelfoltot von ki a képből, hogy megszorozza a kernellel. A kernel alapvetően egy súlymátrix. A képből kinyert pixelfoltot gyakran nevezik receptív mezőnek – a biológiában a receptív mező egy szenzoros régió, amely egy neuront stimulál. A receptív mező és a kernel közötti szorzás az egyes pixelek és a kernel megfelelő eleme közötti elemenkénti szorzásból áll. A szorzások után az eredmények összeadódnak a tereptérkép egyik elemévé, amelyet a 4. egyenletben 𝑟[𝑖,𝑗] definiál.

A következő animáció egy 5x5-ös szürkeárnyalatos kép és egy 3x3-as kernel közötti konvolúciós műveletet mutatja be. A befogadó mezőt a piros négyzet emeli ki. Ennek a konvolúciónak a kimenete egy 3x3-as jellemzőtérkép.

Az animációban használt tényleges kép az alábbi 3. ábrán látható. A kernel és a jellemzőtérkép értékeit átméreteztük, hogy illeszkedjenek a 0 és 255 közötti intervallumba, hogy szürkeárnyalatos pixelként jelenjenek meg. A kép világosabb képpontjai a konvolúcióból származó magasabb értékeket, míg a sötétebb pixelek alacsonyabb értékeket képviselnek.

A fenti konvolúció 3x3-as kernelt használ, következésképpen kilenc lehetséges receptív mező van a bemenetben, mindegyik 3x3-as méretű. Vegye figyelembe, hogy a többnyire fehér képpontokból vagy többnyire sötét képpontokból álló befogadó mezők a konvolúció után nagyon sötét képpontot eredményeznek. Másrészt, a befogadó mezők, amelyek a bal oldalon három fényes, a középső középső és a jobb oldalon sötét pixelekből állnak, a konvolúció után a legfényesebb pixeleket eredményezik. Ennek az az oka, hogy ez a típusú kernel hasznos az élek kiemelésére, különösen a bal oldali világos területről a jobb oldali sötét területre átlépő élekre.

Most nézzük meg, mi történik, ha ugyanazt a kernelt alkalmazzuk egy olyan képre, amely az ellenkező átmenetet is tartalmazza, a bal oldali sötét területről a jobb oldali világos területre. A 4. ábrán a receptív mezők, amelyek a sötétből a világosba való átmenetet mutatják, a legsötétebb pixeleket eredményezték. Vegye figyelembe, hogy a korábbi átmenet (világosról sötétre) továbbra is világosabb képpontokat eredményezett. Ez azt jelenti, hogy ez a kernel nemcsak a világosból a sötétbe átmenet éleit érzékeli, hanem az ellentétes éleket is, sötétről világosra. Az egyik éltípus eredményezi a legtöbb pozitív értéket, míg a másik típusú él a legtöbb negatív értéket.

Az RGB képek konvolúciója nagyon hasonló a szürkeárnyalatos esethez. A 4-es egyenlet hozzáigazítható az RGB-képhez egy újabb hurok hozzáadásával az RGB-csatornákon való iterációhoz a következőképpen:

A 𝑐 változó feletti kiegészítő hurok lehetővé teszi az iterációt az RBG csatornákon. Ennek eredményeként az összeg háromdimenziós adatokon történik a kétdimenziós helyett, és továbbra is egyetlen értéket eredményez minden háromdimenziós receptív mező és kernel számára.

Funkció kivonás

Kezdjük ezt a témát egy gyakorlati példával. Tekintse meg a következő három konvolúció eredményét az 5. ábrán. A konvolúciók eredményének szemléltetésére a következő példákban a három kernel mindegyike a képből kivont kis foltból áll.

Az első példában a kernelt alkotó folt a sík fehér hatos tartományát tartalmazza. A jobb oldali szürkeárnyalatos kép lényegében a kernel és a kép közötti konvolúció eredménye. A legsötétebb pixelek jelentik a receptív mező és a kernel közötti művelet legkisebb eredményét, másrészt a legfényesebb pixelek jelentik a receptív mező és a kernel közötti művelet legmagasabb értékét.

A második példában a kernel a sík kerekét alkotó pixelek foltjából áll. A harmadik példában a kernel a sík végéről másolt sárga pixelekből áll.

Ne feledje, hogy az eredményül kapott képek legfényesebb képpontjai annak a helynek felelnek meg, ahonnan az egyes kernelek származtak. Az első példában a 6-os szám helyének felel meg. A második példában a kerekek helyének. Annak ellenére, hogy a kernel az egyik kerék másolata, a másik kerék meglehetősen hasonló, és szintén világos képpontokat eredményezett. A harmadik példában a legfényesebb pixelek a sík összes sárga tartományának felelnek meg.

Lépés

A lépés az egyes befogadó mezők közötti távolság. Az összes eddig bemutatott példa egy lépést tesz ki. Az ilyen kis lépések elfogadása nagy átfedést eredményez a befogadó területek között. Ennek eredményeként sok információ ismétlődik a szomszédos receptív mezőkben, amint az a 6. ábrán látható.

Egy 3x3-as méretű kernel esetében a 2-es lépés elfogadása azt eredményezi, hogy egy oszlop vagy egy sor átfedésben van a szomszédos receptív mezőkkel. Ez az átfedés azért kívánatos, hogy garantáljuk, hogy a lépés ne hagyja ki a fontos információkat.

A lépések növelése csökkenti a konvolúciók számítási költségét. Ha a lépést egyről kettőre változtatjuk, a számítási költség csökkenése körülbelül négy. Ez azért történik, mert a lépés mindkét dimenzióban befolyásolja a befogadó mezők közötti távolságot. Hasonlóképpen, ha megháromszorozzuk a lépést, nagyjából kilencszeres számítási költségcsökkenésre számíthatunk. Csökken a számítási költség, mert a lépésszám növekedése csökkenti a bemenetből kinyert receptív mezők számát, következésképpen a kimenet mérete is csökken.

A 7. ábra a konvolúció négy eredményét mutatja 2, 4, 8 és 16 lépésekkel. A konvolúciókban használt kernelméret 70x70. Vegye figyelembe, hogy a lépések kétszeresére növelésével a végrehajtási idő majdnem négyszeresére csökken.

A 7. ábrán a 16-os lépést használó konvolúció eredménye négyszer kevesebb képpontot tartalmaz, mint a 8-as lépést használó eredmény. Vegye figyelembe, hogy a 16-os lépés elfogadása 54 sor vagy oszlop átfedését eredményezi, mivel a receptív mező mérete 70x70. A 16-os lépéssel még mindig lehetséges a konvolúció legmagasabb értékei a sík kerekének legfényesebb képpontjai alapján azonosítani.

Előre terjedés

Ebben a részben megvizsgáljuk, hogyan működik az előreterjedés a konvolúciós rétegekben. Ehhez meg fogjuk érteni, hogyan működik egyetlen konvolúciós réteg, majd megértjük, hogyan működik együtt több réteg. Ebben a tanulmányban két új fogalmat fogunk megtanulni: a nemlineáris aktiválást és a pooling műveletet.

Konvolúciós rétegen belül

A 8. ábra az előre terjedést mutatja egy tipikus konvolúciós rétegben, amely három szakaszból áll: konvolúciókból, nemlineáris aktiválásokból és poolingból. A konvolúciós műveletről már az első részben volt szó. Most meglátjuk a másik két műveletet.

A nemlineáris aktiválást detektor fokozatnak is nevezik. Ebben a szakaszban a konvolúciók és a torzítás eredménye nemlineáris aktiválásnak van alávetve, például a ReLU függvénynek. A nemlineáris aktiválás nem változtatja meg a tereptérkép méreteit, csak a benne lévő értékeket módosítja.

Nemlineáris aktiválások

Először is, mi az a lineáris aktiválás? A lineáris aktiválás egy olyan függvény, amely követi az f(x)=ax szabályt, ahol a egy konstans, x pedig a változó. A grafikonja egy egyenes vonal az origón (0, 0). Ez azt jelenti, hogy az f(x)=ax + b alakú függvények, amelyekben a és b állandó, nem lineárisak. Mindkettő affin függvény, de csak az, amelyik egyetlen állandóval megszorozza a változót, lineáris függvény.

Ahhoz, hogy egy függvény lineáris legyen, ha megszorozzuk a bemenetet egy konstanssal 𝛼, akkor a kimenetet is látnunk kell ugyanazzal a konstanssal 𝛼. Azt jelenti:

Egy másik követelmény, hogy amikor egy lineáris függvényben két bemenet összegét alkalmazzuk, akkor a függvényre külön-külön alkalmazott két változó összegének kimeneti megfelelőjét kapjuk:

Nos, miért használunk nemlineáris aktiválást? Mert ha lineáris kombinációkat (összeadásokat vagy szorzásokat) alkalmazunk a lineáris függvényekben, akkor az eredmény is lineáris. Annak ellenére, hogy sok modell durván közelíthető lineáris modellekkel, az ANN-okban a nemlinearitások használata lehetővé teszi mind a lineáris, mind a nem lineáris modellek ábrázolását. Más szóval, a nemlinearitások az ANN-okat erősebb függvény közelítővé teszik.

A mélytanulásban használt egyik leggyakoribb nemlineáris aktiválás a ReLU funkció, amely a Rectified Linear Unit rövidítése. Ezt a funkciót a következő adja:

Ez a függvény torzítással alkalmazva a 9. ábrán látható grafikont eredményez.

A 10. ábra azt mutatja, hogy a ReLU hogyan modulálja a konvolúció eredményét. Itt a 2. ábrán látható eredményeket használjuk fel a ReLU függvény alkalmazására.

A fenti példában használt ReLU függvény ekvivalens képe a 11. ábrán látható. Vegye figyelembe, hogy néhány köztes érték elsötétült, kiemelve a legfényesebb három képpontot.

Ezután a 12. ábrán a ReLU függvény egyes torzítási lehetőségeit láthatjuk. A függvény a sík konvolúciójának eredményét veszi be, és bemenetként a kereket tartalmazó kép foltját. Vegye figyelembe, hogy a torzítás küszöbként viselkedik, amely meghatározza, hogy mi legyen látható és mi nem.

A 12. ábrán látható küszöbviselkedés a biológiai neuronokhoz hasonlít, amelyek „nem tüzelnek, ha egy bizonyos küszöb alatti ingert kapnak”. Ha az inger túllépi a küszöböt, a neuron tüzelni kezd, és az inger növekedésével gyakrabban is tüzel. A 12. ábrán, amikor a torzítás 500, ez hozzájárul a mesterséges neuron aktivitásához. Ha azonban a torzítást -1000-ben határozzuk meg, a mesterséges neuron csak a legerősebb ingerrel tüzel.

Összefoglalva, a ReLU függvény mesterséges neuronként működik. Ezért ezt a fázist detektálási fázisnak nevezik. A ReLU függvény felelős a kernel által kivont szolgáltatás jelenlétének észleléséért. Következésképpen minden kernelhez egyetlen torzítás tartozik, mivel minden szolgáltatás más küszöbértéket igényel.

Összevonás

Végül, de nem utolsósorban a pooling művelet. Ez egy lemintavételezési művelet, amelyet minden egyes jellemzőtérképen hajtanak végre. Kivonja a befogadó mezőket a jellemzőtérképből, és egyetlen értékkel helyettesíti. Ezt az egyetlen értéket különböző aggregációs kritériumokkal kaphatjuk meg, mint például a maximális érték, az átlag vagy a súlyozott átlag a receptív mező középpontjától való távolság szerint.

Az aggregációs kritériumok mellett a pooling műveletben van még két hiperparaméter, a receptív mező mérete és a lépés.

A lépéshez hasonlóan a pooling művelet is kevesebb adatot eredményez a konvolúciók által feldolgozva. Az egyik különbség az, hogy az adatok kihagyása helyett a pooling művelet megpróbálja összefoglalni a befogadó mezőt egyetlen értékké. Egy másik különbség az, hogy a lépést a konvolúció előtt alkalmazzák, míg a poolingot a konvolúció eredménye felett alkalmazzák, csökkentve az adatok mennyiségét a következő rétegre. Ezenkívül a pooling művelet receptív mezője kétdimenziós, mivel minden egyes jellemzőtérképre külön-külön kerül alkalmazásra, míg a konvolúció receptív mezője háromdimenziós, amely egy rétegben lévő összes jellemzőtérkép egy részét tartalmazza.

A pooling művelet egyik kívánt mellékhatása az, hogy a bemenet "megnöveli a hálózat invarianciáját a fordítások tekintetében". Ez a hatás felerősödik, amikor a konvolúciósabb rétegeket összevonó rétegek követik.

A 13. ábra az értékek továbbterjedését mutatja be két gyűjtőrétegen keresztül, 3x3-as gyűjtőmérettel és 2-es lépéssel. A kék színnel borított régióban a bemeneti jellemzőtérkép minden aktiválása hatással van a kékkel borított területre az 1. pooling kimenetelében. Hasonlóképpen, az aktiválások a kékkel borított régióban az 1. összevonás eredményeként érinti a kékkel borított régiót a 2. pooling kimenetelében. Ugyanez az összefüggés érvényes a zölddel borított régiókra is.

Tekintettel arra, hogy a 13. ábrán a pooling a max pooling, nem mindegy, hogy a kék régióban hol található a legmagasabb érték a bemeneti jellemzőtérképen, mert a 2. eredmény poolingban ugyanúgy továbbítódik a kék aktiváláshoz. Ez az oka annak, hogy a rétegek összevonása növeli a fordítási invarianciát, a bemenetben lévő kis fordítások nem változtatják meg a kimenet értékeit.

A 14. ábra a lépések különböző kombinációinak hatását mutatja a konvolúcióban, a ReLU függvény torzításait, a pooling méreteket és a pooling lépéseket. A bal oldalon három példa látható a lépésekre: 2, 9 és 16. Mindegyik lépéshez három példa van a torzításra: 500, -250 és -1000. Minden egyes torzításhoz három példa van a pooling méretre és lépésre: pooling size 3x3 and stride of 2, pooling size 5x5 and stride of 3, valamint pooling size 7x7 and stride of 4x4.

A lépés hatása a konvolúcióban és a lépés a maximális összevonásban kumulatív. Ha kettős lépést használunk mind a konvolúcióban, mind a maximális összevonásban, akkor a végeredmény nagyjából négyszeres csökkenés a tereptérkép szélességében és magasságában.

A konvolúció lépésének 16-os és a max pooling lépésben négyes értéke szokatlan. Szándékosan eltúlozták, hogy bemutassák, milyen hatást gyakorolnak a konvolúciós réteg végeredményére. Az így kapott tereptérkép csak 100 elemből áll (10 x 10), sokkal kisebb, mint a 37636 elemből álló tereptérkép (194 x 194).

A darabok összerakása

Vissza fogunk térni az AlexNethez, az első híres CNN architektúrához. Ez egy jó gyakorlati példa arra, hogy megértsük, hogyan működnek együtt a CNN-ek összetevői. Az AlexNet építőköveit a 14. ábra mutatja be. A szaggatott piramisok a konvolúciók végrehajtását jelzik a bemenetből származó receptív mező vagy az előző réteg jellemzőtérképe segítségével. A nagy dobozok a jellemzőtérképeket, a kis dobozok pedig a tereptérképeken belül a befogadó mezőket jelentik. Ez a CNN 1000 különböző osztályba tudja besorolni az objektumokat.

Ennek az architektúrának az egyik sajátossága, hogy két GPU-val képezték ki. A 15. ábra felső elemei egy GPU-ban, míg az alsó részek egy másik GPU-ban kerültek kiosztásra.

Ezt a CNN-t beszerezheti bizonyos keretrendszerekbe, például a PyTorch-ba. Használata viszonylag egyszerű. Az átviteli tanulás segítségével ezt az architektúrát más képadatkészletekre is alkalmazhatja. Egy kis adatfeldolgozást igényel a képek normalizálása és átméretezése, hogy megfeleljenek az AlexNet követelményeinek, de megéri a próbát. Valami ilyesmi lenne:

from torchvision import transforms
pre_transforms = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

A modellt a következőképpen importálhatja a PyTorch-ba:

from torchvision import models
model = models.alexnet(pretrained=True)

Letilthatja a konvolúciós rétegek képzését, és létrehozhat saját osztályozót az eredeti AlexNet teljesen összekapcsolt rétegek felülbírálásához:

from torch import nn
for param in model.parameters():
    param.requires_grad = False # disable training
fcLayersDict = OrderedDict([('fc1', nn.Linear(9216, 1024)),
                   ('relu1', nn.ReLU()),
                   ('fc2', nn.Linear(1024, 102)),
                   ('output', nn.LogSoftmax(dim=1))
                           ])
model.fcLayersDict = fcLayersDict
fc = nn.Sequential(fcLayersDict)
model.classifier = fc

Az AlexNet mellett a PyTorch-ben további modellek is találhatók, amelyek segítségével a szükséges testreszabások mellett osztályozhatja a saját képadatkészletét. Valóban ajánlott tesztelni ezeket a modelleket, vagy akár a semmiből megépíteni saját CNN-t, hogy megértsük, hogyan működik a CNN.

Még ha már ismerte is az itt bemutatott fogalmakat, remélem, legalább más szemszögből látta őket. A CNN-ek más fogalmai is voltak, amelyekről itt nem esett szó. Ha kíváncsi vagy nem biztos a CNN-ek egy bizonyos aspektusában, kérem, jelezze.