Jeg fjernet 74 % av nevronene fra et nevralt nettverk. Den reduserte nøyaktigheten med bare 0,50 %. Her er en oversikt (med kode):
Et trent nevralt nettverk har alltid nevroner som ikke bidrar vesentlig til ytelsen. Men de bruker fortsatt minne. Disse kan fjernes uten at det går vesentlig på bekostning av nøyaktigheten. La oss se hvordan du identifiserer dem!
Her er trinnene: Trinn 1) Tren det nevrale nettverket som vanlig. Trinn 2) Send valideringssettet gjennom det trente nettverket, og beregn for hvert nevron i skjulte lag: - Den gjennomsnittlige aktiveringen - Variansen av aktiveringer (hvis aktiveringer kan være -ve) Sjekk dette👇
Trinn 3) Beskjær nevroner som har et aktiveringsgjennomsnitt og varians nær null siden de har liten innvirkning på modellens utgang. Ideelt sett bør du plotte ytelsen på tvers av flere beskjæringsterskler for å velge modellen som passer til din størrelse kontra nøyaktighetskompromisser. Sjekk dette 👇
La oss se på koden. Vi starter med å definere et enkelt nevralt nettverk og trener det. Siden vi skal beregne aktiveringer på nevronnivå senere for beskjæring, returnerer vi alle de mellomliggende aktiveringene i foroverpasset. Sjekk dette👇
Deretter definerer vi to lister med tre elementer: - Man vil lagre gjennomsnitt av aktiveringer - En annen vil lagre std dev av aktiveringer Vi sender valideringssettet gjennom modellen vår for å beregne denne statistikken for hvert skjulte lag. Sjekk dette 👇
På dette tidspunktet, la oss lage et distribusjonsplott av statistikk på nevronnivå vi genererte ovenfor. Som vist nedenfor, er de fleste nevroners gjennomsnittlige aktiveringer og deres std-utvikling tungt fordelt rundt nesten nullverdier. La oss prøve å beskjære dem neste gang.
For beskjæring gjentar vi over en liste over terskler og: - Opprett et nytt nettverk og overfør vekter som passerer terskelen. - Evaluer det nye nettverket og beregn totalt antall parametere. - Legg til resultatene i en liste. Sjekk dette 👇
Denne tabellen sammenligner den beskjærte modellens nøyaktighet og størrelsesreduksjon på tvers av flere terskler i forhold til den opprinnelige modellen. Ved gjennomsnitt = 0,1 og std-dev = 0,4: - Modellens nøyaktighet synker med 0,08 %. - Modellens størrelse reduseres med 62 %. Det er en enorm reduksjon. Sjekk dette 👇
Her er et annet interessant resultat. Ved gjennomsnitt = 0,5 og std-dev = 1: - Modellens nøyaktighet synker med 0,5 %. - Modellens størrelse reduseres med 74 %. Så i hovedsak får vi nesten lik ytelse for 1/4 av parametrene. Sjekk dette 👇
Selvfølgelig er det en avveining mellom nøyaktighet og størrelse. Når vi reduserer størrelsen, synker nøyaktigheten (sjekk videoen). Men i de fleste tilfeller er ikke nøyaktighet den eneste beregningen vi optimaliserer. I stedet er flere operasjonelle beregninger som effektivitet, minne, etc., nøkkelfaktorene.
40,99K