Mencionar el “código de producción” en la pregunta significa que la velocidad / rendimiento de ejecución y las escalas son importantes. Supongo que otros criterios de elección, como la disponibilidad de la biblioteca y los desarrolladores, etc., no son importantes aquí.
Por lo tanto, es posible que necesitemos elegir un idioma con la siguiente función para obtener el rendimiento
- Un lenguaje compilado (tipo estático): en general, los lenguajes compilados de tipo estático tardan en compilar el código para producir archivos ejecutables, pero se ejecuta más rápido que el programa escrito en lenguaje de secuencias de comandos de tipo dinámico. La compilación Just in Time (JIT) es otra alternativa. La administración de memoria podría aumentar el rendimiento, pero no es necesario en la programación de ML, ya que agrega más complejidades en el proceso de desarrollo.
- Expresividad: hay una buena cantidad de complejidades involucradas (tanto en términos de estructura de datos como de algoritmos) para escribir un programa de aprendizaje automático. Un lenguaje de paradigma múltiple (OOP + FP + ..) sería mejor. Las características como la sobrecarga del operador, la creación de iteradores, etc. son muy importantes.
- Ejecución en paralelo: utilizar GPU y soporte de múltiples idiomas centrales para ejecución paralela (y concurrente) es una buena característica para incluir en la programación de aprendizaje automático.
Algunos idiomas potenciales (que probé) son
- ¿Es obligatoria la experiencia de aprendizaje automático para conseguir un trabajo con Google? ¿Es realmente un tema importante en las universidades?
- ¿Cuál es el papel de la informática en el aprendizaje automático?
- ¿Qué es un perceptrón?
- Codificación dispersa: ¿cuál es la implementación paso a paso para la codificación dispersa? ¿Qué representa la norma l0 / norma l1 / regularización?
- ¿Cómo debo combinar la retroalimentación implícita y explícita en el filtrado colaborativo?
- Julia
- Capilla: una muy prometedora, pero a menudo me encuentro con dificultades en el proceso de instalación (especialmente en Windows, instancia de Linux vm en Google Compute Engine)
- Nim: potencialmente una buena pero limitada compatibilidad con la biblioteca en este momento. Recursos limitados para aprender el idioma.
- Cristal: Característica completa, sintaxis similar a Ruby. Biblioteca y documentación limitadas. No hay soporte para subprocesos múltiples todavía. Todavía no está disponible para Windows
- Scala: Java + FP. Demasiadas funciones Compilado en código Java Byte.
- Swift: biblioteca Grand Central Dispatch (que se adapta bien a los sistemas Apple) para ejecución paralela.
- Ir: fácil pero faltan muchas funciones: sobrecarga, genéricos, etc. Muy bueno para tareas / aplicaciones específicas, pero no para el desarrollo de la biblioteca debido a la falta de funciones.
- C ++, Rust: complejidad añadida debido a la gestión de memoria
Ningún idioma es perfecto para el aprendizaje automático. En mi opinión, Julia o Chapel tiene un buen potencial para ser utilizado en la producción. Nim, Crystal son buenos. Ir también es una buena opción a pesar de la falta de características (a diferencia del desarrollo de la biblioteca, el desarrollo de aplicaciones requiere generalización ocasionalmente).