Las mejores librerías de ML y DL

0
81

Si está iniciando un nuevo proyecto de aprendizaje automático (ML, por sus siglas en inglés) o de aprendizaje profundo (DL, por sus siglas en inglés), puede confundirse sobre qué framework elegir. Como veremos, hay variedad de opciones buenas para ambos tipos de proyectos.

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

Un framework 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 frameworks de aprendizaje profundo. Scikit-learn y Spark MLlib son frameworks de aprendizaje automático.

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

Si bien se pueden entrenar redes neuronales profundas en una o más CPUs, el entrenamiento tiende a ser lento, y no solo segundos o minutos. Cuantas más neuronas y capas deban ser entrenadas, y mientras más datos estén disponibles para la capacitación, más tiempo llevará. Cuando el equipo de Google Brain entrenó sus modelos de traducción de idiomas para la nueva versión de Google Translate en el 2016, realizaron sus sesiones de entrenamiento durante una semana a la vez en varias GPUs. Sin las GPUs, cada experimento de entrenamiento habría tomado meses.

Desde entonces, Math Kernel Library (MKL) de Intel ha hecho posible entrenar algunas redes neuronales en las CPUs en un tiempo razonable. Mientras tanto, las GPUs, TPUs y FPGAs 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 GPUs es casi idéntica. Esto se debe a que los bucles internos de entrenamiento pasan la mayor parte del tiempo en el paquete Nvidia CuDNN.

Además de la velocidad de entrenamiento, cada una de las librerías de aprendizaje profundo tiene su propio conjunto de ventajas y desventajas, y lo mismo se aplica a Scikit-learn y Spark MLlib. Vamos a sumergirnos.

Keras
Keras es una especificación e implementación front-end de alto nivel para crear modelos de redes neuronales, que viene con soporte para tres frameworks back-end de aprendizaje profundo: TensorFlow, CNTK y Theano. Actualmente, Amazon está trabajando en el desarrollo de un back-end MXNet para Keras. También es posible usar PlaidML (un proyecto independiente) como back-end para que, así, Keras aproveche el soporte de OpenCL de PlaidML en todas las GPUs.

TensorFlow es el back-end predeterminado de Keras, y el recomendado para muchos casos de uso que incluyen la aceleración de GPU en el 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 clase tf.kerasinterna, 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 solo requiere una llamada de función para compilar y entrenar un modelo. Keras permite trabajar en un nivel inferior si se desea, con su API Model o funcional.

Keras permite desplegar aún más hasta el nivel de codificación de Python mediante la subclasificación keras.Model, pero prefiera la API funcional cuando sea posible. Keras también tiene una API de scikit-learn, por lo que puede utilizar la búsqueda de cuadrícula 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; TensorFlow, Theano o CNTK back-end.

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

Las ventajas de Gluon incluyen:

  • Código simple y fácil de entender: Gluon ofrece un conjunto completo de bloques de construcción de redes neuronales plug-and-play, que incluyen capas predefinidas, optimizadores e inicializadores.
  • Estructura imperativa y flexible: Gluon no requiere que el modelo de red neuronal esté rígidamente definido, sino que, más bien, une el algoritmo y el modelo de entrenamiento para proporcionar flexibilidad en el proceso de desarrollo.
  • Gráficos dinámicos:Gluon permite a los desarrolladores definir modelos de redes neuronales que son dinámicas, lo que significa que pueden construirse 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 muy amplia de ejemplos de modelos, hacen que Gluon/MXNet esté casi al mismo nivel de Keras/TensorFlow y PyTorch para facilitar el desarrollo y la velocidad de entrenamiento. Puede ver ejemplos de códigos para cada uno de estos 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 contribuidos de redes neuronales experimentales. Puede combinar libremente Gluon con módulos MXNet y NumPy estándar, por ejemplo, moduleautogradndarray, así como con flujos de control de Python.

Gluon tiene una buena selección de capas para la creación de modelos, incluidas las capas básicas (Dense, Dropout, etc.), capas convolucionales, capas de agrupación y capas de activación. Cada una de estas es una llamada de una línea. Éstas 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.

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

PyTorch está catalogado como «Tensores y redes neuronales dinámicas en Python con fuerte aceleración de GPU». ¿Qué significa eso?

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

La aceleración de GPU es algo fijo para la mayoría de los frameworks modernos de redes neuronales profundas. Una red neuronal dinámica es aquella que puede cambiar de iteración a iteración, por ejemplo, permitiendo que un modelo 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 iteración. Por el contrario, TensorFlow por defecto crea 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 ávida es una opción bastante nueva en TensorFlow, es la única forma en que PyTorch se ejecuta: las llamadas API se ejecutan cuando se les invoca, en lugar de ser agregadas a un gráfico para ejecutarlas luego. Puede parecer menos eficiente desde el punto de vista computacional, pero PyTorch fue diseñado para funcionar de esa manera, y no se queda atrás cuando se trata del entrenamiento o la velocidad de predicción.

