Automatisk differentiering - Automatic differentiation

I matematik og computeralgebra er automatisk differentiering ( AD ), også kaldet algoritmisk differentiering , beregningsdifferentiering , auto-differentiering eller simpelthen autodiff , et sæt teknikker til at evaluere afledningen af en funktion, der er specificeret af et computerprogram. AD udnytter det faktum, at hvert computerprogram, uanset hvor kompliceret, udfører en række elementære aritmetiske operationer (addition, subtraktion, multiplikation, division osv.) Og elementære funktioner (exp, log, sin, cos osv.). Ved at anvende kædereglen gentagne gange på disse operationer kan derivater af vilkårlig orden beregnes automatisk, nøjagtigt til arbejdspræcision og højst bruge en lille konstant faktor mere aritmetiske operationer end det oprindelige program.

Figur 1: Hvordan automatisk differentiering er relateret til symbolsk differentiering

Automatisk differentiering adskiller sig fra symbolsk differentiering og numerisk differentiering (metoden til begrænsede forskelle). Symbolsk differentiering kan føre til ineffektiv kode og står over for vanskelighederne med at konvertere et computerprogram til et enkelt udtryk, mens numerisk differentiering kan introducere afrundingsfejl i diskretiseringsprocessen og annullering. Begge klassiske metoder har problemer med at beregne højere derivater, hvor kompleksitet og fejl øges. Endelig er begge klassiske metoder er langsomme til beregning partielle afledede af en funktion med hensyn til mange indgange, som er nødvendig for gradient -baserede optimering algoritmer. Automatisk differentiering løser alle disse problemer.

Kædestyret, frem og tilbage akkumulering

Grundlæggende for AD er nedbrydningen af ​​forskelle, der leveres af kædereglen . For den enkle sammensætning

kædereglen giver

Normalt præsenteres to forskellige tilstande for AD, fremad akkumulering (eller fremadtilstand ) og omvendt akkumulering (eller omvendt tilstand ). Fremad akkumulering specificerer, at man krydser kædereglen indefra og udefra (det vil sige først beregne og derefter og til sidst ), mens omvendt akkumulering har gennemgangen udefra til indvendigt (først beregne og derefter og til sidst ). Mere kortfattet,

  1. fremad akkumulering beregner det rekursive forhold: med , og,
  2. omvendt akkumulering beregner det rekursive forhold: med .

Fremad akkumulering

Figur 2: Eksempel på fremad akkumulering med beregningsgraf

I fremad ophobning AD, man først fastsættes det uafhængige variabel med hensyn til hvilket differentiering udføres og beregner den afledte af hver sub- ekspression rekursivt. I en pen-og-papir-beregning indebærer dette gentagne gange at erstatte afledningen af ​​de indre funktioner i kædereglen:

Dette kan generaliseres til flere variabler som et matrixprodukt af Jacobians .

Sammenlignet med omvendt akkumulering er fremad akkumulering naturlig og let at implementere, da strømmen af ​​afledt information falder sammen med rækkefølgen for evaluering. Hver variabel w forstærkes med sit afledte (lagret som en numerisk værdi, ikke et symbolsk udtryk),

som angivet med prikken. Derivaterne beregnes derefter synkroniseret med evalueringstrinnene og kombineres med andre derivater via kædereglen.

Overvej som eksempel funktionen:

For klarhedens skyld er de enkelte underudtryk blevet mærket med variablerne w i .

Valget af den uafhængige variabel, hvortil differentiering udføres påvirker frø værdier W 1 og w 2 . Givet interesse for afledningen af ​​denne funktion med hensyn til x 1 , bør frøværdierne indstilles til:

Når frøværdierne er indstillet, formeres værdierne ved hjælp af kædereglen som vist. Figur 2 viser en billedskildring af denne proces som en beregningsgraf.

Funktioner til beregning af værdi Operationer til beregning af afledte
(frø)
(frø)

For at beregne gradienten af denne eksempelfunktion, som kræver derivaterne af f med hensyn til ikke kun x 1, men også x 2 , udføres en yderligere fejning over beregningsgrafen ved hjælp af frøværdierne .

Den beregningsmæssige kompleksitet af et sweep af fremad akkumulation er proportional med kompleksiteten af den oprindelige kode.

Fremad akkumulering er mere effektiv end omvendt akkumulering for funktioner f  : R nR m med mn, da kun n sweeps er nødvendige sammenlignet med m sweeps til reverse akkumulering.

