Hola colegas
De las últimas noticias sobre nuestras próximas innovaciones en el campo de ML / DL:
Nishant Shakla, "
Aprendizaje automático con Tensorflow " - un libro en diseño, que se espera en las tiendas en enero
Delip Rao, Brian McMahan, "
Procesamiento del lenguaje natural en PyTorch ": el contrato está firmado, planeamos comenzar la traducción en enero.
En este contexto, una vez más queríamos volver a un tema doloroso: un estudio pobre del tema ML / DL en el lenguaje Java. Debido a la aparente inmadurez de estas soluciones y algoritmos de Java, una vez decidimos abandonar el libro DL4J de Gibson y Patterson, y el artículo de Humphrey Sheil publicado hoy sugiere que probablemente teníamos razón. Te invitamos a que te familiarices con los pensamientos del autor sobre cómo Java finalmente podría competir con Python en el aprendizaje automático
Recientemente, di una
conferencia sobre el presente y el futuro de la máquina y el aprendizaje profundo (ML / DL) en la empresa. En el contexto de una gran empresa, los temas y problemas más aplicados son relevantes que en una conferencia de investigación, por ejemplo, cómo mi equipo y yo podemos comenzar a usar ML y la mejor manera de integrar ML con los sistemas que tenemos en funcionamiento. Luego comenzó una mesa redonda sobre Java y el aprendizaje automático.
El lenguaje Java está prácticamente ausente en el segmento de aprendizaje automático. Casi no hay marcos ML que se escribirían en Java (hay
DL4J , pero personalmente, no conozco a nadie que lo use,
MXNet tiene una API en Scala, pero no en Java, y este marco en sí no está escrito en Java) . Tensorflow tiene
una API incompleta en Java , sin embargo, Java tiene una gran participación en el desarrollo empresarial, en los últimos 20 años, se han invertido billones de dólares en este lenguaje en casi todas las áreas temáticas concebibles: servicios financieros, transacciones electrónicas, tiendas en línea, telecomunicaciones - lista puede continuar por siempre. En el aprendizaje automático, el "primero entre iguales" es Python, no Java. Personalmente, me gusta mucho programar en Python y Java, pero
Frank Greco formuló una pregunta interesante que me llevó a pensar:
¿Por qué Java debería competir con Python en ML? ¿Por qué no asumir la tarea de tener en cuenta el apoyo serio de ML?
¿Es importante?Justifiquemos este tema. Desde 1998, el lenguaje Java ha estado en la Premier League, sin él no habría eventos evolutivos y revolucionarios en la empresa. Estamos hablando de tecnologías web y móviles, sobre la comparación de soluciones nativas y de navegador, sobre sistemas de mensajería, soporte de globalización i18n y l10n, escala horizontal y soporte de almacenamiento para cualquier información empresarial que pueda imaginar, desde bases de datos relacionales hasta Búsqueda elástica
Este nivel de soporte incondicional proporciona una cultura muy saludable que se ha desarrollado en los comandos de Java: "podemos", "arremangarse y escribir código". No existe un componente mágico o API que no pueda ser complementado o reemplazado por un buen equipo de desarrolladores de Java.
Pero este principio no funciona en el aprendizaje automático. Aquí, los comandos de Java tienen dos opciones:
- Vuelva a entrenar / reentrenar en Python.
- Use una API de terceros para agregar capacidades de aprendizaje automático a su sistema empresarial existente.
Ninguna de estas opciones puede llamarse verdaderamente inofensiva. El primero requiere mucho tiempo e inversión por adelantado, además de los costos de soporte continuo. En la segunda opción, corremos el riesgo de depender del proveedor, perder el soporte del proveedor, además de tener que trabajar con componentes de terceros (pagar el precio de la transición de la red al mismo tiempo), migrar a un sistema en el que puede haber requisitos de seguridad potencialmente críticos y tendrá que compartir información con por alguien fuera de su organización. En algunas situaciones, esto es inaceptable.
Lo más destructivo en este caso (en mi opinión) es el potencial de
deterioro cultural : los equipos no pueden cambiar el código que no entienden o no pueden mantener, por lo que las responsabilidades son confusas y el trabajo principal debe delegarse en otra persona. Los equipos formados exclusivamente por desarrolladores de Java corren el riesgo de perderse la próxima gran ola, que se inundará en la informática empresarial: la ola del aprendizaje automático.
Por lo tanto, es importante y deseable que el soporte de primera clase para el aprendizaje automático aparezca en el lenguaje y en la plataforma Java. De lo contrario, existe el riesgo de que en los próximos 5 a 10 años Java sea reemplazado por otros idiomas donde ML sea mejor compatible.
¿Por qué Python es tan dominante en ML?Para comenzar, analicemos por qué Python se ha convertido en un líder en aprendizaje automático y aprendizaje profundo.
Sospecho que todo comenzó con una característica completamente inocente: soporte para el corte de listas. Este soporte es extensible: cualquier clase de Python que implemente los métodos
__getitem__
y
__setitem__
puede cortarse utilizando esta sintaxis. La siguiente lista muestra cuán simple y natural es esta característica de Python.
a = [1, 2, 3, 4, 5, 6, 7, 8] print(a[1:4])
Por supuesto, esto no es todo. El código Python es mucho más compacto y conciso en comparación con el "antiguo" código Java. Se admiten excepciones, pero no se comprueban, y los desarrolladores pueden escribir fácilmente scripts de Python que sean adecuados como elemento consumible: intente "cómo funciona" sin ahogarse en la cosmovisión de Java "todo es una clase". Es fácil involucrarse en Python.
Sin embargo, en mi opinión, el factor más importante de superioridad (que no me impide reconocer el arduo trabajo que está haciendo la comunidad de Python para mantener la conexión entre Python 2.7 y Python 3) es que lograron crear una biblioteca mucho más rápida y mejor diseñada para las operaciones con números - NumPy. Numpy está construido alrededor de
ndarray , un objeto que es una matriz N-dimensional. Cito la documentación: “
El objeto principal en NumPy es una matriz multidimensional homogénea. Esta es una tabla de elementos (generalmente números), todos del mismo tipo, indexados por una tupla de enteros positivos "
. Todo el trabajo de NumPy se basa en escribir sus datos en ndarray y las operaciones posteriores en ellos. NumPy admite una variedad de opciones de indexación, difusión y vectorización para la velocidad, y generalmente permite a los desarrolladores crear y manipular fácilmente grandes matrices numéricas.
La siguiente lista muestra en la práctica la indexación y la transmisión en ndarray: estas son operaciones clave en ML / DL.
import numpy as np
Al trabajar con grandes matrices numéricas multidimensionales, marcamos el corazón de la programación para el aprendizaje automático y, en particular, el aprendizaje profundo. Las redes neuronales profundas son redes de nodos y bordes modelados a nivel de números. Las operaciones de tiempo de ejecución cuando se entrena una red o se realiza una salida basada en ella requieren una multiplicación de matriz rápida.
Gracias a NumPy, se ha hecho mucho más:
scipy ,
pandas y muchas otras bibliotecas basadas en NumPy. Las principales bibliotecas de aprendizaje profundo (
Tensorflow de Google,
PyTorch de Facebook) están desarrollando seriamente Python. Tensorflow tiene otras API para Go, Java y JavaScript, pero están incompletas y se consideran inestables. PyTorch se escribió originalmente en Lua, y experimentó un aumento real de popularidad cuando en 2017 pasó de este lenguaje francamente nicho al ecosistema principal de ML Python en 2017.
Defectos de PythonPython no es un lenguaje ideal, ni es el tiempo de ejecución más popular, CPython. Tiene un bloqueo global de intérprete (
GIL ), por lo que el escalado no es fácil. Además, los marcos de aprendizaje profundo de Python como PyTorch y Tensorflow aún transmiten métodos clave a implementaciones opacas. Por ejemplo, la biblioteca
cuDNN de NVidia
tuvo un gran impacto en el alcance de la implementación PyTorch
RNN / LSTM . RNN y LSTM (redes neuronales recurrentes y memoria a corto y largo plazo) son herramientas DL muy importantes para aplicaciones comerciales, en particular porque se especializan en la clasificación y predicción de series sucesivas de longitudes variables, por ejemplo. navegación web, análisis de flujo de clics, análisis de fragmentos de texto, eventos de usuarios, etc.
En aras de la imparcialidad con Python, debe tenerse en cuenta que dicha opacidad / limitación se aplica a casi cualquier marco para ML / DL, excepto escrito en C o C ++. Por qué Porque para lograr el máximo rendimiento para operaciones básicas y altamente cargadas, como la multiplicación de matrices, los desarrolladores se acercan lo más posible al metal.
¿Qué necesita Java para competir en este campo?Supongo que la plataforma Java necesita tres adiciones principales. Si se implementa, un ecosistema saludable y próspero para el aprendizaje automático comenzará a extenderse:
- Agregue soporte de indexación / corte nativo al núcleo del lenguaje para que pueda competir con Python con toda su facilidad de uso y expresividad. Es posible que tales capacidades se construyan en Java alrededor de una colección ordenada existente, la interfaz Lista <E> . Para tal soporte, también será necesario reconocer la necesidad de sobrecarga; es necesario para cumplir con el punto # 2.
- Cree una implementación de tensor , probablemente en el paquete
java.math
, pero también con una salida a la API de colecciones. Este conjunto de clases e interfaces podría funcionar de manera equivalente a ndarray
y proporcionó soporte adicional para la indexación, en particular, los tres tipos de indexación que están disponibles en NumPy: acceso a campos, segmentos simples e indexación avanzada necesarios para la programación. - Proporcione difusión: escalares y tensores de dimensiones arbitrarias (pero compatibles).
Si estas tres tareas se pudieran realizar en el núcleo del lenguaje Java y el tiempo de ejecución, habríamos abierto el camino para crear
"NumJava" , equivalente a NumPy.
El proyecto de Panamá también podría ser útil para proporcionar acceso vectorizado de bajo nivel a operaciones rápidas de tensor realizadas en la CPU, GPU, TPU y no solo para que Java ML pueda convertirse en el más rápido de su tipo.
No digo en absoluto que estos complementos sean triviales, no, ni mucho menos, pero sus beneficios potenciales para toda la plataforma Java son enormes.
La siguiente lista muestra cómo podría verse nuestro ejemplo de difusión e indexación de NumPy en NumJava con la clase
Tensor
, con soporte para la sintaxis de corte basada en el lenguaje y las restricciones actuales sobre la sobrecarga del operador.
Perspectiva y llamado a la acciónTodos sabemos que el aprendizaje automático transformará el mundo de los negocios no menos que en su tiempo: bases de datos relacionales, Internet y tecnologías móviles. Hay mucha publicidad a su alrededor, pero aparecen algunos artículos y conclusiones muy convincentes. Por ejemplo,
este artículo describe el futuro cuando el sistema puede aprender las configuraciones óptimas del servidor de la base de datos, el servidor web y el servidor de aplicaciones, en segundo plano, utilizando el aprendizaje automático. Ni siquiera tiene que implementar ML usted mismo en su propio sistema; definitivamente, uno de sus proveedores podrá hacer esto.
Basado en las posiciones pragmáticas presentadas en este artículo, puede escribir en Java no menos marcos para aprendizaje automático y aprendizaje profundo (trabajando en JRE) que los marcos existentes para la web, el almacenamiento a largo plazo o el análisis XML, ¡solo imagínese! Puede imaginar marcos Java con soporte para
redes neuronales convolucionales (CNN) para implementaciones de visión por computadora de vanguardia, tales como implementaciones de LSTM de redes neuronales recurrentes para conjuntos de datos en serie (que son de importancia clave para los negocios), con las características de ML más avanzadas, como la diferenciación automática y más. Luego, estos marcos ayudarían a implementar y alimentar la próxima generación de sistemas empresariales que podrían integrarse perfectamente con los sistemas Java existentes, utilizando las mismas herramientas: IDE, marcos de prueba, integración continua. Lo más importante, serán escritos y respaldados por nuestra gente. Si eres fanático de Java, ¿no te gusta esa perspectiva?