PyTorch integra librerías 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 sus redes neuronales -TH (Torch), THC (Torch CUDA), THNN (Torch Neural Network) y THCUNN (Torch CUDA Neural Network)- son escritas como librerías independientes con una API C99. A su vez, PyTorch no es un enlace de Python en un framework monolítico de C++; la intención es que esté profundamente integrado con Python y permita el uso de otras librerías de Python.

  • Costo:Código abierto gratuito
  • Plataforma:Linux, MacOS, Windows; CPUs y GPUs de Nvidia

Scikit-learn
El framework de Python Scikit-learn tiene una amplia variedad de algoritmos de aprendizaje automático robustos, pero no de aprendizaje profundo. Si es fanático de Python, Scikit-learn puede ser la mejor opción para usted entre las librerías simples de aprendizaje automático.

Scikit-learn es una librería de aprendizaje automático robusta y conocida 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.

Desafortunadamente, Scikit-learn no cubre el aprendizaje profundo o el aprendizaje por refuerzo, carece de modelos gráficos y predicción de secuencias, y no puede ser usado en otros idiomas que no sean Python. No es compatible con PyPy, el compilador just-in-time de Python, o con GPUs. Dicho esto, excepto por su pequeña incursión en las redes neuronales, en realidad no cuenta con problemas de velocidad. Utiliza Cython (el compilador de Python a C) para las funciones que necesitan ser rápidas, como los bucles internos.

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

Scikit-learn obtiene las mejores calificaciones por su facilidad de desarrollo, principalmente porque todos los algoritmos funcionan como se documenta, las APIs son coherentes y están bien diseñadas, y existen pocas «diferencias de impedancia» entre las estructuras de datos. Es un placer trabajar con una librería cuyas características han sido completamente desarrolladas y cuyos errores han sido eliminados de manera detallada.

Por otro lado, la librería no cubre el aprendizaje profundo o el aprendizaje por refuerzo, dejando de lado los problemas difíciles, pero actualmente importantes, como la clasificación precisa de las imágenes y análisis y traducción confiables del idioma en tiempo real. Claramente, si está interesado en el aprendizaje profundo, debería buscar en otra parte.

Sin embargo, hay muchos problemas -que van desde la construcción de una función de predicción que vincula diferentes observaciones hasta la clasificación de las observaciones y el aprendizaje de la estructura de un conjunto de datos sin etiquetar- que se presentan en el simple aprendizaje automático 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.

Spark MLlib
Spark MLlib, la librería de código abierto de aprendizaje automático para Apache Spark, proporciona algoritmos comunes de aprendizaje automático como clasificación, regresión, agrupación y filtrado colaborativo (pero no redes neuronales profundas). También incluye herramientas para extracción de características, transformación, reducción de dimensionalidad y selección; herramientas para la construcción, evaluación y ajuste de tuberías de aprendizaje automático; y utilidades para guardar y cargar algoritmos, modelos y pipelines, para el manejo de datos, y para hacer álgebra lineal y estadística.

Spark MLlib está escrito en Scala y usa el paquete de álgebra lineal Breeze. Breeze depende de netlib-java para un 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 GPUs, lo que potencialmente puede lograr otra mejora de velocidad 10x 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 novato podría confundirse; pero un experto podría encontrar, eventualmente, una buena opción de modelo para analizar los datos. A esta gran cantidad de modelos, Spark 2.x agrega la importante característica de la optimización de hiperparámetros, también conocida como selección de modelos. La optimización de hiperparámetros le permite al analista configurar una cuadrícula de parámetros, un estimador y un evaluador; y permite que el método de validación cruzada (que consume mucho tiempo, pero es preciso) o el train validation split method (más rápido, pero menos preciso) encuentre el mejor modelo para los datos.

Spark MLlib tiene APIs completas para Scala y Java, APIs casi completas para Python, y APIs parciales incompletas para R. Puede hacerse una idea de la cobertura contando las muestras: 54 ejemplos de aprendizaje automático de Java y 60 de Scala, 52 ejemplos de aprendizaje automático de Python, y solo cinco ejemplos de R. En mi experiencia, Spark MLlib es más fácil de usar con los notebooks Jupyter, pero ciertamente puede ejecutarlo en una consola si controla los mensajes de estado detallados de Spark.

Spark MLlib proporciona prácticamente todo lo que quiera en cuanto a aprendizaje automático básico, selección de funciones, pipelines y persistencia. Hace un trabajo bastante bueno con la 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 similares a Windows y 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.

