{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "*Created by Petteri Nevavuori.*\n", "\n", "---\n", "\n", "# Deep Learning seminaari\n", "\n", "Kirjana Goodfellow et al.: Deep Learning (2016)\n", "\n", "Otsikot seuraavat pääotsikoiden tasolla kirjaa, mutta alaotsikot eivät aina." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" }, "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 9. Convolutional Networks" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Konvoluutioverkot (*convolutional networks, convolutional neural networks, CNN*) ovat ennenkaikkea tasomuotoisen datan käsittelyyn erikoistuneita verkkoja. Perinteisimmin konvoluutioverkkoja käytetään kuvien kanssa, mutta niitä voidaan käyttää myös useasta rivistä muodostuvan aikasarjadatan kanssa. Koska konvoluutioverkkojen kehitys on niin nopeasti etenevää tällä hetkellä, esitellään kirjassa konvoluutioverkkojen merkittävimmät komponentit. Samoin esitellään niitä verkkoihin liittyviä yksityiskohtia, joilla parhaiten menestyviä verkkoja on kehitetty." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.1. The Convolution Operation" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Yleisimmillään konvoluuutiolla tarkoitetaan kahdelle reaaliluvun vastaanottavalle funktiolle tehtävää operaatiota. Yksinkertainen esimerkki tästä on kohinainen funktio $f(x)$ ja liukuvan ikkunan keskiarvon funktio $g(x)$. Yhdessä nämä tuottavat funktion\n", "\n", "$$ s(x) = (f * g)(x),$$\n", "\n", "joka tasoittaa kohinaa. Tätä kutsutaan konvoluutioksi. Matemaattisesti konvoluution funktioiden on oltava vaihdannaisia siten, että $(f * g)(x)=(g * f)(x)$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Konvoluutioverkkojen tapauksessa konvoluutio tehdään syötteitä (*input*) ja kerneleitä (*kernel, filter*) käsittelevien funktioiden kanssa. Kernelit ovat koulutuksen aikana opittavia parametritaulukoita, joiden avulla syötteistä tuotetaan piirrekarttoja. Tämä mahdollistaa mm. kuvien käsittelyn, sillä kerneleitä voidaan käyttää yksi- tai moniulotteiseen syötteeseen - kuva kanavineen käsitellään kernel kerrallaan. Tällöin yksikanavaisen kuvan ja kernelin konvoluutio-operaatio voidaan kirjoittaa kaavana seuraavasti:\n", "\n", "$$ S(i,j) = (K*I)(i,j).$$\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Vaikka implementaatiotapoja kyseiselle operaatiolle löytyy joitakin, on usein käytetty implementaatio ristikorrelaatio (*cross-correlation*):\n", "\n", "$$ S(i,j) = (I*K)(i,j) = \\sum_m \\sum_n I(i+m,j+n)K(m,n),$$\n", "\n", "jossa $(i,j)$ on yksi kuvan $I$ pikseli ja $(m,n)$ on kernelin $K$ koko. Konvoluutio tehdään tällöin syötteen $I$ ja kernelin $K$ pistetulona kerneliä vastaavalta alueelta. Pistetulo on matriisien vastaavien alkioiden tulojen summa. Alue määritellään lähtien kuvan pikselistä $(i,j)$ ja kattaen kernelin $K$ kokoinen alue. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Alla sama esitetty kuvana:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Kernel $K$ etsii kuvasta vinoja reunoja ja vain kuvan oikeassa alakulmassa esiintyy sellainen. Muualta löytyy osittaisia vinoja piirteitä. Kerneleitä on konvoluutioverkoissa normaalisti useita ja useissa kerroksissa." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.2 Motivation" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Konvoluutio käyttää apunaan kolmea perustanaan toimivaa ideaa, jotka edesauttavat menetelmää hyödyntäviä koneoppimisjärjestelmiä: harvoja vuorovaikutussuhteita (*sparse interactions*), parametrien jakamista (*parameter sharing*) ja samankaltaista muuttuvaisuutta (*equivariance*)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Sparse interactions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Perinteiset myötäkytketyt verkot toimivat siten, että kerrosten välillä jokainen edellisen kerroksen neuroni on tekemisissä jokaisen seuraavan kerroksen neuronin kanssa - ne ovat täysin kytkettyjä. Konvoluutioverkot ovat sen sijaan harvoja, kuten aiemmasta kuvastakin kävi ilmi. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Koska kokonaisten kuvien sijasta käsitelläänkin pienempiä kerneleillä tuotettuja piirrekarttoja, on verkon parametrien määrä kerrosten välillä täysin kytkettyjä verkkoja pienempi. Tällöin kerneleitä käytetään löytämään syötteinä tuoduista kuvista merkityksillisiä piirteitä, kuten reunoja. Näin kuvan jokaista pikseliä ei käsitellä merkityksellisenä, jolloin koulutettavia parametreja ei tarvitse olla myöskään jokaiselle pikselille." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Vaikka kirjassa harvat kytkennät esitetään kiinteinä osittaiskytkentöinä, jossa edellisen kerroksen neuronit ovat kytketty kiinteästi osaan seuraavan kerroksen neuroita, on konvoluutioverkon harvakytkentäisyydessä suurin tekijä kerneleiden avulla tuotettujen pienempien kuvien harvuus - tiettyjä piirteitä löytyy vain joistain kohden kuvaa. Osittaiskytkentä on konvoluutioverkoissa täten ennemmin *dropout*-regularisointia vastaavaa, koulutuksen aikaista dynaamista ja syötteestä riippuvaa harvuutta." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Parameter sharing" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Edelleen käyttäen perinteisiä verkkoja esimerkkinä, jokaista edeltävän kerroksen ulostuloa käytetään seuraavan kerroksen ulostulon laskentaan vain kerran. Sen sijaan konvoluutioverkoissa jokaista kerneliä käytetään lähtökohtaisesti syötteen jokaiselle alkiolle, kuvan tapauksessa pikselille. Sen sijaan että jokaiselle syötekuvan osalle tai alkiolle opittaisiin oma parametrien kokoonpano, opitaankin joukko koko kuvaan sovitettuja uniikkeja kerneleitä, jotka pyrkivät oppimaan merkittävimmät datasta löytyvät piirteet." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Equivariance" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Kun funktio on samankaltaisesti muuttuva (*equivariant*), se kykenee löytämään toisistaan poikkeavista syötteistä niissä esiintyviä samoja piirteeitä. Jos kyseessä on kuva ja siitä tehty muunnos vaikkapa siirroksella, samankaltaisesti mukautuva funktio löytää kuvista samat piirteet muunnoksesta huolimatta. Siirroksella muunnetun kuvan piirteet ovat tosin ulostulossa siirroksen verran eri paikassa. Funktio toisin sanoen muuttuu eli mukautuu tällöin syötteen mukaisesti. Yksinkertaisten kyse on funktion robustisuudesta syötteen muunnoksia kohtaan." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.3 Pooling" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Syötteen hajottaminen piirrekarttoihin konvoluutiolla on konvoluutioverkon piilokerroksien operaatioista ensimmäinen. Tätä seuraa usein lineaarisuuden katkaiseminen esimerkiksi oikaistulla lineaarifunktiolla (*ReLU*), jota kutsutaan joskus havaintovaiheeksi (*detector stage*). Viimeinen operaatioista on koonti (*pooling*)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Koontivaiheessa epälineaariset piirrekartat syötetään valittuun koontifunktioon (*pooling function*). Tällöin piirrekartat arvot ryhmitellään ja näistä ryhmistä otetaan jokin valittu tilastollinen suure. Maksimikoonnissa (*max pooling*) otetaan ryhmäkohtainen suurin arvo, kun taas keskiarvokoonnissa (*mean pooling*) lasketaan alkioiden keskiarvo. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Alla on esimerkki yhteen kernelin tuotokseen $S$ eli piirrekarttaan tehdystä maksimikoonnista:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Koonnin ryhmän kokona on $(2,2)$ eivätkä ryhmät mene limittäin. Tällöin piirrekartta $S$ käytännössä puolitetaan siten, että jokaiselta yksittäiseltä ryhmältä otetaan sen suurin arvo talteen. Näin toimittaessa löydettyjen piirrekarttojen hienovaraisuutta saadaan rikottua ja niistä saadaan näin robustimpia pieniä muutoksia kohtaan. Esimerkiksi kasvot voivat olla hieman eri asennossa, mutta ne tunnistetaan silti ylimalkaisesti kasvoiksi. Näin malli saadaan paremmin löytämään jokin piirre ylipäätään sen sijaan, että sitä etsittäin vain jossain tarkassa tapauksessa." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Näin konvoluutioverkon kerroksen opittavalle funktiolle saadaan asetettua myös ennakkoehto (*prior*), että sen on oltava muuttumaton pienille kuvatason muunnoksille. Mikäli yhden piirrekartan sijaan koonti tehdään selkeästi toisista poikkeavien mutta samaa asiaa tunnistavien piirteiden kohdalla, voi verkko oppia muuttumattomaksi myös merkittävämpiä muunnoksia kohtaan." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Koonnilla on koulutuksen kannalta mieluisia sivuvaikutuksia. Kun alkuperäiset syötekuvat hajotetaan pienemmiksi piirrekartoiksi, on laskenta jo silloin tehokkaampaa verrattuna pikseli pikseliltä käsittelyyn. Kun piirrekartat vielä edelleen tiivistetään koonnilla, laskevat laskennan muistivaatimukset entisestään. Koonnin seurauksena syötteen tilastolliset ominaisuudet voivat myös parantua. Joissain tapauksessa koonnin käyttö hankaloittaa käytettyjen verkkojen arkkitehtuureja. Näin on mm. Boltzmannin koneiden (*Boltzmann machines*) ja autoenkooderien (*autoencoder*) kanssa. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.4 Convolution and Pooling as an Infinitely Strong Prior" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Mallien parametreja voidaan alustaa ennalta jonkin todennäköisyysjakauman mukaisesti (*prior probability distribution*). Tällöin mallille asetetaan ennen koulutusta jo jotain ennakkoehtoja koulutukseen sen osalta, mihin mistä lähtöasetelmasta parametrit ylipäätään lähtevät kouluttumaan. Mikäli jakaumassa on paljon varianssia eli entropiaa, ennakkojakaumaa kutsutaan heikoksi. Vahvat ennakkojakaumat taas ovat hyvin keskittyneitä eli niillä on matala varianssi." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Äärettömän suuri ennakkojakauma pitää joitain parametreja täydellisen epätodennäköisinä, vaikka data tukisikin niiden käyttöä. Näin on konvoluutioverkkojen kanssa. Koska kuvat käydään kokonaisuudessaan läpi kernelkohtaisesti, pysyvät koko kuvan ajan yhden kernelin parametrit identtisinä. Tästä johtuen suuri osa piirrekarttojen arvoista saavat arvon nolla, sillä samaa piirrettä ei lähtökohtaisesti löydy kaikkialla kuvasta. Toisaalta myös tietyt piirteet painottuvat selvästi yli muiden, sillä ne määrittävät eniten opittavaa ilmiötä. Tällöin parametrien arvot keskittyvät vahvasti ja hajonta on pientä." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Siksipä siis konvoluutioverkkojen ongelmana onkin alisovittuminen. Mikäli tavoitteena on säilyttää merkittävimmät avaruudelliset (*spatial*) piirteet ja verkon jokaisessa vaiheessa käytetään koontia, voi koulutusvirhe laskemisen sijaan itseasiassa vain kasvaa. Mikäli merkitykselliset piirteet ovat syötteissä kaukana toisistaan, konvoluutioverkon keskittynyt ennakkojakauma tekee sen käytöstä epäsuotuisaa." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Konvoluutioverkkojen kerroskohtaisten operaatioiden tuoman äärettömän vahvan parametrien ennakkojakauman vuoksi konvoluutioverkot ovat vertailtavissa vain toisiin konvoluutioverkkoihin. Täysin myötäkytketyt verkot kykenevät oppimaan lähes mitä vain, vaikka syötteenä olisi kaikki kuvan pikselit. Konvoluutioverkoilla näin ei ole." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.5 Variants of the Basic Convolution Function" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Neuroverkkojen yhteydessä konvoluutiolla tarkoitetaan harvemmin itse matemaattista konvoluutio-operaatiota, sillä käytännön neuroverkkototeutukset eroavat siitä jokseenkin. Ensinnäkin neuroverkkojen konvoluutiolla tarkoitetaan monen rinnakkaisen konvoluutio-operaation suorittamista rinnakkain useamman kernelin käytöstä johtuen. Tämän lisäksi matemaattisen konvoluutio-operaation reaaliarvojen sijasta neuroverkkojen konvoluutiot tehdään lähes aina vähintään vektoreilla. Konvoluution vaihdannaisuusvaatimuskaan ei konvoluutioverkkojen kohdalla väistämättä täyty." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Hyvä esimerkki edellä mainituista on värikuva, jonka jokainen pikseli sisältää lukuarvon kunkin kanavan osalta. Pikselit ovat tällöin $[R,G,B]^T$ vektoreita. Kun tähän vielä yhdistetään monikerroksisuus, jossa yhden konvoluutiokerroksen ulostulo toimii seuraavan syötteenä, ei takeita konvoluution funktioiden vaihdannaisuudesta ole. Esimerkiksi jos $C_1$ on ensimmäinen konvoluutioverkon kerros ja $C_2$ sitä seuraava, ei voida varmuudella sanoa, että $(C_1*C_2)(x)=(C_2*C_1)(x)$, etenkään ulostulojen kanavamäärien osalta." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Stride" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Tähän mennessä konvoluutioverkon konvoluutio on esitetty siten, että se tehdään syötekuvan jokaiselle pikselille kullakin kernelillä. Se voidaan tehdä myös erikseen määritellyn askelpituuden (*stride*) mukaisesti, jolloin kerneleitä siirretään haluttu määrä vaaka- ja pystypikseleitä kiinteän yhden pikselin sijasta. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Alla on havainnoillistava kuva:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Syötekuvasta $I$ etsitään piirteitä siten, että askelpituus $s=(2,2)$. Verrattuna pikseli kerrallaan tehtävään konvoluutioon kuvaa pienennetään vielä merkittävämmin, sillä piirteitä etsitään harvemmin. Pituus- ja vaaka-askelten ei tarvitse olla symmetrisiä." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Padding" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Konvoluutioverkkojen implementoinneissa on myös mahdollista määritellä sekä syötteille että kerrosten ulostuloille pehmusteet (*padding*). " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Lähestytään tätäkin asiaa esimerkkikuvan kautta. Otetaan ensin käsittelyyn kuvasyöte $I$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Esimerkin muuttujista $d_K$ tarkoittaa kernelin kokoa ja $s$ askelta. Piirrekartta saadaan sovitettua vain neljä kertaa pehmustamattomaan kuvaan, jolloin osa kuvan pikseleistä jää aina käyttämättä. Jos kuvaa pehmustetaan nollilla oikeanpuoleisen kuvan tapaan, saadaan koko kuva käytyä kernelillä $K$ läpi ja tuloksena on syötteen kanssa identtisen kokoinen piirrekartta $I*K$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Pehmustettavana syötteenä voi olla yhtäläillä myös konvoluution ulostulo $k\\in K$ ja operaationa tällöin koonti. Tällöin pehmustaminen vaikuttaa koonnin ulostulon dimensioihin." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Jälleen pehmustus auttaa siihen, että kokonainen piirrekartta eli konvoluution tulos huomioidaan. Ilman pehmustusta sekä ulostulon koko pienenee että informaatiota jää käyttämättä." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Nollilla pehmustamisella on kolme mainitsemisen arvoista erityistapausta:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Ei pehmustusta**: Syötettä ei pehmusteta lainkaan ja vain täysin täydelliset konvoluutiot sallitaan (esimerkkikuvan vasen tapaus). Tätä kutsutaan joskus kelvolliseksi (*valid*) konvoluutioksi ja konvoluutio- tai koontioperaatioiden seurauksena ulostulon dimensiot pienenevät suhteessa muihin tapauksiin nopeammin. Tämä rajoittaa käytettävien konvoluutiokerrosten määrää." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Tasoittava pehmustus**: Syötteitä pehmustetaan vain sen verran, että seuraava operaatio voi hyödyntää saman kokoista syötettä. Askeleen ollessa yksi suuntaansa on tuotettu ulostulo samankokoinen syötteen kanssa. Tällöin verkon syvyyttä ei rajoita syötteen dimensioiden asteittainen häviäminen. Reunojen lähellä olevat pikselit ovat kuitenkin aliedustettuja verkon laskennassa." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Täysi pehmustus**: Syöte pehmustettaisiin sen joka sivulta siten, että jokainen pikseli käydään kernelillä läpi yhtä monta kertaa. Kuten tasoittavassa pehmustuksessa, reunojen pikselit jäävät tällöin aliedustetuiksi syötteen keskialueen pikseleihin nähden. Verrattuna esimerkkikuvien pehmustukseen, pehmustus on symmetristä kuvan joka sivulla." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Unshared Convolution" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Kun on ennalta tiedossa, että kaikkia piirteitä ei ole mielekästä etsiä joka paikasta, ovat paikallisesti yhdistetyt kerrokset perinteistä konvoluutiota parempi vaihtoehto. Tätä kutsutaan ei-jaetuksi konvoluutioksi (*unshared convolution*). \n", "\n", "Tällöin vain osa edellisen kerroksen neuroneista on yhdistetty yhteen seuraavan kerroksen kuhunkin neuroniin, jolloin seuraava kerros käsittelee vain edellisen kerroksen syötteitä ryhmissä, s.o. paikallisesti. Konvoluutioverkkojen tapauksessa neuronien sijasta jokaiselle konvoluution tuottamalle piirrekartalle määritetään omat painot. Piirrekartat tai niiden koonnit yhdistetään tämän jälkeen vain osittain seuraavaan kerrokseen. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Ositeltu konvoluutio (*tiled convolution*) on kompromissi perinteisen ja ei-jaetun konvoluution välillä. Tällöin käytetään kerneleiden settiä, josta otetaan käyttöön jokaisen syötteessä tapahtuvan siirtymän jälkeen seuraava kernel järjestyksessä. Näin saadaan tasapainoa sekä perinteisen konvoluution että paikallisten piirteiden havaitsemisen välillä. Havainnollistetaan jälleen." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Erottelun vuoksi kerneleiden setistä käytetään merkintää $K_S$. Perinteisessä konvoluutioverkon konvoluutiossa kuvasta $I$ tuotettaisiin vain yhden kernelin mukaisia ulostuloja, kun ositellussa konvoluutiossa kerneleitä vaihdellaan systemaattisesti. Mikäli kerneleitä olisi setissä vaikkapa kolme, vain setin ensimmäinen kernel tulisi käytetyksi $I$:n kanssa kahdesti." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Paikallisesti yhdistetyillä konvoluutioverkoilla on luontaisesti kyky oppia mahdollisesti samasta piirteistä sen eri muunnoksia. Tämä tekee mallista vieläkin robustimman piirteiden muutoksia kohtaan." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Training " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Konvoluutioverkot ovat koulutettavissa *backpropilla*. Jotta konvoluutioverkot voivat oppia, on niiden kerneleille voitava laskea gradientit suhteessa mallin tuottamaan virheeseen. Jotta gradientit voidaan laskea, on otettava gradientteja laskiessa huomioon kulloinkin käytetty askelkoko, syötteiden dimensiot ja mahdollinen pehmennys. Kun nämä huomioidaan, on kerneleiden parametrien gradientit laskettavissa sopivilla matriisimuunnoksilla, joista merkittävin on konvoluutio-operaation matriisin transpoosi.\n", "\n", "Normaalisti konvoluutioverkossa ei käytetä lineaarisia toimintoja syötteen käsittelyissä. Tavallista on myös, että jokaiselle kerrokselle tai paikalliselle yhteydelle on oma *bias*-terminsä ja verkon ulostulon jokaiselle kanavalle omansa." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.6 Structured Outputs" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Konvoluutioverkkoja voidaan käyttää myös moniulotteisen jäsennellyn ulostulon tuottamiseen. Tällöin yksittäisen luokan sijasta voidaan tuottaa esimerkiksi pikselitason luokittelumaskeja. Tällöin voidaan välttää koontia, sillä se tavallisesti pienentää verkon lopullista ulostuloa suhteessa syötteeseen heikentäen syötteen ja ulostulon keskinäistä vertailua. Toisaalta on myös mahdollista, että ulostulo käsitellään matalampiresoluutioisena luokittelumaskina, jossa yksi pikseli vastaa pienehköä aluetta syötteessä." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Tällöin konvoluutioverkosta rakennetaan esimerkiksi rekursiivista verkkoa muistuttava kokonaisuus, jossa samojen konvoluutiokerrosten piirrekarttoja käytetään useita kertoja ja verkon ulostulo kytketään takaisin piilokerroksiin. Tällöin hyödynnetään sitä oletusta, että kuvissa esiintyvät vierekkäiset pikselit liittyvät usein samaan luokkaan eli tunnistettavaan hahmoon." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.7 Data Types" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Vaikka konvoluutioverkkoihin tavallisesti syötetään kuvia, voidaan siihen syöttää monenlaista dataa sekä yksi- että monikanavaisena:\n", "\n", "- *1D*: Ääniaaltodata, partikkelin suuntavektoridata.\n", "- *2D*: Harmaasävy- ja värikuvadata.\n", "- *3D*: Volumetrinen data, videodata." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Konvoluutioverkko kykenee käsitelemään myös koon puolesta vaihtelevia syötteitä, mikä ei ole luontaisesti mahdollista perinteisillä myötäkytketyillä verkoilla. Kuvan koosta riippuen vain kerneleiden syötekohtainen käyttömäärä vaihtelee, mutta kerneleiden määrä ja ominaisuudet säilyvät samoina syötteestä toiseen. Vaihtelevien syötekokojen kohdalla on kuitenkin ensiarvoisen tärkeää, että syötteet liittyvät aina vain johonkin tiettyyn luokkaan tai ilmiöön. Sillä jos koon lisäksi sisältö vaihtuu, ei konvoluutiota voida suoraan sellaisenaan hyödyntää." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.8 Efficient Convolution Algorithms" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Laskennallisen tehostamisen, kuten rinnakkaislaskennan, lisäksi konvoluutioverkkojen toimintaa voidaan myös nopeuttaa konvoluutioalgoritmin valinnalla. Tämä on aktiivista tutkimuksen aluetta. Kun sekä syöte että kernel nähdään omina signaaleinaan, voidaan konvoluutiota käsitellä Fourier-muunnoksena. Tämä voi olla suuremman kokoluokan ongelmissa nopeampi laskentatapa, kuin naiivi suoraviivainen konvoluutio. Toisaalta mikäli kernelit voidaan erotella vektoreihin, on suoraviivainen konvoluutio tehoton. Tällöin on huomattavasti tehokkaampaa suorittaa konvoluutio nähin vektoreihin, kuin yhteen moniulotteiseen kerneleiden matriisiin." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.9 Random or Unsupervised Features" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Koulutuksen vaativin osa on kerneleiden ja tätä kautta dataa mallintavien piirteiden oppiminen. Kerneleiden satunnaisen alustamisen ohella on muitakin alustusstrategioita, joilla voidaan nopeuttaa piirteiden oppimista." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Ensimmäinen näistä on manuaalinen kerneleiden säätäminen. Kartat voidaan säätää löytämään tiettyjä muotoja, kuten reunoja, kulmia ja pyöreitä muotoja. Toinen on kerneleiden alustus ohjaamattoman oppimisen keinoin. Tällöin voidaan esimerkiksi tehdä koulutusdatalle ensin klusterointia, josta saatavia tuloksia sitten hyödynnetään kerneleiden alustamisessa. Satunnaisesti alustetut kernelit ovat empiirisissä tutkimuksissa osoittautuneet toimiviksi konvoluutioverkoissa. Konvoluutiokerroksissa, joissa suoritetaan myös lopuksi koonti, näyttää tapahtuvan luonnollisesti erikoistumista tietyille piirteille." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Kuten myötäkytketyt verkot, myös konvoluutioverkot voidaan kouluttaa kerros kerrallaan. Tämä helpottaa koulutusta etenkin syvien konvoluutioverkkojen tapauksissa ja edesauttaa myös piirteiden löytämistä. Toisaalta nykyisin käytössä on jo huomattavasti paremmin laskentatehoa, jolloin konvoluutioverkotkin voidaan kouluttaa suoraan sellaisinaan ilman pilkkomista." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.10 Neuroscientific Basis for Convolutional Networks" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Konvoluutioverkkojen perustavana toimivat ajatukset juontavat juurensa hyvin vahvasti biologiaan ja neurotieteisiin. Aiheen tutkimus on saanut alkunsa jo 1950-luvulla, kun tahdottiin saada selvyyttä ihmisten ja eläinten tapaa hahmottaa asioita havainnoistaan. Tutkimuksissa havaittiin, että näköhavainnon ensimmäisenä vastaanottavat aivojen osat aktivoituivat selkeiden erottuvien muotojen, kuten rajojen ja reunojen kohdilla. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Tästä seurasi mm. konvoluutioverkkoihin liittyvän tutkimuksen kehittyminen etenkin aivojen näköalueen toimintatavan matkimisessa. Konvoluutioverkot pyrkivät mallintamaan aivojen näköaluetta kolmella tapaa: " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Kerneleiden avulla**: Näköalue on pinta, jonka alueet vastaavat silmän pohjan pintaan. Konvoluutioverkot matkivat tätä pintamaisten eli kaksiulotteisten piirrekarttojen avulla." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Lineaarisen aktivoinnin avulla**: Näköalueessa yksinkertaisia soluja, jotka aktivoituvat paikallisesti. Konvoluutioverkoissa vastaavina toimivat konvoluution jälkeiset aktivointifunktiot." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Piirteiden robustisuuden avulla**: Näköalueessa on myös monimutkaisempia soluja, jotka takaavat yksinkertaisten solujen havaitsemien piirteiden robustisuuden (*invariance to translation and transformation*). Konvoluutioverkoissa tämä toteutetaan koonnin keinoin." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Vaikka ihmisaivot ovat kokonaisuutena todella paljon niiden yksittäistä osaa monimutkaisemmat, on konvoluutioverkoilla kyetty mallintamaan näköhavainnon ensimmäistä läpikulkua silmästä aina aivojen näköalueen läpi näyttämällä kuvaa vain hyvin pienen hetken. Jos kuvaa näytetään yhtään pidempään, alkaa aivojen takaisinsyöttömekanismit aktivoimaan muita osia ja havaintoja ruvetaan prosessoimaan paljon monimutkaisemmin ja -ulotteisemmin." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Kaikenkaikkiaan, kuten muidenkin neuroverkkotyyppien kohdalla, konvoluutioverkot ovat vain biologisista ja toistaiseksi ihmisen täydellisen matkintakyvyn ulottumattomissa olevista hienosäädetyistä mekanismeista vain perusideoita ammentava varjo. Toisin sanoen verkon ideat pohjaavat biologiaan, mutta sen biologisen idolin toimintatapoja ei ymmärretä niin hyvin, että menetelmän voitaisiin sanoa toimivan kuten biologiset menetelmät." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Konvoluutioverkkojen kehitys lähti itseasiassa jopa liikkeelle viiveneuroverkoista (*time delay neural neutworks*), jotka ovat yksiulotteisia konvoluutioverkkoja ja kuitenkin samalla biologisesti lähes mahdottomia. Tätä kehitystä laajennettiin kaksiulotteisen datan alueelle, josta päästiin nykyisiin konvoluutioverkkoihin. Tällöin voitaisiin jopa hyvällä omallatunnolla todeta, että konvoluutioverkkojen vertailu biologiseen näköhavaintojen käsittelyyn on, ellei suoranaisesti jälkiviisasta, niin ainakin vertailun kohdetta redusoivaa." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 9.11 Convolutional Neural Networks and the History of Deep Learning" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Kuten edellisessä aliluvussa todettiin, konvoluutioverkkojen lähtökohtana on ihmisten ja eläinten näköhavaintojen muodostumisen tutkimus. Nykyaikaisia konvoluutioverkkoja on käytetty aina 1990-luvun lopulta alkaen jopa kaupallisissa tunnistustehtävissä, mm. kuittien lukemisessa ja käsikirjoituksen sekä tekstin tunnistuksessa." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Verkkoja on käytetty myös menestyksekkäästi monissa kuvan- ja hahmontunnistuksen kilpailussa, joista ehkä tunnetuin on ImageNet Large Scale Visual Recognition Competition eli ILSVRC. Etenkin vuoden 2012 jälkeen konvoluutioverkkoja on käytetty aina vain laajenevassa mittakaavassa ja kasvavalla menestyksellä." ] } ], "metadata": { "celltoolbar": "Slideshow", "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" }, "toc": { "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }