Site Overlay

A gépi tanulás szórakoztató! 3. rész: Mélytanulás és konvolúciós neurális hálózatok

Egy ilyen neurális hálózatot néhány perc alatt betaníthatunk egy modern laptopon. Ha ezzel készen vagyunk, akkor lesz egy olyan neurális hálózatunk, amely elég nagy pontossággal képes felismerni a “8-asok” képeit. Üdvözöljük a (nyolcvanas évek végi) képfelismerés világában!

Tunnel Vision

Ez igazán klassz, hogy a pixelek egyszerű betáplálása egy neurális hálózatba valóban működött a képfelismerés kialakításában! A gépi tanulás varázslatos! …ugye?

Hát persze, hogy nem ilyen egyszerű.

Először is, a jó hír az, hogy a mi “8-as” felismerőnk valóban jól működik olyan egyszerű képeken, ahol a betű a kép közepén van:

De most jön az igazán rossz hír:

A “8”-as felismerőnk egyáltalán nem működik, ha a betű nem tökéletesen középen van a képen. Már a legkisebb pozícióváltozás is mindent elront:

Ez azért van, mert a hálózatunk csak a tökéletesen középre állított “8” mintáját tanulta meg. Egyáltalán nincs fogalma arról, hogy mi az a nem középen álló “8-as”. Pontosan egy és csakis egy mintát ismer.

Ez nem túl hasznos a való világban. A valós világ problémái sosem ilyen tiszták és egyszerűek. Ezért ki kell találnunk, hogyan tudjuk a neurális hálózatunkat olyan esetekben is működőképessé tenni, amikor a “8” nem tökéletesen középen van.

Brute Force Idea #1: Keresés csúszóablakkal

Egy igazán jó programot már létrehoztunk a képen középen lévő “8” megtalálására. Mi lenne, ha egyszerűen körbejárnánk a képet a lehetséges “8-asok után kisebb szakaszokban, szakaszonként, amíg nem találunk egyet?

Ezt a megközelítést csúszóablaknak hívják. Ez a nyers erővel történő megoldás. Bizonyos korlátozott esetekben jól működik, de nagyon nem hatékony. Ugyanazt a képet kell újra és újra ellenőrizni, különböző méretű objektumok után kutatva. Ennél jobbat is tudunk!

2. nyers erő ötlet: Több adat és mély neurális háló

Amikor betanítottuk a hálózatunkat, csak olyan “8”-asokat mutattunk neki, amelyek tökéletesen középen voltak. Mi lenne, ha több adattal képeznénk, beleértve a “8-asokat” mindenféle pozícióban és méretben a kép körül?

Nem is kell új képzési adatokat gyűjtenünk. Egyszerűen írhatunk egy szkriptet, amely új képeket generál a “8”-akkal a kép mindenféle különböző pozíciójában:

Szintetikus képzési adatokat hoztunk létre a már meglévő képzési képek különböző változatainak létrehozásával. Ez egy nagyon hasznos technika!

Ezzel a technikával könnyen létrehozhatunk végtelen mennyiségű gyakorló adatot.

A több adat megnehezíti a neurális hálózatunk számára a probléma megoldását, de ezt ellensúlyozhatjuk azzal, hogy a hálózatunk nagyobb lesz, és így bonyolultabb mintákat tud megtanulni.

A hálózat nagyobbá tételéhez egyszerűen rétegről rétegre halmozzuk a csomópontokat:

Ezt “mély neurális hálózatnak” hívjuk, mert több réteggel rendelkezik, mint egy hagyományos neurális hálózat.

Ez az ötlet már az 1960-as évek vége óta létezik. De egészen a közelmúltig egy ekkora neurális hálózat betanítása egyszerűen túl lassú volt ahhoz, hogy hasznos legyen. De amint kitaláltuk, hogyan használjuk a 3d-s grafikus kártyákat (amelyeket arra terveztek, hogy nagyon gyorsan végezzenek mátrixszorzást) a normál számítógépes processzorok helyett, a nagy neurális hálózatokkal való munka hirtelen praktikussá vált. Valójában pontosan ugyanazzal az NVIDIA GeForce GTX 1080 videokártyával, amit az Overwatch játékhoz használunk, hihetetlenül gyorsan lehet neurális hálózatokat képezni.

