De bästa biblioteken för maskininlärning och djupinlärning

Om du startar ett nytt maskininlärnings- eller djupinlärningsprojekt kan du vara förvirrad över vilket ramverk du ska välja. Som vi kommer att diskutera finns det flera bra alternativ för båda typerna av projekt.

Det finns en skillnad mellan en ram för maskininlärning och en djupinlärningsram. I huvudsak täcker ett ramverk för maskininlärning en mängd olika inlärningsmetoder för klassificering, regression, kluster, detektering av avvikelser och dataförberedelse, och kan inkludera neuronätverksmetoder eller inte.

Ett djupt lärande eller djupt neurala nätverk ramar täcker en mängd olika neurala nätverkstopologier med många dolda lager. Keras, MXNet, PyTorch och TensorFlow är ramar för djupinlärning. Scikit-lär och Spark MLlib är ramverk för maskininlärning. (Klicka på någon av de tidigare länkarna för att läsa min fristående recension av produkten.)

I allmänhet går djupa neurala nätverksberäkningar mycket snabbare på en GPU (specifikt en Nvidia CUDA allmänt GPU), TPU eller FPGA, snarare än på en CPU. I allmänhet gynnas inte enklare maskininlärningsmetoder av en GPU.

Medan du kan träna djupa neurala nätverk på en eller flera processorer tenderar träningen att vara långsam, och långsamt talar jag inte om sekunder eller minuter. Ju fler nervceller och lager som behöver tränas, och ju mer data som finns tillgängliga för träning, desto längre tid tar det. När Google Brain-teamet utbildade sina språköversättningsmodeller för den nya versionen av Google Translate 2016, körde de sina träningspass i en vecka i taget på flera GPU: er. Utan grafikprocessorer hade varje modellutbildningsexperiment tagit månader.

Sedan dess har Intel Math Kernel Library (MKL) gjort det möjligt att träna vissa neurala nätverk på processorer på en rimlig tid. Under tiden har GPU: er, TPU: er och FPGA: er blivit ännu snabbare.

Träningshastigheten för alla djupinlärningspaket som körs på samma GPU: er är nästan identisk. Det beror på att träningens inre slingor tillbringar större delen av sin tid i Nvidia CuDNN-paketet.

Förutom träningshastighet har vart och ett av de djupa inlärningsbiblioteken sina egna för- och nackdelar, och detsamma gäller Scikit-learning och Spark MLlib. Låt oss dyka in.

Keras

Keras är en avancerad specifikation och implementering på hög nivå för att bygga neurala nätverksmodeller som levereras med stöd för tre backend-ramar för djupinlärning: TensorFlow, CNTK och Theano. Amazon arbetar för närvarande med att utveckla en MXNet-backend för Keras. Det är också möjligt att använda PlaidML (ett oberoende projekt) som en back-end för Keras att dra nytta av PlaidMLs OpenCL-stöd för alla GPU: er.

TensorFlow är standardbackend för Keras, och den som rekommenderas för många användningsfall som involverar GPU-acceleration på Nvidia-maskinvara via CUDA och cuDNN, liksom för TPU-acceleration i Google Cloud. TensorFlow innehåller också en intern tf.kerasklass, separat från en extern Keras-installation.

Keras har en miljö på hög nivå som gör det enkelt att lägga till ett lager i ett neuralt nätverk som en kodrad i sin sekventiella modell, och kräver endast en funktionsanrop för att sammanställa och träna en modell. Keras låter dig arbeta på en lägre nivå om du vill, med dess modell eller funktionella API.

Keras låter dig falla ner ännu längre, till Python-kodningsnivån, genom subklassning keras.Model, men föredrar det funktionella API när det är möjligt. Keras har också ett scikit-learnAPI, så att du kan använda Scikit-learning-rutnätssökningen för att utföra hyperparameteroptimering i Keras-modeller. 

Kostnad: Gratis öppen källkod. 

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

Läs min recension av Keras. 

MXNet

MXNet har utvecklats och förbättrats en hel del sedan vi flyttade under Apache Software Foundation-paraplyet tidigt 2017. Även om det har pågått arbete på Keras med en MXNet-back-end har ett annat gränssnitt på hög nivå blivit mycket viktigare: Gluon. Innan Gluon infördes kan du antingen skriva enkel kod eller snabb symbolskod i MXNet, men inte båda samtidigt. Med Gluon kan du kombinera det bästa från två världar, på ett sätt som konkurrerar med både Keras och PyTorch.

Fördelarna för Gluon inkluderar:

  • Enkel, lättförståelig kod: Gluon erbjuder en komplett uppsättning plug-and-play-neuronbyggnadsnätverk, inklusive fördefinierade lager, optimerare och initialiserare.
  • Flexibel, imperativ struktur: Gluon kräver inte att neurala nätverksmodellen definieras styvt utan snarare för träningsalgoritmen och modellen närmare varandra för att ge flexibilitet i utvecklingsprocessen.
  • Dynamiska grafer: Gluon gör det möjligt för utvecklare att definiera neurala nätverksmodeller som är dynamiska, vilket innebär att de kan byggas direkt, med vilken struktur som helst, och använda något av Pythons ursprungliga kontrollflöde.
  • Hög prestanda: Gluon ger alla ovanstående fördelar utan att påverka träningshastigheten som den underliggande motorn ger.

