Kunstig nevralt nettverk

Kunstig nevralt nettverk, eller bare nevralt nettverk, brukes som benevnelse på en sterkt forenklet etterligning av biologisk nervevev fra hjernen eller det sensoriske system. Metodene og algoritmene bruker inspirasjon fra biologisk nervevev, men uten å være eksakt kopi. Slike kunstige nevrale nettverk stod i spissen blant de nye biologiinspirerte teknikkene innen databehandling som vokste frem på 1970-tallet, selv om metodegrunnlaget kan føres tilbake til Frank Rosenblatt sin forskning på perceptroner ved Cornell Aeronautical Laboratory i 1957.Frasen nevralt nettverk refererer som oftest til kunstige nevrale nettverk på en klassisk digital form, men det finnes varianter som går ut over de kjente metodene fra biologien. I biologien er det også metoder som vanskelig lar seg kopiere i kunstige implementasjoner. Hvis etterligningen er inspirert av biologien snakker en ofte om Nevromorf prosessering. Det er flere mulige grenser som kan trekkes mellom slike implementasjoner. En kan dele i digitale implementasjoner med mykvare og maskinvare på ene siden og analoge implementasjoner på den andre, en kan dele i nettverk som har liten eller ingen tidsdimensjon vs nettverk hvor tidsdimensjonen er vesentlig, en kan dele i nettverk med lineære noder vs nettverk med ulineære noder (lineære overføringsfunksjoner eller aktiveringsfunksjoner vs ulineære), en kan dele i ettlagsnettverk vs flerlagsnettverk (dyp læring aka «deep learning»), en kan dele i forovermatede nettverk vs tilbakematede nettverk, en kan dele i homogene nettverk med like noder vs heterogene nettverk, og så videre.
De viktigste anvendelsene er i 2018 innen selvlærende flerlagsnettverk med ulineære noder, hvor læringen eventuelt spisses med styrt læring. Slike anvendelser vil ofte bli initialisert til en startverdi ut ifra et utagget treningsett (apriori kunnskap) hvoretter det brukes selvlærende algoritmer for å få nettverket til å følge eller tilpasse seg et nytt tagget treningsett (aposteriori kunnskap). En slik transfer learning forutsetter at en kan avgjøre hva som er riktig respons for det taggede treningsettet.


== Bakgrunn ==
Den originale inspirasjonen til nevrale nettverk kom fra observasjon av sentralnervesystemet, med nerveceller, aksoner, dendritter og synapser er «prosessoren» i levende vesener. Inspirasjon til noen av bestanddelene er også fra forskning på levende vesener som har et nervesystem, men som mangler et fullt utviklet sentralnervesystem. Metodene er generelle og ikke spesifikt knyttet til eksistensen av et emulert sentralnervesystem, selv om et overordnet mål for mange forskningsarbeider er å nå frem til noe slikt.
Siden forskning på nervenes funksjon fortsatt er på et tidlig stadie der det finnes mange ubesvarte spørsmål og abstraksjonsnivå, så finnes det ingen entydig definisjon av hva som er et kunstig nevralt nettverk. En løst definert fellesnevner er at slike består av et nettverk av enkle prosesseringselementer som utfører en globalt kompleks handling basert på koblinger mellom prosesseringselementer og disses parametere. Det er vanlig å bruke algoritmer for maskinlæring til å balansere og tilpasse parametrene som i denne sammenheng typisk kalles «vekter».
Uttrykket kunstige nevrale nettverk blir i hovedsak brukt om nevrale nettverksmodeller nyttet i statistikk, kognitiv psykologi og kunstig intelligens.
I moderne programvareutvikling har man tatt i bruk en mer praktisk tilnærming basert på statistikk og signal prosessering. Prinsippet om ikke-lineær, distribuert, parallell og lokal prosessering og adapsjon blir ivaretatt i disse systemene, selv om mange av elementene fra biologi ikke finnes i disse systemene.


