Når vi trener CNN-er, er en av utfordringene at vi trenger mye merket data. Når det gjelder bildeklassifisering, må vi dele bilder inn i ulike klasser, noe som krever manuell innsats.
Vi kan imidlertid ønske å bruke rå (umerkede) data for å trene CNN-funksjonsekstraktorer, noe som kalles selv-supervisert læring. I stedet for etiketter bruker vi treningsbilder både som nettverksinput og output. Hovedideen med autoencoder er at vi har et encoder-nettverk som konverterer input-bildet til et latent rom (vanligvis bare en vektor av mindre størrelse), og deretter et decoder-nettverk, som har som mål å rekonstruere det originale bildet.
✅ En autoencoder er "en type kunstig nevralt nettverk som brukes til å lære effektive kodinger av umarkert data."
Siden vi trener en autoencoder til å fange så mye informasjon som mulig fra det originale bildet for nøyaktig rekonstruksjon, prøver nettverket å finne den beste embedding av input-bilder for å fange meningen.
Bilde fra Keras-blogg
Selv om det å rekonstruere originale bilder ikke virker nyttig i seg selv, finnes det noen scenarier der autoencodere er spesielt nyttige:
- Redusere dimensjonen på bilder for visualisering eller trene bildeembeddings. Vanligvis gir autoencodere bedre resultater enn PCA, fordi de tar hensyn til bildenes romlige natur og hierarkiske funksjoner.
- Fjerning av støy, dvs. fjerne støy fra bildet. Fordi støy inneholder mye unyttig informasjon, kan autoencoder ikke passe alt inn i det relativt lille latente rommet, og dermed fanger den bare den viktige delen av bildet. Når vi trener støyfjernere, starter vi med originale bilder og bruker bilder med kunstig lagt til støy som input for autoencoder.
- Superoppløsning, øke bildekvaliteten. Vi starter med bilder med høy oppløsning og bruker bildet med lavere oppløsning som input for autoencoder.
- Generative modeller. Når vi har trent autoencoder, kan decoder-delen brukes til å lage nye objekter basert på tilfeldige latente vektorer.
Tradisjonelle autoencodere reduserer dimensjonen på input-data på en eller annen måte, og finner de viktige funksjonene i input-bildene. Imidlertid gir latente vektorer ofte ikke mye mening. Med andre ord, hvis vi tar MNIST-datasettet som et eksempel, er det ikke lett å finne ut hvilke sifre som tilsvarer ulike latente vektorer, fordi nærliggende latente vektorer ikke nødvendigvis tilsvarer de samme sifrene.
På den annen side, for å trene generative modeller er det bedre å ha en viss forståelse av det latente rommet. Denne ideen leder oss til variational autoencoder (VAE).
VAE er en autoencoder som lærer å forutsi statistisk distribusjon av de latente parameterne, det såkalte latente distribusjonen. For eksempel kan vi ønske at latente vektorer skal være normalt fordelt med en viss gjennomsnitt zmean og standardavvik zsigma (både gjennomsnitt og standardavvik er vektorer med en viss dimensjonalitet d). Encoder i VAE lærer å forutsi disse parameterne, og deretter tar decoder en tilfeldig vektor fra denne distribusjonen for å rekonstruere objektet.
Oppsummert:
- Fra input-vektoren forutsier vi
z_meanogz_log_sigma(i stedet for å forutsi standardavviket direkte, forutsier vi logaritmen av det) - Vi tar en prøvevektor
samplefra distribusjonen N(zmean,exp(zlog_sigma)) - Decoder prøver å dekode det originale bildet ved å bruke
samplesom input-vektor
Bilde fra denne bloggposten av Isaak Dykeman
Variasjonelle autoencodere bruker en kompleks tapsfunksjon som består av to deler:
- Rekonstruksjonstap er tapsfunksjonen som viser hvor nært et rekonstruert bilde er til målet (det kan være Mean Squared Error, eller MSE). Det er den samme tapsfunksjonen som i vanlige autoencodere.
- KL-tap, som sikrer at latente variabeldistribusjoner holder seg nær normalfordelingen. Det er basert på begrepet Kullback-Leibler-divergens - en metrikk for å estimere hvor like to statistiske distribusjoner er.
En viktig fordel med VAE-er er at de lar oss generere nye bilder relativt enkelt, fordi vi vet hvilken distribusjon vi skal ta latente vektorer fra. For eksempel, hvis vi trener VAE med 2D latente vektorer på MNIST, kan vi deretter variere komponentene i den latente vektoren for å få ulike sifre:
Bilde av Dmitry Soshnikov
Legg merke til hvordan bildene glir over i hverandre, ettersom vi begynner å ta latente vektorer fra ulike deler av det latente parameterrommet. Vi kan også visualisere dette rommet i 2D:
Bilde av Dmitry Soshnikov
Lær mer om autoencodere i disse tilhørende notatbøkene:
- Dataspesifikke - de fungerer bare godt med den typen bilder de er trent på. For eksempel, hvis vi trener et superoppløsningsnettverk på blomster, vil det ikke fungere godt på portretter. Dette er fordi nettverket kan produsere bilder med høyere oppløsning ved å ta fine detaljer fra funksjoner lært fra treningsdatasettet.
- Tapsbaserte - det rekonstruerte bildet er ikke det samme som det originale bildet. Naturen til tapet er definert av tapsfunksjonen som brukes under trening.
- Fungerer på umarkert data
I denne leksjonen lærte du om de ulike typene autoencodere som er tilgjengelige for AI-forskeren. Du lærte hvordan du bygger dem, og hvordan du bruker dem til å rekonstruere bilder. Du lærte også om VAE og hvordan du bruker det til å generere nye bilder.
I denne leksjonen lærte du om bruk av autoencodere for bilder. Men de kan også brukes for musikk! Sjekk ut Magenta-prosjektets MusicVAE-prosjekt, som bruker autoencodere til å lære å rekonstruere musikk. Gjør noen eksperimenter med dette biblioteket for å se hva du kan skape.
For referanse, les mer om autoencodere i disse ressursene:
- Bygge autoencodere i Keras
- Bloggpost på NeuroHive
- Variasjonelle autoencodere forklart
- Betingede variasjonelle autoencodere
På slutten av denne notatboken med TensorFlow, finner du en 'oppgave' - bruk denne som din oppgave.



