krása funkčních jazyků v hlubokém učení-Clojure a Haskell

hluboké učení je podmnožinou metod strojového učení, které jsou založeny na umělých neuronových sítích. Ty jsou inspirovány zpracováním informací a distribuovanými komunikačními uzly v biologických systémech, jako je mozek. V hlubokém učení se každá úroveň učí transformovat vstupní data do mírně abstraktnější a kompozitnější reprezentace. Například v systému rozpoznávání obličeje mohou být pixely jednou vrstvou systému, zatímco hrany mohou být další, oči mohou být další a obličej může být další. Díky složitosti metod hlubokého učení je používání existujících balíčků populární v programovací komunitě. TensorFlow a PyTorch v Pythonu jsou populární, stejně jako balíček Keras v r. nicméně, při výrobě systémů hlubokého učení, výkon a bezpečnost jsou dva problémy, které vedou společnosti k výběru funkčních programovacích jazyků, jako jsou Clojure a Haskell.

image

obtíže implementace hlubokého učení

při zavádění systémů hlubokého učení do výroby mohou neuronové sítě obsahovat milion parametrů. Data mohou rychle explodovat a trénovat tyto parametry. Tato exploze dat vyžaduje výkon, kterého lze dosáhnout pouze efektivním programovacím jazykem s bezpečnými schopnostmi souběžnosti a paralelismu. Vzhledem ke složitosti neuronových sítí, s daty předávanými z vrstvy na vrstvu, je důležitá jednoduchost a konzistence způsobu, jakým programovací jazyk zpracovává tato data. Bezpečnost v tomto případě znamená schopnost zachovat stav původních dat konzistentním způsobem, zatímco jednoduchost znamená schopnost snadno číst a udržovat kódovou základnu při maximalizaci výkonu.

proč je funkční programování vhodnější pro hluboké učení

ve snaze vyřešit některé obtíže, které mohou nastat při implementaci hlubokého učení, programátoři zjišťují, že funkční programovací jazyky mohou poskytnout řešení.

v informatice je funkcionální programování programovacím paradigmatem, které zachází s výpočtem jako s hodnocením matematických funkcí a vyhýbá se měnícím se stavům a proměnlivým datům. Jedná se o programovací vzor, který je blíže matematickému myšlení.

modely hlubokého učení jsou v podstatě matematické modely. Například umělé neuronové sítě obsahují připojené uzly, z nichž každý provádí jednoduché matematické operace. Pomocí funkčního programovacího jazyka jsou programátoři schopni popsat tyto matematické operace v jazyce, který je blíže samotným operacím. Explicitní způsob, jakým jsou tyto programy psány, usnadňuje čtení a udržování základny kódu.

současně kompoziční povaha algoritmů hlubokého učení znamená, že v každé vrstvě neurální práce mají vrstvy nebo funkce tendenci se spojovat a provádět úkoly. To lze snadno implementovat pomocí funkčního řetězení funkčního programovacího jazyka.

image

kromě toho, v hlubokém učení, když jsou funkce aplikovány na data, data se nemění. Nové hodnoty mohou být vyvedeny postupně po řádku, ale samotná data zůstávají konzistentní. Funkce neměnnosti funkčního programovacího jazyka umožní programátorovi vytvořit novou datovou sadu pokaždé, když jsou generovány nové hodnoty, aniž by se změnila původní neměnná datová sada. To usnadňuje udržení konzistence dat v celé neuronové síti.

konečně, velký počet parametrů a tréninkových dat zapojených do implementace hlubokého učení znamená, že paralelismus a souběžnost jsou klíčem k vytváření systémů hlubokého učení na úrovni výroby. Paralelismus znamená spouštění vláken na různých procesorech, aby se urychlil proces učení. Souběžnost znamená schopnost spravovat vlákna, aby se zabránilo konfliktu. Funkční programování umožňuje souběžnost a paralelismus bez nákladů. To znamená, že funkcionální programování, kde je čistá funkce bez státní příslušnosti, bude vždy produkovat stejný výstup pro konkrétní vstup, povede ke schopnosti izolovat jakoukoli funkci a spustit, kdykoli budete chtít. To usnadňuje správu souběžnosti a paralelismu. Nemusíte se zabývat otázkami, jako jsou slepé uličky a podmínky závodu. Různé podprocesy přistupující k různým procesorům budou moci běžet nezávisle bez nároků.

Clojure

díky funkčnímu programování, které získává popularitu v hlubokém učení, a díky robustním balíčkům dostupným pro hluboké učení je Clojure nyní upřednostňován společnostmi jako Walmart a Facebook. Je to dynamický funkční programovací jazyk na vysoké úrovni založený na programovacím jazyce LISP a má kompilátory, které umožňují běh na Java i v runtime prostředí.Net.

síla souběžného programování v Clojure

Clojure nenahrazuje Java thread system, spíše s ním pracuje. Vzhledem k tomu, že základní datové struktury jsou neměnné, mohou být snadno sdíleny mezi vlákny. Současně jsou možné změny stavu v programu, ale Clojure poskytuje mechanismy, které zajistí, že státy zůstanou konzistentní. Pokud dojde ke konfliktům mezi 2 transakcemi, které se snaží změnit stejný odkaz, jedna z nich odejde do důchodu. Není třeba explicitní zamykání.

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

zdroj

paralelismus v Clojure je levný

v hlubokém učení musí modely trénovat na velkém množství dat. Paralelismus znamená spuštění více vláken na různých procesorech. Paralelismus, který je levný, bude znamenat významné zlepšení výkonu. Použití oddílu ve spojení s mapou může dosáhnout paralelismu, který je méně nákladný.

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

