Programmering

De bedste maskinlæring og dyb læringsbiblioteker

Hvis du starter et nyt machine learning- eller deep learning-projekt, kan du være forvirret over, hvilken ramme du skal vælge. Som vi vil diskutere, er der flere gode muligheder for begge slags projekter.

Der er en forskel mellem en maskinlæringsramme og en dyb læringsramme. I det væsentlige dækker en maskinindlæringsramme en række forskellige læringsmetoder til klassificering, regression, klyngedannelse, detektion af anomalier og klargøring af data og kan eller ikke inkluderer neurale netværksmetoder.

En dyb læring eller dyb neuralt netværksramme dækker en række neurale netværkstopologier med mange skjulte lag. Keras, MXNet, PyTorch og TensorFlow er dybe læringsrammer. Scikit-learning og Spark MLlib er maskinindlæringsrammer. (Klik på et af de foregående links for at læse min enkeltstående anmeldelse af produktet.)

Generelt kører dybe neurale netværksberegninger meget hurtigere på en GPU (specifikt en Nvidia CUDA generel GPU), TPU eller FPGA snarere end på en CPU. Generelt drager ikke enklere maskinlæringsmetoder fordel af en GPU.

Mens du kan træne dybe neurale netværk på en eller flere CPU'er, træningen har tendens til at være langsom, og langsomt taler jeg ikke om sekunder eller minutter. Jo flere neuroner og lag der skal trænes, og jo flere data der er tilgængelige til træning, jo længere tid tager det. Da Google Brain-teamet uddannede sine sprogoversættelsesmodeller til den nye version af Google Translate i 2016, kørte de deres træningssessioner i en uge ad gangen på flere GPU'er. Uden GPU'er ville hvert modeluddannelseseksperiment have taget måneder.

Siden da har Intel Math Kernel Library (MKL) gjort det muligt at træne nogle neurale netværk på CPU'er på en rimelig tid. I mellemtiden er GPU'er, TPU'er og FPGA'er blevet endnu hurtigere.

Træningshastigheden for alle de dybe læringspakker, der kører på de samme GPU'er, er næsten identisk. Det skyldes, at træningens indre sløjfer bruger det meste af deres tid i Nvidia CuDNN-pakken.

Bortset fra træningshastighed har hvert af de dybe læringsbiblioteker sit eget sæt fordele og ulemper, og det samme gælder Scikit-learning og Spark MLlib. Lad os dykke ind.

Keras

Keras er en front-end-specifikation og implementering på højt niveau til opbygning af neurale netværksmodeller, der leveres med support til tre back-end dyb læringsrammer: TensorFlow, CNTK og Theano. Amazon arbejder i øjeblikket på at udvikle en MXNet-back-end til Keras. Det er også muligt at bruge PlaidML (et uafhængigt projekt) som en back-end for Keras for at drage fordel af PlaidMLs OpenCL-support til alle GPU'er.

TensorFlow er standard-backend for Keras, og den, der anbefales til mange brugssager, der involverer GPU-acceleration på Nvidia-hardware via CUDA og cuDNN, samt til TPU-acceleration i Google Cloud. TensorFlow indeholder også en intern tf.keras klasse, adskilt fra en ekstern Keras-installation.

Keras har et miljø på højt niveau, der gør det nemt at tilføje et lag til et neuralt netværk som en kodelinje i sin sekventielle model og kræver kun én funktionsopkald hver til kompilering og træning af en model. Keras giver dig mulighed for at arbejde på et lavere niveau, hvis du vil, med sin model eller funktionelle API.

Keras giver dig mulighed for at falde ned endnu længere til Python-kodningsniveauet ved at underklasse keras.Model, men foretrækker den funktionelle API, når det er muligt. Keras har også en scikit-lær API, så du kan bruge Scikit-læringssøgning til at udføre hyperparameteroptimering i Keras-modeller.

Koste: Gratis open source.

Platform: Linux, MacOS, Windows eller Raspbian; TensorFlow, Theano eller CNTK back-end.

Læs min anmeldelse af Keras.

MXNet

MXNet har udviklet sig og forbedret en hel del siden flytningen under Apache Software Foundation-paraplyen tidligt i 2017. Mens der har været arbejde på Keras med en MXNet-back-end, er en anden grænseflade på højt niveau blevet meget vigtigere: Gluon. Før inkorporeringen af ​​Gluon kunne du enten skrive let imperativ kode eller hurtig symbolsk kode i MXNet, men ikke begge på én gang. Med Gluon kan du kombinere det bedste fra begge verdener på en måde, der konkurrerer med både Keras og PyTorch.

Fordelene, der kræves for Gluon, inkluderer:

  • Enkel, letforståelig kode: Gluon tilbyder et komplet sæt plug-and-play neurale netværksbyggesten, inklusive foruddefinerede lag, optimeringer og initialiseringer.
  • Fleksibel, bydende struktur: Gluon kræver ikke, at neurale netværksmodeller defineres strengt, men bringer snarere træningsalgoritmen og modellen tættere sammen for at give fleksibilitet i udviklingsprocessen.
  • Dynamiske grafer: Gluon gør det muligt for udviklere at definere neurale netværksmodeller, der er dynamiske, hvilket betyder, at de kan bygges med det samme, med enhver struktur og ved hjælp af en hvilken som helst af Pythons oprindelige kontrolflow.
  • Høj ydeevne: Gluon giver alle ovenstående fordele uden at påvirke den træningshastighed, som den underliggende motor giver.

