¿Por qué nadie recomienda JavaScript / Node.js como lenguaje para el aprendizaje automático o el análisis de datos?

(Nota: ver actualización en la parte inferior)

Soporte de biblioteca, documentación, mindhare, etc. Tome Python; las bibliotecas para ML (scikit-learn, NumPy, Theano, etc.) proporcionan más que un soporte más amplio de algoritmos de ML que Node (¡lo cual es importante!); pero también rendimiento. Las bibliotecas de Python están escritas para sumergirse en C / Fortran, y en el caso de Theano / TensorFlow para utilizar la GPU. Numpy admite matemática matricial / vectorial mediante operaciones de “datos múltiples de instrucción única” (SMID) O (1). En Node, debe realizar un bucle en su vector o anidar en bucle su matriz, que es O (n * m). Estas operaciones se ejecutan con mucha frecuencia, por lo que es una optimización crucial. Python, C ++, Matlab, … – sus bibliotecas están construidas para funcionar al rendimiento cayendo al metal.

Luego está “zeitgeist”. El mundo de ML tiene lugar en estos lenguajes, especialmente Python. Es un tren de movimiento rápido, y si no aborda ahora, volará mientras está ajustando su martillo a un tornillo. Las empresas obtienen rápidamente sus bibliotecas en Python / C ++ (por ejemplo, TensorFlow, CNTK). Los MOOC están explotando con cursos en ML + Python (y cada vez más en TensorFlow).

Francamente, Node no sostiene una vela, y me encanta JS; Lo uso para todo: Backend (Node), frontend (React), mobile (React Native) … No hay nada sobre Node en que lo haga inferior a la tarea: los autores de la biblioteca ML podrían escribir sus módulos Node como “extensiones nativas” usando C, LIBSVM, LIBLINEAR, etc. (y vaya, ¡asíncrono brillaría!). Pero aún no lo han hecho, lo que significa que Node tiene mucho para ponerse al día … demasiado .

Debo mencionar: estamos viendo mucho ML en JS con fines de demostración (por ejemplo, brain.js), lo cual es fantástico; pero no lo vas a ver para ML a gran escala. Lo que recomiendo: use Node para su servidor de aplicaciones y externalice sus requisitos de ML a un microservicio de Python a través de RabbitMQ.

Tengo un episodio completo de podcast en ML Languages ​​& Frameworks, que elegir / cuándo. Además, estoy disparando en Python aquí porque supongo que quieres trabajar en la web, según tu afiliación a JS. R, Matlab, Julia, C / C ++ son más populares en las comunidades científicas (fuente).

[ACTUALIZACIÓN 19/08/2017] ¡Hay novedades! Brain.js y otras bibliotecas JS anteriores a 2017 todavía no usan GPU, lo que te hace perder ventaja: el principal argumento de venta de Python. Sin embargo, se han eliminado 3 nuevas bibliotecas JS que usan GPU. KerasJS y TensorFire le permiten escribir sus modelos en Keras / TensorFlow respectivamente (Python) e implementarlos en la web. También, úselos para la inferencia del lado del cliente, ahorrando ciclos de GPU del lado del servidor. Eso está muy bien, pero deeplearn.js de Google te permite escribir, entrenar e implementar tus modelos DL basados ​​en GPU, todo en JS: ¡el santo grial! No estoy seguro sobre el soporte del servidor Node.js, o si es solo WebGL; Tendrás que cavar. Pero las cosas están mejorando para JS.

Mi equipo y yo estamos usando JavaScript para el aprendizaje automático y el análisis de datos. Pero antes de explicar eso, respondamos tu pregunta:

Normalmente no utiliza JavaScript para el aprendizaje automático, simplemente porque no desea “reinventar la rueda”. Hay muchos paquetes de aprendizaje automático disponibles en otros idiomas que puede usar, con un mínimo de líneas de codificación requeridas. Estos paquetes / bibliotecas han sido ampliamente probados y depurados para que no tenga que preocuparse por su corrección. ¡También puede implementar métodos de aprendizaje automático en JavaScript, pero lleva tiempo y tiene que ganar algo! En nuestro caso, lo hacemos.

