Site Overlay

Koneoppiminen on hauskaa! Osa 3: Syväoppiminen ja konvolutiiviset neuroverkot

Voidaan kouluttaa tällainen neuroverkko muutamassa minuutissa nykyaikaisella kannettavalla tietokoneella. Kun se on valmis, meillä on neuroverkko, joka pystyy tunnistamaan ”8:n” kuvia melko suurella tarkkuudella. Tervetuloa (1980-luvun lopun) kuvantunnistuksen maailmaan!

Tunnelinäkö

Tosi siistiä, että pelkkä pikseleiden syöttäminen neuroverkkoon todella toimi kuvantunnistuksen rakentamisessa! Koneoppiminen on taikaa! …eikö?

No, se ei tietenkään ole niin yksinkertaista.

Hyvä uutinen on ensinnäkin se, että ”8”-tunnistimemme todella toimii hyvin yksinkertaisissa kuvissa, joissa kirjain on aivan kuvan keskellä:

Mutta nyt todella huonot uutiset:

”8”-tunnistimemme ei toimi lainkaan silloin, kun kirjain ei ole täydellisesti keskellä kuvaa. Pienikin asennonmuutos pilaa kaiken:

Tämä johtuu siitä, että verkkomme oppi vain täydellisesti keskitetyn ”8:n” mallin. Sillä ei ole mitään käsitystä siitä, mitä epäkeskeinen ”8” on. Se tuntee täsmälleen yhden kuvion ja vain yhden kuvion.

Tämä ei ole kovin hyödyllistä todellisessa maailmassa. Reaalimaailman ongelmat eivät koskaan ole näin puhtaita ja yksinkertaisia. Meidän on siis keksittävä, miten saamme neuroverkkomme toimimaan tapauksissa, joissa ”8” ei ole täydellisesti keskellä.

Brute Force Idea #1: Haku liukuikkunan avulla

Loimme jo todella hyvän ohjelman, jolla löydämme kuvassa keskellä olevan ”8:n”. Entä jos vain etsisimme koko kuvan ympäriltä mahdollisia ”8”:ia pienemmissä osissa, osa kerrallaan, kunnes löydämme yhden?

Tätä lähestymistapaa kutsutaan liukuvaksi ikkunaksi. Se on brute force -ratkaisu. Se toimii hyvin joissakin rajatuissa tapauksissa, mutta se on todella tehoton. Sama kuva on tarkistettava yhä uudelleen ja uudelleen etsimällä erikokoisia kohteita. Pystymme parempaankin!

Brute Force Idea #2: Enemmän dataa ja syvä neuroverkko

Kouluttaessamme verkkoamme näytimme sille vain täydellisesti keskitettyjä ”8”-kuvia. Entä jos kouluttaisimme sitä useammalla datalla, mukaan lukien ”8”-merkkejä kaikissa eri asennoissa ja koossa ympäri kuvaa?

Meidän ei edes tarvitse kerätä uutta harjoitusdataa. Voimme vain kirjoittaa skriptin, joka luo uusia kuvia, joissa ”8”-merkit ovat kaikenlaisissa eri asennoissa kuvassa:

Loimme synteettistä harjoitusdataa luomalla erilaisia versioita harjoituskuvista, jotka meillä jo oli. Tämä on erittäin hyödyllinen tekniikka!

Tämän tekniikan avulla voimme helposti luoda loputtoman määrän harjoitusdataa.

Enemmän dataa vaikeuttaa neuroverkkomme ongelman ratkaisemista, mutta voimme kompensoida tämän tekemällä verkostamme suuremman ja siten kykenevän oppimaan monimutkaisempia kuvioita.

Tehdäksemme verkosta suuremman me vain kasaamme kerroksittain solmuja:

Kutsumme tätä ”syväksi neuroverkoksi” (deep neural network), koska siinä on useampia kerroksia kuin tavallisessa neuraalisessa neuroverkossa.

Tämä ajatus on ollut esillä 1960-luvun loppupuolelta lähtien. Mutta viime aikoihin asti näin suuren neuroverkon kouluttaminen oli vain liian hidasta ollakseen hyödyllistä. Mutta kun keksimme, miten käyttää 3d-grafiikkakortteja (jotka on suunniteltu tekemään matriisikertoja todella nopeasti) tavallisten tietokoneprosessoreiden sijasta, suurten neuroverkkojen kanssa työskentelystä tuli yhtäkkiä käytännöllistä. Itse asiassa täsmälleen samaa NVIDIA GeForce GTX 1080 -näytönohjainta, jota käytät Overwatchin pelaamiseen, voidaan käyttää neuroverkkojen kouluttamiseen uskomattoman nopeasti.