Disse fire fordele sammen med en meget udvidet samling af modeleksempler bringer Gluon / MXNet til grov paritet med Keras / TensorFlow og PyTorch for at lette udvikling og træningshastighed. Du kan se kodeeksempler for hver af disse på hovedsiden Gluon og gentages på oversigtssiden for Gluon API.

Gluon API inkluderer funktionalitet til neurale netværkslag, tilbagevendende neurale netværk, tabsfunktioner, datasættemetoder og vision datasæt, en model zoo og et sæt bidragede eksperimentelle neurale netværksmetoder. Du kan f.eks. Kombinere Gluon frit med standard MXNet- og NumPy-moduler modul, autogradog ndarray, såvel som med Python-kontrolstrømme.

Gluon har et godt udvalg af lag til opbygning af modeller, herunder grundlæggende lag (tæt, udfald osv.), Sammenfoldningslag, poollag og aktiveringslag. Hver af disse er et opkald i en linje. Disse kan blandt andet bruges inde i netværkscontainere som f.eks gluon.nn.Sequential ().

Koste: Gratis open source.

Platform: Linux, MacOS, Windows, Docker, Raspbian og Nvidia Jetson; Python, R, Scala, Julia, Perl, C ++ og Clojure (eksperimentel). MXNet er inkluderet i AWS Deep Learning AMI.

Læs min anmeldelse af MXNet.

PyTorch

PyTorch bygger på den gamle fakkel og den nye Caffe2-ramme. Som du måske gætter ud fra navnet, bruger PyTorch Python som sit script-sprog, og det bruger en udviklet Torch C / CUDA-back-end. Produktionsfunktionerne i Caffe2 indarbejdes i PyTorch-projektet.

PyTorch faktureres som "Tensorer og dynamiske neurale netværk i Python med stærk GPU-acceleration." Hvad betyder det?

Tensorer er en matematisk konstruktion, der bruges meget i fysik og teknik. En tensor af rang to er en særlig slags matrix; tager det indre produkt af en vektor med tensoren giver en anden vektor med en ny størrelse og en ny retning. TensorFlow tager sit navn fra den måde, som tensorer (af synapsvægte) strømmer omkring sin netværksmodel. NumPy bruger også tensorer, men kalder dem en ndarray.

GPU-acceleration er givet for de fleste moderne dybe neurale netværksrammer. EN dynamisk neuralt netværk er et, der kan skifte fra iteration til iteration, for eksempel at lade en PyTorch-model tilføje og fjerne skjulte lag under træning for at forbedre dets nøjagtighed og generelle. PyTorch genskaber grafen på farten ved hvert iterationstrin. I modsætning hertil opretter TensorFlow som standard en enkelt dataflytningsgraf, optimerer grafkoden til ydeevne og træner derefter modellen.

Mens ivrig udførelsestilstand er en ret ny mulighed i TensorFlow, er det den eneste måde, PyTorch kører på: API-opkald udføres, når de påberåbes, snarere end at blive føjet til en graf, der skal køres senere. Det kan virke som om det ville være mindre beregningseffektivt, men PyTorch var designet til at arbejde på den måde, og det er ikke slumret, når det kommer til træning eller forudsigelseshastighed.

PyTorch integrerer accelerationsbiblioteker som Intel MKL og Nvidia cuDNN og NCCL (Nvidia Collective Communications Library) for at maksimere hastigheden. Dens centrale CPU og GPU Tensor og neurale netværk bagenden - TH (Torch), THC (Torch CUDA), THNN (Torch Neural Network) og THCUNN (Torch CUDA Neural Network) - er skrevet som uafhængige biblioteker med en C99 API. På samme tid er PyTorch ikke en Python-binding i en monolitisk C ++ - ramme - hensigten er, at den skal være dybt integreret med Python og tillade brug af andre Python-biblioteker.

Koste: Gratis open source.

Platform: Linux, MacOS, Windows; CPU'er og Nvidia GPU'er.

Læs min anmeldelse af PyTorch.

Scikit-lær

Scikit-lær Python-rammen har et bredt udvalg af robuste maskinlæringsalgoritmer, men ingen dyb læring. Hvis du er en Python-fan, kan Scikit-learning muligvis være den bedste mulighed for dig blandt de almindelige maskinlæringsbiblioteker.

Scikit-learning er et robust og velprøvet maskinindlæringsbibliotek til Python med et bredt udvalg af veletablerede algoritmer og integreret grafik. Det er relativt let at installere, lære og bruge, og det har gode eksempler og tutorials.

