tiistai 28. huhtikuuta 2015

Luento 29.4: Koneoppiminen

Tänään aloitimme kappaleen 11, joka käsittelee hahmontunnistusta. Hahmontunnistusjärjestelmän ideana on esittää järjestelmälle näytteitä ja opettaa se tuottamaan oikea ulostulo kun sille esitetään opetusjoukkoon kuulumaton uusi näyte. Yksi oppivien järjestelmien osajoukko ovat luokittelijat, jossa ulostulo kertoo luokan johon esitetty näyte kuuluu.

Suosittuja luokittelualgoritmeja ovat ainakin seuraavat (kasvavan monimutkaisuuden järjestyksessä):

Näistä neljä ensimmäistä käsiteltiin luennolla. KNN on ideana yksinkertaisin: kaikki opetusdata pidetään muistissa ja uuden näytteen tullessa etsitään k samanlaisinta näytettä, ja valitaan näistä yleisin luokka. Tyypillisesti k on vajaan kymmenen luokkaa, mutta voi olla suurempikin; esim. 30. Mitä suurempi k on, sitä sileämpi luokkarajasta tulee. Vaikka KNN:n luokittelutulos onkin melko hyvä, on sen ongelmana suuri muistin tarve sekä laskennallinen kompleksisuus. Koko opetusjoukko täytyy nimittäin säilyttää muistissa, josta etsitään k lähintä naapuria jokaisen luokittelun yhteydessä. Sekä tilantarve että etsinnän vaatima aika voivat olla ongelmallisia jos opetusjoukossa on esim. 100000 alkiota.

Luentomonisteen seuraava menetelmä on Fisherin diskriminantti eli LDA. Tässä vilkaistiin mm. alla olevan kuvan mukaista Matlab-demoa, jolla voidaan piirtää hiirellä projektiosuora kaksiulotteisen datan koordinaatistoon. Kun kaksi pistettä suoralta on merkitty, Matlab-skripti projisoi datan tälle suoralle ja piirtää tuloksena saatavien yksiulotteisten näytteiden jakauman sekä luokitteluprosentin. Hyvillä projektiosuorilla data oli täydellisesti luokiteltavissa, mutta huonoilla joukot menivät päällekkäin projisoinnin jälkeen. Fisherin lineaarinen erottelija laskee tämän suoran automaattisesti niin että erottelu on optimaalinen.


Tukivektorikone ja logistinen regressio ovat myös lineaarisia luokittimia, mutta niiden opetusalgoritmi on eri kuin LDA:n. Tukivektorikoneen erityispiirre on sen käyttö yhdessä kernelitempun kanssa ja logistisen regression ominaisuutena on sen todennäköisyystulkinta: LR antaa myös luokan todennäköisyyden, ei pelkästään ennustettua luokkaa.

Seuraavaksi pohjustettiin seuraavan viikon hermoverkkoaihetta vilkaisemalla helmikuussa 2015 ilmestynyttä artikkelia, jossa hermoverkko opetettiin pelaamaan vanhoja Atari 2600 tietokonepelejä. Alla on video kuinka verkko pelaa Breakout-peliä. Ks. myös Google research blog.

tiistai 21. huhtikuuta 2015

Luento 22.4: Kuvankäsittely


Tänään paneuduttiin kappaleeseen 10 (ks. kurssimonisteen liite), joka tarkastelee kuvankäsittelyä.

Alkuosa koostuu enimmäkseen yksiulotteisten lineaaristen järjestelmien yleistyksestä kahteen ulottuvuuteen. Fourier-muunnoksen yhteydessä todettiin, että kaksiulotteinen tapaus voidaan toteuttaa kahden yksiulotteisen FFT:n avulla, mikä mahdollistaa nopean laskennan.

Tämän jälkeen tarkasteltiin dekonvoluutiota, eli konvoluution käänteistä operaatiota. Monisteen esimerkin lisäksi esimerkkinä mainittiin Hubble-avaruusteleskoopin varhainen ongelma, joka aiheutti kuvaan jonkin verran epätarkkuutta. Ennen kuin kiertoradalle päästiin korjaamaan linssi kuntoon, täytyi linssin virhe mallintaa konvoluution avulla. Varhaisia kuvia myös korjattiin dekonvoloimalla virheelliset kuvat. Linssi kuitenkin lopulta vaihdettiin, koska dekonvoluutio ei voi tuottaa yhtä täydellistä tulosta kuin fyysinen korjaus. Tämä johtuu siitä, että PSF ei koskaan ole täysin oikea, vaan siinä on numeerista epätarkkuutta. Lisäksi informaatiota saattaa kadota konvoluution yhteydessä, jos taajuustason funktiossa H(n,m) on nollia kertoimina.

