Tervetuloa sovelletun syväoppimisen sarjan osaan 3. Osa 1 oli käytännönläheinen johdatus keinotekoisiin neuroverkkoihin, kattaen sekä teorian että sovelluksen paljon koodiesimerkkejä ja visualisointia. Osassa 2 sovellimme syväoppimista reaalimaailman tietokokonaisuuksiin, jotka kattoivat 3 yleisimmin kohdattua ongelmaa tapaustutkimuksina: binääriluokitus, moniluokkaluokitus ja regressio.
nyt alamme sukeltaa tiettyihin syväoppimisarkkitehtuureihin, alkaen yksinkertaisimmasta: Automaattikoodereista.
- Johdanto
- Arkkitehtuuri
- toteutus
- Denoisoivat Autokooderit
- harva Autokoodaaja
- käyttötapaukset
- johtopäätös
tämän artikkelin koodi löytyy täältä jupyter-muistikirjana, voit vapaasti ladata ja kokeilla sitä itse.
Introduction
Autoencoders on tietyntyyppinen feedforward-neuroverkko, jossa tulo on sama kuin lähtö. He pakkaavat tulon alempiulotteiseen koodiin ja rekonstruoivat tämän esityksen tuotoksen. Koodi on tulon kompakti” tiivistelmä” tai ”puristus”, jota kutsutaan myös latentin-avaruuden esitykseksi.
automaattikooderi koostuu 3 osasta: kooderista, koodista ja dekooderista. Kooderi pakkaa tulon ja tuottaa koodin, dekooderi sitten rekonstruoi tulon vain käyttämällä tätä koodia.
rakentaa autoencoder tarvitsemme 3 asioita: koodaus menetelmä, dekoodaus menetelmä, ja tappio funktio verrata lähtö tavoite. Tarkastelemme näitä seuraavassa jaksossa.
Automaattisovittimet ovat pääasiassa dimensionaalisuuden reduction (tai compression) – algoritmi, jolla on pari tärkeää ominaisuutta:
- Data-specific: Autoencoders pystyvät vain mielekkäästi pakata tietoja, jotka ovat samanlaisia kuin ne on koulutettu. Koska he oppivat tietyn koulutustietojen ominaisuuksia, he ovat erilaisia kuin tavallinen tietojen pakkausalgoritmi, kuten gzip. Joten emme voi odottaa automaattikooderia, joka on koulutettu käsinkirjoitetuilla numeroilla pakkaamaan maisemakuvia.
- häviöllinen: Autoencoderin ulostulo ei ole täsmälleen sama kuin tulo, se on tiivis mutta huonontunut esitys. Jos haluat häviötöntä puristusta, ne eivät ole oikea tapa.
- valvomaton: autokooderin kouluttamiseksi ei tarvitse tehdä mitään hienoa, vain heittää raakaa syöttödataa siihen. Automaattiohjaimet pidetään valvomaton oppimisen tekniikka, koska ne eivät tarvitse nimenomaisia tarroja kouluttaa. Mutta tarkemmin sanottuna he ovat itseohjautuvia, koska he tuottavat omat leimansa harjoitustietojen perusteella.
Arkkitehtuuri
tutustutaan kooderin, koodin ja dekooderin yksityiskohtiin. Sekä kooderi ja dekooderi ovat täysin kytketty syötteen eteenpäin neuroverkkoja, lähinnä ANNs katoimme Osa 1. Koodi on yksittäinen Ann-kerros, jonka mitta on valittavanamme. Koodikerroksen solmujen määrä (koodikoko) on hyperparametri, jonka asetamme ennen automaattikooderin koulutusta.
tämä on tarkempi visualisointi autoencoder. Ensin tulo kulkee kooderin läpi, joka on täysin kytketty ANN, tuottaa koodin. Dekooderi, jolla on samanlainen ANN-rakenne, tuottaa tulosteen vain koodin avulla. Tavoitteena on saada lähtö identtinen tulo. Huomaa, että dekooderiarkkitehtuuri on kooderin peilikuva. Tämä ei ole vaatimus,mutta se on tyypillisesti. Ainoa vaatimus on panoksen mitoitus ja tuotoksen on oltava sama. Kaiken keskellä voi leikkiä.
on 4 hyperparametriä, jotka meidän on asetettava ennen automaattiohjaimen harjoittelua:
- koodin koko: keskimmäisen kerroksen solmujen lukumäärä. Pienempi koko aiheuttaa enemmän puristusta.
- kerrosten lukumäärä: automaattikooderi voi olla niin syvä kuin haluamme. Yllä olevassa kuvassa meillä on 2 kerrosta sekä kooderi ja dekooderi, ottamatta huomioon Tulo ja Lähtö.
- solmujen määrä kerrosta kohti: työstämäämme automaattisoderarkkitehtuuria kutsutaan pinotuksi automaattisoderiksi, koska kerrokset pinotaan yksi toisensa jälkeen. Yleensä pinottu autoencoders näyttävät ”sandwitch”. Solmujen määrä kerrosta kohti vähenee jokaisen seuraavan kooderin kerroksen myötä ja kasvaa takaisin dekooderissa. Myös dekooderi on symmetrinen enkooderiin nähden kerrosrakenteeltaan. Kuten edellä todettiin, tämä ei ole välttämätöntä, ja meillä on täydellinen valvonta näiden parametrien.
- Häviöfunktio: käytämme joko mean squared erroria (MSE) tai binääristä crossentropiaa. Jos tuloarvot ovat alueella, käytämme tyypillisesti crossentropiaa, muuten käytämme keskiarvon potenssivirhettä. Katso lisätietoja tästä videosta.
Autokouluttajat koulutetaan samalla tavalla kuin ANNs backpropagaation kautta. Tutustu käyttöönotto Osa 1 lisätietoja siitä, miten neuroverkkoja koulutetaan, se koskee suoraan autoencoders.
toteutus
nyt toteutetaan automaattikooderi seuraavalle arkkitehtuurille, 1 piilotettu kerros kooderiin ja dekooderiin.
käytämme erittäin suosittua mnist-aineistoa syötteenä. Se sisältää mustavalkoisia kuvia käsin kirjoitetuista numeroista.
ne ovat kooltaan 28×28 ja käytämme niitä vektorina 784 lukujen välillä . Tarkista jupyterin muistikirjasta yksityiskohdat.
toteutamme nyt automaattikooderin Keroilla. Hyperparametrit ovat: piilokerroksessa on 128 solmua, koodikoko on 32 ja binäärinen crossentropia on häviöfunktio.
tämä on hyvin samanlainen kuin Ans työskentelimme, mutta nyt käytämme Keras toiminnallinen API. Katso tästä oppaasta lisätietoja, mutta tässä on nopea vertailu. Ennen kuin käytimme lisätä kerroksia käyttämällä peräkkäistä API seuraavasti:
model.add(Dense(16, activation='relu'))
model.add(Dense(8, activation='relu'))
toiminnallisen API: n avulla teemme tämän:
layer_1 = Dense(16, activation='relu')(input)
layer_2 = Dense(8, activation='relu')(layer_1)
se on monisanaisempi mutta joustavampi tapa määritellä monimutkaisia malleja. Voimme helposti napata osia mallistamme, esimerkiksi vain dekooderin, ja työskennellä sen kanssa. Tuotos tiheä menetelmä on kutsuttava kerros, käyttämällä toiminnallista API tarjoamme sen tulo ja tallentaa tuotos. Kerroksen tuotoksesta tulee seuraavan kerroksen tulo. Sekventiaalisella API: lla add-menetelmä hoiti tämän implisiittisesti meille.
huomaa, että kaikki kerrokset käyttävät relu-aktivointifunktiota, koska se on standardi syvien neuroverkkojen kanssa. Viimeinen kerros käyttää sigmoid aktivointi, koska tarvitsemme lähdöt olla välillä . Myös panos on samaa luokkaa.
huomaa myös kutsu sovitettavaksi-funktio, ennen annsilla teimme:
model.fit(x_train, y_train)
mutta nyt on:
model.fit(x_train, x_train)
muista, että tavoitteet autoencoder ovat samat kuin tulo. Siksi toimitamme harjoitustietoja kohteena.
visualisointi
nyt visualisoidaan, kuinka hyvin autokooderimme rekonstruoi panoksensa.
suoritamme autencoderin testisarjassa yksinkertaisesti käyttämällä kerasin ennustusfunktiota. Jokaista testisarjan kuvaa varten saamme automaattikooderin tuotoksen. Odotamme tuotoksen olevan hyvin samanlainen kuin panos.
ne ovat todellakin melko samanlaisia, mutta eivät aivan samanlaisia. Voimme huomata sen selkeämmin viimeisessä numerossa ”4”. Koska tämä oli yksinkertainen tehtävä meidän autoencoder suoriutui melko hyvin.
neuvo
meillä on täysi kontrolli automaattiohjaimen arkkitehtuurista. Voimme tehdä siitä erittäin tehokkaan lisäämällä kerrosten määrää, solmuja kerrosta kohti ja mikä tärkeintä koodin kokoa. Näiden hyperparametrien lisääminen antaa autokooderin oppia monimutkaisempia koodauksia. Meidän on kuitenkin varottava tekemästä siitä liian voimakasta. Muuten autoencoder yksinkertaisesti oppia kopioimaan panoksensa ulostuloon oppimatta mitään mielekästä esitystä. Se vain jäljittelee identiteettifunktiota. Autoencoder rekonstruoi harjoitustiedot täydellisesti, mutta se on ylimitoitettua ilman, että se pystyy yleistämään uusiin instansseihin, mitä emme halua.
tämän vuoksi suosimme ”sandwitch” – arkkitehtuuria, ja pidämme tarkoituksella koodin koon pienenä. Koska koodauskerros on pienempi dimensionaliteetti kuin syöttötiedot, automaattiohjaimen sanotaan olevan alivalmis. Se ei pysty suoraan kopioimaan tuotantopanoksiaan ulostuloon ja joutuu opettelemaan älykkäitä ominaisuuksia. Jos syöttötiedossa on kuvio, esimerkiksi luku ”1” sisältää yleensä jokseenkin suoran ja luku ”0” on pyöreä, se oppii tämän tosiasian ja koodaa sen kompaktimpaan muotoon. Jos syöttötiedot olivat täysin satunnaisia ilman sisäistä korrelaatiota tai riippuvuutta, niin alikuntoinen autoencoder ei pysty palauttamaan sitä täydellisesti. Mutta onneksi reaalimaailmassa on paljon riippuvuutta.
Denoivien automaattien
koodikerroksen pitäminen pienenä pakotti automaattikooderimme opettelemaan älykkään esityksen datasta. On toinenkin tapa pakottaa autoencoder oppia hyödyllisiä ominaisuuksia, mikä on lisäämällä satunnainen melu sen tuloa ja tekee siitä palauttaa alkuperäisen kohinaton tiedot. Näin automaattikooderi ei voi yksinkertaisesti kopioida tuloaan ulostuloonsa, koska tulo sisältää myös satunnaista kohinaa. Pyydämme sitä vähentämään melua ja tuottamaan taustalla olevaa merkityksellistä tietoa. Tätä kutsutaan denoisoivaksi automaattikooderiksi.
ylärivissä on alkuperäiset kuvat. Lisäämme niihin satunnaista Gaussin kohinaa ja meluisasta datasta tulee syöttö automaattiseen kooderiin. Automaattikooderi ei näe alkuperäistä kuvaa lainkaan. Mutta sitten odotamme autoencoder uudistaa kohinaton alkuperäinen kuva.
denoising autoencoderin toteutuksessa on vain yksi pieni ero tavalliseen. Arkkitehtuuri ei muutu lainkaan, vain fit-toiminto. Koulutimme säännöllisesti autoencoder seuraavasti:
autoencoder.fit(x_train, x_train)
Denoising autoencoder on koulutettu:
autoencoder.fit(x_train_noisy, x_train)
niin yksinkertaista kuin se on, kaikki muu on täsmälleen samanlaista. Automaattikooderin tulo on äänekäs kuva,ja odotettu kohde on alkuperäinen kohinaton.
visualisointi
nyt visualisoidaan, saadaanko kohinattomat kuvat palautettua.
näyttää hyvältä. Alarivi on automaattinen kooderi lähtö. Voimme tehdä paremmin käyttämällä monimutkaisempia autoencoder arkkitehtuuri, kuten convolutionous autoencoders. Käsittelemme convolutions tulevassa artikkelissa.
harva Automaattikoodaaja
esittelimme kaksi tapaa pakottaa automaattikooderi oppimaan hyödyllisiä ominaisuuksia: pitää koodikoko pienenä ja denoisoida automaattikooderit. Kolmas menetelmä on säännönmukaistaminen. Voimme regularize autoencoder käyttämällä harvuusrajoitusta siten, että vain murto-osa solmut olisi nonzero arvot, kutsutaan aktiivisia solmuja.
erityisesti lossifunktioon lisätään rangaistustermi siten, että vain murto-osa solmuista aktivoituu. Tämä pakottaa automaattisen kooderin edustamaan jokaista syöttöä pienen määrän solmujen yhdistelmänä ja vaatii sitä löytämään mielenkiintoisen rakenteen tiedoista. Tämä menetelmä toimii, vaikka koodin koko olisi suuri, koska vain pieni osajoukko solmuista on aktiivinen milloin tahansa.
se on aika helppo tehdä Kerasissa vain yhdellä parametrilla. Muistutuksena, aiemmin loimme koodikerroksen seuraavasti:
code = Dense(code_size, activation='relu')(input_img)
lisäämme nyt toisen parametrin nimeltä activity_regularizer määrittelemällä regularisaatiolujuuden. Tämä on tyypillisesti arvo alueella . Tässä valitsimme 10e-6.
code = Dense(code_size, activation='relu', activity_regularizer=l1(10e-6))(input_img)
harvamallin lopullinen häviö on 0,01 vakiomallia suurempi, johtuen lisätystä säännönmukaistamistermistä.
osoitetaan, että säännönmukaisen mallin tuottamat koodaukset ovat todella harvassa. Jos katsomme testijoukon kuvien koodiarvojen histogrammia, jakauma on seuraava:
standardimallin keskiarvo on 6,6, mutta vakiomallilla se on 0,8, mikä on aika iso vähennys. Voimme nähdä, että suuri osa koodiarvoista säännönmukaistetussa mallissa on todellakin 0, mitä halusimme. Myös vakioidun mallin varianssi on melko pieni.
Use Cases
now we may ask the following questions. Kuinka hyviä automaattikoodaajat ovat syötteen puristamisessa? Ja ovatko ne yleisesti käytetty syväoppimisen tekniikka?
valitettavasti automaattiohjaimet eivät ole laajalti käytössä reaalimaailman sovelluksissa. Pakkausmenetelmänä ne eivät suoriudu sen vaihtoehtoja paremmin, esimerkiksi jpeg tekee kuvapakkauksen paremmin kuin autokooderi. Ja se, että autoencoders ovat datakohtaisia tekee niistä epäkäytännöllisiä yleisenä tekniikkana. Heillä on kuitenkin 3 yhteistä käyttötapausta:
- Data denoising: olemme nähneet tästä esimerkin kuvissa.
- Dimensionaalisuuden vähentäminen: suuriulotteisen datan visualisointi on haastavaa. t-SNE on yleisimmin käytetty menetelmä, mutta sillä on suuri määrä ulottuvuuksia (tyypillisesti yli 32). Niinpä automaattisia koodaajia käytetään esikäsittelynä dimensionaalisuuden vähentämiseksi, ja t-SNE käyttää tätä pakattua esitystapaa datan visualisointiin 2D-avaruudessa. Suuri artikkeleita t-SNE katso täältä ja täältä.
- Variational Autoencoders (VAE): tämä on nykyaikaisempi ja monimutkaisempi käyttötapaus autoencoders ja käsittelemme niitä toisessa artikkelissa. Mutta nopeana yhteenvetona VAE oppii todennäköisyysjakauman parametrit, jotka mallintavat syöttötietoja, sen sijaan että oppisi mielivaltaisen funktion vanilla-automaattien tapauksessa. Näytteenottopisteillä tästä jakaumasta Voimme käyttää myös Vae: ta generatiivisena mallina. Tässä on hyvä viittaus.
Conclusion
Autokooderit ovat erittäin hyödyllinen dimensionaalisuuden vähentämistekniikka. Ne ovat erittäin suosittuja opetusmateriaalina johdantokursseilla syväoppimisessa, todennäköisesti niiden yksinkertaisuuden vuoksi. Tässä artikkelissa käsittelimme niitä yksityiskohtaisesti ja toivon, että pidit siitä.
tämän artikkelin koko koodi löytyy täältä, jos haluat hakkeroida siihen itse. Jos sinulla on palautetta, ota minuun yhteyttä Twitterissä.