TensorFlow
TensorFlow es probablemente el estándar de excelencia para el desarrollo de redes neuronales profundas, aunque no carece de defectos. Históricamente, dos de los problemas más grandes con TensorFlow fueron que era demasiado difícil de aprender, y que se necesitaba mucho código para crear un modelo. Ambos problemas han sido abordados en los últimos años.

Para hacer que TensorFlow sea más fácil de aprender, el equipo de TensorFlow ha producido más materiales de aprendizaje, además de aclarar los tutoriales de «introducción» existentes. Varios terceros han producido sus propios materiales de tutoría. Actualmente existen varios libros de TensorFlow impresos, y cursos en línea de TensorFlow. Incluso puede seguir el curso CS20 en Stanford, TensorFlow for Deep Learning Research, que publica todas las diapositivas y notas de clase en línea.

Varias secciones nuevas de la librería de TensorFlow ofrecen interfaces que requieren menos programación para crear y entrenar modelos. Estos incluyen tf.keras, que proporciona una versión solo para TensorFlow del paquete Keras engine-neutral; y tf.estimator, que proporciona una serie de instalaciones de alto nivel para trabajar con modelos. Estos incluyen regresores y clasificadores para redes neuronales profundas y lineales, y redes neuronales profundas y lineales combinadas, y una clase base a partir de la cual puede construir sus propios estimadores. Además, la Dataset API le permite crear pipelines de entrada complejas a partir de piezas simples y reutilizables. No tiene que elegir solo uno. Como muestra este tutorial, se puede hacer que tf.kerastf.data.dataset, y tf.estimatortrabajen juntos.

TensorFlow Lite es la solución liviana de TensorFlow para dispositivos móviles e integrados, que permite la inferencia de aprendizaje automático en el dispositivo (pero no el entrenamiento) con baja latencia y un tamaño binario pequeño. TensorFlow Lite también admite la aceleración de hardware con la API Android Neural Networks. Los modelos de TensorFlow Lite son lo suficientemente pequeños como para ejecutarse en dispositivos móviles y pueden servir en el caso de uso sin conexión.

La idea básica de TensorFlow Lite es que usted entrene un modelo completo TensorFlow y lo convierta al formato de modelo TensorFlow Lite. Luego puede usar el archivo convertido en su aplicación móvil en Android o iOS.

Alternativamente, puede usar uno de los modelos TensorFlow Lite previamente entrenados para la clasificación de imágenes o respuestas inteligentes. Las respuestas inteligentes son mensajes relevantes al contexto que pueden ofrecerse como opciones de respuesta; esencialmente, esto proporciona la misma funcionalidad de predicción de respuesta que se encuentra en los clientes de Gmail de Google.

Otra opción más es volver a entrenar un modelo TensorFlow existente contra un nuevo conjunto de datos etiquetado, una técnica importante llamada aprendizaje de transferencia, que reduce significativamente los tiempos de entrenamiento. Un tutorial práctico sobre este proceso se llama TensorFlow for Poets.

  • Costo:Código abierto gratuito
  • Plataforma:Ubuntu 14.04 o posterior, MacOS 10.11 o posterior, Windows 7 o posterior. Se recomienda GPU y CUDA Nvidia. La mayoría de las nubes ahora admiten TensorFlow con las GPUs de Nvidia. TensorFlow Lite ejecuta modelos entrenados en Android y iOS.

¿Aprendizaje automático o aprendizaje profundo?
A veces, uno sabe que necesitará una red neuronal profunda para resolver un problema en particular de manera efectiva, por ejemplo, para clasificar imágenes, reconocer el habla o traducir idiomas. Otras veces, uno no sabe si es necesario, por ejemplo, para predecir las cifras de ventas del próximo mes o para detectar valores atípicos en los datos.

Si necesita una red neuronal profunda, entonces Keras, MXNet con Gluon, PyTorch y TensorFlow con Keras o Estimulators son todas buenas opciones. Si no está seguro, comience con Scikit-learn o Spark MLlib y pruebe todos los algoritmos relevantes. Si obtiene resultados satisfactorios del mejor modelo o un conjunto de varios modelos, puede detenerse.

Si necesita mejores resultados, intente realizar aprendizaje de transferencia en una red neuronal profunda entrenada. Si aún no obtiene lo que necesita, intente construir y entrenar una red neuronal profunda desde cero. Para refinar su modelo, pruebe la optimización de hiperparámetros

No importa qué método utilice para entrenar un modelo, recuerde que el modelo es tan bueno como los datos que usa para el entrenamiento. Recuerde limpiarlo, estandarizarlo y equilibrar el tamaño de sus clases de entrenamiento.

Martin Heller, InfoWorld.com