Hemos estado trabajando en la construcción de un marco de análisis de datos en tiempo real donde nuestros medios para la recopilación de datos son los relojes inteligentes. Se ejecutan en Tizen, pero técnicamente, todo es JavaScript. Después de probar con suficiente cantidad de datos, construimos nuestro modelo predictivo. Más tarde nos dimos cuenta de que al implementar el modelo en relojes inteligentes, podríamos acelerar la rutina de análisis de datos de manera significativa. Nuestro objetivo ha sido el análisis de datos en tiempo real, y al implementar métodos en JavaScript, ¡nos hemos acercado mucho!

La única razón será el soporte de la biblioteca. En R, tiene una amplia gama de bibliotecas para crear modelos utilizando Regresión lineal, Árboles de decisión / Bosques, Redes neuronales, SVM y más. En Python, también tiene bibliotecas como Scikit Learn que cubren muchas de estas. Ambas también tienen algunas bibliotecas que admiten el uso de su GPU para entrenar Deep Belief Networks y otras redes neuronales en una cantidad de tiempo factible. JavaScript simplemente no tiene la misma variedad de bibliotecas, y las que están alrededor (ver Bibliotecas de aprendizaje automático principales para Javascript) generalmente están menos documentadas, con menos libros y tutoriales que las cubran para permitir que otros usen las bibliotecas de manera efectiva. También parecen ser relativamente primitivos en comparación con algunas de las bibliotecas en otros idiomas, ya que no tienen el mismo soporte para GPU o computación en clúster.

Además, incorporado a los lenguajes matemáticos como R y Matlab es la capacidad de trabajar limpiamente con matrices, lo que permite empalmar, subconjunto y manipulación de matrices sin mucha repetitiva. Python tiene NumPy para proporcionar capacidades similares (aunque hay un poco más de una curva de aprendizaje). Que yo sepa, JavaScript no tiene lo mismo. Al cargar datos, naturalmente hay bastantes bibliotecas para cargar varios conjuntos de datos en JavaScript, pero en objetos o matrices multidimensionales en lugar de marcos de datos o tablas de datos o similares que combinan referencias de columnas basadas en nombres con procesamiento y almacenamiento de datos eficientes.

Dicho esto, puede instalar un kernel de JavaScript para que Jupyter tenga el mismo tipo de programación de estilo portátil que prevalece en el análisis de datos basado en Python, solo con JavaScript. Ciertamente, puede aprender sobre Machine Learning mientras utiliza JavaScript, ya que las bibliotecas disponibles cubren algoritmos comunes supervisados ​​y no supervisados. Sin embargo, no es un gran obstáculo para aprender el nivel de Python requerido para comenzar en Machine Learning si ya conoce JS, y siempre es bueno saber más de un idioma para tener una idea de los puntos buenos y malos de los diferentes idiomas. . Ciertamente, será más desafiado por los conceptos de ML en sí mismos que por comprender el código de Python para usar las bibliotecas existentes, y no necesitará desechar su conocimiento específico de la biblioteca a medida que se acerca a las aplicaciones del mundo real. Como resultado, habiendo señalado algunas bibliotecas JS para ML, todavía recomendaría saltar ese pequeño obstáculo que es aprender algo de programación básica de Python y mirar las bibliotecas como Scikit Learn, Numpy, Pandas y quizás también Theano o MXNet.

También estoy comenzando en esta área, más específicamente en redes neuronales profundas. Me hice la misma pregunta, ¿por qué no JavaScript? Puede que no tenga la mejor respuesta, pero esto es lo que he aprendido …

Existen bastantes proyectos para Javascript en la naturaleza. Aunque parece prometedor en general, la mayoría de las bibliotecas que se mencionan a continuación son muy nuevas, experimentales o para conjuntos de datos a pequeña escala y en realidad no están destinadas a la producción (todavía).