Omvendt akkumulering

Figur 3: Eksempel på omvendt akkumulering med beregningsgraf

I omvendt ophobning AD, den afhængige variabel skal differentieres er fast og derivatet beregnes i forhold til hver sub- ekspression rekursivt. I en pen-og-papir-beregning erstattes afledningen af ​​de ydre funktioner gentagne gange i kædereglen:

I omvendt akkumulering er mængden af ​​interesse den sammenhængende , betegnet med en bjælke ( ); det er et derivat af en valgt afhængig variabel med hensyn til en underekspression w :

Omvendt akkumulering krydser kædereglen udefra og indefra eller i tilfælde af beregningsgrafen i figur 3 fra top til bund. Eksempelfunktionen er skalaværdier, og der er således kun et frø til den afledte beregning, og der kræves kun en fejning af beregningsgrafen for at beregne (to-komponent) gradienten. Dette er kun halvdelen af ​​arbejdet sammenlignet med fremad akkumulering, men omvendt akkumulering kræver lagring af de mellemliggende variabler w i samt instruktionerne, der producerede dem i en datastruktur kendt som en Wengert-liste (eller "tape"), som muligvis forbruge betydelig hukommelse, hvis beregningsgrafen er stor. Dette kan afhjælpes til en vis grad ved kun at lagre en delmængde af de mellemliggende variabler og derefter rekonstruere de nødvendige arbejdsvariabler ved at gentage evalueringerne, en teknik kendt som rematerialisering . Checkpointing bruges også til at gemme mellemliggende tilstande.

Handlingerne til beregning af derivatet ved hjælp af omvendt akkumulering er vist i nedenstående tabel (bemærk omvendt rækkefølge):

Operationer til beregning af derivater

Datastrømningsgrafen for en beregning kan manipuleres til at beregne gradienten af ​​dens oprindelige beregning. Dette gøres ved at tilføje en sammenhængende node for hver primærnode, der er forbundet med tilstødende kanter, der paralleller med de primære kanter, men flyder i modsat retning. Knudepunkterne i den tilgrænsende graf repræsenterer multiplikation med derivaterne af funktionerne beregnet af knudepunkterne i primalen. For eksempel forårsager tilføjelse i den oprindelige fanout i den sammenhængende; fanout i de primære årsager tilføjelse i tilslutningen; en unær funktion y = f  ( x ) i de primal årsager X = ȳ f  '( x ) i adjungerede; etc.

Omvendt akkumulering er mere effektiv end fremad akkumulering for funktioner f  : R nR m med mn, da kun m sweeps er nødvendige sammenlignet med n sweeps for fremad akkumulering.

Reverse mode AD blev først udgivet i 1976 af Seppo Linnainmaa .

Backpropagation af fejl i multilayer perceptrons, en teknik, der anvendes i maskinindlæring , er et specielt tilfælde af reverse mode AD.

Udover akkumulering frem og tilbage

Frem og tilbage akkumulering er kun to (ekstreme) måder at krydse kædereglen på. Problemet med at beregne en fuld jakob af f  : R nR m med et minimum antal aritmetiske operationer er kendt som det optimale Jacobian akkumuleringsproblem (OJA), som er NP-komplet . Centralt for dette bevis er ideen om, at der kan eksistere algebraiske afhængigheder mellem de lokale deldele, der markerer kanterne på grafen. Især kan to eller flere kantetiketter genkendes som ens. Problemets kompleksitet er stadig åben, hvis det antages, at alle kantetiketter er unikke og algebraisk uafhængige.

Automatisk differentiering ved hjælp af dobbelte tal

Automatisk differentiering fremad tilstand opnås ved at forøge algebraen med reelle tal og opnå en ny aritmetik . En ekstra komponent føjes til hvert tal for at repræsentere afledningen af ​​en funktion ved tallet, og alle aritmetiske operatorer udvides til den forstørrede algebra. Den forstørrede algebra er algebra med dobbelt tal .

Udskift hvert nummer med tallet , hvor er et reelt tal, men er et abstrakt tal med egenskaben (et uendeligt stort ; se Glat uendelig minimal analyse ). Brug kun dette, regelmæssig aritmetik giver

og ligeledes til subtraktion og opdeling.

Nu kan polynomer beregnes i denne udvidede aritmetik. Hvis , så

hvor betegner afledningen af med hensyn til dets første argument, og kaldes et frø , kan vælges vilkårligt.

