Las mejores bibliotecas de aprendizaje automático y aprendizaje profundo

Si está iniciando un nuevo proyecto de aprendizaje automático o aprendizaje profundo, es posible que se sienta confundido acerca de qué marco elegir. Como veremos, hay varias buenas opciones para ambos tipos de proyectos.

Existe una diferencia entre un marco de aprendizaje automático y un marco de aprendizaje profundo. Esencialmente, un marco de aprendizaje automático cubre una variedad de métodos de aprendizaje para clasificación, regresión, agrupamiento, detección de anomalías y preparación de datos, y puede incluir o no métodos de redes neuronales.

Un marco de aprendizaje profundo o de red neuronal profunda cubre una variedad de topologías de redes neuronales con muchas capas ocultas. Keras, MXNet, PyTorch y TensorFlow son marcos de aprendizaje profundo. Scikit-learn y Spark MLlib son marcos de aprendizaje automático. (Haga clic en cualquiera de los enlaces anteriores para leer mi reseña independiente del producto).

En general, los cálculos de redes neuronales profundas se ejecutan mucho más rápido en una GPU (específicamente una GPU de propósito general Nvidia CUDA), TPU o FPGA, en lugar de en una CPU. En general, los métodos de aprendizaje automático más simples no se benefician de una GPU.

Si bien puede entrenar redes neuronales profundas en una o más CPU, el entrenamiento tiende a ser lento, y por lento no estoy hablando de segundos o minutos. Cuantas más neuronas y capas deban entrenarse y más datos disponibles para el entrenamiento, más tiempo se tarda. Cuando el equipo de Google Brain entrenó sus modelos de traducción de idiomas para la nueva versión de Google Translate en 2016, llevaron a cabo sus sesiones de formación durante una semana a la vez, en varias GPU. Sin las GPU, cada experimento de entrenamiento de modelos habría llevado meses.

Desde entonces, Intel Math Kernel Library (MKL) ha hecho posible entrenar algunas redes neuronales en CPU en una cantidad de tiempo razonable. Mientras tanto, las GPU, TPU y FPGA se han vuelto aún más rápidas.

La velocidad de entrenamiento de todos los paquetes de aprendizaje profundo que se ejecutan en las mismas GPU es casi idéntica. Eso es porque los bucles internos de entrenamiento pasan la mayor parte de su tiempo en el paquete Nvidia CuDNN.

Además de la velocidad de entrenamiento, cada una de las bibliotecas de aprendizaje profundo tiene su propio conjunto de pros y contras, y lo mismo ocurre con Scikit-learn y Spark MLlib. Vamos a sumergirnos.

Keras

Keras es una especificación e implementación de front-end de alto nivel para la creación de modelos de redes neuronales que se envía con soporte para tres marcos de back-end de aprendizaje profundo: TensorFlow, CNTK y Theano. Amazon está trabajando actualmente en el desarrollo de un back-end MXNet para Keras. También es posible utilizar PlaidML (un proyecto independiente) como back-end para que Keras aproveche el soporte OpenCL de PlaidML para todas las GPU.

TensorFlow es el back-end predeterminado para Keras, y el recomendado para muchos casos de uso que involucran la aceleración de GPU en hardware Nvidia a través de CUDA y cuDNN, así como para la aceleración de TPU en Google Cloud. TensorFlow también contiene una tf.kerasclase interna , separada de una instalación externa de Keras.

Keras tiene un entorno de alto nivel que hace que agregar una capa a una red neuronal sea tan fácil como una línea de código en su modelo secuencial, y requiere solo una llamada de función cada una para compilar y entrenar un modelo. Keras te permite trabajar a un nivel inferior si lo deseas, con su Modelo o API funcional.

Keras le permite bajar aún más, al nivel de codificación de Python, mediante subclases keras.Model, pero prefiere la API funcional cuando es posible. Keras también tiene una scikit-learnAPI, por lo que puede usar la búsqueda de cuadrícula de Scikit-learn para realizar la optimización de hiperparámetros en los modelos de Keras. 

