skønheden i funktionelle sprog i dyb læring – Clojure og Haskell

dyb læring er en delmængde af maskinindlæringsmetoder, der er baseret på kunstige neurale netværk. Disse er inspireret af informationsbehandling og distribuerede kommunikationsnoder i biologiske systemer som hjernen. I dyb læring lærer hvert niveau at omdanne inputdataene til en lidt mere abstrakt og sammensat repræsentation. For eksempel i et ansigtsgenkendelsessystem kan billedpunkter være et lag af systemet, mens kanter kan være et andet, øjne kan være et andet, og ansigtet kan være et andet. Kompleksiteten af dybe læringsmetoder gør brug af eksisterende pakker populære i programmeringsfællesskabet. Tensorstrøm og PyTorch i Python er populære, ligesom Keras-pakken i R. imidlertid, i produktionen af dybe læringssystemer, ydeevne og sikkerhed er to problemer, der får virksomheder til at vælge funktionelle programmeringssprog som Clojure og Haskell i stedet.

image

vanskelighederne ved Deep learning implementeringer

ved at sætte dybe læringssystemer i produktion kan neurale netværk indeholde en million parametre. Data kan hurtigt eksplodere for at træne disse parametre. Denne eksplosion af data kræver ydeevne, der kun kan opnås ved et effektivt programmeringssprog med sikker samtidighed og parallelisme. På grund af kompleksiteten af neurale netværk, med data overført fra lag til lag, er enkelhed og konsistens i den måde, programmeringssproget håndterer disse data på, vigtig. Sikkerhed betyder i dette tilfælde evnen til at bevare tilstanden af de originale data på en ensartet måde, mens enkelhed betyder at være i stand til at læse og vedligeholde kodebasen let, mens ydeevnen maksimeres.

hvorfor funktionel programmering er mere egnet til dyb læring

i et forsøg på at løse nogle af de vanskeligheder, der kan opstå ved implementering af dyb læring, finder programmører, at funktionelle programmeringssprog kan levere løsninger.

i datalogi er funktionel programmering et programmeringsparadigme, der behandler beregning som evaluering af matematiske funktioner og undgår at ændre tilstand og foranderlige data. Det er et programmeringsmønster, der er tættere på matematisk tænkning.

dyb læring modeller er hovedsagelig matematiske modeller. For eksempel omfatter kunstige neurale netværk tilsluttede noder, som hver udfører enkle matematiske operationer. Ved at bruge et funktionelt programmeringssprog kan programmører beskrive disse matematiske operationer på et sprog, der er tættere på operationerne selv. Den eksplicitte måde, disse programmer er skrevet på, gør læsning og vedligeholdelse af kodebasen meget lettere.

samtidig betyder sammensætningen af dybe læringsalgoritmer, at lagene eller funktionerne i hvert lag af det neurale arbejde har tendens til at kæde sammen for at udføre opgaver. Dette kan let implementeres ved hjælp af funktionel kæde af et funktionelt programmeringssprog.

image

desuden ændres dataene ikke i dyb læring, når funktioner anvendes på dataene. Nye værdier udsendes muligvis sekventielt ned ad linjen, men selve dataene forbliver konsistente. Funktionen uforanderlighed i et funktionelt programmeringssprog giver programmøren mulighed for at oprette et nyt datasæt, hver gang der genereres nye værdier uden at ændre det originale uforanderlige datasæt. Dette gør det lettere at opretholde konsistensen af dataene i hele det neurale netværk.

endelig betyder det store antal parametre og træningsdata, der er involveret i implementeringen af dyb læring, at parallelisme og samtidighed er nøglerne til at skabe dyb læringssystemer på produktionsniveau. Parallelisme betyder at køre tråde på forskellige CPU ‘ er for at fremskynde læringsprocessen. Samtidighed betyder evnen til at styre tråde for at undgå konflikt. Funktionel programmering giver mulighed for samtidighed og parallelisme uden omkostninger. Dette betyder, at funktionel programmering, hvor den rene funktion er statsløs, altid vil producere den samme output for en bestemt indgang, føre til evnen til at isolere enhver funktion og udføre, når du vil have det. Dette gør samtidighed og parallelisme meget lettere at styre. Du behøver ikke at beskæftige sig med spørgsmål som deadlocks og race betingelser. Forskellige tråde, der får adgang til forskellige CPU ‘ er, kan køre uafhængigt uden påstande.

