Recognizer projekt

Az emberi képességek közül számomra mindig érdekesek voltak azok, amelyeket szinte mindenki használ, de senki sem tudná szabályokba foglalni, hogy pontosan hogyan is csinálja (pl. balesetmentes közlekedés biciklivel, a másik ember felismerése a legkülönbözőbb helyzetekben). A kézzel írott számjegyek felismerése is ebbe a csoportba tartozik, és első ránézésre nagyon nem nyilvánvaló, hogy hogyan lehetne ezt a feladatot számítógépes programmal megoldani. Az ember a számjegyfelismerési képességet példák alapján történő tanulással sajátítja el. Miért ne lehetne ugyanezt az utat követni az elkészítendő programnál is? Ez azt jelenti, hogy a számjegyfelismerés szabályainak beprogramozása helyett inkább egy tanuló gépet készítünk, amelynek majd számjegyeket ábrázoló képeket mutatunk a hozzájuk tartozó helyes válaszokkal. A tanítás után megézzük, hogy mit válaszol a rendszer eddig még nem látott képekre. Természetesen nem tudjuk megmutatni a gépünknek a világ összes lehetséges kézzel írott számjegyét (ahogy a számjegyeket tanuló diák sem nézi végig összeset). Azt szeretnénk, hogy kellő mennyiségű kép - válasz pár után megtanulása után a gépünk már jól általánosítson.

Automatikus számjegyfelismerőt a fenti alapelv alkalmazásával már sokan, sokféleképpen készítettek (először 1990 körül). Bár a feladat alapvető megoldhatósága ma már nem kérdés, az egyre pontosabb és zajtűrőbb megoldások keresése továbbra is nyitott terület. A tanuló algoritmusok kipróbálására, kísérletezésre is kitűnően alkalmas a számjegyfelismerési probléma. Egy ilyen kísérletezésemet fogja össze a Recognizer projekt, amelyen 2002-ben dolgoztam.

Tanuló gépként mesterséges neurális hálózatot (artificial neural network = ANN) használtam, ezen belül többrétegű perceptront (multilayer perceptron = MLP). A mesterséges neurális hálózatok az élőlények idegrendszerét próbálják utánozni valamilyen módon. A mesterséges neuronháló is egyszerű építőelemek (neuronok) sűrűn összekötött rendszeréből áll, amelyben a kapcsolatok serkentik vagy gátolják az ingerek továbbhaladását. A hálózat tudása a kapcsolatokban van elrejtve, a tanulás során a kapcsolatok erőssége változik. Fontos megjegyeznem, hogy a mesterséges és a biológiai neuronhálózatok közötti hasonlóság csak magas szinten, távoli nézőpontból áll fenn, a részletek teljesen különbözőek. De az alapgondolat, vagyis a természet valamilyen szintű utánzása így is érdekes ötlet.

A többrétegű perceptron hálózatok legnagyobb előnye az egyszerűség. Mind a felépítés, mind a tanulási algoritmus olyan egyszerű, hogy egy átlagos programozó kb. 1 nap alatt készíthet magának egyet (hacsak nem olyan lusta, hogy inkább az internetről tölt le egy kész forráskódot ;-). Ki szerettem volna próbálni, hogy mire lehet képes ez a primitív építőelemek sokaságából álló, rendkívül egyszerű felépítésű és működésű rendszer. A kísérletben a hálózat a számjegyeket 14x14-es vagy 7x7-es felbontású vál-tozatban kapta, így 196 vagy 49 bemenettel rendelkezett. A rejtett rétegek számát illetve méretét változtatni lehetett, a kimeneti neuronok száma 10 volt (minden számjegyhez tartozott egy). Ismeretlen bemenet osztályozásakor az a számjegy volt a válasz, amelyhez tartozó kimenet értéke a legnagyobb.

A számjegy-felismerési feladatra jellemző, hogy bizonyos típusú bemeneti torzítások kis mértékű alkalmazása nem befolyásolja az osztályozás végeredményét. Ilyen például az eltolás, elforgatás, vagy vastagítás ill. vékonyítás. Ezt az a priori tudást sokféleképpen be lehet építeni a számjegyfelismerőbe. Talán a legegyszerűbb megközelítés a számjegyek torzított változatainak hozzávétele a tanító készlethez. 14x14-es vagy 7x7-es képekre a néhány pixellel való eltolás megvalósítható információveszteség nélkül (invertálható módon), ha a kép szélein található egy kis üres sáv. Viszont forgatás vagy vastagítás esetén a túl durva felbontású reprezentáció miatt a bemenet célzott módosítása mellett információveszteség is fellép. Ezért a kísérletben csak a számjegyek eltolt változataival bővítettem a tanító készletet, amelynek elemszáma ily módon 9-szeresére volt növelhető.

A tanítást hagyományos backpropagation algoritmusal végeztem, momentum módszer alkalmazásával. A súlyok kezdeti értékét véletlenszerűen állítottam be, a [-0,1; +0,1] intervallumból történő, egyenletes eloszlású sorsolással. A bátorsági faktort a tanítás elején a háló mérete alapján állítottam be (nagyobb hálóhoz kisebb bátorsági faktor), majd a tanítás során folyamatosan csökkentettem. Momentum együtthatóként minden tanításnál fix 0,8-at használtam. A tanításhoz és a teszteléshez a szabadon elérhető MNIST adatbázist használtam. Az MNIST adatbázis tanító készlete 60 000, tesztelő készlete 10 000 elemet tartalmaz. A tesztelő készlet érdekessége, hogy számjegyei más emberektől származtak mint a tanító készlet számjegyei. A különböző beállítások mellett elért pontosságok az alábbi táblázatból olvashatók le:

Bemenetek számaRejtett neuronok számaTanító készlet méretePontosság
498060 00095,6 %
4912060 00096,5 %
49180540 00096,6 %
19630060 00098,0 %
19660060 00098,6 %
196600540 00099,1 %

A tanítási paraméterek illetve a felismerési pontosság közötti összefüggések megfelelnek a várakozásunknak (a képek finomabb reprezentálása illetve a tanító készlet bővítése növeli a pontosságot). Annyit meg kell jegyeznem, hogy a kísérletben a tanítást minden beállítás mellett többször is elvégeztem (eltérő kezdeti súlyokkal, esetleg másképp változtatták a tanulási rátát és a momentumegyütthatót), és az eredménytáblázatba csak a legjobban sikerült számjegyfelismerők kerültek bele. Az összes tanítást figyelembe véve fordultak elő anomáliák, például hogy némelyik jól sikerült 7x7-es bemenetű MLP pontosabbnak bizonyult egy rosszul sikerült 14x14-esnél (azonos tanító készlet mellett). Érdekesség, hogy a legpontosabb (99,1 %-os felismerési aránnyal rendelkező) hálózat tanítása kb. 24 óráig tartott.