Costo: código abierto gratuito. 

Plataforma: Linux, MacOS, Windows o Raspbian; Back-end de TensorFlow, Theano o CNTK. 

Lea mi reseña de Keras. 

MXNet

MXNet ha evolucionado y mejorado bastante desde que se movió bajo el paraguas de Apache Software Foundation a principios de 2017. Si bien se ha trabajado en Keras con un back-end de MXNet, una interfaz diferente de alto nivel se ha vuelto mucho más importante: Gluon. Antes de la incorporación de Gluon, podía escribir código imperativo fácil o código simbólico rápido en MXNet, pero no ambos a la vez. Con Gluon, puede combinar lo mejor de ambos mundos, de una manera que compite tanto con Keras como con PyTorch.

Las ventajas declaradas para Gluon incluyen:

  • Código simple y fácil de entender: Gluon ofrece un conjunto completo de componentes básicos de redes neuronales plug-and-play, que incluyen capas predefinidas, optimizadores e inicializadores.
  • Estructura flexible e imperativa: Gluon no requiere que el modelo de red neuronal se defina de manera rígida, sino que acerca el algoritmo de entrenamiento y el modelo para brindar flexibilidad en el proceso de desarrollo.
  • Gráficos dinámicos: Gluon permite a los desarrolladores definir modelos de redes neuronales que son dinámicos, lo que significa que se pueden construir sobre la marcha, con cualquier estructura y utilizando cualquiera de los flujos de control nativos de Python.
  • Alto rendimiento: Gluon proporciona todos los beneficios anteriores sin afectar la velocidad de entrenamiento que proporciona el motor subyacente.

Estas cuatro ventajas, junto con una colección enormemente ampliada de ejemplos de modelos, llevan a Gluon / MXNet a una paridad aproximada con Keras / TensorFlow y PyTorch para facilitar el desarrollo y la velocidad de entrenamiento. Puede ver ejemplos de código para cada uno de ellos en la página principal de Gluon y repetidos en la página de descripción general de la API de Gluon.

La API de Gluon incluye funcionalidad para capas de redes neuronales, redes neuronales recurrentes, funciones de pérdida, métodos de conjuntos de datos y conjuntos de datos de visión, un zoológico modelo y un conjunto de métodos de redes neuronales experimentales contribuidos. Se pueden combinar libremente Gluon con módulos estándar MXNet y NumPy, por ejemplo module,autograd y ndarray, así como con los flujos de control Python.

Gluon tiene una buena selección de capas para construir modelos, incluidas las capas básicas (Densa, Abandonada, etc.), capas convolucionales, capas de agrupación y capas de activación. Cada uno de estos es una llamada de una línea. Estos se pueden utilizar, entre otros lugares, dentro de contenedores de red como gluon.nn.Sequential().

Costo: código abierto gratuito. 

Plataforma: Linux, MacOS, Windows, Docker, Raspbian y Nvidia Jetson; Python, R, Scala, Julia, Perl, C ++ y Clojure (experimental). MXNet está incluido en la AMI de aprendizaje profundo de AWS.

Lea mi reseña de MXNet. 

PyTorch

PyTorch se basa en el antiguo Torch y el nuevo marco Caffe2. Como puede adivinar por el nombre, PyTorch usa Python como su lenguaje de scripting, y usa un back-end de Torch C / CUDA evolucionado. Las funciones de producción de Caffe2 se están incorporando al proyecto PyTorch.

PyTorch se factura como "Tensores y redes neuronales dinámicas en Python con una fuerte aceleración de GPU". Qué significa eso?

Los tensores son una construcción matemática que se utiliza mucho en física e ingeniería. Un tensor de rango dos es un tipo especial de matriz; tomando el producto interno de un vector con el tensor se obtiene otro vector con una nueva magnitud y una nueva dirección. TensorFlow toma su nombre de la forma en que los tensores (de pesos de sinapsis) fluyen alrededor de su modelo de red. NumPy también usa tensores, pero los llama un ndarray.

