keskiviikko 28. elokuuta 2019

Syvät neuroverkot ja kuvien käsittely

Kirjoittaja: Helinä Heino


Nykyisin syväoppimista voidaan käyttää kasvojen tunnistukseen ja tunnistautumiseen. Tunnistautuminen perustuu siihen, että jokaisen ihmisen kasvonpiirteiden mittasuhteet ovat uniikkeja ja syvä neuroverkko oppii näitä kasvojen edustavia piirteitä. Yllä oleva kuva on Pixabayn kuvapankin materiaalia.


Syvät neuroverkot vaativat riittävää laskentatehoa   

Syvät neuroverkot (engl. Deep Neural Network, DNN) ovat tällä hetkellä hyvin suosittuja tekoälyn sovelluksia. Neuroverkkoja on tutkittu 1960-luvulta asti, mutta jo 1940-luvulla on luotu neuroverkkojen matemaattisia perusteita.  Kuitenkin vasta 2000-luvulla tietokoneiden muisti, kapasiteetti ja laskentateho riittivät verkkojen järkevään käyttöön.

Merkittävässä roolissa on ollut erityisesti grafiikkaprosessorien (engl. Graphical Processing Unit, GPU) kehitystyö. GPU on tärkeä osa neuroverkkotyöskentelyyn tarkoitettua laskentatyöasemaa, sillä se mahdollistaa tehokkaan rinnakkaislaskennan. Esimerkiksi näytönohjaimia valmistava NVIDIA on kehittänyt verkosta ilmaiseksi ladattavan CUDA-ohjelmointirajapinnan, jota monet koneoppimiskirjastot käyttävät.



Kuva Pixabayn kuvapankista.  Yllä olevassa kuvassa on Nvidian näytönohjain.

Neuroverkkojen kerroksissa on usein tuhansia toisistaan riippumattomia laskutoimituksia, mistä syystä rinnakkaislaskennalla voidaan nopeuttaa prosessointia merkittävästi, kun dataa on runsaasti. Tällöin ei muodostu pullonkaulaa, jossa yksi yksikkö laskisi kaikki operaatiot perättäin, vaan useat ytimet laskevat eri operaatioita samanaikaisesti. Tietokoneen keskusprosessoriin (engl. Central Processing Unit, CPU) verrattuna GPU tarjoaa moninkertaisen määrän laskentaytimiä, ja näin ollen jopa 100-kertaisen nopeuden pelkkään CPU:n verrattuna. Karkeasti arvioiden neuroverkkojen koulutus nopeutuu suoraan verrannollisesti saatavilla olevan laskentatehon mukaan.



Syväoppiminen  

Syväoppiminen (engl. deep learning) on monikerroksisia, syviä neuroverkkoja hyödyntävä tekoälymenetelmä. Syväoppimista voidaan soveltaa hyvin monenlaisille datatyypeille, kuten esimerkiksi puheentunnistukseen äänisignaalista tai hintakuplien ennustamiseen talousdatasta.

Kuvadatan prosessointiin käytetään ns. konvoluutioneuroverkkoja (engl. Convolutional Neural Network, CNN), jotka saavat nimensä verkon kerroksissa esiintyvistä matemaattisista konvoluutio-operaatioista. Menemättä sen syvemmälle matematiikkaan, konvoluutiolla voidaan erottaa kuvista erilaisia piirteitä, joita voidaan syöttää edelleen seuraaville konvoluutiokerroksille. Näin ensimmäiset konvoluutiokerrokset oppivat yksinkertaisia piirteitä kuten värejä, reunoja ja muotoja, ja syvemmällä verkossa opitaan monimutkaisia piirteitä kuten esimerkiksi silmä, nenä tai korva. Lopulta kuvasta voidaan vaikkapa tunnistaa tietty henkilö. AIDMEI-projektissa ollaan kiinnostuneita lääketieteellisten kuvien käsittelystä näiden neuroverkkojen avulla.

Lähestytään asiaa perinteisellä esimerkillä, jossa tunnistetaan, onko verkkoon syötetyssä kuvassa kissa. Jotta kissa voidaan tunnistaa kuvasta, on ensin oltava selkeä malli siitä, miltä kissa näyttää. Tätä varten täytyy koota näytteitä eli kuvia monen kokoisista, värisistä ja mallisista kissoista, kuvia jotka eivät sisällä kissoja, sekä tieto että, onko kussakin kuvassa kissaa vai ei (annotointi). Tämän jälkeen verkko koulutetaan tunnistamaan kissa kuvasta. Verkon painokertoimet alustetaan esimerkiksi satunnaisilla luvuilla ja sille syötetään kuvia, joissa on kissa sekä kuvia, joissa ei ole kissaa (opetusdata). Kuvan prosessoituaan verkko antaa ulos ennusteen väliltä [0-1], joka tulkitaan esimerkiksi siten, että lukua 0.5 suurempi ennusteen arvo tarkoittaa, että verkon tuottaman mallin mukaan kuvassa olisi kissa.