Kolmantena aiheena kappale tarkastelee piste-ehostusta: kontrastin parannusta gamma-korjauksella sekä histogrammin ekvalisoinnilla. Molemmat löytyvät kaikista kuvankäsittelyohjelmista. Lisäksi vilkaistiin Androidin tarjoamia 3A-kuvankäsittelyoperaatioita, joihin kuuluvat auto exposure, auto-white-balance sekä auto-focus.

Aivan lopuksi tutustuttiin sovelluksena automaattiseen rekisterikilven tunnistukseen, jota olen ollut kehittämässä tamperelaisessa Visy Oy:ssä sivutoimisesti jo toistakymmentä vuotta.

tiistai 14. huhtikuuta 2015

Luento 15.4: Interpolointi D/A-muunnoksessa sekä signaalprosessorit


Ensimmäisen tunnin aiheena oli 1-bittinen D/A-muunnos, jonka tavoitteena on yksinkertaistaa analogiapuolta äärimmilleen kvantisoimalla D/A-muunnettava signaali 1-bittiseksi. Ratkaisusta käytetään nimeä kohinanmuokkaus, englanniksi noise shaping tai sigma delta modulation. Kvantisointi onnistuu äänenlaatua heikentämättä, kun nostetaan näytteenottotaajuus ensin riittävän suureksi. Tällöin näytteiden suuri määrä kompensoi niiden heikkoa tarkkuutta. Pelkkä ylinäytteistys ei kuitenkaan vielä riitä: ilman muita temppuja näytteenottotaajuus pitäisi nostaa jopa miljardikertaiseksi, mikä ei käytännössä ole mahdollista. Siksi täytyy ottaa käyttöön alla olevan lohkokaavion mukainen takaisinkytkentä, joka aiheuttaa kvantisointivirheen siirtymisen korkeammille taajuuksille.




Korkeilla taajuuksilla kohina ei haittaa, koska se voidaan erottaa hyötysignaalista analogisella alipäästösuodatuksella D/A-muunnoksen jälkeen. Jäljelle jäävän kvantisointikohinan määrä voidaan laskea, ja havaitaan että suuruusluokassa 1500 oleva muunnoskerroin riittää (miljardien sijaan). Ratkaisua voidaan edelleen tehostaa tarkastelemalla korkeampiasteisia kohinanmuokkaimia, jotka siirtävät vieläkin tehokkaammin kvantisointikohinaa korkeammalle.

Jotkin audioformaatit kuten Super Audio CD tallentavat äänen suoraan yksibittisenä. Tästä on etuna se, että kohinanmuokkaus täytyy tehdä vain kerran äänitysstudiossa eikä jokaisessa kuluttajalaitteessa erikseen.

Toisella tunnilla käsiteltiin kappale signaaliprosessoreista. Tärkeimmät syyt niiden käyttöön ovat yksinkertaisuus, halvempi hinta sekä pienempi virrankulutus (ks. esim TI). Kuitenkin niistä saa riittävästi tehoa signaalinkäsittelyn tarpeisiin, koska alan tarvitsemat operaatiot (kertolasku, yhteenlasku) ovat nopeita sekä rinnakkaisia. Esimerkiksi FIR-suodatuksen tai kompressiossa käytettävän kaksiulotteisen DCT:n tarvitsemat kertolaskut ja yhteenlaskut voidaan pistetuloina laskea rinnakkain ns. MAC-operaation avulla. Vastaavia operaatioita on nykyisin myös tavallisissa prosessoreissa, ja ensimmäinen tällainen laajennus oli Intelin MMX-käskykanta vuodelta 1997.


Kahden viikon päästä olevissa viikkoharjoituksissa koodataan FIR-suodin luokan TC303 signaaliprosessoreille. Olennaisimmat vaiheet olivat:
  1. Suodin suunniteltiin Matlabin fir1-rutiinilla.
  2. Kertoimet kopioitiin C-koodiin.
  3. C-kieliseen pohjaan kirjoitettiin for-silmukka, jossa kertoimet käydään läpi.
  4. Ulostulonäyte kirjoitetaan D/A-muuntimelle.
Vaiheessa 3 on kiinnitettävä huomiota circular buffering-tekniikkaan, jotta viitataan oikeisiin aiemmin sisään tulleisiin alkioihin.
Aivan toisen tunnin loppupuolella luotiin katsaus GPU-laskentaan ja sen sovelluksiin koneoppimisessa. GPU on keskeinen työkalu esim. syvien neuroverkkojen opetuksessa, ja mm. GPU-valmistaja Nvidialla on oma DNN-kirjastonsa. Aiheesta lisää hahmontunnistuksen yhteydessä.