På den anden side dækker Scikit-læring ikke dyb læring eller forstærkning, mangler grafiske modeller og sekvensforudsigelse, og det kan ikke rigtig bruges fra andre sprog end Python. Det understøtter ikke PyPy, Python just-in-time compiler eller GPU'er. Når det er sagt, bortset fra dets mindre strejftog i neurale netværk, har det ikke rigtig hastighedsproblemer. Det bruger Cython (Python til C-kompilatoren) til funktioner, der skal være hurtige, f.eks. Indre sløjfer.

Scikit-learning har et godt udvalg af algoritmer til klassificering, regression, klyngedannelse, reduktion af dimensionalitet, modelvalg og forbehandling. Det har god dokumentation og eksempler på alle disse, men mangler enhver form for styret arbejdsgang til udførelse af disse opgaver.

Scikit-lærer tjener topkarakterer for at lette udviklingen, hovedsagelig fordi algoritmerne alle fungerer som dokumenteret, API'erne er konsistente og veldesignede, og der er få "impedansmatchninger" mellem datastrukturer. Det er en fornøjelse at arbejde med et bibliotek, hvis funktioner er grundigt uddybet, og hvis fejl er blevet grundigt skyllet ud.

På den anden side dækker biblioteket ikke dyb læring eller forstærkning, hvilket udelader de aktuelle hårde, men vigtige problemer, såsom nøjagtig billedklassificering og pålidelig realtids sprogparsing og oversættelse. Det er klart, at hvis du er interesseret i dyb læring, skal du kigge andre steder.

Ikke desto mindre er der mange problemer - lige fra opbygning af en forudsigelsesfunktion, der forbinder forskellige observationer, til klassificering af observationer, til at lære strukturen i et umærket datasæt - der egner sig til almindelig gammel maskinindlæring uden behov for snesevis af lag neuroner og til disse områder Scikit-læring er faktisk meget god.

Koste: Gratis open source.

Platform: Kræver Python, NumPy, SciPy og Matplotlib. Udgivelser er tilgængelige til MacOS, Linux og Windows.

Læs min anmeldelse af Scikit-learn.

Spark MLlib

Spark MLlib, open source machine learning-biblioteket til Apache Spark, giver almindelige maskinlæringsalgoritmer som klassificering, regression, klyngedannelse og samarbejdsfiltrering (men ikke dybe neurale netværk). Det inkluderer også værktøjer til funktionsextraktion, transformation, dimensioneringsreduktion og valg; værktøjer til konstruktion, evaluering og indstilling af maskinlæringsrørledninger; og hjælpeprogrammer til at gemme og indlæse algoritmer, modeller og rørledninger, til datahåndtering og til at udføre lineær algebra og statistik.

Spark MLlib er skrevet i Scala og bruger den lineære algebra-pakke Breeze. Brise afhænger af netlib-java til optimeret numerisk behandling, selvom det i open source-distribution betyder optimeret brug af CPU'en. Databricks tilbyder tilpassede Spark-klynger, der bruger GPU'er, hvilket potentielt kan give dig endnu 10x hastighedsforbedring til træning af komplekse maskinlæringsmodeller med store data.

Spark MLlib implementerer en lastbil med almindelige algoritmer og modeller til klassificering og regression, til det punkt, hvor en novice kan blive forvirret, men en ekspert vil sandsynligvis finde et godt valg af model til de data, der skal analyseres. Til denne overflod af modeller tilføjer Spark 2.x det vigtige træk ved hyperparameter tuning, også kendt som modelvalg. Hyperparameter-tuning giver analytikeren mulighed for at oprette et parametergitter, en estimator og en evaluator og lade krydsvalideringsmetoden (tidskrævende men nøjagtig) eller togvalideringsopdelingsmetode (hurtigere men mindre nøjagtig) finde den bedste model til data.

Spark MLlib har fulde API'er til Scala og Java, mest fulde API'er til Python og sketchy delvise API'er til R. Du kan få en god fornemmelse for dækningen ved at tælle eksemplerne: 54 Java og 60 Scala maskinindlæringseksempler, 52 Python-maskine læringseksempler og kun fem R-eksempler. Efter min erfaring er Spark MLlib nemmest at arbejde med at bruge Jupyter-notesbøger, men du kan helt sikkert køre det i en konsol, hvis du tæmmer de detaljerede Spark-statusmeddelelser.

Spark MLlib leverer stort set alt, hvad du vil have i vejen for grundlæggende maskinindlæring, valg af funktioner, rørledninger og vedholdenhed. Det gør et ret godt stykke arbejde med klassificering, regression, klyngedannelse og filtrering. I betragtning af at det er en del af Spark, har det god adgang til databaser, streams og andre datakilder. På den anden side er Spark MLlib ikke rigtig konfigureret til at modellere og træne dybe neurale netværk på samme måde som TensorFlow, PyTorch, MXNet og Keras.

Koste: Gratis open source.

Platform: Spark kører på både Windows og Unix-lignende systemer (f.eks. Linux, MacOS) med Java 7 eller nyere, Python 2.6 / 3.4 eller nyere og R 3.1 eller nyere. Til Scala API bruger Spark 2.0.1 Scala 2.11. Gnist kræver Hadoop / HDFS.

Læs min anmeldelse af Spark MLlib.