Les meilleures bibliothèques d'apprentissage automatique et d'apprentissage en profondeur

Si vous démarrez un nouveau projet d'apprentissage automatique ou d'apprentissage en profondeur, vous ne savez peut-être pas quel framework choisir. Comme nous le verrons, il existe plusieurs bonnes options pour les deux types de projets.

Il existe une différence entre un cadre d'apprentissage automatique et un cadre d'apprentissage en profondeur. Essentiellement, un cadre d'apprentissage automatique couvre une variété de méthodes d'apprentissage pour la classification, la régression, le regroupement, la détection d'anomalies et la préparation de données, et peut ou non inclure des méthodes de réseau neuronal.

Un framework d'apprentissage en profondeur ou de réseau de neurones profond couvre une variété de topologies de réseau de neurones avec de nombreuses couches cachées. Keras, MXNet, PyTorch et TensorFlow sont des frameworks d'apprentissage en profondeur. Scikit-learn et Spark MLlib sont des frameworks d'apprentissage automatique. (Cliquez sur l'un des liens précédents pour lire mon examen autonome du produit.)

En général, les calculs de réseaux neuronaux profonds s'exécutent beaucoup plus rapidement sur un GPU (en particulier un GPU à usage général Nvidia CUDA), un TPU ou un FPGA, plutôt que sur un CPU. En général, les méthodes d'apprentissage automatique plus simples ne bénéficient pas d'un GPU.

Bien que vous puissiez entraîner des réseaux de neurones profonds sur un ou plusieurs processeurs, la formation a tendance à être lente, et par lent, je ne parle pas de secondes ou de minutes. Plus il y a de neurones et de couches à entraîner, et plus il y a de données disponibles pour l'entraînement, plus cela prend de temps. Lorsque l'équipe Google Brain a formé ses modèles de traduction linguistique pour la nouvelle version de Google Traduction en 2016, elle a organisé ses sessions de formation pendant une semaine à la fois, sur plusieurs GPU. Sans GPU, chaque expérience de formation de modèle aurait pris des mois.

Depuis lors, la bibliothèque Intel Math Kernel (MKL) a permis d'entraîner certains réseaux de neurones sur des CPU dans un délai raisonnable. Pendant ce temps, les GPU, TPU et FPGA sont devenus encore plus rapides.

La vitesse d'entraînement de tous les packages de deep learning fonctionnant sur les mêmes GPU est presque identique. En effet, les boucles internes d'entraînement passent la plupart de leur temps dans le package Nvidia CuDNN.

Outre la vitesse de formation, chacune des bibliothèques d'apprentissage en profondeur a son propre ensemble d'avantages et d'inconvénients, et il en va de même pour Scikit-learn et Spark MLlib. Plongeons-nous.

Keras

Keras est une spécification et une implémentation frontales de haut niveau pour la création de modèles de réseaux neuronaux qui sont livrées avec la prise en charge de trois frameworks d'apprentissage profond back-end: TensorFlow, CNTK et Theano. Amazon travaille actuellement sur le développement d'un back-end MXNet pour Keras. Il est également possible d'utiliser PlaidML (un projet indépendant) comme back-end pour Keras afin de tirer parti du support OpenCL de PlaidML pour tous les GPU.

TensorFlow est le back-end par défaut pour Keras, et celui recommandé pour de nombreux cas d'utilisation impliquant l'accélération GPU sur du matériel Nvidia via CUDA et cuDNN, ainsi que pour l'accélération TPU dans Google Cloud. TensorFlow contient également une tf.kerasclasse interne , distincte d'une installation Keras externe.

Keras dispose d'un environnement de haut niveau qui facilite l'ajout d'une couche à un réseau neuronal comme une seule ligne de code dans son modèle séquentiel, et ne nécessite qu'un seul appel de fonction pour la compilation et l'apprentissage d'un modèle. Keras vous permet de travailler à un niveau inférieur si vous le souhaitez, avec son modèle ou son API fonctionnelle.

Keras vous permet de descendre encore plus loin, au niveau de codage Python, en sous keras.Model- classant , mais préfère l'API fonctionnelle lorsque cela est possible. Keras dispose également d'une scikit-learnAPI, de sorte que vous pouvez utiliser la recherche de grille Scikit-learn pour effectuer une optimisation d'hyperparamètres dans les modèles Keras. 