Mutta vaikka pystymme tekemään neuroverkostostamme todella suuren ja kouluttamaan sen nopeasti 3d-grafiikkakortin avulla, emme silti pääse ratkaisuun asti. Meidän on oltava fiksumpia siinä, miten käsittelemme kuvia neuroverkossamme.

Ajattele asiaa. Ei ole järkevää kouluttaa verkkoa tunnistamaan ”8” kuvan yläreunassa erillään siitä, että sitä koulutetaan tunnistamaan ”8” kuvan alareunassa, ikään kuin ne olisivat kaksi täysin erilaista kohdetta.

Pitäisi olla jokin keino saada neuroverkko tarpeeksi älykkääksi, jotta se tietäisi, että ”8” missä tahansa kuvassa on sama asia ilman ylimääräistä koulutusta. Onneksi… sellainen on!

Ratkaisu on konvoluutio

Ihmisenä tiedät intuitiivisesti, että kuvilla on hierarkia tai käsitteellinen rakenne. Ajattele tätä kuvaa:

Gratuaalinen kuva pojastani

Ihmisenä tunnistat välittömästi hierarkian tässä kuvassa:

  • Mailla on ruohoa ja betonia
  • Täällä on lapsi
  • Lapsi istuu pomppuhevosen päällä
  • Pomppuhevonen on ruohon päällä

Vaikka tärkeintä on, että tunnistamme ajatuksen lapsesta riippumatta siitä, millä pinnalla lapsi on. Meidän ei tarvitse opetella uudelleen ajatusta lapsesta jokaiselle mahdolliselle pinnalle, jolla se voisi esiintyä.

Mutta juuri nyt neuroverkkomme ei pysty tähän. Se ajattelee, että ”8” kuvan eri osassa on täysin eri asia. Se ei ymmärrä, että objektin liikuttelu kuvassa ei tee siitä jotain erilaista. Tämä tarkoittaa, että sen on opittava uudelleen jokaisen objektin tunnistaminen jokaisessa mahdollisessa asennossa. Se on syvältä.

Meidän täytyy antaa neuroverkkomme ymmärtää translaatiovarianssin – ”8” on ”8” riippumatta siitä, missä kohtaa kuvaa se näkyy.

Tehdään tämä käyttämällä prosessia nimeltä konvoluutio. Konvoluution idea on saanut inspiraationsa osittain tietotekniikasta ja osittain biologiasta (eli hullut tiedemiehet kirjaimellisesti tökkimässä kissojen aivoja oudoilla koettimilla selvittääkseen, miten kissat käsittelevät kuvia).

Miten konvoluutio toimii

Sen sijaan, että syöttäisimme neuraaliverkkoomme kokonaisia kuvia yhtenäisenä numeroiden ruudukkona, aiomme tehdä jotakin paljon älykkäämpää, jossa hyödynnetään ajatusta siitä, että objekti säilyy samanlaisena riippumatta siitä, missä kohtaa kuvaa se esiintyy.

Näin se toimii, askel askeleelta –

Vaihe 1: Jaetaan kuva päällekkäisiin kuvalaatikoihin

Samankaltaisesti kuin liukuikkunahakumme edellä, ohjataan liukuikkuna koko alkuperäisen kuvan yli ja tallennetaan jokainen tulos erillisenä, pienenä kuvalaatikkona:

Toimimalla näin muutimme alkuperäisen kuvamme 77:ksi samankokoiseksi pikkuruiseksi kuvalaataksi.

Vaihe 2: Syötä jokainen kuvalaatta pieneen neuroverkkoon

Aiemmin syötimme yksittäisen kuvan neuroverkkoon nähdaksemme, oliko se ”8”. Teemme tässä täsmälleen saman, mutta teemme sen jokaiselle yksittäiselle kuvalaatikolle:

Toista tämä 77 kertaa, kerran jokaiselle laatikolle.

Tässä on kuitenkin yksi iso käänne: Pidämme samat neuroverkon painotukset jokaiselle yksittäiselle laatalle samassa alkuperäisessä kuvassa. Toisin sanoen kohtelemme jokaista kuvan laattaa tasavertaisesti. Jos jossakin laatassa näkyy jotain mielenkiintoista, merkitsemme kyseisen laatan mielenkiintoiseksi.

Vaihe 3: Tallenna kunkin laatan tulokset uuteen matriisiin

Emmekä halua menettää alkuperäisten laattojen järjestystä. Tallennamme siis jokaisen laatan käsittelystä saadun tuloksen ruudukkoon, joka on samassa järjestyksessä kuin alkuperäinen kuva. Se näyttää tältä:

Aloitimme siis suurella kuvalla ja lopetimme hiukan pienemmällä matriisilla, johon on tallennettu, mitkä alkuperäisen kuvamme osat olivat kiinnostavimpia.