Den nye aritmetik består af ordnede par , elementer skrevet med almindelig aritmetik på den første komponent og første ordens differentieringsaritmetik på den anden komponent som beskrevet ovenfor. Udvidelse af ovenstående resultater på polynomer til

analytiske funktioner giver en liste over grundlæggende aritmetik og nogle standardfunktioner til den nye aritmetik:
og generelt for den primitive funktion ,
hvor og er derivaterne af henholdsvis dets første og andet argument.

Når en binær grundlæggende aritmetisk operation anvendes på blandede argumenter - parret og det reelle tal - løftes det reelle tal først til . Afledningen af ​​en funktion ved punktet findes nu ved at beregne ved hjælp af ovenstående aritmetik, som giver som resultat.

Vektorargumenter og funktioner

Multivariate funktioner kan håndteres med samme effektivitet og mekanismer som univariate funktioner ved at vedtage en retningsafledt operator. Det vil sige, at hvis det er tilstrækkeligt at beregne , retningsderivatet af at i retningen , kan dette beregnes ved at bruge den samme aritmetik som ovenfor. Hvis alle elementerne i ønskes, kræves funktionsevalueringer. Bemærk, at i mange optimeringsapplikationer er retningsafledningen faktisk tilstrækkelig.

Høj orden og mange variabler

Ovenstående aritmetik kan generaliseres til beregning af anden orden og højere derivater af multivariate funktioner. Imidlertid bliver de aritmetiske regler hurtigt komplicerede: kompleksitet er kvadratisk i den højeste afledte grad. I stedet kan trunkeret Taylor polynomalgebra bruges. Den resulterende aritmetik, defineret på generaliserede dobbelte tal, tillader effektiv beregning ved hjælp af funktioner som om de var en datatype. Når Taylor polynom af en funktion er kendt, ekstraheres derivaterne let.

Implementering

Fremad-mode AD er implementeret af en ikke-standard fortolkning af programmet, hvor reelle tal erstattes af dobbelt tal, konstanter løftes til dobbelt tal med en nul epsilon-koefficient, og de numeriske primitive løftes for at fungere på dobbelt tal. Denne ikke-standardfortolkning implementeres generelt ved hjælp af en af ​​to strategier: kildekodetransformation eller operatøroverbelastning .

Kildekodetransformation (SCT)

Figur 4: Eksempel på, hvordan kildekodetransformation kunne fungere

Kildekoden for en funktion erstattes af en automatisk genereret kildekode, der inkluderer udsagn til beregning af derivater sammenflettet med de originale instruktioner.

Kildekodetransformation kan implementeres for alle programmeringssprog, og det er også lettere for compileren at foretage kompileringstidsoptimeringer. Imidlertid er implementeringen af ​​selve AD-værktøjet vanskeligere.

Operatøroverbelastning (OO)

Figur 5: Eksempel på, hvordan operatøroverbelastning kunne fungere

Operatøroverbelastning er en mulighed for kildekode skrevet på et sprog, der understøtter den. Objekter til reelle tal og elementære matematiske operationer skal overbelastes for at imødekomme den forstørrede aritmetik, der er afbildet ovenfor. Dette kræver ingen ændring i form eller rækkefølge af operationer i den oprindelige kildekode for at funktionen kan differentieres, men kræver ofte ændringer i grundlæggende datatyper for tal og vektorer for at understøtte overbelastning og involverer ofte også indsættelse af specielle flagningsoperationer.

Operatøroverbelastning til fremad akkumulering er let at implementere og også mulig for omvendt akkumulering. De nuværende kompilatorer ligger imidlertid bagud med at optimere koden sammenlignet med fremad akkumulering.

Operatøroverbelastning til både fremad- og bagudakkumulering kan være velegnet til applikationer, hvor objekterne er vektorer med reelle tal snarere end skalarer. Dette skyldes, at båndet derefter omfatter vektoroperationer; dette kan lette beregningseffektive implementeringer, hvor hver vektoroperation udfører mange skalære operationer. Vector adjoint algoritmisk differentieringsteknikker (vektor AAD) kan f.eks. Anvendes til at differentiere værdier beregnet ved Monte-Carlo simulering.

Eksempler på implementeringer af operatør-overbelastning af automatisk differentiering i C ++ er Adept- og Stan- bibliotekerne.

Se også

Bemærkninger

Referencer

Yderligere læsning

eksterne links