Coût: open source gratuit. 

Plateforme: Linux, MacOS, Windows ou Raspbian; Back-end TensorFlow, Theano ou CNTK. 

Lisez ma critique de Keras. 

MXNet

MXNet a évolué et amélioré un peu depuis son passage sous l'égide d'Apache Software Foundation au début de 2017. Bien qu'il y ait eu des travaux sur Keras avec un back-end MXNet, une interface de haut niveau différente est devenue beaucoup plus importante: Gluon. Avant l'incorporation de Gluon, vous pouviez soit écrire du code impératif simple, soit du code symbolique rapide dans MXNet, mais pas les deux à la fois. Avec Gluon, vous pouvez combiner le meilleur des deux mondes, d'une manière qui rivalise avec Keras et PyTorch.

Les avantages revendiqués pour Gluon comprennent:

  • Code simple et facile à comprendre: Gluon propose un ensemble complet de blocs de construction de réseau neuronal plug-and-play, y compris des couches prédéfinies, des optimiseurs et des initialiseurs.
  • Structure flexible et impérative: Gluon n'exige pas que le modèle de réseau neuronal soit défini de manière rigide, mais rapproche plutôt l'algorithme de formation et le modèle pour offrir une flexibilité dans le processus de développement.
  • Graphiques dynamiques: Gluon permet aux développeurs de définir des modèles de réseaux neuronaux dynamiques, ce qui signifie qu'ils peuvent être construits à la volée, avec n'importe quelle structure et en utilisant n'importe quel flux de contrôle natif de Python.
  • Haute performance: Gluon offre tous les avantages ci-dessus sans affecter la vitesse d'entraînement fournie par le moteur sous-jacent.

Ces quatre avantages, ainsi qu'une collection largement étendue d'exemples de modèles, amènent Gluon / MXNet à une parité approximative avec Keras / TensorFlow et PyTorch pour une facilité de développement et une vitesse d'entraînement. Vous pouvez voir des exemples de code pour chacun d'eux sur la page principale de Gluon et répétés sur la page de présentation de l'API Gluon.

L'API Gluon comprend des fonctionnalités pour les couches de réseau neuronal, les réseaux neuronaux récurrents, les fonctions de perte, les méthodes d'ensembles de données et les ensembles de données de vision, un zoo modèle et un ensemble de méthodes expérimentales de réseaux neuronaux contribués. Vous pouvez combiner librement gluons avec des modules standards MXNet et numpy, par exemple module,autograd et ndarray, ainsi qu'avec les flux de contrôle Python.

Gluon propose une bonne sélection de couches pour la construction de modèles, y compris des couches de base (Dense, Dropout, etc.), des couches convolutives, des couches de regroupement et des couches d'activation. Chacun de ces appels est un appel sur une seule ligne. Ceux-ci peuvent être utilisés, entre autres, à l'intérieur de conteneurs réseau tels que gluon.nn.Sequential().

Coût: open source gratuit. 

Plateforme: Linux, MacOS, Windows, Docker, Raspbian et Nvidia Jetson; Python, R, Scala, Julia, Perl, C ++ et Clojure (expérimental). MXNet est inclus dans l'AMI AWS Deep Learning.

Lisez ma critique de MXNet. 

PyTorch

PyTorch s'appuie sur l'ancien Torch et le nouveau framework Caffe2. Comme vous pouvez le deviner d'après son nom, PyTorch utilise Python comme langage de script, et il utilise un back-end Torch C / CUDA évolué. Les fonctionnalités de production de Caffe2 sont en cours d'intégration dans le projet PyTorch.

PyTorch est présenté comme "Tensors et réseaux de neurones dynamiques en Python avec une forte accélération GPU." Qu'est-ce que ça veut dire?

Les tenseurs sont une construction mathématique largement utilisée en physique et en ingénierie. Un tenseur de rang deux est un type spécial de matrice; prendre le produit interne d'un vecteur avec le tenseur donne un autre vecteur avec une nouvelle magnitude et une nouvelle direction. TensorFlow tire son nom de la façon dont les tenseurs (des poids de synapse) circulent autour de son modèle de réseau. NumPy utilise également des tenseurs, mais les appelle un ndarray.

