Lær TensorFlow, Word2Vec-modellen og TSNE-algoritmen ved hjælp af rockbånd

At lære "TensorFlow-måde" at opbygge et neuralt netværk kan virke som en stor forhindring for at komme i gang med maskinlæring. I denne vejledning tager vi det trin for trin og forklarer alle de involverede kritiske komponenter, når vi bygger en Bands2Vec-model ved hjælp af Pitchfork-data fra Kaggle.

For den fulde kode, se GitHub-siden.

Word2Vec-modellen

Neurale netværk forbruger tal og producerer tal. De er meget gode til det. Men giv dem lidt tekst, så smider de et raserianfald og gør intet fjernt interessant.

Hvis det er det neurale netværks job at knuse tallene og producere meningsfuld output, er det vores job at sikre, at uanset hvad vi fodrer, er det også meningsfuldt. Denne søgen efter en meningsfuld gengivelse af information fødte Word2Vec-modellen.

En tilgang til at arbejde med ord er at danne en-hot-kodede vektorer. Opret en lang (antallet af forskellige ord i vores ordforråd) liste over nuller, og få hvert ord til et unikt indeks på denne liste. Hvis vi ser dette ord, skal du gøre det indeks på listen til nummer et.

Mens denne fremgangsmåde fungerer, kræver den meget plads og er fuldstændig blottet for mening. 'God' og 'Fremragende' er lige så ens som 'Duck' og 'Blackhole'. Hvis der kun var en måde at vektorisere ord på, så vi bevarede denne kontekstuelle lighed ...

Heldigvis er der en måde!

Ved hjælp af et neuralt netværk kan vi producere 'indlejringer' af vores ord. Dette er vektorer, der repræsenterer hvert unikke ord ekstraheret fra vægten af ​​forbindelserne i vores netværk.

Men spørgsmålet er stadig: hvordan sørger vi for, at de er meningsfulde? Svaret: feed i par ord som et målord og et kontekstord. Gør dette nok gange, kast også nogle dårlige eksempler, og det neurale netværk begynder at lære, hvilke ord der vises sammen, og hvordan dette næsten danner en graf. Som et socialt netværk af ord, der er sammenkoblet af sammenhænge. 'Godt' går til 'nyttigt', som går til 'omsorg' og så videre. Vores opgave er at føre disse data ind i det neurale netværk.

En af de mest almindelige tilgange er Skipgram-modellen, der genererer disse mål-kontekst-parringer baseret på at flytte et vindue over et datasæt med tekst. Men hvad hvis vores data ikke er sætninger, men vi har stadig sammenhængende betydning?

I denne vejledning er vores ord kunstnernavne, og vores sammenhænge er genrer og gennemsnitlige anmeldelse. Vi ønsker, at kunstner A skal være tæt på kunstner B, hvis de deler en genre og har en gennemsnitlig anmeldelse, der svarer til hinanden. Så lad os komme i gang.

Opbygning af vores datasæt

Pitchfork er et online amerikansk musikmagasin, der for det meste dækker rock, uafhængig og ny musik. Dataene, der blev frigivet til Kaggle, blev skrabet fra deres hjemmeside og indeholder oplysninger som anmeldelser, genrer og datoer, der er knyttet til hver kunstner.

Lad os oprette en kunstnerklasse og ordbog til at gemme alle de nyttige oplysninger, vi ønsker.

Store! Nu vil vi fremstille vores parring af mål-kontekst baseret på genre og gennemsnitlig gennemgangsscore. For at gøre dette opretter vi to ordbøger: en til de forskellige unikke genrer og en til scores (diskretiseret til heltal).

Vi tilføjer alle vores kunstnere til den tilsvarende genre og betyder score i disse ordbøger, der skal bruges senere, når vi genererer par kunstnere.

Et sidste trin inden vi dykker ned i TensorFlow-koden: generering af en batch! Et parti er som en stikprøve af data, som vores neurale netværk vil bruge til hver epoke. En epoke er en fejning over det neurale netværk i en træningsfase. Vi vil generere to følelsesløse arrays. Den ene indeholder følgende kode:

TensorFlow

Der er et utal af TensorFlow tutorials og kilder til viden derude. Enhver af disse fremragende artikler hjælper dig såvel som dokumentationen. Den følgende kode er stærkt baseret på word2vec-tutorial fra TensorFlow-folket selv. Forhåbentlig kan jeg afmystificere noget af det og koge det ned til det væsentlige.

