a

Lorem ipsum dolor sit amet, consectetur adicing elit ut ullamcorper. leo, eget euismod orci. Cum sociis natoque penati bus et magnis dis.Proin gravida nibh vel velit auctor aliquet. Leo, eget euismod orci. Cum sociis natoque penati bus et magnis dis.Proin gravida nibh vel velit auctor aliquet.

  /  Project   /  Blog: Jót vagy újat! — BoxConvolution

Blog: Jót vagy újat! — BoxConvolution


Szerző: Illés Tamás, MSc hallgató

Koncepció

A félév során egy új eszközzel foglalkoztam, amely a neurális hálók fejlesztése során gyakran előkerülő nehézséget próbál orvosolni, ez pedig a megfelelő paraméterezés megtalálása az egyes rétegekhez. Ha valaki nekilát egy háló építésének, ideje nagy részét az emészti fel, hogy számos iteráció során az egyes konvolúciós rétegek filterméretét, valamint a hozzá kapcsolódó számos paraméter értékét próbálja optimalizálni az adott problémára. Mivel erre nincsen jelenleg általános szabály, ezért marad a találgatás, rengeteg tesztelés és a tapasztalat, azonban amikor találunk egy már elfogadhatót, akkor sem biztos, hogy az az optimális.

Ez a probléma általánosnak mondható, így óriási megkönnyebbülést jelentene, ha ezt helyettünk megoldaná a tanítás során maga a model. Pontosan ezt ígérte az úgynevezett BoxConvolution, melynek felfedezését rengeteg reménnyel kezdtem a félév elején.