Dessa fyra fördelar, tillsammans med en väldigt utökad samling av modellexempel, för Gluon / MXNet till grov paritet med Keras / TensorFlow och PyTorch för enkel utveckling och träningshastighet. Du kan se kodexempel för var och en av dessa på huvudsidan Gluon och upprepas på översiktssidan för Gluon API.

Gluon API inkluderar funktionalitet för neurala nätverkslager, återkommande neurala nätverk, förlustfunktioner, datametodmetoder och visionsdatauppsättningar, en modell zoo och en uppsättning med bidragna experimentella neuronätverk metoder. Du kan fritt kombinera Gluon med standard MXNet och numpy moduler, till exempel module,autograd och ndarray, liksom med Python kontroll flöden.

Gluon har ett bra urval av lager för att bygga modeller, inklusive grundläggande lager (täta, bortfall, etc.), konvolutionsskikt, poolande lager och aktiveringslager. Var och en av dessa är ett samtalslinje. Dessa kan bland annat användas i nätverkscontainrar som gluon.nn.Sequential().

Kostnad: Gratis öppen källkod. 

Plattform: Linux, MacOS, Windows, Docker, Raspbian och Nvidia Jetson; Python, R, Scala, Julia, Perl, C ++ och Clojure (experimentell). MXNet ingår i AWS Deep Learning AMI.

Läs min recension av MXNet. 

PyTorch

PyTorch bygger på den gamla facklan och det nya Caffe2-ramverket. Som du kanske gissar från namnet använder PyTorch Python som skriptspråk och det använder en utvecklad Torch C / CUDA-back-end. Produktionsfunktionerna i Caffe2 införlivas i PyTorch-projektet.

PyTorch faktureras som "Tensorer och dynamiska neurala nätverk i Python med stark GPU-acceleration." Vad betyder det?

Tensorer är en matematisk konstruktion som används mycket inom fysik och teknik. En tensor av rang två är en speciell typ av matris; tar man den inre produkten av en vektor med tensorn ger en annan vektor med en ny storlek och en ny riktning. TensorFlow tar sitt namn från hur tensorer (synapsvikter) flödar runt sin nätverksmodell. NumPy använder också tensorer, men kallar dem en ndarray.

GPU-acceleration är givet för de flesta moderna djupa neurala nätverksramar. Ett dynamiskt neuralt nätverk är ett som kan ändras från iteration till iteration, till exempel tillåter en PyTorch-modell att lägga till och ta bort dolda lager under träning för att förbättra dess noggrannhet och allmänna. PyTorch återskapar diagrammet i farten vid varje iterationssteg. Däremot skapar TensorFlow som standard ett enda dataflödesdiagram, optimerar grafkoden för prestanda och tränar sedan modellen.

Medan ivrigt körningsläge är ett ganska nytt alternativ i TensorFlow, är det det enda sättet PyTorch kör: API-samtal körs när de anropas, snarare än att läggas till i en graf som ska köras senare. Det kan tyckas som om det skulle vara mindre effektivt, men PyTorch var utformat för att fungera på det sättet, och det är ingen slarv när det gäller träning eller förutsägelseshastighet.

PyTorch integrerar accelerationsbibliotek som Intel MKL och Nvidia cuDNN och NCCL (Nvidia Collective Communications Library) för att maximera hastigheten. Dess centrala CPU- och GPU-Tensor och baksidor för neurala nätverk - TH (Torch), THC (Torch CUDA), THNN (Torch Neural Network) och THCUNN (Torch CUDA Neural Network) - är skrivna som oberoende bibliotek med ett C99 API. Samtidigt är PyTorch inte en Python-bindning i ett monolitiskt C ++ - ramverk - avsikten är att den ska vara djupt integrerad med Python och tillåta användning av andra Python-bibliotek.

Kostnad: Gratis öppen källkod. 

Plattform: Linux, MacOS, Windows; CPU: er och Nvidia GPU: er. 

Läs min recension av PyTorch. 

Scikit-lär dig

Scikit-lär Python-ramverket har ett brett urval av robusta maskininlärningsalgoritmer, men inget djupt lärande. Om du är ett Python-fan kan Scikit-learning mycket väl vara det bästa alternativet för dig bland de vanliga maskininlärningsbiblioteken.

Scikit-learning är ett robust och väl beprövat maskininlärningsbibliotek för Python med ett brett sortiment av väletablerade algoritmer och integrerad grafik. Det är relativt enkelt att installera, lära sig och använda, och det har bra exempel och handledning.