Clojure

med funktionel programmering vinder popularitet i dyb læring, og med de robuste pakker til rådighed for dyb læring, Clojure er nu begunstiget af virksomheder som Facebook. Det er et dynamisk funktionelt programmeringssprog på højt niveau baseret på Lisp-programmeringssproget, og det har kompilatorer, der gør det muligt at køre på både Java og.net runtime-miljøet.

kraften i samtidig programmering i Clojure

Clojure erstatter ikke Java-trådsystemet, det virker snarere med det. Da kernedatastrukturerne er uforanderlige, kan de let deles mellem tråde. Samtidig er tilstandsændringer i programmet mulige, men Clojure giver mekanismer til at sikre, at staterne forbliver konsistente. Hvis der opstår konflikter mellem 2 transaktioner, der forsøger at ændre den samme reference, vil en af dem gå på pension. Der er ikke behov for eksplicit låsning.

(import '(java.util.concurrent Executors))(defn test-stm (let (fn (dotimes (dosync (doseq (alter r + 1 t)))))) (range nthreads))] (doseq (.get future)) (.shutdown pool) (map deref refs)))(test-stm 10 10 10000) -> (550000 550000 550000 550000 550000 550000 550000 550000 550000 550000)

kilde

parallelisme i Clojure er billig

i dyb læring skal modeller træne på store mængder data. Parallelisme indebærer at køre flere tråde på forskellige CPU ‘ er. Parallelisme, der er billig, vil betyde betydelige præstationsforbedringer. Brug af partition i forbindelse med map kan opnå parallelisme, der er billigere.

(defn calculate-pixels-2 (let (doall (map (fn (let (get-color (process-pixel (/ row (double *width*)) (/ col (double *height*)))))) x))) work)] (doall (apply concat result))))

kilde

Kædefunktioner i Clojure betyder klarhed

i Clojure er der mange funktioner til meget få datatyper. Funktioner kan også overføres som argumenter til andre funktioner, hvilket muliggør kædefunktioner i dyb læring. Med implementering tættere på den faktiske matematiske model kan Clojure-kode være enkel at læse og vedligeholde.

;; pipe arg to function(-> "x" f1) ; "x1";; pipe. function chaining(-> "x" f1 f2) ; "x12"

kilde

identitet og tilstand i Clojure giver sikkerhed

i Clojure har hver models identitet en tilstand på ethvert tidspunkt. Denne tilstand er en sand værdi, der aldrig ændrer sig. Hvis identiteten ser ud til at ændre sig, skyldes det, at den er forbundet med en anden tilstand. Nye værdier er gamle funktioner. Inde i hvert lag af det neurale netværk bevares tilstanden af de originale data altid. Hvert sæt data med nye værdier, der er output af funktioner, kan fungere uafhængigt. Dette betyder, at handlinger kan udføres på disse datasæt sikkert eller uden hensyntagen til Strid. Vi kan til enhver tid henvise til den oprindelige tilstand af dataene. Derfor betyder konsistens i dette tilfælde sikkerhed.

Biblioteker og begrænsninger

historisk set indeholder biblioteket for maskinindlæring alt hvad du behøver for at implementere maskinindlæringsalgoritmer i Clojure. Med den nylige stigende popularitet af open source-rammen for dyb læring er det lettere at implementere dyb læring ved hjælp af API ‘ en.

selvom der nu er forskellige API ‘ er og maskinlæringsbiblioteker tilgængelige for Clojure, er der stadig en stejl indlæringskurve for at blive flydende i den. Fejlmeddelelser kan være kryptiske, og virksomheder skal være villige til at investere på forhånd for at bruge det til at opskalere deres maskinlæringssystemer. Da flere eksempler på produktionsklare systemer er skrevet i Clojure, vil sproget vinde mere popularitet i de kommende år, men kun hvis antallet og størrelsen af biblioteker, der ledsager brugen af Clojure, vokser konsekvent.