L'accélération GPU est une donnée pour la plupart des frameworks de réseaux neuronaux profonds modernes. Un réseau de neurones dynamique est un réseau qui peut changer d'itération en itération, par exemple en permettant à un modèle PyTorch d'ajouter et de supprimer des couches cachées pendant l'entraînement pour améliorer sa précision et sa généralité. PyTorch recrée le graphique à la volée à chaque étape d'itération. En revanche, TensorFlow crée par défaut un seul graphique de flux de données, optimise le code du graphique pour les performances, puis entraîne le modèle.

Bien que le mode d'exécution hâtive soit une option relativement nouvelle dans TensorFlow, c'est la seule façon dont PyTorch s'exécute: les appels d'API s'exécutent lorsqu'ils sont appelés, plutôt que d'être ajoutés à un graphique pour être exécutés plus tard. Cela peut sembler moins efficace en termes de calcul, mais PyTorch a été conçu pour fonctionner de cette façon, et ce n'est pas en reste en ce qui concerne la vitesse d'entraînement ou de prédiction.

PyTorch intègre des bibliothèques d'accélération telles que Intel MKL et Nvidia cuDNN et NCCL (Nvidia Collective Communications Library) pour maximiser la vitesse. Son cœur CPU et GPU Tensor et back-end de réseau neuronal - TH (Torch), THC (Torch CUDA), THNN (Torch Neural Network) et THCUNN (Torch CUDA Neural Network) - sont écrits en tant que bibliothèques indépendantes avec une API C99. En même temps, PyTorch n'est pas une liaison Python dans un framework C ++ monolithique - l'intention est qu'il soit profondément intégré à Python et de permettre l'utilisation d'autres bibliothèques Python.

Coût: open source gratuit. 

Plateforme: Linux, MacOS, Windows; Processeurs et GPU Nvidia. 

Lisez ma critique de PyTorch. 

Scikit-learn

Le framework Python Scikit-learn propose une large sélection d'algorithmes d'apprentissage automatique robustes, mais pas d'apprentissage en profondeur. Si vous êtes un fan de Python, Scikit-learn pourrait bien être la meilleure option pour vous parmi les bibliothèques d'apprentissage automatique simples.

Scikit-learn est une bibliothèque d'apprentissage automatique robuste et éprouvée pour Python avec un large assortiment d'algorithmes bien établis et de graphiques intégrés. Il est relativement facile à installer, à apprendre et à utiliser, et il contient de bons exemples et tutoriels.

Du côté des inconvénients, Scikit-learn ne couvre pas l'apprentissage en profondeur ou l'apprentissage par renforcement, manque de modèles graphiques et de prédiction de séquence, et il ne peut pas vraiment être utilisé à partir de langages autres que Python. Il ne prend pas en charge PyPy, le compilateur Python juste-à-temps, ni les GPU. Cela dit, à l'exception de son incursion mineure dans les réseaux de neurones, il n'a pas vraiment de problèmes de vitesse. Il utilise Cython (le compilateur Python vers C) pour les fonctions qui doivent être rapides, telles que les boucles internes.

Scikit-learn propose une bonne sélection d'algorithmes pour la classification, la régression, le clustering, la réduction de dimensionnalité, la sélection de modèles et le prétraitement. Il contient une bonne documentation et des exemples pour tous ces éléments, mais il manque tout type de flux de travail guidé pour accomplir ces tâches.

Scikit-learn obtient les meilleures notes pour sa facilité de développement, principalement parce que les algorithmes fonctionnent tous comme documenté, que les API sont cohérentes et bien conçues et qu'il existe peu de «discordances d'impédance» entre les structures de données. C'est un plaisir de travailler avec une bibliothèque dont les fonctionnalités ont été complètement étoffées et dont les bogues ont été complètement éliminés.