== Oppbygning ==
Et nevralt nettverk er bygget opp av nevroner, som i sin enkleste og eldste form også kalles perceptrons, og bindingene mellom disse og påtrykk fra foregående lag. Bindinger er i noen sammenhenger brukt om de enkelte vektene i nettverket, i andre sammenhenger er de brukt om de enkelte utganger fra foregående lag. I mange typer nevrale nettverk er det veldefinerte inngangsnoder (inputvector), som vektes og prosesseres med overføringsfunksjonen (aktiveringsfunksjonen), hvoretter de leveres til veldefinerte utgangsnoder (outputvector). Disse blir gjerne kalt Feed-forward nettverk hvis de ikke har læring aktivert.
Det snakkes ofte om inngangsnoder og utgangsnoder som ikke har noen selvstendig overføringsfunksjon, samtidig som det snakkes om prosesserende noder i laget. Dette kan være forvirrende. Det er enklere å se på dette som en inngangsvektor og en utgangsvektor, hvor en matrise bringer inngangsvektoren over på formen til utgangsvektoren.
I det etterfølgende beskrives et forovernett (feed foreward net). Hvis en legger til læring så vil dette fungere som et nett rettet motsatt vei og som propagerer feilverdier. I praktisk bruk er det imidlertid vanligere å flytte selve lærealgoritmen (backpropalgoritmen) inn i enheten som definerer det kunstige nevronet.


=== Nevron ===
Nevrale nettverk består av et stort antall relativt enkle noder, alle kjører den samme algoritmen. Opprinnelig var disse ment som en emulasjon av en enkelt nervecelle eller nevron. Hvert nevron kommuniserer med et subset av de andre kunstige nevronene i nettverket. Hver input et nevron får fra andre nevroner har en vekt assosiert. Vekten sier hvor viktig denne inputen er for nevronet. Nevroner har også en aktiveringsfunksjon som prosesserer summen av påtrykket, og et tilhørende bias. Bias fungerer som en terskel i et perceptron. Det er i noen tilfeller enklest å skille ut bias i en egen parameter, mens det i andre tilfeller er enklere å se på bias som et konstantpådrag i en av inngangsnodene.


=== Aktiveringsfunksjon ===
I nevrale nettverk beskriver aktiveringsfunksjonen outputoppførselen til et nevron. De fleste nevrale nettverk starter med å beregne den vektede summen av alle inngangene. Denne verdien (total net input) blir deretter vanligvis transformert ved hjelp av overføringsfunksjonen (aktiveringsfunksjon, squashing function). En av de enkleste overføringsfunksjonene sier kun at hvis total net input er mindre enn 0, er output fra nevron 0, ellers output 1. Denne overføringsfunksjonen er tett opp mot funksjonen som finnes i enkelte former for biologisk nervevev, hvor en sier at nerven «fyrer» når potensialet kommer opp i et gitt nivå. Andre viktige funksjoner er en identitetsfunksjon, eller en slik med øvre og/eller nedre skranke. Slike funksjoner er så tilnærmet med en eller flere logaritmiske funksjoner eller endog en hyperbolsk funksjon. Valget av den siste kommer av disses egenskaper i forbindelse med maskinlæring.


=== Vekt ===
En vekt, i et kunstig nevralt nettverk, er en parameter tilknyttet tilkoblingen mellom et nevron M, til et annet nevron N. Dette er omtrent det samme som bindingen til en synapse i et biologisk nevron. Vekten bestemmer hvor mye nevron N bryr seg om aktiveringen N får fra nevron M, eller hvor mye av pådraget fra N som når frem til M.I noen spesielle former for nettverk brukes det også ulineære overføringsfunksjoner istedenfor lineær vekting, men slike nettverk kan skrives om til to eller flere koblede nettverk med ulike overføringsfunksjoner. Slike nettverk brukes vanligvis i forbindelse med problemstillinger hvor en ønsker separasjon av datasett og ikke bare dekorrelering, det vil si dekorrelering over høyereordens komponenter.


=== Bias ===
I feedforward og noen andre nevrale nettverk er hvert nevron tilkoblet et fast bias, som også kan beskrives som et konstantpådrag, via en trenbar vekt. Dennes eksaktverdi er uvesentlig, men blir ofte satt til 1 eller -1. Fortegnet er uvesentlig om det kan trenes negative vekter. Dette gjør at hver skjulte enhet og outputenhet får et trenbart threshhold. Hvis eksaktverdien er -1 så blir threshold verdien til vekten knyttet til nevronets bias.