De még akkor is, ha a neurális hálózatunkat nagyon nagyra tudjuk méretezni és gyorsan tudjuk képezni egy 3d-s grafikus kártyával, ez még mindig nem vezet el minket a megoldásig. Okosabbnak kell lennünk abban, hogyan dolgozzuk fel a képeket a neurális hálózatunkban.

Gondoljunk csak bele. Nincs értelme külön betanítani egy hálózatot arra, hogy felismerjen egy “8”-at a kép tetején, és külön arra, hogy felismerjen egy “8”-at a kép alján, mintha két teljesen különböző objektumról lenne szó.

A neurális hálózatot valahogyan elég okossá kell tenni ahhoz, hogy tudja, hogy egy “8” bárhol a képen ugyanaz a dolog, minden extra betanítás nélkül. Szerencsére… van!

A megoldás a konvolúció

Az ember intuitív módon tudja, hogy a képeknek hierarchiájuk vagy fogalmi struktúrájuk van. Gondoljunk csak erre a képre:

Gratuláló kép a fiamról

Emberként azonnal felismered a hierarchiát ezen a képen:

  • A földet fű és beton borítja
  • Egy gyermek van
  • A gyermek egy ugráló lócán ül
  • Az ugráló ló a fű tetején van

A legfontosabb, hogy felismerjük a gyermek gondolatát, függetlenül attól, hogy milyen felületen van a gyermek. Nem kell újra megtanulnunk a gyermek gondolatát minden lehetséges felületre, amelyen megjelenhet.

De jelenleg a neurális hálózatunk erre nem képes. Azt gondolja, hogy egy “8-as” a kép egy másik részén egy teljesen más dolog. Nem érti, hogy egy tárgy mozgatása a képen nem teszi azt valami mássá. Ez azt jelenti, hogy minden egyes tárgy azonosítását minden lehetséges helyzetben újra meg kell tanulnia. Ez szívás.

Meg kell adnunk a neurális hálózatunknak, hogy megértse a fordítási invarianciát – egy “8-as” az egy “8-as”, függetlenül attól, hogy a képen hol jelenik meg.

Ezt egy konvolúciónak nevezett eljárással fogjuk elérni. A konvolúció ötletét részben az informatika, részben pedig a biológia ihlette (azaz az őrült tudósok szó szerint furcsa szondákkal bökdösték a macskák agyát, hogy kitalálják, hogyan dolgozzák fel a macskák a képeket).

Hogyan működik a konvolúció

Ahelyett, hogy a neurális hálózatunkba egész képeket táplálnánk be egyetlen számrácsként, valami sokkal okosabbat fogunk csinálni, ami kihasználja azt az elképzelést, hogy egy tárgy ugyanaz, függetlenül attól, hogy hol jelenik meg a képen.

Íme, hogyan fog ez működni, lépésről lépésre –

1. lépés: A képet átfedő képcsempékre bontjuk

Hasonlóan a fenti csúszóablakos keresésünkhöz, egy csúszóablakot juttatunk át a teljes eredeti képen, és minden eredményt külön, apró képcsempeként mentünk el:

Ezzel az eljárással az eredeti képünket 77 egyforma méretű apró képcsempévé alakítottuk.

2. lépés: Minden egyes képcsempét betáplálunk egy kis neurális hálózatba

Előtte egyetlen képet betápláltunk egy neurális hálózatba, hogy megnézzük, hogy az egy “8-as”. Itt is pontosan ugyanezt fogjuk csinálni, de minden egyes képcsempére vonatkozóan:

Ismételjük meg ezt 77-szer, minden egyes csempére egyszer.

Viszont van egy nagy csavar: ugyanazon eredeti kép minden egyes csempéjénél ugyanazokat a neurális hálózati súlyokat tartjuk meg. Más szóval, minden képcsempét egyformán kezelünk. Ha egy adott csempén valami érdekes jelenik meg, akkor azt a csempét érdekesnek jelöljük.

3. lépés: Az egyes csempék eredményeinek mentése egy új tömbbe

Nem akarjuk elveszíteni az eredeti csempék elrendezését. Ezért az egyes csempék feldolgozásának eredményét az eredeti kép elrendezésével megegyező elrendezésű rácsba mentjük. Ez így néz ki:

