Makan til alfabetsuppe skal man lete lenge etter. Matematikere burde sporenstreks ta seg et kurs i hvordan man kommuniserer enkle konsepter til andre mennesker. Deler av maskinlæringslitteraturen er imho direkte menneskefiendtlig.

Jeg er nå nesten helt sikker på at jeg har implementert Stochastic Gradient Descent med Nesterov momentum og L2-regularization – riktig. Jeg er nesten også helt sikker på at jeg normaliserer input, bruker tanh-aktiveringsfunksjon og softmax på output – riktig. Beviset ligger likevel, som kjent, i puddingen. Evne til overfitting og korrekt klassifisering av et treningssett er en indikasjon på en viss grad av virk. Og for å kunne sjekke om man har en rimelig grad av virk, så trenger man da det som på fagspråket heter “data” :)

Et glitrende datasett, som det er moro å bryne seg på er MNIST.

MNIST er en database over håndskrevne siffer. Den består av et treningssett med 60000 siffer og et testsett på 10000 siffer. Hvert siffer er et bitmap på 28×28 pixels. Gitt at man ikke har featuredetektorer i forkant, så vil et enkelt nett for å lære seg å klassifisere disse, ha 784 inputnoder, et eller flere skjulte lag med noder og 10 noder i outputlaget. Ved å benytte softmax-algoritmen, så tvinger man output inn i en sannsynlighetsfordeling, hvilket er glitrende når man skal bygge et et neuralt nett, som skal klassifisere noe.

Utfordringen er å ikke trene nettet slik at det kun husker treningssettet , men på en slik måte at det er i stand til å lære å ekstrahere features fra treningsettet.

Det sparker rimelig greit unna, selv om koden sannsynligvis ikke er helt optimal mht hastighet (Jeg fokuserte i første omgang på egenopplæring + korrekt oppførsel + kode som ikke resulterte i hjerneblødning ved forsøk på å lese den dagen etter). På en relativt gammel i7, så klarer et {I:784, H:128, O:10}-nett typisk å lære seg å klassifisere 2000 siffer på 10-12 sekunder. Anser det som “innafor”, selv om det nepper er i TensorFlow-divisjonen mht ytelse.

Backpropagation er i essens et sett av matrise-/vektoroperasjoner og treningen er et høyst dataparallelliserbart problem. Hvorfor nøye seg med kun en kjerne ? Neste trinn blir derfor å gå litt mer i dybden på C++AMP for å kunne trene større nett på GPU.

Det klør også litt mht å skrape i overflata på andre typer av nettverk, som eksempelvis RNN for tidsserieprediksjon, convolutional nettverk mtp bildegjenkjenning, deep belief-nettverk, samt visualisering av hva som skjer under trening.

PS. Jeg vet det finnes glitrende rammeverk der ute, men man lærer mye mer av å implementere ting fra first principles.