the Beauty of Functional Languages in Deep Learning – Clojure and Haskell

a Deep learning a mesterséges neurális hálózatokon alapuló gépi tanulási módszerek részhalmaza. Ezeket az információfeldolgozás és az elosztott kommunikációs csomópontok inspirálják olyan biológiai rendszerekben, mint az agy. A mély tanulás során minden szint megtanulja a bemeneti adatokat kissé elvontabb és összetett ábrázolássá alakítani. Például egy arcfelismerő rendszerben a pixelek lehetnek a rendszer egyik rétege, míg az élek lehetnek egy másik, a szemek lehetnek egy másik, az arc pedig egy másik. A mély tanulási módszerek összetettsége a meglévő csomagok használatát népszerűvé teszi a programozási közösségben. A TensorFlow és a PyTorch a Pythonban népszerűek, csakúgy, mint a Keras csomag az R-ben.azonban a deep learning rendszerek gyártásában a teljesítmény és a biztonság két olyan kérdés, amelyek arra késztetik a vállalatokat, hogy inkább funkcionális programozási nyelveket válasszanak, mint például a Clojure és a Haskell.

image

a deep learning implementációk nehézségei

a deep learning rendszerek gyártásba helyezése során a neurális hálózatok millió paramétert tartalmazhatnak. Az adatok gyorsan felrobbanhatnak, hogy kiképezzék ezeket a paramétereket. Ez az adatrobbanás olyan teljesítményt igényel, amelyet csak hatékony programozási nyelvvel lehet elérni, biztonságos párhuzamossági és párhuzamossági képességekkel. A neurális hálózatok összetettsége miatt, a rétegről rétegre továbbított adatok miatt fontos az egyszerűség és a következetesség abban, ahogyan a programozási nyelv kezeli ezeket az adatokat. A biztonság ebben az esetben az eredeti adatok állapotának következetes megőrzését jelenti, míg az egyszerűség azt jelenti, hogy a kódbázis könnyen olvasható és karbantartható, miközben maximalizálja a teljesítményt.

miért alkalmasabb a funkcionális programozás a mély tanulásra

a mély tanulás végrehajtása során felmerülő nehézségek megoldása érdekében a programozók azt tapasztalják, hogy a funkcionális programozási nyelvek megoldást nyújthatnak.

a számítástechnikában a funkcionális programozás olyan programozási paradigma, amely a számítást matematikai függvények értékeléseként kezeli, és elkerüli az állapotváltozást és a változó adatokat. Ez egy programozási minta, amely közelebb áll a matematikai gondolkodáshoz.

a mély tanulási modellek lényegében matematikai modellek. Például a mesterséges neurális hálózatok összekapcsolt csomópontokat tartalmaznak, amelyek mindegyike egyszerű matematikai műveleteket hajt végre. A funkcionális programozási nyelv használatával a programozók képesek leírni ezeket a matematikai műveleteket egy olyan nyelven, amely közelebb áll a műveletekhez. Ezeknek a programoknak a kifejezett módja megkönnyíti a kódbázis olvasását és karbantartását.

ugyanakkor a deep learning algoritmusok kompozíciós jellege azt jelenti, hogy az idegi munka minden rétegében a rétegek vagy a funkciók hajlamosak láncolni a feladatok elvégzéséhez. Ez könnyen megvalósítható egy funkcionális programozási nyelv funkcionális láncolásával.

image

ezenkívül a mély tanulás során, amikor funkciókat alkalmaznak az adatokra, az adatok nem változnak. Lehet, hogy az új értékek egymás után jelennek meg a sorban, de maga az adat konzisztens marad. A funkcionális programozási nyelv megváltoztathatatlansága lehetővé teszi a programozó számára, hogy minden új érték létrehozásakor új adatkészletet hozzon létre az eredeti megváltoztathatatlan adatkészlet megváltoztatása nélkül. Ez megkönnyíti az adatok konzisztenciájának fenntartását az ideghálózatban.