Más szóval, egy nagy képpel kezdtünk, és egy valamivel kisebb tömbtel fejeztük be, amely rögzíti, hogy az eredeti képünk mely részei voltak a legérdekesebbek.

4. lépés: lemintavételezés

A 3. lépés eredménye egy olyan tömb lett, amely feltérképezi, hogy az eredeti kép mely részei a legérdekesebbek. De ez a tömb még mindig elég nagy:

A tömb méretének csökkentése érdekében egy max pooling nevű algoritmus segítségével lemintavételezzük. Ez csicsásan hangzik, de egyáltalán nem az!

Megnézzük a tömb minden egyes 2×2 négyzetét, és megtartjuk a legnagyobb számot:

Az ötlet itt az, hogy ha az egyes 2×2 négyzetet alkotó négy bemeneti csempe bármelyikében találtunk valami érdekeset, akkor csak a legérdekesebb részt tartjuk meg. Ez csökkenti a tömbünk méretét, miközben megtartjuk a legfontosabb biteket.

Végső lépés: Készítsünk előrejelzést

Ezidáig egy óriási képet redukáltunk le egy meglehetősen kis tömbre.

Kitalálod? Ez a tömb csak egy csomó szám, így ezt a kis tömböt használhatjuk egy másik neurális hálózat bemeneteként. Ez a végső neurális hálózat fogja eldönteni, hogy a kép egyezik-e vagy sem. Hogy megkülönböztessük a konvolúciós lépéstől, “teljesen összekapcsolt” hálózatnak nevezzük.

Az elejétől a végéig tehát az egész ötlépéses csővezetékünk így néz ki:

Még több lépés hozzáadása

A képfeldolgozási csővezetékünk több lépésből áll: konvolúció, max-pooling, és végül egy teljesen összekapcsolt hálózat.

A valós problémák megoldásakor ezeket a lépéseket annyiszor kombinálhatjuk és egymásra helyezhetjük, ahányszor csak akarjuk! Lehet két, három vagy akár tíz konvolúciós réteg is. Ahol csak akarod, bedobhatod a max poolingot, hogy csökkentsd az adatok méretét.

Az alapötlet az, hogy egy nagy képpel kezded, és folyamatosan, lépésről lépésre leépíted, amíg végül egyetlen eredményt kapsz. Minél több konvolúciós lépésünk van, annál bonyolultabb tulajdonságokat lesz képes megtanulni a hálózatunk felismerni.

Az első konvolúciós lépés például megtanulhatja felismerni az éles éleket, a második konvolúciós lépés az éles élek ismeretében felismerheti a csőröket, a harmadik lépés az egész madarakat a csőrök ismeretében, stb.

Íme, így néz ki egy reálisabb mély konvolúciós hálózat (amilyet egy kutatási tanulmányban találunk):

Ebben az esetben egy 224 x 224 pixeles képből indulnak ki, kétszer alkalmaznak konvolúciót és max poolingot, még háromszor alkalmaznak konvolúciót, max poolingot, majd két teljesen összekapcsolt rétegük van. A végeredmény az, hogy a képet az 1000 kategória egyikébe sorolják!

A megfelelő hálózat felépítése

Honnan tudod tehát, hogy mely lépéseket kell kombinálnod ahhoz, hogy a képosztályozód működjön?

Az igazat megvallva, erre sok kísérletezéssel és teszteléssel kell válaszolnod. Lehet, hogy 100 hálózatot kell betanítanod, mielőtt megtalálod az optimális struktúrát és paramétereket a megoldandó problémához. A gépi tanulás sok próbálkozással és hibával jár!

A madárosztályozónk megépítése

Most végre eleget tudunk ahhoz, hogy írjunk egy programot, amely el tudja dönteni, hogy egy kép madár-e vagy sem.

Mint mindig, most is szükségünk van néhány adatra, hogy elkezdhessük. Az ingyenes CIFAR10 adathalmaz 6000 képet tartalmaz madarakról és 52000 képet olyan dolgokról, amelyek nem madarak. De hogy még több adatot kapjunk, hozzáadjuk a Caltech-UCSD Birds-200-2011 adathalmazt is, amely további 12 000 madárképet tartalmaz.

Itt van néhány madár a kombinált adathalmazunkból:

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

Az e-mail-címet nem tesszük közzé.