=== Perceptron ===

Et perceptron er et enkelt kunstig nevron som har en aktiveringsfunksjon som tar total net input og gir 1 hvis dette er over en grense (treshold), eller 0 hvis ikke. I noen sammenhenger er det praktisk å behandle alle nevrons som en perceptron.
Det er litt forskjell i litteratur med hensyn på hva som kalles et perceptron. I noen tilfeller brukes begrepet om et enkelt kunstig nevron, i andre tilfeller om et helt lag av slike, i noen tilfeller om et nevron med lineær overføringsfunksjon, i andre tilfeller med en enkelt terskel.


=== Grensefunksjon (threshold function) ===
Output fra et perceptron er 0 hvis total net input til perceptronet er mindre enn grensen(threshold) T, ellers er output 1. 


== Enkelt lag forovermatet nevralt nettverk ==
Et nettverk der alle input er koblet direkte til output blir kalt et ettlagsnettverk (single layer network) eller perceptron nettverk. Igjen er bruk av perceptron litt uklart, for normaltolkingen vil være at hver node også har egenskapene til en ren thresholdfunksjon. Når nodene implementerer en 'treshold' funksjon så kan vi se på perceptronene som en representasjon av en boolsk funksjon. Det er en del boolske funksjoner et slikt ettlags perceptron nettverk ikke kan representere. 


=== Læringsalgoritme ===
For et perceptron nettverk kan det brukes en enkel læringsalgoritme for å trene vektene utfra et datasett. For flerlagsnettverk må en bruke tilbakepropageringsalgoritmer for læring. 
Læringsalgoritmen som blir presentert her er den samme for alle output-nevroner, derfor blir algoritmen beskrevet for ett enkelt nevron i isolasjon.

Vi definerer noen variabler

  
    
      
        y
        =
        f
        (
        
          z
        
        )
        
      
    
    {\displaystyle y=f(\mathbf {z} )\,}
   funksjon for output fra en perceptron med input vektor 
  
    
      
        
          z
        
      
    
    {\displaystyle \mathbf {z} }
  .

  
    
      
        b
        
      
    
    {\displaystyle b\,}
   er bias termen.

  
    
      
        D
        =
        {
        (
        
          
            x
          
          
            1
          
        
        ,
        
          d
          
            1
          
        
        )
        ,
        …
        ,
        (
        
          
            x
          
          
            s
          
        
        ,
        
          d
          
            s
          
        
        )
        }
        
      
    
    {\displaystyle D=\{(\mathbf {x} _{1},d_{1}),\dots ,(\mathbf {x} _{s},d_{s})\}\,}
   er treningsdatasettet bestående av 
  
    
      
        s
      
    
    {\displaystyle s}
   verdier, der 
  
    
      
        
          
            x
          
          
            j
          
        
      
    
    {\displaystyle \mathbf {x} _{j}}
   er den 
  
    
      
        n
      
    
    {\displaystyle n}
  -dimensionale input vektoren og 
  
    
      
        
          d
          
            j
          
        
        
      
    
    {\displaystyle d_{j}\,}
   er den ønskede utgangsverdien for den gitte inngangsvektoren.Vi gir pådraget på nodene slik at

  
    
      
        
          x
          
            j
            ,
            i
          
        
        
      
    
    {\displaystyle x_{j,i}\,}
   er verdien av for inngangsnode 
  
    
      
        i
      
    
    {\displaystyle i}
   og løpenummer 
  
    
      
        j
      
    
    {\displaystyle j}
   i treningssettet.

  
    
      
        
          x
          
            j
            ,
            0
          
        
        =
        1
        
      
    
    {\displaystyle x_{j,0}=1\,}
   er tilsvarende pådraget for bias i datasettet.For å representere vektene

  
    
      
        
          w
          
            i
          
        
        
      
    
    {\displaystyle w_{i}\,}
   er verdien for nummer 
  
    
      
        i
      
    
    {\displaystyle i}
  i vektvektoren, som skal multipliseres med input node nummer 
  
    
      
        i
      
    
    {\displaystyle i}
  , eller for et fullt lag så vil dette være matrisen alle innganger vektes med.En ekstra dimensjon, med indeks 
  
    
      
        n
        +
        1
      
    
    {\displaystyle n+1}
  , kan bli lagt til alle input vektorer, med 
  
    
      
        
          x
          
            j
            ,
            n
            +
            1
          
        
        =
        1
        
      
    
    {\displaystyle x_{j,n+1}=1\,}
  , i så fall vil 
  
    
      
        
          w
          
            n
            +
            1
          
        
        
      
    
    {\displaystyle w_{n+1}\,}
   erstatte bias termen.