végül a deep learning megvalósításában részt vevő paraméterek és képzési adatok nagy száma azt jelenti, hogy a párhuzamosság és a párhuzamosság a termelési szintű deep learning rendszerek létrehozásának kulcsa. A párhuzamosság azt jelenti, hogy szálakat futtatnak különböző CPU-kon a tanulási folyamat felgyorsítása érdekében. A konkurencia a szálak kezelésének képességét jelenti a konfliktusok elkerülése érdekében. A funkcionális programozás lehetővé teszi a párhuzamosságot és a párhuzamosságot költség nélkül. Ez azt jelenti, hogy természeténél fogva a funkcionális programozás, ahol a tiszta függvény hontalan, mindig ugyanazt a kimenetet hozza létre egy adott bemenet számára, képes bármilyen funkció elkülönítésére és végrehajtására, amikor csak akarja. Ez megkönnyíti a párhuzamosság és a párhuzamosság kezelését. Nem kell olyan kérdésekkel foglalkoznia, mint a holtpontok és a versenyfeltételek. A különböző CPU-khoz hozzáférő különböző szálak önállóan futhatnak, viták nélkül.

Clojure

a funkcionális programozás egyre népszerűbb a deep learningben, és a deep learninghez rendelkezésre álló robusztus csomagokkal a Clojure-t olyan vállalatok kedvelik, mint a Walmart és a Facebook. Ez egy magas szintű, dinamikus funkcionális programozási nyelv, amely a LISP programozási nyelvre épül, és olyan fordítókkal rendelkezik, amelyek lehetővé teszik mind a Java, mind a.net futásidejű környezetben történő futtatást.

a Clojure

Clojure egyidejű programozásának ereje nem helyettesíti a Java szálrendszert, hanem működik vele. Mivel az alapvető adatstruktúrák megváltoztathatatlanok, könnyen megoszthatók a szálak között. Ugyanakkor a programban állapotváltozások lehetségesek, de a Clojure mechanizmusokat biztosít annak biztosítására, hogy az államok következetesek maradjanak. Ha konfliktusok merülnek fel 2 tranzakció között, amelyek ugyanazt a hivatkozást próbálják módosítani, az egyik visszavonul. Nincs szükség explicit zár.

(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)

forrás

a párhuzamosság a Clojure-ban olcsó

a mély tanulásban a modelleknek nagy mennyiségű adatra kell edzeniük. A párhuzamosság több szál futtatását jelenti különböző CPU-kon. Az olcsó párhuzamosság jelentős teljesítményjavulást jelent. A partíció használata a térképpel együtt kevésbé költséges párhuzamosságot érhet el.

(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))))

forrás

a Clojure-ban a láncolási funkciók egyértelműséget jelentenek

a Clojure-ban sok funkció van nagyon kevés adattípushoz. A függvények argumentumként átadhatók más függvényeknek is, ami lehetővé teszi a láncolási funkciókat a mély tanulásban. A tényleges matematikai modellhez közelebb eső implementációval a Clojure kód egyszerűen olvasható és karbantartható.

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

forrás

identitás és állapot a Clojure-ban biztonságot nyújt

a Clojure-ban minden modell identitásának egy állapota van az idő bármely pontján. Ez az állapot valódi érték, amely soha nem változik. Ha úgy tűnik, hogy az identitás megváltozik, ez azért van, mert egy másik állapothoz van társítva. Az új értékek a régi funkciók. A neurális hálózat minden rétegén belül az eredeti adatok állapota mindig megmarad. Minden olyan adatkészlet, amelynek új értékei a funkciók kimenetei, függetlenül működhetnek. Ez azt jelenti, hogy ezeken az adatsorokon biztonságosan vagy a vitától függetlenül is végrehajthatók műveletek. Az adatok eredeti állapotára bármikor visszatérhetünk. Ezért a konzisztencia ebben az esetben biztonságot jelent.

könyvtárak és korlátozások

történelmileg, a cortex machine learning library tartalmaz mindent, amire szükség van, hogy végre gépi tanulási algoritmusok Clojure. A nyílt forráskódú mxnet framework for deep learning közelmúltbeli növekvő népszerűségével könnyebb megvalósítani a mély tanulást az MXNet-Clojure API segítségével.

bár ma már különböző API-k és gépi tanulási könyvtárak állnak rendelkezésre a Clojure-hoz, még mindig meredek tanulási görbe van ahhoz, hogy folyékonyan lehessen benne. A hibaüzenetek rejtélyesek lehetnek, és a vállalatoknak készen kell állniuk arra, hogy előre fektessenek be, hogy felhasználják a gépi tanulási rendszereik bővítéséhez. Mivel a Clojure-ban több példa van a gyártásra kész rendszerekre, a nyelv nagyobb népszerűségre tesz szert az elkövetkező években, de csak akkor, ha a Clojure használatát kísérő könyvtárak száma és mérete folyamatosan növekszik.