D'autre part, la bibliothèque ne couvre pas l'apprentissage en profondeur ou l'apprentissage par renforcement, ce qui laisse de côté les problèmes difficiles mais importants actuels, tels que la classification précise des images et l'analyse et la traduction fiables en temps réel de la langue. De toute évidence, si vous êtes intéressé par l'apprentissage en profondeur, vous devriez chercher ailleurs.

Néanmoins, il existe de nombreux problèmes - allant de la création d'une fonction de prédiction reliant différentes observations à la classification des observations, en passant par l'apprentissage de la structure d'un ensemble de données non étiqueté - qui se prêtent à un apprentissage automatique ancien sans avoir besoin de dizaines de couches de neurones, et pour ces zones Scikit-learn est vraiment très bon.

Coût: open source gratuit. 

Plate-forme: nécessite Python, NumPy, SciPy et Matplotlib. Les versions sont disponibles pour MacOS, Linux et Windows.

Lisez ma critique de Scikit-learn. 

Spark MLlib

Spark MLlib, la bibliothèque d'apprentissage automatique open source pour Apache Spark, fournit des algorithmes d'apprentissage automatique courants tels que la classification, la régression, le clustering et le filtrage collaboratif (mais pas les réseaux de neurones profonds). Il comprend également des outils d'extraction, de transformation, de réduction de dimensionnalité et de sélection d'entités; des outils de construction, d'évaluation et de réglage de pipelines d'apprentissage automatique; et des utilitaires pour enregistrer et charger des algorithmes, des modèles et des pipelines, pour la gestion des données et pour faire de l'algèbre linéaire et des statistiques.

Spark MLlib est écrit en Scala et utilise le package d'algèbre linéaire Breeze. Breeze dépend de netlib-java pour un traitement numérique optimisé, bien que dans la distribution open source, cela signifie une utilisation optimisée du processeur. Databricks propose des clusters Spark personnalisés qui utilisent des GPU, ce qui peut potentiellement vous apporter une autre amélioration de la vitesse 10x pour la formation de modèles d'apprentissage automatique complexes avec du Big Data.

Spark MLlib implémente une multitude d'algorithmes et de modèles communs pour la classification et la régression, au point où un novice pourrait devenir confus, mais un expert serait susceptible de trouver un bon choix de modèle pour les données à analyser, à terme. À cette pléthore de modèles, Spark 2.x ajoute la fonction importante de réglage des hyperparamètres, également appelée sélection de modèles. Le réglage des hyperparamètres permet à l'analyste de configurer une grille de paramètres, un estimateur et un évaluateur, et de laisser la méthode de validation croisée (longue mais précise) ou la méthode de fractionnement de validation de train (plus rapide mais moins précise) trouver le meilleur modèle pour le Les données.

Spark MLlib possède des API complètes pour Scala et Java, des API pour la plupart complètes pour Python et des API partielles sommaires pour R. Vous pouvez avoir une bonne idée de la couverture en comptant les exemples: 54 exemples d'apprentissage automatique Java et 60 Scala, 52 machine Python exemples d'apprentissage, et seulement cinq exemples R. D'après mon expérience, il est plus facile de travailler avec Spark MLlib à l'aide des blocs-notes Jupyter, mais vous pouvez certainement l'exécuter dans une console si vous apprivoisez les messages d'état détaillés de Spark.

Spark MLlib fournit à peu près tout ce que vous souhaitez en termes d'apprentissage automatique de base, de sélection de fonctionnalités, de pipelines et de persistance. Il fait un très bon travail avec la classification, la régression, le clustering et le filtrage. Étant donné qu'il fait partie de Spark, il dispose d'un excellent accès aux bases de données, aux flux et à d'autres sources de données. D'un autre côté, Spark MLlib n'est pas vraiment configuré pour modéliser et entraîner les réseaux de neurones profonds de la même manière que TensorFlow, PyTorch, MXNet et Keras.

Coût: open source gratuit.

Plate-forme: Spark fonctionne à la fois sur les systèmes Windows et Unix (par exemple Linux, MacOS), avec Java 7 ou version ultérieure, Python 2.6 / 3.4 ou version ultérieure et R 3.1 ou version ultérieure. Pour l'API Scala, Spark 2.0.1 utilise Scala 2.11. Spark nécessite Hadoop / HDFS.

Lisez mon avis sur Spark MLlib.