zdroj

řetězové funkce v Clojure znamenají jasnost

v Clojure existuje mnoho funkcí pro velmi málo datových typů. Funkce mohou být také předány jako argumenty jiným funkcím, což umožňuje řetězové funkce v hlubokém učení. S implementací blíže skutečnému matematickému modelu lze kód Clojure snadno číst a udržovat.

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

zdroj

identita a stav v Clojure poskytují bezpečnost

v Clojure má identita každého modelu v každém okamžiku jeden stav. Tento stav je skutečná hodnota, která se nikdy nezmění. Pokud se zdá, že se identita mění, je to proto, že je spojena s jiným stavem. Nové hodnoty jsou funkce starých. Uvnitř každé vrstvy neuronové sítě je vždy zachován stav původních dat. Každá sada dat s novými hodnotami, které jsou výstupy funkcí, může pracovat nezávisle. To znamená, že akce mohou být prováděny na těchto souborech dat bezpečně nebo bez ohledu na tvrzení. Na původní stav dat se můžeme kdykoli vrátit. Proto konzistence v tomto případě znamená bezpečnost.

Knihovny a omezení

historicky knihovna strojového učení cortex obsahuje vše, co potřebujete k implementaci algoritmů strojového učení v Clojure. S nedávnou rostoucí popularitou open-source rámce MXNet pro hluboké učení je snazší implementovat hluboké učení pomocí rozhraní API MXNET-Clojure.

ačkoli jsou nyní k dispozici různé API a knihovny strojového učení pro Clojure, stále existuje strmá křivka učení, která se v něm plynule ovládá. Chybové zprávy mohou být záhadné a společnosti budou muset být ochotny investovat předem, aby je využily k rozšíření svých systémů strojového učení. Vzhledem k tomu, že v Clojure je napsáno více příkladů systémů připravených na výrobu, jazyk si v příštích letech získá větší popularitu, ale pouze pokud počet a velikost knihoven doprovázejících používání Clojure neustále roste.

Haskell

Haskell je funkční jazyk, který je staticky napsán s odvozením typu a líným hodnocením. Je založen na sémantice programovacího jazyka Miranda a je považován za výraznější, rychlejší a bezpečnější pro implementaci strojového učení.

Typ safety v Haskell poskytuje bezpečnost a flexibilitu

Typ safety definuje omezení typů hodnot, které může proměnná držet. To pomůže zabránit nelegálním operacím, zajistí lepší bezpečnost paměti a povede k menšímu počtu logických chyb. Lazy hodnocení znamená, že Haskell zpozdí vyhodnocení výrazu, dokud není potřeba jeho hodnota. Vyhýbá se také opakovaným hodnocením, což ušetří čas běhu. Lazy vyhodnocení zároveň umožňuje definovat nekonečné datové struktury. To dává programátorovi neomezené matematické možnosti.

jednoduchý explicitní kód v Haskell poskytuje jasné implementace

jednou z největších výhod Haskell je, že dokáže popsat algoritmy ve velmi explicitních matematických konstrukcích. Model můžete reprezentovat v několika řádcích kódu. Můžete si také přečíst kód stejným způsobem si můžete přečíst matematickou rovnici. To může být velmi silné ve složitých algoritmech, jako jsou algoritmy hlubokého učení ve strojovém učení. Například níže uvedená implementace jedné vrstvy feed-forward neuronové sítě ukazuje, jak čitelný může být 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)

zdroj

vícejádrový paralelismus v Haskellu poskytuje výkon

v hlubokém učení budou typické neuronové sítě obsahovat milion parametrů, které definují model. K získání těchto parametrů je také zapotřebí velké množství dat, což je výpočetně velmi časově náročné. Na jednom počítači může být použití více jader pro paralelní sdílení paměti a procesu velmi silné, pokud jde o implementaci hlubokého učení. V Haskellu je však implementace vícejádrového paralelismu snadná.

Knihovny a omezení

haskellova knihovna hlearn obsahuje implementace algoritmů strojového učení, zatímco vazba tensor-flow pro Haskell může být použita pro hluboké učení. Paralelní a souběžné se mezitím používají pro paralelismus a souběžnost.

ačkoli existují některé knihovny strojového učení vyvinuté v Haskellu, pro implementaci Haskell připravenou na výrobu bude stále třeba provést základní implementace. Zatímco veřejné knihovny dostupné pro konkrétní úkoly hlubokého učení a strojového učení jsou omezené, haskellovo použití v AI bude také omezené. Společnosti jako Aetion Technologies nebo Credit Suisse Global Modeling and Analytics Group používají Haskell ve svých implementacích-zde je kompletní seznam organizací, které jej používají—

závěr

modely hlubokého učení jsou složité matematické modely, které vyžadují specifické vrstvení funkcí. Funkční programovací jazyky jako Clojure a Haskell mohou často představovat složitost s čistším kódem, který je blíže matematice modelu. To vede k úspoře času, efektivitě a snadné správě základny kódu. Specifické vlastnosti funkcionálního programování umožňují, aby implementace v těchto jazycích byly bezpečnější než implementace jiných jazyků. Jak vývoj v technologii AI postupuje, hodnocení těchto jazyků pro potřeby rozsáhlých projektů vývoje systémů v AI bude stále častější.

tento článek je součástí kódu, média pro vývojáře, vývojáři. Objevte další články a videa návštěvou za kódem!

chcete přispět? Zveřejněte!

Sledujte nás na Twitteru a zůstaňte naladěni!

ilustrace Victoria Roussel

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.