La aceleración de la GPU es un hecho para la mayoría de los marcos de redes neuronales profundas modernas. Una red neuronal dinámica es aquella que puede cambiar de una iteración a otra, por ejemplo, permitiendo que un modelo de PyTorch agregue y elimine capas ocultas durante el entrenamiento para mejorar su precisión y generalidad. PyTorch recrea el gráfico sobre la marcha en cada paso de la iteración. Por el contrario, TensorFlow crea de forma predeterminada un solo gráfico de flujo de datos, optimiza el código del gráfico para el rendimiento y luego entrena el modelo.

Si bien el modo de ejecución ansiosa es una opción bastante nueva en TensorFlow, es la única forma en que se ejecuta PyTorch: las llamadas a la API se ejecutan cuando se invocan, en lugar de agregarse a un gráfico para ejecutarse más tarde. Eso podría parecer menos eficiente computacionalmente, pero PyTorch fue diseñado para funcionar de esa manera, y no se queda atrás cuando se trata de entrenamiento o velocidad de predicción.

PyTorch integra bibliotecas de aceleración como Intel MKL y Nvidia cuDNN y NCCL (Nvidia Collective Communications Library) para maximizar la velocidad. Su CPU central y GPU Tensor y back-end de red neuronal —TH (Torch), THC (Torch CUDA), THNN (Torch Neural Network) y THCUNN (Torch CUDA Neural Network) — se escriben como bibliotecas independientes con una API C99. Al mismo tiempo, PyTorch no es un enlace de Python en un marco monolítico de C ++; la intención es que esté profundamente integrado con Python y permita el uso de otras bibliotecas de Python.

Costo: código abierto gratuito. 

Plataforma: Linux, MacOS, Windows; CPU y GPU Nvidia. 

Lea mi reseña de PyTorch. 

Scikit-aprender

El marco de Python de Scikit-learn tiene una amplia selección de algoritmos de aprendizaje automático robustos, pero no aprendizaje profundo. Si eres un fanático de Python, Scikit-learn puede ser la mejor opción para ti entre las bibliotecas simples de aprendizaje automático.

Scikit-learn es una biblioteca de aprendizaje automático robusta y bien probada para Python con una amplia variedad de algoritmos bien establecidos y gráficos integrados. Es relativamente fácil de instalar, aprender y usar, y tiene buenos ejemplos y tutoriales.

En el lado negativo, Scikit-learn no cubre el aprendizaje profundo o el aprendizaje por refuerzo, carece de modelos gráficos y predicción de secuencias, y realmente no se puede usar desde otros lenguajes que no sean Python. No es compatible con PyPy, el compilador just-in-time de Python o GPU. Dicho esto, a excepción de su incursión menor en las redes neuronales, realmente no tiene problemas de velocidad. Utiliza Cython (el compilador de Python a C) para funciones que necesitan ser rápidas, como los bucles internos.

Scikit-learn tiene una buena selección de algoritmos para clasificación, regresión, agrupamiento, reducción de dimensionalidad, selección de modelos y preprocesamiento. Tiene buena documentación y ejemplos para todos estos, pero carece de cualquier tipo de flujo de trabajo guiado para realizar estas tareas.

Scikit-learn obtiene las mejores calificaciones por la facilidad de desarrollo, principalmente porque todos los algoritmos funcionan según lo documentado, las API son consistentes y están bien diseñadas, y hay pocas "discrepancias de impedancia" entre las estructuras de datos. Es un placer trabajar con una biblioteca cuyas características se han desarrollado a fondo y cuyos errores se han eliminado completamente.