På nackdelen täcker inte Scikit-learning djupinlärning eller förstärkning, det saknas grafiska modeller och sekvensförutsägelse, och det kan inte riktigt användas från andra språk än Python. Det stöder inte PyPy, Python just-in-time kompilator eller GPU: er. Med detta sagt, förutom dess mindre razzia i neurala nätverk, har det inte riktigt hastighetsproblem. Den använder Cython (Python-till-C-kompilatorn) för funktioner som behöver vara snabba, till exempel inre slingor.

Scikit-learning har ett bra urval av algoritmer för klassificering, regression, kluster, dimensioneringsreduktion, modellval och förbehandling. Den har bra dokumentation och exempel på alla dessa, men saknar någon form av styrt arbetsflöde för att utföra dessa uppgifter.

Scikit-lär tjänar toppbetyg för att underlätta utvecklingen, främst för att algoritmerna alla fungerar som dokumenterade, API: erna är konsekventa och väldesignade och det finns få "impedansfel" mellan datastrukturer. Det är ett nöje att arbeta med ett bibliotek vars funktioner har grundligt utplånats och vars buggar har spolats ut ordentligt.

Å andra sidan täcker biblioteket inte djupinlärning eller förstärkningslärande, vilket utelämnar de nuvarande svåra men viktiga problemen, såsom exakt bildklassificering och pålitlig realtidsspråkning och översättning. Det är uppenbart att om du är intresserad av djupinlärning bör du söka någon annanstans.

Ändå finns det många problem - allt från att bygga en prediktionsfunktion som länkar olika observationer, till att klassificera observationer, att lära sig strukturen i en omärkt dataset - som lämpar sig för vanlig gammal maskininlärning utan att behöva dussintals lager av nervceller, och för dessa områden Scikit-learning är verkligen bra.

Kostnad: Gratis öppen källkod. 

Plattform: Kräver Python, NumPy, SciPy och Matplotlib. Releaser är tillgängliga för MacOS, Linux och Windows.

Läs min recension av Scikit-lär. 

Spark MLlib

Spark MLlib, öppen källkod för maskininlärningsbibliotek för Apache Spark, tillhandahåller vanliga maskininlärningsalgoritmer som klassificering, regression, klustring och samverkande filtrering (men inte djupa neurala nätverk). Den innehåller också verktyg för att extrahera funktioner, transformation, dimensioneringsreduktion och val; verktyg för att konstruera, utvärdera och ställa in rörledningar för maskininlärning; och verktyg för att spara och ladda algoritmer, modeller och rörledningar, för datahantering och för att göra linjär algebra och statistik.

Spark MLlib är skrivet i Scala och använder det linjära algebrapaketet Breeze. Breeze beror på netlib-java för optimerad numerisk bearbetning, men i öppen källkodsfördelning betyder det optimerad användning av CPU. Databricks erbjuder skräddarsydda Spark-kluster som använder GPU: er, vilket potentiellt kan ge dig ytterligare 10 gånger snabbare förbättring för att träna komplexa maskininlärningsmodeller med stora data.

Spark MLlib implementerar en lastbil med vanliga algoritmer och modeller för klassificering och regression, till den punkt där en nybörjare kan bli förvirrad, men en expert skulle sannolikt hitta ett bra val av modell för de data som ska analyseras, så småningom. Till denna uppsjö av modeller lägger Spark 2.x till det viktiga inslaget i hyperparameterjustering, även känd som modellval. Hyperparameterinställning gör det möjligt för analytikern att ställa in ett parameternät, en uppskattare och en utvärderare och låta korsvalideringsmetoden (tidskrävande men noggrann) eller tågvalideringsdelningsmetod (snabbare men mindre exakt) hitta den bästa modellen för data.

Spark MLlib har fullständiga API: er för Scala och Java, mestadels fulla API: er för Python och skissartade partiella API: er för R. Du kan få en bra känsla för täckningen genom att räkna exemplen: 54 Java och 60 Scala maskininlärningsexempel, 52 Python-maskin inlärningsexempel och endast fem R-exempel. Enligt min erfarenhet är Spark MLlib enklast att arbeta med att använda Jupyter-bärbara datorer, men du kan säkert köra den i en konsol om du tämjer de detaljerade Spark-statusmeddelandena.

Spark MLlib levererar nästan allt du vill ha i vägen för grundläggande maskininlärning, funktionsval, rörledningar och uthållighet. Det gör ett ganska bra jobb med klassificering, regression, kluster och filtrering. Med tanke på att det är en del av Spark har det stor tillgång till databaser, strömmar och andra datakällor. Å andra sidan är Spark MLlib inte riktigt inställd för att modellera och träna djupa neurala nätverk på samma sätt som TensorFlow, PyTorch, MXNet och Keras.

Kostnad: Gratis öppen källkod.

Plattform: Spark körs på både Windows- och Unix-liknande system (t.ex. Linux, MacOS), med Java 7 eller senare, Python 2.6 / 3.4 eller senare och R 3.1 eller senare. För Scala API använder Spark 2.0.1 Scala 2.11. Spark kräver Hadoop / HDFS.

Läs min recension av Spark MLlib.