.

Recursos y bibliotecas de Javascript ML que he encontrado:

  • josephmisiti / awesome-machine-learning
  • Aprendizaje automático en Javascript: una compilación de recursos
  • convNet.js – Aprendizaje profundo en su navegador (otro ejemplo aquí: Playground, la versión de GPU posiblemente próximamente # 13)
  • https://github.com/transcranial/ … (Ejecutar modelos Keras (backend de tensorflow) en el navegador, con soporte de GPU – la versión de nodejs podría llegar pronto # 32)
  • nodo-tensorflow / nodo-tensorflow (aún no terminado)
  • chaosmail / caffejs (en el aprendizaje profundo del navegador)
  • mysamai / cerebro natural
  • cazala / synaptic
  • Biblioteca flexible de redes neuronales

.

Personalmente elegí ir con Python para ML por las siguientes razones:

  1. La mayoría de las bibliotecas de ML buenas y maduras que he encontrado usan Python. (Tensorflow, scikit-learn, PyBrain, Theano, Pylearn2, Pyevolve, NuPIC, Pattern, Caffe, etc.)
  2. Python es el lenguaje delfacto para los científicos de datos. ¿Por qué Python es un lenguaje de elección para los científicos de datos?
  3. Python ha existido mucho más tiempo que Javascript / node.js, por lo que es mucho más maduro en esta área. Hay muchas más bibliotecas, muchas más guías y la comunidad en torno al tema es enorme.
  4. Javascript solo recientemente ha podido manejar tareas de ML de manera eficiente.
    Hasta hace poco, Javascript se mantenía en navegadores lentos y solo se usaba realmente para “efectos bonitos”. Con es2015,16,17, node.js, el motor V8 y el acceso a la GPU, este no es el caso, pero en comparación con otros idiomas en este campo, ¡es bastante tarde para la fiesta!
  5. Computación paralela y aceleración de GPU. Las mejores bibliotecas que he encontrado utilizan la computación paralela y / o la aceleración de GPU para atravesar grandes cantidades de datos. Si bien parece que esto es posible con javascript / node.js, esta área podría funcionar con un poco de maduración. (paralleljs, waylonflinn / weblas – requiere un navegador, waylonflinn / webnn – requiere un navegador, kashif / node-cuda (no parece que se mantenga: S), mikeseven / node-opencl, etc.)

.

Para resumir, diría que aún es temprano para ML y javascript. Si bien parece que JavaScript es capaz de ML, muchas de las bibliotecas todavía están en su infancia y no son capaces de trabajar con grandes cantidades de datos para fines de producción.

Cuando compara esto con los recursos maduros y la comunidad para, por ejemplo, Python o Java, es mucho más fácil recomendar algo que no sea javascript / node.js.

En mi opinión, aunque es solo una cuestión de tiempo. ¡Javascript está activado o en todo en estos días!

Porque realmente no ofrecen ningún beneficio sobre los idiomas que ya usamos.

node.js está diseñado para crear aplicaciones de red. Eso realmente no tiene nada que ver con ML / DA.

Hay algunos idiomas más utilizados para ML, y todos ofrecen cosas que son muy valiosas:
MATLAB: bibliotecas fácilmente disponibles, operaciones de matriz rápidas y flexibilidad
Python: fácil para la creación de prototipos y es lo suficientemente rápido para la mayoría de las aplicaciones con bibliotecas como NumPy y SciPy
C ++: para un rendimiento muy alto

Yo aprendería Python. Es un lenguaje generalmente muy útil fuera de ML también.

Para ser un desarrollador competente, no puede restringirse a un idioma o 2. Los diferentes trabajos se realizan mejor en diferentes idiomas, y JS no es adecuado para esta aplicación.

¿Puedes hacer algo de ML en JS si REALMENTE quisieras? Seguro. Pero eso es como golpear las uñas con un destornillador. Simplemente haría tu vida mucho más difícil.

Desde que se hizo esta pregunta por primera vez, muchas cosas han cambiado en la comunidad JavaScript (por lo tanto, NodeJS). Estas son cosas que pueden afectar a la mayoría de las personas que no sugieren JavaScript como lenguaje para Machine Learning. Por qué no recomiendan usar JavaScript depende de la disponibilidad de las bibliotecas.

  • Python, C / C ++ y Java son más utilizados en comunidades científicas que realizan investigaciones en algoritmos de inteligencia artificial. En mi conocimiento, JavaScript NO es el lenguaje de la Academia en comparación con las adopciones de Lisp / Java / C / C ++ y Python en varias comunidades científicas. Esa puede ser la razón principal.
  • En el momento de transferir el conocimiento de la Academia al mundo real, los mismos investigadores prefieren usar el lenguaje que ya usaban al perfeccionar sus algoritmos y agrupar bibliotecas principalmente en los idiomas mencionados anteriormente. Algunas compañías como Google y Microsoft, a través de sus departamentos de I + D, traducen esas bibliotecas en los idiomas que usan internamente. Por ejemplo, Go tiene una traducción de Tensorflow [1] ya que Google (la compañía detrás de los avances de Go Lang) proporcionó recursos para hacerlo.
  • Pero las cosas han cambiado cuando comencé a responder esta pregunta. El repositorio josephmisiti / awesome-machine-learning tiene ejemplos de bibliotecas JavaScript utilizadas con cualquiera de las visualizaciones de resultados finales.
  • Puede hacer mucho con JavaScript con bibliotecas como node-ffi / node-ffi (interfaz de función externa de nodo) para interactuar con las bibliotecas C ++ ML. También puede usar NodeJS para usar extensiones C ++ a través de complementos.

Notas al pie

[1] Paquete tensorflow

Normalmente escribiría los motores principales en C / C ++ … Julia, Python, etc … Últimamente, sin embargo, he estado haciendo un desarrollo del servidor (menos) y del lado del cliente para paneles usando Nodo, y decidí probar algunos algos en JavaScript. Los resultados fueron realmente bastante impresionantes. La naturaleza asincrónica de Node y la rápida io hace que realmente “parezca” muy adecuado para problemas que requieren ejecución paralela y asincrónica en una red. (¡Los resultados de ejecutar algos listos para usar en Javascript frente a cualquier idioma son simplemente un aturdimiento mental, dejando la mayor parte de las preguntas, wtf!)

El problema es que Javascript no es el lenguaje de elección para desarrollar bibliotecas de matemáticas, por lo que no lo tocaré por ahora cuando se trata de la parte de cálculo de números de la tubería de ML.

El hecho de que puedo ejecutar Julia dentro de Node sin problemas (pueden compartir los mismos objetos en la memoria sin sobrecarga) significa que puedo conectar el monitoreo en vivo usando patrones reactivos casi sin esfuerzo (nunca he trabajado con Node y otros idiomas, así que no se puede generalizar).

Por lo tanto, guarde el Nodo / JS para administrar y monitorear los procesos, y deje el procesamiento a bibliotecas estándar bien soportadas.

Creo que es hora de volver a examinar esta pregunta, creo que JS nunca se menciona porque, por la falta de una mejor palabra, por la falta de comercialización de las bibliotecas JS y por los intereses creados en las bibliotecas existentes construidas en otros idiomas (Python, R etc …), ya que las personas no siempre quieren reinventar la rueda.

Sin embargo, si los busca, encontrará un trabajo increíble realizado en ese frente:

harthur / cerebro: redes neuronales en JS

ml.js, una colección de herramientas de aprendizaje automático y análisis numérico para Node.js y el navegador

stevenmiller888 / cuenta con una biblioteca flexible de redes neuronales

cazala / synaptic, una biblioteca de red neuronal libre de arquitectura para node.js y el navegador

karpathy / convnetjs Aprendizaje profundo en Javascript, quizás el más desarrollado con muchas demostraciones

Finalmente, me gustaría mencionar el trabajo del departamento de Aprendizaje Automático de la Universidad de Tokio, que ha construido un conjunto completo de bibliotecas para el aprendizaje automático en Javascript: MILJS, han publicado varios trabajos de investigación sobre el tema y afirman ser una de las bibliotecas más rápidas para el cálculo debido al desarrollo de la biblioteca JS más rápida para cálculos matriciales (su reclamo, no el mío) con cálculos en CPU o GPU multinúcleo gracias al uso de Web-CL y la implementación de un cálculo distribuido marco a través de navegadores llamados mil-tokyo / sashimi. De hecho, me sorprende que no hayan recibido más atención, dadas las afirmaciones de rendimiento.

Creo que ML en JS tiene mucho potencial ya que todos tienen un navegador en sus dispositivos, ¡participe!

Actualización: Recientemente hice una presentación sobre el tema, donde doy una visión general de las bibliotecas de aprendizaje automático de hoy (8 de agosto de 2017) en Javascript, ¡disfruten!

Hay una herramienta JS ML alojada llamada PredictScript. Solo hace modelos predictivos de ML, pero oculta todas las complejidades y hace que sea realmente fácil entrenar un modelo simple. Llama a “predecir ()” con las características que desea en su modelo y la “etiqueta ()” para decirle al modelo lo que realmente sucedió.

Solo necesitas una buena biblioteca para ir debajo.

Considere que Python se promociona como bueno para esto, pero solo tiene una biblioteca C ++ bastante buena para SciPi y NumPi.

Sin embargo, hay muchas bibliotecas de C ++ que podría envolver en JavaScript con bastante facilidad. Node.js puede ser una buena puerta de entrada a dicha biblioteca. Pero, la configuración real del proceso podría ser un conjunto de servicios numéricos detrás de un servicio de manejo de solicitudes. La idea de que IO sin bloqueo tiene algo que ver con esto es algo tonto. Obviamente, no desea detener un servicio web ejecutando un servicio numérico largo en el mismo espacio de controlador que el servicio web. Entonces, no los pondrías juntos en el mismo hilo.

¿Puedes lanzar hilos bajo node.js? Sí. Pero, esta será una aplicación C ++. Hay una biblioteca para proporcionar subprocesos de JavaScript, que funciona realmente sincronizando las llamadas con el intérprete. Pero, ¿por qué te saldrías de tu camino para usarlo? Pero, si desea escribir sus scripts numéricos en JavaScript, puede hacerlo. Pero, probablemente sería una buena idea mantener los servicios numéricos como un proceso secundario.

He visto algunas bibliotecas de JavaScript que son frentes para CUDA u OpenGL. Esta suele ser una capa delgada sobre el soporte del navegador, como three.js. Puede haber algunas bibliotecas de node.js que admitan este lado del servidor. Una vez más, el lenguaje JavaScript podría no cubrir todo el alcance de esto, con scripts GL como parte de la mezcla de implementación.

Entonces, ¿pueden los procesos numéricos largos bloquear el proceso en otros idiomas? Sí. Todavía tiene que resolver los problemas del sistema para usar la computación numérica en entornos fluidos.

Por lo tanto, si puede encontrar un buen soporte para un paquete C ++ en JavaScript, puede permanecer dentro de JavaScript para realizar un trabajo numérico. Pero, el lenguaje puede no ser tan cómodo como aquellos diseñados específicamente para el trabajo numérico. Puede implementar una traducción de script a lo largo de las líneas de CoffeeScript para que pueda incluir primitivas matemáticas.

En pocas palabras: porque hay muchos, mucho mejores idiomas disponibles.

Hay Java, Python, C ++, R, Matlab, Julia. JavaScript es el idioma dominante para las aplicaciones de navegador web porque no tiene otra opción. JavaScript es popular en Node debido a la capacidad de Node para manejar cargas de transacciones altas, siempre que las operaciones no sean de bloqueo. Pero lenguajes como Go y Erlang / Elixir eventualmente desplazarán a Node porque tienen una concurrencia muy superior.

Hay bibliotecas de JavaScript que realizan tareas de análisis de datos. Puede realizar análisis estadísticos básicos y algunos algoritmos de aprendizaje automático. Aquí hay una lista completa de las bibliotecas existentes:

Ciencia de datos con JavaScript

Hay mejores herramientas para el trabajo. El nodo es mejor para aplicaciones que requieren un alto rendimiento de E / S. Las aplicaciones ML / DS están más ligadas a la capacidad computacional que las E / S, por lo tanto, Javascript no se adapta bien a la tarea. Además, hay comunidades bien establecidas en torno a otras pilas de herramientas para hacer el trabajo de ML. Mi opinión sobre esto es usar Java o, si te sientes ambicioso, prueba con un lenguaje funcional (escuché que Clojure es bastante bueno para hacer aplicaciones ML / DS).

Como ingeniero de software que ha creado muchos productos y sistemas de back-end, incluido el aprendizaje automático, Javascript no sería mi primera opción para esto. La naturaleza no bloqueante y las devoluciones de llamada no se adaptarían a este tipo de trabajo. Además, ya existen muchas herramientas, extensiones y bibliotecas de ML excelentes que ayudan a Perl, Python y Java.

Node.js es muy adecuado para aplicaciones web de alta E / S, debido a su diseño asincrónico de subproceso único. Yo mismo soy un gran admirador de Node.js, pero sé que no funciona bien para todo tipo de aplicaciones, particularmente aquellas que requieren muchos cálculos, como el caso de ML. Si bien las E / S no bloquean en Node, el cómputo intensivo de CPU no lo es, y Node sería bastante lento para un trabajo ML altamente sofisticado en conjuntos de datos muy grandes.

Python es una opción popular entre los científicos de datos, tiene un gran soporte de biblioteca para ML y es realmente fácil y divertido de aprender. Recomiendo probarlo. Siempre es bueno diversificarse a más idiomas de todos modos (y descubrirá que aprender otro idioma realmente lo ayudará a convertirse en un mejor programador de JS, ya que obtendrá una mejor comprensión de cómo es diferente de otro idioma y qué ventajas / desventajas tiene) tiene). Realmente recomiendo el CS101 de Udacity para aprender Python, y luego la Introducción al aprendizaje automático de Udacity para sumergirme en ML con Python. ¡Ambos cursos son gratis!

Puede ver esta página para obtener recursos sobre Machine Learning usando JavaScript:

josephmisiti / awesome-machine-learning

Supongo que no es muy útil reescribir las bibliotecas en Javascript, ya que puede vincular otras bibliotecas a sus aplicaciones de nodo. Por ejemplo, uno podría construir microservicios en los que la clasificación se realiza utilizando python (scikit-learn) y la representación podría ser realizada por un sistema de nodo js.

Es porque la gente está acostumbrada a usar la API de otra persona en lugar de crear la suya propia. Y Python y R son los primeros en eso, pero si quieres usar algún otro lenguaje, nadie puede detenerte.

Las personas se centran más en usar api en lugar de cómo se implementa, debido a esto podríamos tener problemas en el futuro.

Estoy bastante en posición como tú. He aprendido el ecosistema js y me he adherido a nodejs para la mayoría de las tareas. Pero ahora descubro que los lenguajes como Python son una mejor manera de profundizar en el aprendizaje automático y la inteligencia artificial y descubrí una solución a su problema: EdgeJs es lo que permite ejecutar Python y otros códigos CLR en el proceso de Nodejs. Creo que esto puede consolarte como me hizo

Porque hay poca compatibilidad con la biblioteca para el aprendizaje automático en JS.