Syväoppiminen on koneoppimisen menetelmien osajoukko, joka perustuu keinotekoisiin neuroverkkoihin. Ne ovat saaneet innoituksensa biologisten järjestelmien, kuten aivojen, tiedonkäsittelystä ja hajautetuista kommunikaatiosolmuista. Syväoppimisessa jokainen taso oppii muuntamaan syöttödatan hieman abstraktimmaksi ja komposiittisemmaksi esitykseksi. Esimerkiksi kasvojentunnistusjärjestelmässä pikselit voivat olla yksi järjestelmän kerros, kun taas edget voivat olla toinen, silmät voivat olla toinen ja kasvot voivat olla toinen. Syväoppimismenetelmien monimutkaisuus tekee olemassa olevien pakettien käyttämisestä suosittua ohjelmointiyhteisössä. Pythonin TensorFlow ja PyTorch ovat suosittuja, samoin kuin R: n Keras-paketti.syväoppimisjärjestelmien tuotannossa suorituskyky ja turvallisuus ovat kaksi asiaa, jotka ajavat yritykset valitsemaan toiminnallisia ohjelmointikieliä, kuten Clojurea ja Haskellia.
- syväoppimisen toteutusten
- miksi funktionaalinen ohjelmointi soveltuu paremmin syväoppimiseen
- Clojure
- samanaikaisen ohjelmoinnin voima Clojuressa
- Parallelismi Clojuressa on halpaa
- funktioiden ketjuttaminen Clojuressa tarkoittaa selkeyttä
- identiteetti ja tila Clojuressa takaavat turvallisuuden
- Kirjastot ja rajoitukset
- Haskell
- Type safety in Haskell tarjoaa turvallisuutta ja joustavuutta
- yksinkertainen eksplisiittinen koodi Haskellissa tarjoaa selkeitä toteutuksia
- Multicore parallelism in Haskell tarjoaa suorituskyvyn
- Kirjastot ja rajoitukset
- johtopäätös
syväoppimisen toteutusten
vaikeudet saada syväoppimisjärjestelmiä tuotantoon, neuroverkkoihin saattaa sisältyä miljoona parametria. Data voi nopeasti räjähtää kouluttaa näitä parametreja. Tämä tietojen räjähdys vaatii suorituskykyä, joka voidaan saavuttaa vain tehokkaalla ohjelmointikielellä, jossa on turvallinen samanaikaisuus-ja parallelismiominaisuus. Neuroverkkojen monimutkaisuuden vuoksi, tietojen siirtyessä kerroksesta toiseen, ohjelmointikielen käsittelytavan yksinkertaisuus ja johdonmukaisuus on tärkeää. Turvallisuus tarkoittaa tässä tapauksessa kykyä säilyttää alkuperäisten tietojen tila johdonmukaisesti, kun taas yksinkertaisuus tarkoittaa kykyä lukea ja ylläpitää koodipohjaa helposti maksimoiden samalla suorituskyvyn.
miksi funktionaalinen ohjelmointi soveltuu paremmin syväoppimiseen
yrittäessään ratkaista joitakin vaikeuksia, joita voi esiintyä syväoppimisen toteutuksessa, ohjelmoijat ovat havainneet, että funktionaaliset ohjelmointikielet voivat tarjota ratkaisuja.
funktionaalinen ohjelmointi on tietojenkäsittelytieteessä ohjelmointiparadigma, joka käsittelee laskentaa matemaattisten funktioiden arviointina ja välttää muuttuvaa tilaa ja muunneltavaa dataa. Se on ohjelmointikaava, joka on lähempänä matemaattista ajattelua.
syväoppimisen mallit ovat pohjimmiltaan matemaattisia malleja. Esimerkiksi keinotekoiset hermoverkot koostuvat toisiinsa kytketyistä solmuista, joista jokainen suorittaa yksinkertaisia matemaattisia operaatioita. Funktionaalisen ohjelmointikielen avulla ohjelmoijat pystyvät kuvaamaan näitä matemaattisia operaatioita kielellä, joka on lähempänä itse operaatioita. Nimenomainen tapa, jolla nämä ohjelmat on kirjoitettu, tekee koodipohjan lukemisesta ja ylläpitämisestä paljon helpompaa.
samanaikaisesti syväoppimisalgoritmien kompositio tarkoittaa sitä, että hermotyön jokaisessa kerroksessa kerrokset tai funktiot pyrkivät ketjuuntumaan yhteen suorittamaan tehtäviä. Tämä voidaan toteuttaa helposti funktionaalisen ohjelmointikielen funktionaalisella ketjutuksella.
lisäksi syväoppimisessa, kun dataan sovelletaan toimintoja, tieto ei muutu. Uusia arvoja saatetaan tuottaa peräkkäin, mutta itse data pysyy johdonmukaisena. Funktionaalisen ohjelmointikielen muuttumattomuusominaisuuden ansiosta ohjelmoija voi luoda uuden tietojoukon joka kerta, kun uusia arvoja syntyy muuttamatta alkuperäistä muuttumatonta tietojoukkoa. Tämä helpottaa tietojen johdonmukaisuuden ylläpitämistä koko neuroverkossa.
syväoppimisen toteutukseen liittyvien parametrien ja koulutustietojen suuri määrä tarkoittaa, että rinnakkaisuus ja yhtäaikaisuus ovat avain tuotantotason syväoppimisjärjestelmien luomiseen. Parallelismi tarkoittaa kierteiden ajamista eri suorittimilla oppimisprosessin nopeuttamiseksi. Concurrency tarkoittaa kykyä hallita säikeitä konfliktien välttämiseksi. Funktionaalinen ohjelmointi mahdollistaa samanaikaisuuden ja rinnakkaisuuden ilman kustannuksia. Tämä tarkoittaa sitä, että luonteeltaan funktionaalinen ohjelmointi, jossa puhdas funktio on valtioton, tuottaa aina saman ulostulon tietylle tulolle, johtaa kykyyn eristää mikä tahansa funktio ja suorittaa sitä milloin haluat. Tämä tekee rinnakkaisuuden ja rinnakkaisuuden paljon helpommaksi hallita. Sinun ei tarvitse käsitellä asioita, kuten umpikuja ja kisaolosuhteet. Eri suorittimia käyttävät viestiketjut pystyvät toimimaan itsenäisesti ilman riitoja.
Clojure
funktionaalisen ohjelmoinnin kasvattaessa suosiotaan syväoppimisessa, ja syväoppimiseen saatavilla olevien vankkojen pakettien myötä Clojure on nykyään Walmartin ja Facebook-yhtiön kaltaisten yritysten suosiossa. Se on korkean tason dynaaminen funktionaalinen ohjelmointikieli, joka perustuu LISP-ohjelmointikieleen ja siinä on kääntäjiä, jotka mahdollistavat ajamisen sekä Java-että.Net-runtime-ympäristössä.
samanaikaisen ohjelmoinnin voima Clojuressa
Clojure ei korvaa Java-säiettä, vaan se toimii sen kanssa. Koska ydintietorakenteet ovat muuttumattomia, ne voidaan jakaa helposti säikeiden kesken. Samalla valtiomuutokset ohjelmassa ovat mahdollisia, mutta Clojure tarjoaa mekanismeja, joilla varmistetaan, että valtiot pysyvät johdonmukaisina. Jos 2 transaktiota yrittää muuttaa samaa referenssiä, yksi niistä jää eläkkeelle. Eksplisiittistä Lukitusta ei tarvita.
(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)
lähde
Parallelismi Clojuressa on halpaa
syväoppimisessa mallit joutuvat harjoittelemaan suuria tietomääriä. Parallelismi tarkoittaa useiden säikeiden ajamista eri suorittimilla. Halpa rinnastus tarkoittaa merkittäviä suoritusparannuksia. Käyttämällä osiota yhdessä kartan kanssa voidaan saavuttaa parallelismi, joka on halvempaa.
(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))))
lähde
funktioiden ketjuttaminen Clojuressa tarkoittaa selkeyttä
Clojuressa on monia funktioita hyvin harvoille tietotyypeille. Funktioita voidaan siirtää argumentteina myös muille funktioille, mikä mahdollistaa funktioiden ketjuttamisen syväoppimisessa. Toteutuksen ollessa lähempänä varsinaista matemaattista mallia Clojuren koodi voi olla helppo lukea ja ylläpitää.
;; pipe arg to function(-> "x" f1) ; "x1";; pipe. function chaining(-> "x" f1 f2) ; "x12"
lähde
identiteetti ja tila Clojuressa takaavat turvallisuuden
Clojuressa jokaisen mallin identiteetillä on yksi tila milloin tahansa. Se tila on todellinen arvo, joka ei koskaan muutu. Jos identiteetti näyttää muuttuvan, tämä johtuu siitä, että se liittyy toiseen tilaan. Uudet arvot ovat vanhan funktioita. Neuroverkon jokaisen kerroksen sisällä alkuperäisen tiedon tila säilyy aina. Jokainen datajoukko, jolla on uusia arvoja, jotka ovat funktioiden ulostuloja, voi toimia itsenäisesti. Tämä tarkoittaa sitä, että näitä tietokokonaisuuksia voidaan käyttää turvallisesti tai riidatta. Voimme palata tietojen alkuperäiseen tilaan milloin tahansa. Siksi johdonmukaisuus tarkoittaa tässä tapauksessa turvallisuutta.
Kirjastot ja rajoitukset
historiallisesti Cortexin koneoppimisen kirjasto sisältää kaiken, mitä tarvitset koneoppimisen algoritmien toteuttamiseen Clojuressa. Avoimen lähdekoodin mxnet framework for deep learning-ohjelman suosion kasvaessa syväoppiminen on helpompaa toteuttaa MXNet-Clojure API: n avulla.
vaikka Clojurelle on nykyään tarjolla erilaisia sovellusliittymiä ja koneoppimisen kirjastoja, sen sujuvuuteen on vielä jyrkkä oppimiskäyrä. Virheilmoitukset voivat olla kryptisiä ja yritysten on oltava valmiita investoimaan etukäteen, jotta ne voivat käyttää sitä koneoppimisjärjestelmiensä skaalaamiseen. Kun lisää esimerkkejä tuotantovalmiista järjestelmistä kirjoitetaan Clojurella, kieli saa lisää suosiota tulevina vuosina, mutta vain jos Clojuren käyttöön liittyvien kirjastojen määrä ja koko kasvaa jatkuvasti.
Haskell
Haskell on funktionaalinen kieli, joka on tyypiltään staattisesti tyypitetty päättelyllä ja laiskalla arvioinnilla. Se perustuu Miranda-ohjelmointikielen semantiikkaan ja sitä pidetään ilmeikkäämpänä, nopeampana ja turvallisempana koneoppimisen toteuttamiseen.
Type safety in Haskell tarjoaa turvallisuutta ja joustavuutta
Type safety määrittelee rajoitteet sille, millaisia arvoja muuttuja voi pitää. Tämä auttaa ehkäisemään laittomia toimintoja, parantamaan muistin turvallisuutta ja vähentämään logiikkavirheitä. Laiska arviointi tarkoittaa sitä, että Haskell lykkää ilmaisun arviointia, kunnes sen arvoa tarvitaan. Se myös välttää toistuvia arviointeja, mikä säästää ajoaikaa. Samalla laiska arviointi mahdollistaa äärettömien tietorakenteiden määrittelyn. Tämä antaa ohjelmoijalle rajattomat matemaattiset mahdollisuudet.
yksinkertainen eksplisiittinen koodi Haskellissa tarjoaa selkeitä toteutuksia
yksi Haskellin suurimmista eduista on se, että se voi kuvata algoritmeja hyvin eksplisiittisillä matemaattisilla konstruktioilla. Mallia voi edustaa muutamalla koodirivillä. Voit myös lukea koodin samalla tavalla kuin voit lukea matematiikan yhtälön. Tämä voi olla hyvin voimakas monimutkaisissa algoritmeissa, kuten koneoppimisen syväoppimisalgoritmeissa. Esimerkiksi alla oleva yhden syöttöpisteen neuroverkkokerroksen toteutus osoittaa, kuinka luettavissa koodi voi olla.
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)
Source
Multicore parallelism in Haskell tarjoaa suorituskyvyn
syväoppimisessa tyypillisissä neuroverkoissa on miljoona parametria, jotka määrittelevät mallin. Näiden parametrien oppimiseen tarvitaan myös suuri määrä tietoa, mikä laskennallisesti on hyvin aikaa vievää. Yhdellä koneella useiden ydinten käyttäminen muistin ja prosessin jakamiseen rinnakkain voi olla erittäin tehokasta syväoppimisen toteuttamisessa. Haskellissa Multicore-parallelismin toteuttaminen on kuitenkin helppoa.
Kirjastot ja rajoitukset
Haskellin hlearn-kirjasto sisältää koneoppimisen algoritmin toteutuksia, kun taas Haskellin Tensor-flow-sidontaa voidaan käyttää syväoppimiseen. Parallelism ja Concurrent, sillä välin, käytetään parallelism ja concurrency.
vaikka haskellissa on kehitetty joitakin koneoppimisen kirjastoja, on tuotantovalmiisiin Haskell-toteutuksiin vielä tehtävä ground-up-toteutuksia. Tiettyihin syväoppimisen ja koneoppimisen tehtäviin käytettävissä olevat yleiset kirjastot ovat rajalliset, mutta myös Haskellin käyttö tekoälyssä tulee olemaan vähäistä. Yritykset kuten Aetion Technologies ja Credit Suisse Global Modeling and Analytics Group käyttävät haskellia toteutuksissaan-tässä on täydellinen luettelo sitä käyttävistä organisaatioista.
johtopäätös
syväoppimisen mallit ovat monimutkaisia matemaattisia malleja, jotka vaativat funktioiden erityistä kerrospukeutumista. Funktionaaliset ohjelmointikielet kuten Clojure ja Haskell voivat usein edustaa kompleksisuutta puhtaammalla koodilla, joka on lähempänä mallin matematiikkaa. Tämä johtaa ajansäästöön, tehokkuuteen ja koodipohjan helppoon hallintaan. Funktionaalisen ohjelmoinnin erityisominaisuuksien ansiosta toteutukset näissä kielissä ovat turvallisempia kuin muissa kielissä. TEKOÄLYTEKNOLOGIAN kehityksen edetessä näiden kielten arviointi tekoälyn laajamittaisten järjestelmäkehityshankkeiden tarpeisiin yleistyy.
tämä artikkeli on osa Behind the Code, kehittäjien media for developers-julkaisua. Tutustu lisää artikkeleita ja videoita käymällä koodin takana!
haluatko osallistua? Julkaise!
Seuraa meitä Twitterissä pysyäksesi kuulolla!
kuvitus Victoria Roussel