Oppimispäiväkirja syväoppimisesta, eli kuinka opin ohjelmoimaan neuroverkkoja Pythonilla, fast.ai:lla ja PyTorchilla.
Blogin lähdekoodi on GitHubissa plassi/tekoalyn-ohjelmointi-pythonilla
kirjoittanut Lassi Puurunen
Tästä alkaa artikkelisarja, jossa käydään läpi yksinkertaisen konenäön, eli konvoluutioneuroverkon kouluttaminen fast.ai:lla. Artikkelin lähdekoodi on saatavilla Google Colab -projektina. Colab -ympäristössä voit kopioda koodin itsellesi ja ajaa sitä Googlen palvelimella. Tekemällä koodiin pieniä muutoksia, voit toteuttaa haluamasi konenäköä käyttävän luokittelijan. Projekti perustuu fastbookin 2.luvun materiaaleihin.
Yläpuolella olevasta napista saat projektin lähdekoodin auki Colabissa.
Jos vastaasi tulee karhu, on sen lajista kolme vaihtoehtoa. Karhu voi olla metsässä liikkuva ruskeakarhu. Toisaalta karhu voi olla jääkarhu, joita legendan mukaan liikkuu Helsingin kaduilla. Yleisesti kotiympäristöissä tavattu karhulaji on kuitenkin teddykarhu, johon sen metsässä tai Helsingin kaduilla tavattavia heimotovereita ei tule sekoittaa. Onneksi tällaisten, mahdollisesti vaarallisten sekaannusten mahdollisuutta voidaan ehkäistä tekoälyn avulla.
Artikkelisarjassa toteutettava konvoluutioneuroverkko luokittelee kuvia sen perusteella, esiintyykö kuvassa ruskeakarhu, jääkarhu vai teddykarhu.
Koodia kannattaa kokeilla aina ohjelmointia opiskellessa itse, sillä se on tehokkain keino oppia ja oivaltaa järjestelmien toimintaa.
Tässä sarjan ensimmäisessä artikkelissa tutustutaan aluksi keinotekoisen neuronin, sekä monikerroksisen- ja konvoluutioneuroverkon rakenteisiin. Nämä kaikki ovat matemaattisia malleja, mutta mikäli matematiikka ei ole leipälajisi, ei syytä huoleen. Sarjassa ei matematiikka ole pääosassa, vaan tarkoituksena on toteuttaa konenäkö mahdollisimman käytännönläheisesti.
Tutustutaan pikaisesti neuroverkkojen perusosiin. Kuvassa 1 on esitetty biologisen neuronin kaavio. Kuten biologisessa neuronissa on neuronien välillä eri vahvuiset yhteydet ja aksonissa signaalia kuljettava toimintapotentiaali, on keinotekoisessa neuronissa painotetut sisääntulevat kaaret sekä summa- ja siirtofunktiot.
Kuva 1. Biologisen neuronin kaavio
Kuvasta 2 nähdään keinotekoisen neuronin kaavio. Keinotekoiseen neuroniin syötetään signaalit (X1, X2, Xn..) ja jokainen signaali kerrotaan sisään menevien kaarien painoilla (w1, w2, w3). Painotetut signaalit lasketaan summafunktiossa yhteen ja ulosmenevä signaali “suodatetaan” mallin arkkitehtuuriin valitulla siirtofunktiolla, jonka tehtävä on varmistaa esimerkin funktiossa, että syöte pysyy 0:n ja 1:n välissä.
Kuva 2. Keinotekoisen neuronin kaavio
Konvoluutioneuroverkon solmut ovat keinotekoisia neuroneja.
Konvoluutioneuroverkko on saanut inspiraationsa biologisesta näköhermostosta ja sitä sovelletaan konenäköön. Konenäköä voidaan käyttää muuhunkin kuin varsinaisten kuvien luokitteluun, sillä monenlaista tietoa voidaan esittää kuvana. Konenäkö kykenee esimerkiksi äänen tunnistukseen sen kuvan perusteella. Toisaalta esimerkiksi tiedoston tiivisteistä voidaan muodostaa kuvia ja konenäön avulla tunnistaa niistä haittaohjelmia.
Konvoluutioneuroverkko perustuu monikerroksiseen, yhdensuuntaiseen, vahvasti yhtenäiseen neuroverkkoon. Yhdensuuntaisuus tarkoittaa tässä, että verkossa tieto liikkuu vain yhteen suuntaan. Vahva yhtenäisyys tarkoittaa, että kerroksessa kukin neuroni on yhteydessä seuraavan kerroksen jokaiseen neuroniin. Neuroverkko on näiden ominaisuuksien lisäksi painotettu, eli siinä on solmujen välisillä kaarilla jokin paino. Nämä painot, eli neuronien välisten yhteyksien “vahvuudet” ja niiden muuttaminen on keskeisessä asemassa neuroverkon kouluttamisessa.
Kuva 3. Monikerroksinen neuroverkko
Kuvassa 3 on esitetty monikerroksisen neuroverkon rakenne. Kuvassa vasemman puoleiset pisteet ovat solmuja sisään menevälle datalle, eli niistä muodostuu syötekerros. Toisena välissä on kolmen neuronin ns. piilotettu kerros. Kolmantena on kahdesta neuronista koostuva tulostekerros, josta luetaan neuroverkon ennusteet.
Todellisuudessa käytetyt mallit ovat kuitenkin huomattavasti suurempia. Karhuntunnistimessa koulutusdatan kuvien sivun koko on 128 pikseliä, joten sisäänmeneviä solmuja on 128 x 128 = 16384. Piilotettuja kerroksia on syväoppivassa neuroverkossa kymmenistä satoihin, mistä käsite syväoppiminen tulee. Tulostekerroksessa solmuja on yhtä monta, kuin neuroverkolle on koulutettu luokkia, karhuntunnistimessamme niitä on kolme, yksi jokaista lajia kohti.
Konvoluutioneuroverkko poikkeaa itse asiassa tavanomaisesta monikerroksisesta neuroverkosta siten, että osa sen kerroksista on konvoluutio- ja pooli-kerroksia. Tämä aihe vaatii täysin oman käsittelynsä, mutta siitä saa hyvin kiteytettynä tietoa tästä Youtube-videosta.
Raapaisimme nyt kevyesti pintaa teorian osalta siitä, mistä neuroverkoissa on kyse. Tätä tietoa ei kuitenkaan artikkelisarjassa käytännössä tarvita, sillä kaikki matematiikka on pitkälle kehitetyissä fast.ai:n kirjastoissa piilotettu käyttöliittymän alle. Pyrin kuitenkin avaamaan, mitä eri vaiheissa pinnan alla tapahtuu.
Seuraavassa artikkelissa siirrytään tarvittaviin perustyökaluihin, sekä niiden käyttöönottoon.
Heräsikö artikkelista ideoita, ajatuksia, kysymyksiä? Ehkä korjausehdotuksia? Kirjoita alla olevaan kommenttilaatikkoon tai lähetä yksityisesti vaikka LinkedIn-viestinä.
Kuvien lähde Wikimedia Commons
tagit: konvoluutioneuroverkko - teoriaa