Haskell

Haskell egy funkcionális nyelv, amely statikusan gépelt típusú következtetéssel és lusta kiértékeléssel. A Miranda programozási nyelv szemantikáján alapul, és kifejezőbbnek, gyorsabbnak és biztonságosabbnak tekinthető a gépi tanulás megvalósításához.

Típusbiztonság a Haskellben biztonságot és rugalmasságot biztosít

Típusbiztonság meghatározza a változó által tárolható értéktípusok korlátait. Ez segít megelőzni az illegális műveleteket, jobb memória biztonságot nyújt, és kevesebb logikai hibát eredményez. A lusta értékelés azt jelenti, hogy Haskell késlelteti egy kifejezés értékelését, amíg az értékére nincs szükség. Elkerüli az ismételt értékeléseket is, ami időt takarít meg. Ugyanakkor a lusta értékelés lehetővé teszi a végtelen adatstruktúrák meghatározását. Ez korlátlan matematikai lehetőségeket biztosít a programozónak.

egyszerű explicit kód Haskell biztosít egyértelmű megvalósítások

az egyik legnagyobb előnye a Haskell, hogy képes leírni algoritmusok nagyon explicit matematikai konstrukciók. A modellt néhány sornyi kódban ábrázolhatja. A kódot ugyanúgy elolvashatja, mint a matematikai egyenletet. Ez nagyon erős lehet olyan összetett algoritmusokban, mint a gépi tanulás mély tanulási algoritmusai. Például a feed-forward neurális hálózat egyetlen rétegének alábbi megvalósítása megmutatja, mennyire olvasható a kód.

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)

forrás

többmagos párhuzamosság Haskellben teljesítményt nyújt

a mély tanulásban a tipikus neurális hálózatok millió paramétert tartalmaznak, amelyek meghatározzák a modellt. Ezen paraméterek megismeréséhez nagy mennyiségű adat szükséges, amely számítási szempontból nagyon időigényes. Egy gépen több mag használata a memória és a folyamat párhuzamos megosztására nagyon hatékony lehet a mély tanulás megvalósításában. Haskellben azonban a többmagos párhuzamosság megvalósítása egyszerű.

Libraries and limitations

Haskell hlearn Könyvtára gépi tanulási algoritmus implementációkat tartalmaz, míg a Haskell tenzor-flow kötése használható a mély tanuláshoz. A párhuzamos és párhuzamos a párhuzamosság és a párhuzamosság.

bár van néhány gépi tanulási könyvtár, amelyet Haskellben fejlesztettek ki, a gyártásra kész Haskell-implementációkhoz továbbra is alapszintű implementációkat kell készíteni. Míg a konkrét mélytanulási és gépi tanulási feladatokhoz rendelkezésre álló nyilvános könyvtárak korlátozottak, Haskell AI-használata is korlátozott lesz. Az olyan vállalatok, mint az Aetion Technologies és a Credit Suisse Global Modeling and Analytics Group a Haskell—t használják implementációikban-itt található az it-t használó szervezetek teljes listája.

következtetés

a mély tanulási modellek összetett matematikai modellek, amelyek a funkciók speciális rétegezését igénylik. Az olyan funkcionális programozási nyelvek, mint a Clojure és a Haskell, gyakran reprezentálják a komplexitást a tisztább kóddal, amely közelebb áll a modell matematikájához. Ez időmegtakarítást, hatékonyságot és a kódbázis egyszerű kezelését eredményezi. A funkcionális programozás sajátos tulajdonságai lehetővé teszik, hogy ezeken a nyelveken a megvalósítások biztonságosabbak legyenek, mint más nyelveken. Az AI technológia fejlődésének előrehaladtával ezeknek a nyelveknek az AI nagyszabású rendszerfejlesztési projektjeinek igényei szerinti értékelése egyre elterjedtebbé válik.

ez a cikk része mögött a kódot, a média a fejlesztők által. Fedezz fel további cikkeket és videókat a kód mögött!

szeretne hozzájárulni? Publikálj!

Kövessen minket a Twitteren, hogy velünk maradjon!

Victoria Roussel illusztrációja

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.