Dyp læring Er En delmengde av maskinlæringsmetoder som er basert på kunstige nevrale nettverk. Disse er inspirert av informasjonsbehandling og distribuerte kommunikasjonsnoder i biologiske systemer som hjernen. I dyp læring lærer hvert nivå å forvandle inngangsdataene til en litt mer abstrakt og sammensatt representasjon. For eksempel, i et ansiktsgjenkjenningssystem, kan piksler være ett lag av systemet, mens kanter kan være en annen, øynene kan være en annen, og ansiktet kan være en annen. Kompleksiteten i dype læringsmetoder gjør bruk av eksisterende pakker populære i programmeringssamfunnet. Tensorflow og Pytorch I Python er populære, som Det Er Keras-pakken I R. men i produksjonen av dype læringssystemer er ytelse og sikkerhet to problemer som driver bedrifter til å velge funksjonelle programmeringsspråk som Clojure og Haskell i stedet.
- vanskelighetene med deep learning implementeringer
- hvorfor funksjonell programmering er mer egnet for dyp læring
- Clojure
- kraften til samtidig programmering I Clojure
- Parallellisme I Clojure er billig
- Kjedefunksjoner i Clojure betyr klarhet
- Identitet og tilstand i Clojure gir sikkerhet
- Biblioteker Og Begrensninger
- Haskell
- Typesikkerhet i Haskell gir sikkerhet og fleksibilitet
- Enkel eksplisitt kode i Haskell gir klare implementeringer
- multicore parallellisme I Haskell gir ytelse
- Biblioteker og begrensninger
- Konklusjon
vanskelighetene med deep learning implementeringer
ved å sette deep learning systems i produksjon, kan nevrale nettverk inneholde en million parametere. Data kan raskt eksplodere for å trene disse parametrene. Denne eksplosjonen av data krever ytelse som bare kan oppnås ved et effektivt programmeringsspråk med sikker samtidighet og parallellitet evner. På grunn av kompleksiteten i nevrale nettverk, med data som sendes fra lag til lag, er enkelhet og konsistens i måten programmeringsspråket håndterer disse dataene, viktig. Sikkerhet betyr i dette tilfellet evnen til å bevare tilstanden til de opprinnelige dataene på en konsistent måte, mens enkelhet betyr å kunne lese og vedlikeholde kodebasen lett mens du maksimerer ytelsen.
hvorfor funksjonell programmering er mer egnet for dyp læring
i et forsøk på å løse noen av vanskelighetene som kan oppstå ved implementering av dyp læring, finner programmerere at funksjonelle programmeringsspråk kan gi løsninger.
i informatikk er funksjonell programmering et programmeringsparadigme som behandler beregning som evaluering av matematiske funksjoner og unngår å endre tilstand og foranderlige data. Det er et programmeringsmønster som er nærmere matematisk tenkning.
Dype læringsmodeller er i hovedsak matematiske modeller. For eksempel består kunstige nevrale nettverk av tilkoblede noder, som hver utfører enkle matematiske operasjoner. Ved å bruke et funksjonelt programmeringsspråk kan programmerere beskrive disse matematiske operasjonene på et språk som er nærmere operasjonene selv. Den eksplisitte måten disse programmene er skrevet gjør lesing og vedlikehold av kodebasen mye enklere.
samtidig betyr komposisjonens natur av dype læringsalgoritmer at lagene eller funksjonene i hvert lag av det nevrale arbeidet har en tendens til å kjede sammen for å utføre oppgaver. Dette kan enkelt implementeres ved hjelp av funksjonell kjeding av et funksjonelt programmeringsspråk.
videre, i dyp læring, når funksjoner brukes på dataene, endres dataene ikke. Nye verdier kan sendes ut sekvensielt nedover linjen, men selve dataene forblir konsistente. Funksjonen uforanderlighet i et funksjonelt programmeringsspråk vil tillate programmereren å opprette et nytt datasett hver gang nye verdier genereres uten å endre det opprinnelige uforanderlige datasettet. Dette gjør det lettere å opprettholde konsistensen av dataene i hele det nevrale nettverket.
Til Slutt betyr det store antallet parametere og treningsdata som er involvert i implementeringen av dyp læring at parallellisme og samtidighet er nøklene til å skape dyplæringssystemer på produksjonsnivå. Parallellisme betyr å kjøre tråder på forskjellige Cpuer for å øke læringsprosessen. Samtidighet betyr evnen til å håndtere tråder for å unngå konflikt. Funksjonell programmering gir mulighet for samtidighet og parallellitet uten kostnad. Dette betyr at funksjonell programmering, hvor den rene funksjonen er statsløs, alltid vil produsere samme utgang for en bestemt inngang, føre til evnen til å isolere enhver funksjon og utføre når du vil. Dette gjør samtidighet og parallellitet mye enklere å administrere. Du trenger ikke å håndtere problemer som vranglås og raseforhold. Ulike tråder som får tilgang til forskjellige Cpuer, vil kunne kjøre uavhengig uten tvil.
Clojure
med funksjonell programmering stadig mer populært i dyp læring, Og med robuste pakker tilgjengelig for dyp læring, Er Clojure nå foretrekkes av selskaper Som Walmart Og Facebook. DET er et høyt nivå, dynamisk funksjonelt programmeringsspråk basert PÅ LISP programmeringsspråk, og det har kompilatorer som gjør det mulig å kjøre På Både Java OG.NET runtime environment.
kraften til samtidig programmering I Clojure
Clojure erstatter Ikke Java-trådsystemet, men det fungerer med det. Siden kjernen datastrukturer er uforanderlige, kan de deles lett mellom tråder. Samtidig er statlige endringer i programmet mulige, Men Clojure gir mekanismer for å sikre at stater forblir konsistente. Hvis det oppstår konflikter mellom 2 transaksjoner som prøver å endre samme referanse, vil en av dem trekke seg tilbake. Det er ikke behov for eksplisitt låsing.
(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
Parallellisme I Clojure er billig
i dyp læring må modeller trene på store mengder data. Parallellisme innebærer å kjøre flere tråder på forskjellige Cpuer. Parallellisme som er billig vil bety betydelige ytelsesforbedringer. Bruke partisjon i forbindelse med kart kan oppnå parallellitet som er mindre kostbart.
(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
Kjedefunksjoner i Clojure betyr klarhet
I Clojure er det mange funksjoner for svært få datatyper. Funksjoner kan også sendes som argumenter til andre funksjoner, noe som gjør kjedefunksjoner i dyp læring mulig. Med implementering nærmere selve matematisk modell, Kan Clojure kode være enkel å lese og vedlikeholde.
;; pipe arg to function(-> "x" f1) ; "x1";; pipe. function chaining(-> "x" f1 f2) ; "x12"
Kilde
Identitet og tilstand i Clojure gir sikkerhet
I Clojure har hver modells identitet en tilstand til enhver tid. Den tilstanden er en sann verdi som aldri endres. Hvis identiteten ser ut til å endres, er dette fordi den er knyttet til en annen tilstand. Nye verdier er gamle funksjoner. Inne i hvert lag av det nevrale nettverket blir tilstanden til de opprinnelige dataene alltid bevart. Hvert sett med data med nye verdier som er utganger av funksjoner kan operere uavhengig. Dette betyr at handlinger kan utføres på disse datasettene trygt eller uten hensyn til påstand. Vi kan når som helst henvise til den opprinnelige tilstanden til dataene. Derfor betyr konsistens i dette tilfellet sikkerhet.
Biblioteker Og Begrensninger
historisk inneholder cortex machine learning library alt du trenger for å implementere maskinlæringsalgoritmer i Clojure. Med den nylige økende populariteten til open-source mxnet framework for deep learning, er det enklere å implementere deep learning ved Hjelp Av MXNET-Clojure API.
Selv om det nå er forskjellige Apier og maskinlæringsbiblioteker tilgjengelig For Clojure, er Det fortsatt en bratt læringskurve for å bli flytende i Den. Feilmeldinger kan være kryptiske, og bedrifter må være villige til å investere på forhånd for å bruke den til å skalere opp sine maskinlæringssystemer. Som flere eksempler på produksjonsklare systemer er skrevet I Clojure, språket vil få mer popularitet i løpet av de kommende årene, men bare hvis antall og størrelse på biblioteker som følger med bruken Av Clojure vokser konsekvent.
Haskell
Haskell Er et funksjonelt språk som er statisk skrevet med typen slutning og lat evaluering. Den er basert på semantikken Til Miranda programmeringsspråk og anses å være mer uttrykksfulle, raskere og sikrere for å implementere maskinlæring.
Typesikkerhet i Haskell gir sikkerhet og fleksibilitet
Typesikkerhet definerer begrensninger for hvilke typer verdier en variabel kan inneholde. Dette vil bidra til å forhindre ulovlige operasjoner, gi bedre minnesikkerhet og føre til færre logikkfeil. Lazy evaluering betyr At Haskell vil forsinke evalueringen av et uttrykk til verdien er nødvendig. Det unngår også gjentatte evalueringer, noe som vil spare kjøretid. Samtidig gir lat evaluering mulighet for uendelige datastrukturer å bli definert. Dette gir en programmerer ubegrensede matematiske muligheter.
Enkel eksplisitt kode i Haskell gir klare implementeringer
En av De største fordelene Med Haskell er at Den kan beskrive algoritmer i svært eksplisitte matematiske konstruksjoner. Du kan representere en modell i noen få linjer med kode. Du kan også lese koden på samme måte som du kan lese en matematisk ligning. Dette kan være svært kraftig i komplekse algoritmer som dype læringsalgoritmer i maskinlæring. For eksempel viser under implementering av et enkelt lag av et feed-forward nevralt nettverk hvor lesbar 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 parallellisme I Haskell gir ytelse
i dyp læring vil typiske nevrale nettverk inneholde en million parametere som definerer modellen. Det kreves også en stor mengde data for å lære disse parametrene, som beregningsmessig er svært tidkrevende. På en enkelt maskin kan bruk av flere kjerner for å dele minnet og prosessen parallelt være svært kraftig når det gjelder å implementere dyp læring. I Haskell er det imidlertid enkelt å implementere multicore parallellisme.
Biblioteker og begrensninger
Haskells hlearn-bibliotek inneholder maskinlæringsalgoritmeimplementeringer, mens tensor-flytbindingen For Haskell kan brukes til dyp læring. Parallell og Samtidig, i mellomtiden, brukes til parallellisme og samtidighet.
Selv om det er noen maskinlæringsbiblioteker utviklet I Haskell, vil ground-up implementeringer fortsatt måtte gjøres for produksjonsklare haskell implementeringer. Mens offentlige biblioteker tilgjengelig for spesifikke dyp læring og maskinlæringsoppgaver er begrenset, Vil Haskells bruk I AI også være begrenset. Selskaper som Aetion Technologies og Credit Suisse Global Modeling And Analytics Group bruker Haskell i sine implementeringer—her er en komplett liste over organisasjonene som bruker den.
Konklusjon
Dype læringsmodeller er komplekse matematiske modeller som krever spesifikk lagdeling av funksjoner. Funksjonelle programmeringsspråk som Clojure og Haskell kan ofte representere kompleksiteten med renere kode som er nærmere matematikken til modellen. Dette fører til tidsbesparelser, effektivitet og enkel styring av kodebasen. Spesifikke egenskaper ved funksjonell programmering gjør at implementeringene på disse språkene er sikrere enn andre språk. Etter hvert som UTVIKLINGEN innen AI-teknologi utvikler seg, vil evaluering av disse språkene for behovene til store systemutviklingsprosjekter i AI bli mer utbredt.
Denne artikkelen er En del Av Bak Koden, media for utviklere, av utviklere. Oppdag flere artikler og videoer ved å besøke Behind The Code!
Vil du bidra? Få publisert!
Følg Oss På Twitter for å holde deg oppdatert!
Illustrasjon Av Victoria Roussel