Innholdsfortegnelse:
Video: Jeg sliter med en konstant indre uro... 2024
Gitt den neurale nettverksarkitekturen, kan du forestille deg hvor lett algoritmen kunne lære nesten alt fra data, spesielt hvis du lagde for mange lag. Faktisk gjør algoritmen det så godt at dets spådommer ofte påvirkes av en høy estimatavvik som kalles overfitting. Overfitting får det neurale nettverket til å lære hver detalj av treningseksemplene, som gjør det mulig å kopiere dem i prediksjonsfasen. Men bortsett fra treningssettet, vil det ikke alltid forutsi noe annet.
Forstå overfitting problemet
Når du bruker et neuralt nettverk for et reelt problem, må du ta noen forsiktighetsregler på en mye strengere måte enn du gjør med andre algoritmer. Nevrale nettverk er frailer og mer utsatt for relevante feil enn andre maskinlæringsløsninger.
Først deler du forsiktig dataene dine inn i opplæring, validering og testsett. Før algoritmen lærer av data, må du vurdere godheten til parametrene dine: arkitektur (antall lag og noder i dem); aktiveringsfunksjoner; læringsparameter; og antall iterasjoner. Spesielt gir arkitekturen gode muligheter til å lage kraftige prediktive modeller med stor risiko for overfitting. Læringsparameteren styrer hvor raskt et nettverk lærer fra data, men det kan ikke være tilstrekkelig for å forhindre overfitting av treningsdataene.
Du har to mulige løsninger på dette problemet:
- Den første løsningen er regularisering, som i lineær og logistisk regresjon. Du kan summere alle tilkoblingskoeffisienter, kvadrert eller i absolutt verdi, for å straffe modeller med for mange koeffisienter med høye verdier (oppnådd ved L2-regulering) eller med verdier forskjellig fra null (oppnådd ved L1-regulering).
- Den andre løsningen er også effektiv fordi den styrer når overfitting skjer. Den kalles tidligstopp og fungerer ved å sjekke kostnadsfunksjonen på valideringssettet som algoritmen lærer fra treningssettet.
Du kan ikke innse når modellen begynner å overfitte. Kostnadsfunksjonen som beregnes ved hjelp av treningssettet, fortsetter å øke ettersom optimalisering utvikler seg. Men så snart du begynner å ta opp støy fra dataene og slutte å lære generelle regler, kan du sjekke kostnadsfunksjonen på en ekstern prøve (valideringsprøven). På et tidspunkt vil du legge merke til at det slutter å bli bedre og begynner å forverres, noe som betyr at modellen din har nådd sin læringsgrense.
Åpning av den svarte boksen av nevrale nettverk
Den beste måten å lære å bygge et neuralt nettverk på er å bygge en. Python tilbyr et vell av mulige implementeringer for nevrale nettverk og dyp læring. Python har biblioteker som Theano, som tillater komplekse beregninger på abstrakt nivå, og flere praktiske pakker, som Lasagne, som lar deg bygge nevrale nettverk, men det krever fortsatt noen abstraksjoner. Av denne grunn trenger du wrappers, for eksempel nolearn, som er kompatibel med scikit-lær, eller Keras, som også kan pakke TensorFlow-biblioteket ut av Google som har potensial til å erstatte Theano som et programvarebibliotek for neural beregning.
R gir biblioteker som er mindre kompliserte og mer tilgjengelige, for eksempel nnet, AMORE og neuralnet. Disse korte eksemplene i R viser hvordan man trener både et klassifikasjonsnettverk (på Iris datasettet) og et regresjonsnettverk (på Boston datasettet). Fra og med klassifiseringen laster følgende kode inn datasettet og deler den inn i trening og testsett:
bibliotek (neuralnet)
mål <- modell. matrise (~ Arter, # 1, data = iris)
colnames (mål) <- c ("setosa", "versicolor", "virginica")
sett. frø (101)
indeks <- prøve (1: nrow (iris), 100)
train_predictors <- iris [indeks, 1: 4]
test_predictors <- iris [-index, 1: 4]
Fordi nevrale nettverk stole på gradient nedstigning, må du standardisere eller normalisere inngangene. Normalisering er bedre slik at minimumet er null og maksimumet er en for hver funksjon. Naturligvis lærer du hvordan du gjør den numeriske konvertering ved hjelp av treningssettet bare for å unngå mulighet for å bruke informasjon fra testen utenfor prøven.
min_vektor <- søk (train_predictors, 2, min)
range_vector <- apply (train_predictors, 2, max) -
gjelder (train_predictors, 2, min)
train_scaled <- cbind
test_scaled <- cbind (skala (test_predictors,
min_vector, range_vector),
mål [-index,]) < sammendrag (train_scaled)
Når treningssettet er klart, kan du trene modellen for å gjette tre binære variabler, hvor hver av dem representerer en klasse. Utgangen er en verdi for hver klasse proporsjonal med sannsynligheten for å være den virkelige klassen. Du velger en prediksjon ved å ta høyest verdi. Du kan også visualisere nettverket ved å bruke det interne plottet og dermed se den neurale nettverksarkitekturen og de tildelte vekter.
set. frø (102)
nn_iris <- neuralnet (setosa + versicolor + virginica ~
Sepal. Lengde + Sepal. Bredde
+ Petal. Lengde + Petal. Bredde,
data = train_scaled, hidden = c (Nn_iris, test_scaled [1: 4])
y_predicted <- apply Resultat, 1, hvilket. max)
y_true <- søk (test_scaled [5: 7], 1, hvilke. max)
confusion_matrix <- table (y_true, y_predicted)
nøyaktighet <- sum diag (confusion_matrix)) /
sum (confusion_matrix)
utskrift (confusion_matrix)
print (lim inn ("Nøyaktighet:", nøyaktighet))
Du kan plotte et opplært nevralnett.
Følgende eksempel viser hvordan du kan forutsi husverdier i Boston, ved hjelp av Boston datasettet. Prosedyren er den samme som i forrige klassifisering, men her har du en enkelt utgangsenhet. Koden viser også testsettets forventede resultater mot de reelle verdiene for å verifisere den gode passformen til modellen.
no_examples <- nrow (Boston)
funksjoner <- colnames (Boston)
sett. frø (101)
indeks <- prøve (1: no_examples, 400)
test <- boston [-index,]
min_vektor <- gjelder, 2, min)
range_vector <- søk (tog, 2, maks) - søk (tog, 2, min)
scaled_train <- skala (tog, min_vektor, range_vector)
skalertest test, min_vector, range_vector)
formel = lim ("medv ~", lim inn (funksjoner [1: 13],
kollaps = 'n'))
nn_boston <- neuralnet = scaled_train,
skjult = c (5, 3), lineær. utgang = T)
spådommer <- beregne (nn_boston, scaled_test [1: 13])
predicted_values <- Resultatet er
range_vector [14]) + min_vector [14]
RMSE <- sqrt (gjennomsnitt ((test [14] - predicted_values) ^ 2))
RMSE))
plot (test [14], predicted_values, cex = 1. 5)
ablinje (0, 1, lwd = 1)