Por otro lado, la biblioteca no cubre el aprendizaje profundo o el aprendizaje reforzado, lo que deja de lado los problemas actuales, difíciles pero importantes, como la clasificación precisa de imágenes y el análisis y la traducción confiables del idioma en tiempo real. Claramente, si está interesado en el aprendizaje profundo, debería buscar en otro lado.

Sin embargo, existen muchos problemas, que van desde la creación de una función de predicción que vincule diferentes observaciones, hasta la clasificación de observaciones y el aprendizaje de la estructura de un conjunto de datos sin etiquetar, que se prestan al aprendizaje automático antiguo sin necesidad de docenas de capas de neuronas, y para esas áreas Scikit-learn es muy bueno.

Costo: código abierto gratuito. 

Plataforma: Requiere Python, NumPy, SciPy y Matplotlib. Las versiones están disponibles para MacOS, Linux y Windows.

Lea mi reseña de Scikit-learn. 

Spark MLlib

Spark MLlib, la biblioteca de aprendizaje automático de código abierto para Apache Spark, proporciona algoritmos comunes de aprendizaje automático, como clasificación, regresión, agrupación en clústeres y filtrado colaborativo (pero no redes neuronales profundas). También incluye herramientas para extracción, transformación, reducción de dimensionalidad y selección de características; herramientas para construir, evaluar y ajustar canales de aprendizaje automático; y utilidades para guardar y cargar algoritmos, modelos y canalizaciones, para el manejo de datos y para hacer álgebra lineal y estadísticas.

Spark MLlib está escrito en Scala y usa el paquete de álgebra lineal Breeze. Breeze depende de netlib-java para el procesamiento numérico optimizado, aunque en la distribución de código abierto eso significa un uso optimizado de la CPU. Databricks ofrece clústeres Spark personalizados que usan GPU, lo que potencialmente puede brindarle otra mejora de 10 veces la velocidad para entrenar modelos complejos de aprendizaje automático con big data.

Spark MLlib implementa una gran cantidad de algoritmos y modelos comunes para clasificación y regresión, hasta el punto en que un principiante podría confundirse, pero es probable que un experto encuentre una buena opción de modelo para analizar los datos, eventualmente. A esta plétora de modelos, Spark 2.x agrega la característica importante del ajuste de hiperparámetros, también conocida como selección de modelo. El ajuste de hiperparámetros permite al analista configurar una cuadrícula de parámetros, un estimador y un evaluador, y dejar que el método de validación cruzada (lento pero preciso) o el método de división de validación del tren (más rápido pero menos preciso) encuentre el mejor modelo para el datos.

Spark MLlib tiene API completas para Scala y Java, API en su mayoría completas para Python y API parciales incompletas para R. Puede tener una buena idea de la cobertura contando las muestras: 54 Java y 60 ejemplos de aprendizaje automático de Scala, 52 máquina Python ejemplos de aprendizaje y solo cinco ejemplos de R. En mi experiencia, es más fácil trabajar con Spark MLlib usando los cuadernos de Jupyter, pero ciertamente puede ejecutarlo en una consola si controla los mensajes de estado detallados de Spark.

Spark MLlib proporciona prácticamente cualquier cosa que desee en cuanto a aprendizaje automático básico, selección de funciones, canalizaciones y persistencia. Hace un buen trabajo con clasificación, regresión, agrupación y filtrado. Dado que es parte de Spark, tiene un gran acceso a bases de datos, flujos y otras fuentes de datos. Por otro lado, Spark MLlib no está realmente configurado para modelar y entrenar redes neuronales profundas de la misma manera que TensorFlow, PyTorch, MXNet y Keras.

Costo: código abierto gratuito.

Plataforma: Spark se ejecuta en sistemas Windows y similares a Unix (por ejemplo, Linux, MacOS), con Java 7 o posterior, Python 2.6 / 3.4 o posterior y R 3.1 o posterior. Para la API de Scala, Spark 2.0.1 usa Scala 2.11. Spark requiere Hadoop / HDFS.

Lea mi reseña de Spark MLlib.