For å vise hvordan 
  
    
      
        
          w
        
      
    
    {\displaystyle \mathbf {w} }
   endres over iterasjonen som en løpetid brukes

  
    
      
        
          w
          
            i
          
        
        (
        t
        )
        
      
    
    {\displaystyle w_{i}(t)\,}
   som er vekten 
  
    
      
        i
      
    
    {\displaystyle i}
   på tidspunktet 
  
    
      
        t
      
    
    {\displaystyle t}
  .

  
    
      
        α
        
      
    
    {\displaystyle \alpha \,}
   som er læringsraten, der 
  
    
      
        0
        <
        α
        ≤
        1
      
    
    {\displaystyle 0<\alpha \leq 1}
  .Med for høy læringsrate vil perceptronet periodisk variere over og under løsningen. En mulig forbedring for å få det til å konvergere er å bruke 
  
    
      
        L
        
          R
          
            n
          
        
      
    
    {\displaystyle LR^{n}}
   med n=1 i begynnelsen og inkrementere med 1 når en loop i læringen blir funnet. Dette implementerer et fall (decay) i læreraten for å sikre konvergens.


==== Stegene i læringsalgoritmen ====
1.   Initialisering av vekter og 'threshold'. Vekter kan initialiseres ved å sette hver vekt node 
  
    
      
        
          w
          
            i
          
        
        (
        0
        )
        
      
    
    {\displaystyle w_{i}(0)\,}
   til 0 eller til en lav tilfeldig verdi.

2a.   Kalkuler det faktiske output:

  
    
      
        
          y
          
            j
          
        
        (
        t
        )
        =
        f
        [
        
          w
        
        (
        t
        )
        ⋅
        
          
            x
          
          
            j
          
        
        ]
        =
        f
        [
        
          w
          
            0
          
        
        (
        t
        )
        +
        
          w
          
            1
          
        
        (
        t
        )
        
          x
          
            j
            ,
            1
          
        
        +
        
          w
          
            2
          
        
        (
        t
        )
        
          x
          
            j
            ,
            2
          
        
        +
        ⋯
        +
        
          w
          
            n
          
        
        (
        t
        )
        
          x
          
            j
            ,
            n
          
        
        ]
      
    
    {\displaystyle y_{j}(t)=f[\mathbf {w} (t)\cdot \mathbf {x} _{j}]=f[w_{0}(t)+w_{1}(t)x_{j,1}+w_{2}(t)x_{j,2}+\dotsb +w_{n}(t)x_{j,n}]}
  2b.   Tilpass vektene:

  
    
      
        
          w
          
            i
          
        
        (
        t
        +
        1
        )
        =
        
          w
          
            i
          
        
        (
        t
        )
        +
        α
        (
        
          d
          
            j
          
        
        −
        
          y
          
            j
          
        
        (
        t
        )
        )
        
          x
          
            j
            ,
            i
          
        
        
      
    
    {\displaystyle w_{i}(t+1)=w_{i}(t)+\alpha (d_{j}-y_{j}(t))x_{j,i}\,}
  , for all nodes 
  
    
      
        0
        ≤
        i
        ≤
        n
      
    
    {\displaystyle 0\leq i\leq n}
  .Steg 2 er repetert til feilen i en iterasjon 
  
    
      
        
          d
          
            j
          
        
        −
        
          y
          
            j
          
        
        (
        t
        )
        
      
    
    {\displaystyle d_{j}-y_{j}(t)\,}
   er mindre enn en brukerspesifisert grense 
  
    
      
        γ
        
      
    
    {\displaystyle \gamma \,}
  , eller etter at et predefinert nummer av iterasjoner har blitt gjennomført. Legg merke til at algoritmen tilpasser vektene øyeblikkelig etter at steg 2a og 2b er utført på et par i treningsdatasett istedenfor å vente på at alle parene i et treningsdatasett har blitt evaluert.