Jos olet aiemmin liittänyt tarkasteltavan kohteen väärään luokkaan eli vaikkapa luullut pientä koiraa kissaksi, olet luultavasti saanut tästä palautetta ja oppinut virheestäsi. Myös neuroverkot oppivat palautteen kautta. Jos käsiteltävässä kuvassa ei ollut kissaa, verkkoa pyritään muokkaamaan siten, että luokitus onnistuisi seuraavalla kerralla. Käytännössä tämä tapahtuu päivittämällä verkon painokertoimia (ks. blogipostaus hermosolun toiminnasta) tappiofunktiota (loss function) minimoimalla. Jos taas kissa tunnistettiin onnistuneesti, ei muutosta tarvitse tehdä. Käymällä kaikki kuvat läpi useaan kertaan verkko lopulta onnistuu luomaan mallin, jolla voidaan tunnistaa kissoja tietyllä tarkkuudella. Seuraavaksi käyttäjä voi syöttää verkolle kuvan omasta kissastaan (joka ei siis ole osa opetukseen käytettyä datajoukkoa), jonka verkko toivottavasti tunnistaa täksi notkealiikkeiseksi petoeläimeksi.

Sama luokittelu toimii myös lääketieteellisten kuvien tapauksessa. Jos halutaan esimerkiksi erottaa syöpää sairastavien röntgenkuvat terveistä kuvista,   on neuroverkko ensin opetettava tähän tehtävään. Opetukseen käytettävän datan pitäisi olla annotoitua, eli kuviin liittyvät diagnoosit tulisi olla saatavilla (yksinkertaisimmassa tapauksessa sairas vai terve). Lisäksi muut tiedot, kuten esimerkiksi ikä, elämäntavat ja mahdolliset koepalalöydökset hyödyttävät verkon opetusta.

Hieman matemaattisemmin ilmaistuna syvä neuroverkko oppii funktion syötteen ja ennusteen välille, jota se soveltaa uusiin syötteisiin, ja joka voidaan optimoida minimoimalla ennusteen ja todellisen luokituksen välinen tappiofunktio.




Syvän neuroverkon koulutuksesta

Koulutukseen käytettävään dataan kuuluu tavallisesti opetusjoukko ja validiointijoukko. Nimensä mukaisesti opetusdatalla opetetaan verkko luokittelemaan näytteet oikein. Validiointijoukon avulla nähdään, kuinka hyvin verkko toimii datalle, jota ei käytetty opetusvaiheessa. Opetusdatan tarkoitus on saada verkko toimimaan mahdollisimman hyvällä tarkkuudella, ja validointidatan tarkoitus on ehkäistä ylisovittamista (overfitting). Ylisovitus on ongelmallista, sillä vaikka tässä tilanteessa neuroverkko pystyykin luokittelemaan opetusjoukon miltei täydellisesti, uudet verkon ennalta näkemättömät näytteet saavat virheellisen luokituksen, eikä verkko näin ollen ole tarpeeksi yleistettävissä muulle, kuin opetusdatalle. 



Tässä kuvaajassa vaaleansiniset pisteet edustavat opetusdatan terveitä potilaita ja harmaat pisteet opetusdatan sairaita potilaita.    Violetit pisteet edustavat terveitä potilaita, jotka eivät kuulu opetusjoukkoon, ne edustavat siis ennennäkemätöntä dataa. Punainen luokittelurajapinta viiva kuvastaa ylisovitettua mallia ja vastaava vihreä rajapinta viiva kuvastaa tavoiteltua mallia. Kuvaajalta nähdään että punainen viiva pystyy luokittelemaan täydellisesti opetusjoukon, mutta luokittelee ennennäkemättömät potilaat väärin.

  
Lopuksi verkon varsinainen suorituskyky selvitetään erillisen testijoukon avulla, jota ei käytetä opetuksessa eikä validoinnissa. Näin ollen saadaan arvio siitä, miten hyvin verkko toimii täysin ennennäkemättömälle datalle. Tyypillinen jako opetus, validointi ja testidataan on 80%, 15% ja 5% koko koulutukseen käytetystä datasta.

Jos neuroverkon suorituskykyä halutaan parantaa, lisätään usein koulutukseen käytettyä dataa, jolloin algoritmi pääsee käsittelemään mahdollisimman monenlaisia tapauksia. Kuviin voidaan myös lisätä kohinaa tai niitä voidaan kiertää, peilata ja venyttää (datan augmentointi) ja näin ollen luoda keinotekoisesti uusia näytteitä. Voidaan myös generoida varsinaisesta opetusdatasta poikkeavaa kuvadataa. Näiden operaatioiden tarkoituksena on estää verkkoa oppimasta liian spesifejä piirteitä ja parantaa verkon kykyä luokitella ennennäkemättömiä tapauksia. Toisaalta tämä lisää tarvittavan muistin määrää ja laskennan kestoa. Oppimisnopeutta voidaan parantaa eri keinoin, kuten esimerkiksi skaalaamalla kuvia pienemmiksi, jolloin käsiteltävän datan rakenne saadaan muotoon, jota syvän neuroverkon on nopeampi käsitellä. 

Kun ollaan tyytyväisiä neuroverkon luokituskykyyn, voidaan tämä optimoitu algoritmi sulauttaa johonkin olemassaolevaan tietokonejärjestelmään. Opetettu syvä neuroverkko ei vaadi suuria määriä muistitilaa tai erityisen tehokkaita prosessoreita sen käyttöön.