Haskell

Haskell er et funktionelt sprog, der er statisk skrevet med type inferens og doven evaluering. Det er baseret på semantikken i Miranda programmeringssprog og anses for at være mere udtryksfuld, hurtigere og sikrere til implementering af maskinlæring.

Type sikkerhed i Haskell giver sikkerhed og fleksibilitet

Type sikkerhed definerer begrænsninger for de typer af værdier en variabel kan holde. Dette vil bidrage til at forhindre ulovlige operationer, give bedre hukommelsessikkerhed og føre til færre logiske fejl. Doven evaluering betyder, at Haskell vil forsinke evalueringen af et udtryk, indtil dets værdi er nødvendig. Det undgår også gentagne evalueringer, hvilket sparer driftstid. Samtidig giver doven evaluering mulighed for at definere uendelige datastrukturer. Dette giver en programmør ubegrænsede matematiske muligheder.

simpel eksplicit kode i Haskell giver klare implementeringer

en af de største fordele ved Haskell er, at den kan beskrive algoritmer i meget eksplicitte matematiske konstruktioner. Du kan repræsentere en model i et par linjer kode. Du kan også læse koden på samme måde som du kan læse en matematisk ligning. Dette kan være meget kraftfuld i komplekse algoritmer såsom dyb læring algoritmer i machine learning. For eksempel viser nedenstående implementering af et enkelt lag af et fremadgående neuralt netværk, hvor læsbar koden kan være.

import Numeric.LinearAlgebra.Static.Backproplogistic :: Floating a => a -> alogistic x = 1 / (1 + exp (-x))feedForwardLog :: (KnownNat i, KnownNat o) => Model (L o i :& R o) (R i) (R o)feedForwardLog (w :&& b) x = logistic (w #> x + b)

kilde

Multicore parallelisme i Haskell giver ydeevne

i dyb læring vil typiske neurale netværk indeholde en million parametre, der definerer modellen. Der kræves også en stor mængde data for at lære disse parametre, som beregningsmæssigt er meget tidskrævende. På en enkelt maskine kan det være meget kraftfuldt at bruge flere kerner til at dele hukommelsen og processen parallelt, når det kommer til implementering af dyb læring. I Haskell er det imidlertid let at implementere multicore parallelisme.

Biblioteker og begrænsninger

Haskells hlearn-bibliotek indeholder implementering af maskinlæringsalgoritme, mens tensor-strømningsbinding til Haskell kan bruges til dyb læring. Parallel og samtidig bruges i mellemtiden til parallelisme og samtidighed.

selvom der er nogle maskinlæringsbiblioteker udviklet i Haskell, skal der stadig laves grundimplementeringer til produktionsklare Haskell-implementeringer. Mens offentlige biblioteker, der er tilgængelige til specifikke deep learning-og machine learning-opgaver, er begrænsede, vil Haskells brug i AI også være begrænset. Virksomheder som Aetion Technologies og Credit Suisse Global Modeling and Analytics Group bruger Haskell i deres implementeringer—her er en komplet liste over de organisationer, der bruger den.

konklusion

Deep learning modeller er komplekse matematiske modeller, der kræver specifik lagdeling af funktioner. Funktionelle programmeringssprog som Clojure og Haskell kan ofte repræsentere kompleksiteten med renere kode, der er tættere på matematikken i modellen. Dette fører til tidsbesparelser, effektivitet og nem styring af kodebasen. Specifikke egenskaber ved funktionel programmering gør det muligt for implementeringerne på disse sprog at være sikrere end på andre sprog. Efterhånden som udviklingen inden for AI-teknologi skrider frem, vil evaluering af disse sprog til behovene i store systemudviklingsprojekter i AI blive mere udbredt.

denne artikel er en del af bag koden, medierne for udviklere, af udviklere. Oplev flere artikler og videoer ved at besøge bag koden!

vil du bidrage? Bliv offentliggjort!

Følg os på kvidre at stay tuned!

Illustration af Victoria Roussel

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.