Det første trin er at forstå 'graf' repræsentationen. Dette er utroligt nyttigt til TensorBoard-visualiseringer og til at skabe et mentalt billede af datastrømmene inden for det neurale netværk.

Brug lidt tid på at læse koden og kommentarerne nedenfor. Før vi føder data til et neuralt netværk, skal vi initialisere alle de dele, vi skal bruge. Pladsholderne er input, der tager alt, hvad vi giver 'feed_dict'. Variablerne er mutable dele af grafen, som vi til sidst vil finjustere. Den vigtigste del af vores model er tabsfunktionen. Det er resultatet af, hvor godt vi klarede os, og skattekortet for, hvordan vi kan forbedre.

Noise Contrastive Estimation (NCE) er en tabsfunktion. Normalt bruger vi kryds-entropi og softmax, men i den naturlige sprogbehandlingsverden svarer alle vores klasser til hvert eneste unikke ord.

Beregningsmæssigt er dette dårligt. NCE ændrer indramningen af ​​problemet fra sandsynligheder for klasser til, om en mål-kontekst-parring er korrekt eller ej (en binær klassifikation). Det kræver en ægte parring og derefter prøver at få dårlige parringer, konstanten num_sampledstyrer dette. Vores neurale netværk lærer at skelne mellem disse gode og dårlige parringer. I sidste ende lærer det sammenhængene! Du kan læse mere om NCE og hvordan det fungerer her.

Kør det neurale netværk

Nu hvor alt er indrettet pænt, er vi bare nødt til at trykke på den store grønne 'go' -knap og vride tommelfingrene lidt.

Visualisering ved hjælp af TSNE

Okay, vi er ikke helt færdige. Vi har nu kontekstrige 64-dimensionelle vektorer til vores kunstnere, men det er måske for mange dimensioner til virkelig at visualisere dets anvendelighed.

Heldig for os kan vi presse disse oplysninger i to dimensioner, mens vi bevarer så mange af egenskaberne som de 64 dimensioner havde! Dette er T-distribueret stokastisk naboindlejring eller kort sagt TSNE. Denne video gør et godt stykke arbejde med at forklare hovedideen bag TSNE, men jeg vil prøve at give et bredt overblik.

TSNE er en tilgang til dimensionalitetsreduktion, der bevarer lighederne (som euklidisk afstand) for højere dimensioner. For at gøre dette bygger den først en matrix af punkt-til-punkt-ligheder beregnet ved hjælp af en normalfordeling. Fordelingscenteret er det første punkt, og ligheden af ​​det andet punkt er fordelingsværdien i afstanden mellem punkterne væk fra centrum af fordelingen.

Derefter projicerer vi tilfældigt på dimensionen nedenfor og udfører nøjagtig den samme proces ved hjælp af en t-distribution. Nu har vi to matricer med punkt-til-punkt-ligheder. Algoritmen flytter derefter langsomt punkterne i den nedre dimension for at prøve at få det til at ligne matrixen for den højere dimension, hvor lighederne blev bevaret. Og gentag. Heldigvis har Sci-kit Learn en funktion, der kan gøre antallet knasende for os.

Resultaterne

Det fantastiske aspekt ved disse indlejringer er, at de ligesom vektorer understøtter matematiske operationer. Det klassiske eksempel er:, King — Man + Woman = Queeneller i det mindste meget tæt på det. Lad os prøve et eksempel.

Tag de lavdimensionelle indlejringer af Coil, et band med følgende genrer [‘electronic’, ‘experimental', ‘rock’], og gennemsnitlig score 7.9. Træk nu de lavdimensionelle indlejringer af Elder Ones, et band med genrer ['electronic'], og gennemsnitlig score 7.8. Med denne indlejringsforskel skal du finde de nærmeste bånd til det og udskrive deres navne og genrer.

Artist: black lips, Mean Score: 7.48, Genres: ['rock', 'rock', 'rock', 'rock', 'rock']
Artist: crookers, Mean Score: 5.5, Genres: ['electronic']
Artist: guided by voices, Mean Score: 7.23043478261, Genres: ['rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock']

Det virkede! Vi får rock og elektroniske bands med vagt lignende anmeldelse. Nedenfor er de første tre hundrede bånd plottet med etiketter. Forhåbentlig har du fundet dette projekt lærerigt og inspirerende. Gå ud og bygg, udforsk og leg!