A projekt GitHub-on fellelhető, bárki számára elérhető forrás (https://github.com/shrubb/box-convolutions). A leírás nagyon kecsegtető, még egy mutatós gif is van arról, hogy hogyan működik a réteg. Alapvetően arra épít, hogy megreformálja a standard 3×3-as konvolúciós réteget.

De miért is van erre szükség? Nos, a 3×3-as filterméret tekinthető most az alapvető eszköznek, hiszen hardveres támogatás erre a méretre van legjobban megvalósítva, valamint ez az elterjedt mindenhol. Ha találunk egy olyan helyettesító eszközt, mely ennél jobb, akkor mindenhol kicserélve gyakorlatilag minimális erőfeszítéssel javítunk a már létező modelleken. A 3×3-as konvolúció 9 paraméterrel dolgozik, működéséből adódóan, míg a BoxConv megelégszik 4 paraméterrel, tehát a skálázhatóság szempontjából sokkal jobb. Az is probléma lehet, hogy a 3×3-as méret viszonylag kicsinek tekinthető, főleg ha a mai FullHD vagy 4K világra gondolunk, így egy “átlagos” bemenetet tekintve óriási méretekkel lehet csak elemezni az adatokat. Ráadásul nem kell foglalkoznunk a kernel léptetésével sem, gyakorlatilag csak megadjuk a kezdő méretet és azt, hogy hány keretet akarunk az adatainkra helyezni és már taníthatjuk is a modelt. Rengkívül impozáns.

Összehasonlítás

Bár ez mind nagyon jól mutat leírva, de azért járjunk utána a dolgoknak. A fejlesztő elérhetővé tett egy példakódot is, ahol a BoxConv eredményt is ad. Ez egy roppant egyszerű architektúra, MNIST adathalmazon futtatva. A tanítás végeztével a model 97%-os pontosságot ért el, ami valóban jó eredménynek számít, tekintve, hogy semmit nem kellett paramétereznünk, azonban viszonyítás nélkül semmit nem mond ez az eredmény. Az első tesztekhez két ugyan olyan modelt használtam, csak annyi különbséggel, hogy az egyikben csak 3×3-as Conv2D rétegeket használtam, míg a másikben kicseréltem BoxConv-ra.

Az ábrán látható a borzasztóan egyszerű architektúra, amivel próbálkoztam, de hát eleinte nem a teljesítmény maximalizálás volt a szempont, hanem az összehasonlítás. Mindkét háló MNIST-en lett tanítva.

Az első eredmény mutatja a BoxConv teljesítményét, a második a standard 3×3-ast. Általában az összehasonlítás alapját a pontosság, a veszteségfüggvény értéke és a szükséges paraméterek mennyisége adta.

Accuracy: ~97% vs ~98.5%

Loss: < 0.2 vs < 0.1

Parameters: 21410 vs 69650

Látható, hogy közel azonos eredményt adott a két model, tehát valóban ez esetben nem lehet okunk panaszkodni. Az is jól látható, hogy ~21e paraméterből megoldotta az új eszköz, míg a régi ~70e paraméterrel dolgozott. Ez valóban óriási különbség!

A kérdés már csak az, hogy valóban mindenhol hasonlóan teljesít e az új szerzemény. A további eredmények sajnos kiábrándítóak.

A következő teszt teljesen egyezik az előzővel, azonban a tanítóhalmaz a CIFAR10 nevű adatokból állt. Ez egy kicsit nehezebb feladat, hiszen a 28×28-as MNIST képek helyett itt már 32×32-as színes képek láthatóak, melyek ugye az RGB 3 csatorna miatt, 3-szor annyi kernelt jelentett a modelben.

Accuracy: ~52% vs ~70%

Loss: < 1.4 vs < 0.9

Parameters: 91810 vs 137890

Itt már azért látható különbség. A BoxConv jelentősen roszabb eredményt ért el, egyedül a paraméterek számában jeleskedett.

Összehasonlítás más megközelítésben

Mivel az előző tesztekben alul maradt a BoxConv, arra gondoltam, hogy az összehasonlítás módja hibás. Lehetséges, hogy a jól megszokott modellek jobban teljesítenek, de az új eszközt nem a megszokott felépítésben kell felhasználni, hiszen jóval kevesebb paramétere van. A következőkben azt az eljárást alkalmaztam, hogy egy kicsit bonyolultabb modelt építettem a 3×3-as konvolúciónak, melyet referenciaként a másikkal próbáltam elérni. Ehhez már nem azonos felépítést választottam, hanem egyszerűen az általam ismert módokon próbáltam megközelíteni az eredményt.

A képen látható az iterált változata az első modelnek, ez a CIFAR10-es adathalmazon 74%-os pontosságot ért el. Tehát kb. 4% javulást okozott ez a minimális fejlesztés. A célom az volt, hogy a BoxConv-al megközelítsem ezt az eredményt.

Az általam már beváltnak tekinthető módszerek alapján haladtam a javítgatások során, ez pedig 4 csoportot jelentett:

  • Ideális Epoch szám meghatározása
  • Fix/epochonként csökkenő learning rate
  • Filterek számának meghatározása
  • Model struktúra változtatása

Ezek a csoportok egymásra épülő eredmények sorát adták, az elv az volt, hogy az alap struktúrából indulok ki, és az egyes csoportok legjobb eredményét és konfigurációját viszem tovább a következőbe. Így pl. a második csoport alapját, az első csoport nyertes konfigurációja képezte. Az eredmények a következők:

Epochok számának meghatározása

  • 10–58.32%
  • 20–59.50%
  • 30–59.42%

Learning rate

  • Fix Learning rate — 59.50%
  • Epochonként csökkenő Learning rate — 52.47%

Filterek száma csatornánként

  • 40–59.50%
  • 80–57.47%
  • 20–59.60%

Model struktúra változtatása

  • Alap 59.50%
  • Alap+3 réteg teljesen összekötött 59.23%
  • 3×3-as Conv BoxConv előtt 59.61%
  • 3×3-as Conv BoxConv után 50.54%
  • 3×3-as Conv BoxConv előtt és után 56.46%
  • 2 réteg BoxConv 53.36%

Minden csoportban kiemeltem a legjobb eredményeket, látható, hogy minimálisan reagált csak a model a változásokra, azonban átlagosan 60% körüli pontosság érhető el a különböző konstrukciókból. Ez persze nem rossz eredmény, hiszen a véletlen találgatás 10%-ot adna csak (mivel 10 csoport van az adathalmazban), azonban a 3×3-as 74%-ához képest alul marad.

Vizualizáció

A GitHub projektben látható volt egy kis gif a működés közben, melyet rekonstruálni nem volt túl nehéz. Úgy gondoltam, hogy így talán könnyebb lesz debugolni a modelt, ha mégis látható, hogy mit csinál futás közben.

Az alapbeállítás a kernelek darabszámára 40 volt, a tesztek során kiderült, hogy esetenként a kevesebb kernel jobb, azonban a színes képeken a 3×40 de még a 3×20 filter is átláthatatlan lett volna, így minden alkalommal úgy határoztam meg a számukat, hogy összesen 40 darab legyen a képen RGB, illetve grayscale adathalmazon is.

A széleskörű szemléltethetőség végett itt már több adathalmazt is kipróbáltam, név szerint: MNIST, EMNIST, FashionMNIST, CIFAR10, STL10

EMNIST, FashionMNIST, MNIST

A fenti 3 eset a “jó” müködést mutatja. Ezekben az esetekben a model 90%+ pontosságot tudott elérni, tehát a kernelek jók konvergáltak a megfelelő részleteire a képnek.

CIFAR10, STL10

A következőkben látható, hogy az RGB csatornák már nehezére esnek az algoritmusnak. A keretek nem találják a megfelelő részleteket, gyakorlatilag “ráközelítenek” egy pontra, ami persze nem mond semmit, így az eredményen is látható, hogy hibás működést okoz. Mivel a legnagyobb különbség a CIFAR10, valamint STL10 között, hogy az első grayscale a másik pedig RGB, ezért úgy gondoltam, hogy ha átalakítom a színeseket, akkor jobb eredményt kapok.

Cifar10_grayscale, STL10_grayscale

Mint látható, valamivel valóban jobb konvergációt tapasztalhatunk. Eltűntek az “összezsugorodó” kernelek, azonban még így sem látható az a fajta működés, ami az MNIST-eken tapasztalható.

Konklúzió

A BoxConvolution elképzelése nagyon ígéretes volt. Sokkal könnyebb, egyszerűbb, hatékonyabb tudna lenni, mint a mostani megoldások, azonban egyenlőre nem mutatja a kívánt eredményeket. A fejlesztő elérhető, nekem is munkám során sokszor, szinte azonnal válaszolt, ha valami problémám adódott és készségesen segített. Tehát a projekt aktív, az elképzelés kecsegtető és amennyiben sikerül javítani, akkor nagyszerű eszköz lehet a CNN fejlesztés során. Remélem így is lesz, én mindenképpen bízom benne!

Kódok és a gif-ek videóként: https://github.com/illestom/BoxConv

Source: Artificial Intelligence on Medium

(Visited 3 times, 1 visits today)
Post a Comment

Newsletter