Zaoštravanje između neuronskih mreža
Zadnjih godina svjedoci smo masovnog iseljavanja kvalitetnih hrvatskih znanstvenika, inženjera i sl. u razne ‘obećane’ zemlje gdje su njihove sposobnosti mnogo cjenjenije nego u Hrvatskoj, kako u novčanom smislu, tako i u smislu društvenog statusa. Neki odlaze već nakon završetka srednje škole na vrhunske fakultete kao što su Cambridge, Oxford, ETH. Neki upišu fakultet u Hrvatskoj i kroz razne programe studentskih razmjena i praksi se zaljubljuju u sve velike pogodnosti koje im ti programi pružaju, a u Hrvatskoj ih nema ni u tragovima.
Ovdje donosim obrnutu verziju tog standardnog obrasca kroz svoja iskustva i nova saznanja koja sam stekao na ljetnoj praksi u Microsoftu 2017. Odlučio sam napraviti obrnutu stvar od većine. Odlučio sam otići na što veći broj praksi, tamo pokupiti što više znanja i vratiti ih u Hrvatsku. Zatim, u Hrvatskoj upisati doktorat, a programiranjem se baviti koliko stignem sa strane i na taj način paralelno razvijati više vještina. Takvo nešto ne bi bilo moguće u Microsoftu gdje stalno treba ganjati razne rokove, mukotrpno raditi cijeli tjedan, odmarati se u subotu i u nedjelju se već psihološki pripremati za ponedjeljak. Osim u slučaju da vas iznimno ne pozovu da hitno morate doći na radno mjesto i za vikend. Čak i ako u Microsoftu razvijem neko inovativno i efikasno rješenje nekog problema, moje ime ne bi stajalo uz to, nego ime Microsofta.
Bio sam na ljetnoj praksi u Microsoftu ukupno tri puta: 2015. bio sam u Microsoftovom razvojnom centru u Beogradu, a 2016. i 2017. u glavnom centru u Redmondu u SAD-u. Kako sam 2015. pretežno radio na tvrdim i manje zabavnim inženjerskim projektima, a projekt na kojem sam radio 2016. je u patent-pending fazi (pa nisam siguran koliko smijem otkrivati), fokusirat ću se na 2017.
Prije nego što nastavim, bilo bi korisno objasniti kako funkcioniraju ljetne prakse u Microsoftu. Praksa u pravilu traje dvanaest tjedana. Svakom pripravniku dodijeljen je mentor koji istodobno igra ulogu nadređenog i ulogu savjetnika. Mentor pripravniku zadaje projekt, cijelo vrijeme nadgleda njegov napredak i daje mu savjete i materijale koji mogu biti od koristi. Na kraju prakse, mentor na temelju konačnog ishoda projekta donosi zaključak jesu li pripravnikove sposobnosti u skladu s Microsoftovim potrebama. U slučaju pozitivnog ishoda, pripravnik će dobiti ponudu za stalan posao ili za novu praksu ukoliko je još uvijek student.
Početkom srpnja 2017. stigao sam u Redmond na svoju drugu praksu u SAD-u. Ponovno sam imao istog mentora koji je upravo tad oformio novi tim pa sam imao čast biti jednim od prvih članova novog Data Group tima. Tim se fokusirao na deep learning, posebno na relativno novu metodu naziva Generative Adversarial Networks (GANs). Pred mene je stavljen zadatak da istražim tu metodu i da proučim kako se primjenjuje na problem super rezolucije slika: kako sliku uvećati, a da ona ostane oštra?
Metodu GAN-ova prvi je uveo Ian Goodfellow 2014. Ideja je složiti mini-sustav od dvije duboke neuronske mreže. Jednu zovemo generator, a drugu diskriminator. Prvi problem na kojem je ta metoda isprobana bio je problem generiranja znamenaka koje izgledaju kao da ih je rukom napisao čovjek pa je korisno na tom primjeru pokazati kako metoda radi.
Cilj diskriminatora generatora je razlikovati slike 64 × 64 koje prikazuju rukom pisanu znamenku (istinite) od svih ostalih (lažne). Cilj generatora je stvarati slike koje će diskriminator označiti kao istinite. To postižemo na način da generatorovu funkciju greške definiramo formulom koja će biti veća ako je diskriminator za generiranu sliku rekao da se čini lažnom, a manja u suprotnom. Slično zaključivanje iskoristimo i za funkciju greške diskriminatora. Pritom se diskriminatoru u svakoj iteraciji kao primjeri istinitih slika daju sakupljene slike ručno pisanih znamenki (MNIST dataset), a kao primjeri lažnih ono što je izašlo iz generatora.
Može se pokazati da će algoritam s povratnim postupkom gradijentnog spusta, uz pogodno odabranu funkciju greške i uz pravilan niz koraka u treniranju koji u praksi nije moguće postići, koeficijenti u obje mreže konvergirati. Svaki od koraka u ovom procesu je znanost za sebe: način postavljanja početnih koeficijenata, odabir varijante gradijentnog spusta, plana treninga (npr. koliko iteracija treniranja generatora moramo napraviti prije nego što treniramo diskriminator i tako u krug).
Prije nego što ovo modeliramo na način da obavlja zadatak super rezolucije slika, trebamo istražiti koje sve metode super rezolucije postoje. Za početak, postoji naš standardni zoom-in u Microsoft Office Picture Manageru. Sigurno ste uočili da ne radi baš sasvim glupo. Iako je slika prilično loša nakon povećanja od 200%, ipak je jasno da nije ‘kockasta’. Radi se o bikubnoj interpolaciji. Ona je zadana kratkom i jednostavnom formulom.
Sada uočimo da se naša ciljana oštra slika ne razlikuje pretjerano od te bikubno uvećane slike, u smislu vrijednosti piksela. To je naš početni zaključak i stvarni zadatak: ne želimo malu sliku povećati da bude oštra, nego veliku mutnu sliku ‘popraviti’. Trening set nije teško napraviti, samo prikupimo hrpu slika, napravimo im kopije, njih umanjimo i zatim uvećamo da dobijemo mutne verzije originala. Prije nego što uvedemo GAN-ove u priču, napravimo duboku neuronsku mrežu koja pretvara mutne slike u relativno oštre.
Kad je ta mreža istrenirana, već će ona sama za sebe dati solidne rezultate. Ona će biti naš generator. Sad nezavisno od generatora, trenirajmo drugu mrežu. Njen trening set je skup oštrih originala i solidnih outputa generatora. Treniramo ju u smjeru da vraća 1.0 za oštre originale, a 0.0 za outpute generatora. I sada iskoristimo ideju GAN-ova. Generator će pokušati generirati slike koje sliče oštrim originalima. Kad se dovoljno poboljšao, sad treniramo diskriminatora da razlikuje imeđu oštrih i originala i novih, više nego solidnih outputa poboljšanog generatora. Proces ponavljamo mnogo puta.
Moguće je dobiti prilično dobre rezultate. Zanimljivo bi bilo provjeriti i što se dogodi ako uzastopno primjenjujemo našu izoštravajuću mrežu. Ako mutna slika postane izoštrena, ali ne sasvim, što ako tu dobivenu sliku još jednom provučemo kroz našu mrežu? Postat će još oštrija, ali pomalo neprirodna i na slici će se pojaviti artefakti. Postavlja se zanimljivo pitanje: je li možda bolje namjerno istrenirati mrežu da radi lošije kako bi njena dvostruka uzastopna primjena dala rezultat bolji od svih do sada dobivenih? Negdje kod tog pitanja moja praksa je stigla do kraja pa na njega nisam nikad odgovorio jer nigdje više nisam imao pristup dovoljno jakom računalu da na njemu vrtim toliko duboke mreže.
Trenutno sam na doktoratu na PMF-u gdje se bavim eliptičkim krivuljama. Eliptičku krivulju je najlakše zamisliti kao skup točaka koje su rješenja neke jednadžbe i koje možemo zbrajati i oduzimati po nekom relativno intuitivnom pravilu. Od posebnog su interesa točke s racionalnim kordinatama ili s koordinatama iz nekog drugog specifičnog polja. Slično kao što je dva velika prosta broja lako pomnožiti, ali je njihov umnožak teško faktorizirati, tako je i nekoliko točaka na eliptičkoj krivulji lako zbrojiti, ali je njihov zbroj teško rastaviti na pribrojnike, pri čemu je ovdje nesrazmjer težina osjetno veći. Takve situacije su obično idealne za primjenu u kriptosustavima gdje se danas eliptičke krivulje zaista uvelike koriste. S druge strane, imam dovoljno slobodnog vremena da eksperimentiram s algoritmima poput gore opisanog (ali u mnogo manjoj mjeri nego na specijaliziranim računalima).
Borna Vukorepa
bovukor@math.hr