==== Separerbarhet og konvergering ====
Novikoff (1962) beviste at perceptron algoritmen vist ovenfor konvergerer etter et endelig nummer av iterasjoner hvis datasettet er lineært separerbart. Hvis datasettet ikke er lineært separerbart vil ikke algoritmen overfor konvergere.


== Flerlags forovermatet nevralt nettverk ==
Nevrale nettverk med flere lag blir som oftest referert til som Flerlags forovermatet nevralt nettverk. Der den mest vanlige versjonen har et inputlag, et skjult lag og et outputlag, slik som figuren overfor (Fig. 1) viser. I dette tilfellet er ikke inngangsvektoren og utgangsvektoren vist. Man kan tenke seg at hver skjulte enhet er et perceptron som representerer en grensefunksjon fra inputlaget. Videre kan man tenke seg at en outputenhen er en begrenset(thresholded) lineær kombinasjon av flere skjulte enheter. Med et stort nok skjult lag kan et nevralt nettverk med kun ett skjult lag representere alle kontinuerlige funksjoner, med to lag kan til og med ukontinuerlige funksjoner representeres. Hvis overføringsfunksjonene kan velges ideelt så blir også antall skjulte noder begrenset og endelig. Forutsetningene for at dette skal skje er aldri tilstede i praksis.


=== Læringsmetode ===
Læringsalgoritmene for flerlags forovermatede nevrale nettverk er sammenlignbare med algoritmene for perceptronettverk, en variasjon av disse er vist over. En av hovedforskjellene er at vi kan ha flere utganger, slik at vi har en utgangsvektor 
  
    
      
        
          y
          
            f
          
        
        (
        z
        )
      
    
    {\displaystyle y_{f}(z)}
   istedenfor en enkeltverdi, hvert eksempel har også en utgangsvektor 
  
    
      
        x
      
    
    {\displaystyle x}
  . Hovedforskjellen mellom enkeltlags og flerlags er at feilen til output (
  
    
      
        x
        −
        
          y
          
            f
          
        
      
    
    {\displaystyle x-y_{f}}
  ) er tydelig, mens feilen til det skjulte laget forblir ukjent siden treningsdatasettene ikke har noe data om hva de skjulte nodene skal gi som output. Feilen fra utgangen kan imidlertid propageres gjennom nevronet ved å invertere overføringsfunksjonen og dermed fordeles på feil introdusert fra de enkelte pådrag. En slik tilbakepropagering kan gjøres gjennom mange skjulte lag, men som det viser seg, med stadig lavere lærerate.


==== Algoritmen ====
En generell tilbakeforplantningsalgoritme (back-propagation algorithm):

  Initialisering: vektene til det nevrale nettverket får små tilfeldige verdier
  Gjør:
         For alle eksempler e i treningsdatasettet:
              
  
    
      
        O
      
    
    {\displaystyle O}
   = output fra bruk av inputs mot vektene i nettverket sine verdier
              
  
    
      
        T
      
    
    {\displaystyle T}
   = output for e fra treningsdatasettet
              Kalkuler feilen (
  
    
      
        T
        −
        O
      
    
    {\displaystyle T-O}
  ) for outputenhetene
              Regn ut 
  
    
      
        Δ
        
          w
          
            h
          
        
      
    
    {\displaystyle \Delta w_{h}}
   for alle vektene fra det skjulte laget til outputlaget
              Regn ut 
  
    
      
        Δ
        
          w
          
            i
          
        
      
    
    {\displaystyle \Delta w_{i}}
   for alle vektene fra inputlaget til outputlaget
              Oppdater alle vektene i nettverket
  Til: Alle eksemplene er klassifisert korrekt eller til et stoppkriterium blir møtt
  Returner nettverket


== Referanser ==