Vaihe 4: Downsampling

Vaiheen 3 tuloksena syntyi array, joka kartoittaa, mitkä alkuperäisen kuvan osat ovat kiinnostavimpia. Mutta tuo array on silti melko suuri:

Voidaksemme pienentää arraya, otamme siitä downsamplea käyttämällä algoritmia nimeltä max pooling. Se kuulostaa hienolta, mutta ei ole sitä ollenkaan!

Katsomme vain jokaista 2×2 ruudun ruudukkoa ja pidämme suurimman luvun:

Idea tässä on se, että jos löysimme jotain kiinnostavaa jostain neljästä syötetystä ruudun ruudun ruudun ruudun 2×2 neliön muodostavasta ruudukkoon kuuluvasta ruudukosta, pidämme kiinnostavimmaksi osoittautuvan osan. Näin pienennämme matriisin kokoa ja säilytämme samalla tärkeimmät bitit.

Loppuvaihe: Tee ennuste

Tähän mennessä olemme pienentäneet jättimäisen kuvan melko pieneksi joukoksi.

Arvaa mitä? Tuo matriisi on vain joukko numeroita, joten voimme käyttää tuota pientä matriisia toisen neuroverkon syötteenä. Tämä lopullinen neuroverkko päättää, onko kuva täsmäävä vai ei. Erottaaksemme sen konvoluutiovaiheesta kutsumme sitä ”täysin kytketyksi” verkoksi.

Alusta loppuun koko viisivaiheinen putkemme näyttää siis tältä:

Lisäämällä vielä lisää vaiheita

Kuvankäsittelyputkemme koostuu useista vaiheista: konvoluutiosta (convoluutiosta), maksimaalisesta poolista (max poolingista) ja lopulta täysin kytketystä (fully connected) verkosta.

Kun ratkaiset ongelmia reaalimaailmassa, näitä vaiheita voidaan yhdistellä ja pinota niin monta kertaa kuin haluat! Sinulla voi olla kaksi, kolme tai jopa kymmenen konvoluutiokerrosta. Voit heittää mukaan max poolingin aina, kun haluat pienentää datan kokoa.

Perusajatuksena on aloittaa suuresta kuvasta ja kiehauttaa sitä jatkuvasti, askel askeleelta, kunnes saat lopulta yhden tuloksen. Mitä enemmän konvoluutiovaiheita sinulla on, sitä monimutkaisempia piirteitä verkko pystyy oppimaan tunnistamaan.

Ensimmäinen konvoluutiovaihe saattaa esimerkiksi oppia tunnistamaan terävät reunat, toinen konvoluutiovaihe saattaa tunnistaa nokat käyttämällä tietämystään terävistä reunoista, kolmas vaihe saattaa tunnistaa kokonaisia lintuja käyttämällä tietämystään nokista jne.

Tältä näyttää realistisempi syvä konvoluutioverkko (jollainen löytyy tutkimuspaperista):

Tässä tapauksessa he aloittavat kuvasta, joka on kooltaan 224 x 224 pikseliä, soveltavat konvoluutiota (convoluutio) ja maksimipoolausta (max pooling) kahdesti, soveltavat konvoluutiota (convoluutio) vielä kolme kertaa, soveltavat maksimipoolausta (max pooling), ja sen jälkeen heillä on kaksi täysin kytkettyä kerrosta. Lopputuloksena kuva luokitellaan johonkin 1000 kategoriasta!

Oikean verkon rakentaminen

Miten siis tiedät, mitkä vaiheet sinun on yhdistettävä saadaksesi kuvaluokittimesi toimimaan?

Hyvin rehellisesti sanottuna sinun on vastattava tähän tekemällä paljon kokeiluja ja testaamalla. Saatat joutua kouluttamaan 100 verkkoa ennen kuin löydät optimaalisen rakenteen ja parametrit ratkaisemallesi ongelmalle. Koneoppimiseen kuuluu paljon kokeilua ja erehdyksiä!

Lintuluokittelijamme rakentaminen

Nyt vihdoin tiedämme tarpeeksi kirjoittaaksemme ohjelman, joka osaa päättää, onko kuva lintu vai ei.

Kuten aina, tarvitsemme jonkin verran dataa aloittaaksemme. Ilmainen CIFAR10-data-aineisto sisältää 6000 kuvaa linnuista ja 52000 kuvaa asioista, jotka eivät ole lintuja. Mutta saadaksemme vieläkin enemmän dataa lisäämme myös Caltech-UCSD Birds-200-2011 -datasarjan, jossa on toiset 12 000 lintukuvaa.

Tässä on muutamia lintuja yhdistetystä datasarjastamme:

Vastaa

Sähköpostiosoitettasi ei julkaista.