Myös Matlabissa on GPU-tuki. Seuraava koodinpätkä kertoo matriisit A ja B keskenään GPU:lla:

tic();

A = gpuArray(rand(2000, 2000));
B = gpuArray(rand(2000, 2000));
C = A * B;

elapsedTime = toc();
disp(['Matriisikertolaskuun kului ', num2str(elapsedTime), ' sekuntia.'])

 
Käyttö on siis helppoa: funktio gpuArray() siirtää matriisin GPU:lle, jonka jälkeen laskenta toimii kuten muutenkin.

Omalla kannettavallani (Intel i7 + Nvidia NVS 5200M) GPU-versio on noin 4 kertaa nopeampi kuin CPU-versio (joka saadaan poistamalla gpuArray-funktio).

keskiviikko 1. huhtikuuta 2015

Luento 1.4: Näytteenottotaajuuden muuntelu


Tänään desimointi ja interpolointi, jotka toimivat kokonaislukukertoimilla. Näitä yhdistelemällä saadaan kaikki rationaalikertoimet. Molemmat operaatiot tarvitsevat alipäästösuodattimen, joka on yleensä FIR, ja suunnitellaan normaaleilla menetelmillä. Suotimen siirtymäkaistasta todettiin, että se laitetaan aina rajataajuuden alapuolelle. Näin signaaliin tulee vähemmän virhettä kuin jos laskostumista pääsisi tapahtumaan.

Desimoinnissa tapahtuva näytteenottotaajuuden pieneminen toteutetaan yksinkertaisesti jättämällä näytteitä pois tasaisin väliajoin. Esimerkiksi kertoimella kolme jätetään vain joka kolmas näyte jäljelle. Tämä kuitenkin aiheuttaa laskostumista, koska signaalin sisältämät taajuudet pysyvät samoina mutta näytteenottotaajuus pienenee. Tämä saadaan luonnollisesti estettyä suodattamalla signaali ennen alinäytteistämistä sopivalla alipäästösuotimella.

Interpolointi puolestaan koostuu nollien lisäämisestä sekä tämän operaation tuottamien roskien poistamisesta. Nollien lisääminenhän tuottaa kopioita ja peilikuvia alkuperäisestä spektristä, jotka voidaan myös poistaa kätevästi alipäästösuodatuksella. Oikealla olevassa kuvassa on luennolla ollut esimerkki näytteenottotaajuuden kolminkertaistamisesta, jossa kahden näytteen väliin sijoitetaan aina 2 nollaa (yläkuva). Alakuvassa on tuloksen spektrogrammi, jossa näkyy selkeästi kolme versiota alkuperäisestä (kaista 0-4000 Hz) taajuuskaistasta (kopio-peilikuva-kopio).

Kappaleessa luodaan myös katsaus interpoloinnin ja desimoinnin yhdistämiseen, jolloin päästään yksinkertaisempaan rakenteeseen huomaamalla kokonaisuudessa olevan kaksi suodatinta peräkkäin, jotka molemmat poistavat tietyn kaistan ylätaajuuksilta. Näin ollen vain toinen niistä on tarpeellinen. Piirtämällä kuva näiden suodinten amplitudivasteista voidaan päätellä kumpi on tarpeeton (aina se, jota vastaava muunnoskerroin on isompi).

Toisen tunnin lopuksi tutustuttiin interpoloinnin sovellukseen D/A-muunnoksessa. Menetelmää käytettiin jo ensimmäisissä CD-soittimissa 1980-luvun alussa ja sen ideana on tehostaa nollannen asteen pitopiirin toimintaa nostamalla näytteenottotaajuus korkeammaksi ennen pitopiiriä. Tämä näkyy aikatasossa porraskuvion hienontumisena ja tätä kautta pitopiirin virheen pienenemisenä jä siirtymisenä korkeammille taajuuksille. Taajuustasossa yli 22,05 hertsin taajuuksille tulee vastaavia heijastuksia kuin interpoloinnin yhteydessäkin. Erona on, että nyt heijastumat vaimenevat sitä enemmän mitä korkeammalle mennään. Digitaalinen interpolointi helpottaa näiden heijastusten poistamista: ilman digitaalista interpolointia tarvittavan analogisen suotimen siirtymäkaistan leveys olisi 2,05 kHz (20kHz...22.05kHz), kun esim. nelinkertaisella interpoloinnilla se saadaan yli 130 kHz:n levyiseksi (väli 20kHz...154,35 kHz).