¿Aprendizaje automático en OCaml o Haskell?


Espero usar Haskell u OCaml en un nuevo proyecto porque R es demasiado lento. Necesito poder usar máquinas de soporte vectory, idealmente separando cada ejecución para que se ejecute en paralelo. Quiero usar un lenguaje funcional y tengo la sensación de que estos dos son los mejores en cuanto a rendimiento y elegancia se refiere (me gusta Clojure, pero no fue tan rápido en una prueba corta). Me inclino hacia OCaml porque parece haber más apoyo para la integración con otros por lo que podría ser un mejor ajuste a largo plazo (por ejemplo, OCaml-R ).

¿Alguien conoce un buen tutorial para este tipo de análisis, o un ejemplo de código, en Haskell u OCaml?

Author: griffin, 2010-02-16

10 answers

Hal Daume ha escrito varios algoritmos importantes de aprendizaje automático durante su doctorado (ahora es profesor asistente y estrella en ascenso en la comunidad de aprendizaje automático)

En su página web, hay un SVM, un simple árbol de decisión y una regresión logística todo en OCaml. Al leer estos códigos, puede tener una idea de cómo se implementan los modelos de aprendizaje automático en OCaml.

Otro buen ejemplo de escribir modelos básicos de aprendizaje automático es Owl library para cálculos científicos y numéricos en OCaml.

También me gustaría mencionar F#, un nuevo lenguaje.Net similar a OCaml. Aquí está un modelo de grafo factorial escrito en F# analizando datos de juego de Ajedrez. Esta investigación también tiene una publicación NIPS.

Mientras que FP es adecuado para implementar modelos de aprendizaje automático y minería de datos. Pero lo que más se puede conseguir aquí NO es rendimiento. Es correcto que FP soporte la computación paralela mejor que los lenguajes imperativos, como C# o Java. Pero la implementación de un SVM paralelo, o árbol de decisión, tiene muy poca relación con el lenguaje! Paralelo es paralelo. Las optimizaciones numéricas detrás del aprendizaje automático y la minería de datos son generalmente imperativas, escribirlas funcionalmente es generalmente difícil y menos eficiente. Hacer que estos algoritmos sofisticados sean paralelos es una tarea muy difícil en el nivel de algoritmo, no en el nivel de lenguaje. Si desea ejecutar 100 SVM en paralelo, FP ayuda aquí. Pero no veo la dificultad de ejecutar 100 libsvm paralelo en C++, sin considerar que el libsvm de un solo hilo es más eficiente que un paquete svm de haskell no bien probado.

Entonces, ¿qué dan los lenguajes FP, como F#, OCaml, Haskell?

  1. Fácil de probar su código. Los idiomas FP generalmente tienen un intérprete de nivel superior, puede probar sus funciones sobre la marcha.

  2. Pocos estados mutables. Esto significa que pasar el mismo parámetro a una función, esta función siempre da el mismo resultado, por lo que la depuración es fácil en FPs.

  3. El código es sucinto. Inferencia de tipos, coincidencia de patrones, cierres, etc. Te centras más en la lógica del dominio, y menos en la parte del idioma. Así que cuando escribes el código, tu mente está pensando principalmente en la lógica de programación en sí.

  4. Escribir código en FPs es divertido.

 50
Author: Yin Zhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 08:53:40

El único problema que puedo ver es que OCaml realmente no soporta paralelismo multinúcleo, mientras que GHC tiene un excelente soporte y rendimiento. Si está buscando usar múltiples subprocesos de ejecución, en múltiples llamadas, GHC Haskell será mucho más fácil.

En segundo lugar, el Haskell FFI es más poderoso (es decir, hace más con menos código) que el OCaml, y hay más bibliotecas disponibles (a través de Hackage: http://hackage.haskell.org ) así que no creo que las interfaces extranjeras serán un factor decisivo.

 21
Author: Don Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-15 22:17:28

En cuanto a la integración en varios idiomas, combinar C y Haskell es notablemente fácil, y lo digo como alguien que (a diferencia de dons) no es realmente un experto en ninguno de los dos. Cualquier otro lenguaje que se integre bien con C no debería ser mucho más complicado; siempre puede recurrir a una capa de interfaz delgada en C si nada más. Para bien o para mal, C sigue siendo la lingua franca de programación, por lo que Haskell es más que aceptable para la mayoría de los casos.

...pero. Tú dices estás motivado por problemas de rendimiento y quieres usar "un lenguaje funcional". De esto deduzco que no está familiarizado previamente con los idiomas sobre los que pregunta. Entre las características definitorias de Haskell se encuentran que, por defecto, utiliza evaluación no estricta y estructuras de datos inmutables which que son increíblemente útiles en muchos aspectos,pero también significa que optimizar Haskell para el rendimiento a menudo es dramáticamente diferente de otros lenguajes, y los instintos bien perfeccionados extraviados de maneras desconcertantes. Es posible que desee explorar temas relacionados con el rendimiento en la wiki de Haskell para tener una idea de los problemas.

Lo cual no quiere decir que no puedas hacer lo que quieras en Haskell certainly ciertamente puedes. Tanto la pereza como la inmutabilidad pueden, de hecho, ser explotadas para obtener beneficios de rendimiento (La tesis de Chris Okasaki proporciona algunos buenos ejemplos). Pero tenga en cuenta que habrá un poco de una curva de aprendizaje cuando se trata de lidiar con el rendimiento.

Ambos Haskell y OCaml proporcionan los beneficios encantadores de usar un lenguaje de la familia ML, pero para la mayoría de los programadores, OCaml es probable que ofrezca una curva de aprendizaje más suave y mejores resultados inmediatos.

 15
Author: C. A. McCann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-16 15:30:10

Es difícil dar una respuesta definitiva sobre esto. Haskell tiene las ventajas que Don mencionó junto con tener un sistema de tipos más potente y una sintaxis más limpia. OCaml será más fácil de aprender si vienes de casi cualquier otro idioma (esto se debe a que Haskell es tan funcional como los lenguajes funcionales), y trabajar con estructuras de acceso aleatorio mutables puede ser un poco torpe en Haskell. También es probable que encuentre las características de rendimiento de su código OCaml más intuitivas que Haskell por la evaluación perezosa de Haskell.

Realmente, te recomendaría evaluar ambos si tienes el tiempo. Estos son algunos recursos relevantes de Haskell:

Oh, si se mira más en Haskell asegúrese de registrarse para el Haskell Principiantes y Haskell Cafe listas. La comunidad es amigable y está dispuesta a ayudar a los recién llegados (¿se está mostrando mi sesgo?).

 13
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-16 00:56:42

Si la velocidad es tu principal preocupación, entonces ve por C. Haskell es bastante bueno en cuanto a rendimiento, pero nunca vas a llegar tan rápido como C. Que yo sepa, el único lenguaje funcional que ha mejorado C en un punto de referencia es Stalin Scheme, pero eso es muy antiguo y nadie sabe realmente cómo funciona.

He escrito bibliotecas de programación genética donde el rendimiento era clave y lo escribí en un estilo funcional en C. El estilo funcional me permitió paralelizarlo fácilmente usando OMP y escalas it linealmente hasta 8 núcleos dentro de un solo proceso. Ciertamente no se puede hacer eso en OCaml, aunque Haskell está mejorando todo el tiempo con respecto a la concurrencia y el paralelismo.

La desventaja de usar C fue que me llevó meses encontrar finalmente todos los errores y detener los volcados de núcleo, lo que fue extremadamente difícil debido a la concurrencia. Haskell probablemente habría atrapado el 90% de esos errores en la primera compilación.

Así que la velocidad a cualquier costo ? Mirando hacia atrás desearía haber usado Haskell como podría soportar que sea 2 - 3 veces más lento si hubiera ahorrado más de un mes en tiempo de desarrollo.

 9
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-19 12:24:48

Si bien dons es correcto que el paralelismo multinúcleo en el nivel de subproceso está mejor soportado en Haskell, suena como que podrías vivir con el paralelismo a nivel de proceso (de tu frase: idealmente separando cada ejecución para que se ejecute en paralelo.) que es soportado bastante bien en OCaml. Keith señaló que Haskell tiene un sistema de tipos más potente, pero también se puede decir que OCaml tiene un sistema de módulos más potente que Haskell.

Como otros han señalado, La curva de aprendizaje de OCaml será más baja que la de Haskell; es probable que seas más productivo más rápidamente en OCaml. Dicho esto, aprender OCaml es un gran paso hacia el aprendizaje de Haskell porque muchos de los conceptos subyacentes son muy similares, por lo que siempre puedes migrar a Haskell más tarde y encontrar muchas cosas familiares allí. Y como usted señaló, hay un puente OCaml-R.

 8
Author: aneccodeal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-18 16:50:35

Como ejemplos de Haskell y Ocaml en aprendizaje automático, vea cosas en Hal Daume y Lloyd Allison páginas de inicio. IMO es mucho más sencillo lograr un rendimiento similar al de C++en Ocaml que en Haskell. A través de, como ya se ha dicho, Haskell tiene una comunidad mucho más agradable (paquetes, herramientas y soporte), sintaxis y características (es decir, FFI, mónadas de probabilidad a través de clases de tipo) y soporte de programación paralela.

 6
Author: Cfr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-20 09:59:51

Habiendo renovado OCaml-R, tengo algunos comentarios que hacer sobre la integración de OCaml y R. Podría ser útil usar OCaml para llamar al código R, funciona, pero aún no es exactamente sencillo. Así que usarlo para piloto R es worthwile. Integrar la funcionalidad de R mucho más a fondo sigue siendo engorroso, ya que, por ejemplo, queda mucho por hacer para exportar el sistema de tipos de R y los datos a OCaml de una manera fluida (tendrá trabajo que hacer). Además, la interacción del GC de R y el GC de OCaml es delicada punto: libera n valores en tiempo O (n^2), lo cual no es bueno (para resolver este punto, necesita una API R más flexible, por lo que entiendo, o implementar una GC en el enlace como una gran matriz R para una interacción adecuada entre GCs).

En pocas palabras, me gustaría ir para el "piloto R de OCaml" enfoque.

Las contribuciones sobre la capa de interacción GC y sobre la asignación de tipos de datos R a OCaml son muy bienvenidas.

 6
Author: yziquel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-03 12:02:26
 2
Author: Alp Mestanogullari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-05 12:40:01

Respuesta tardía pero una biblioteca de aprendizaje automático en Haskell está disponible aquí: https://github.com/mikeizbicki/HLearn

Esta biblioteca implementa varios algoritmos de ML que están diseñados para tener una validación cruzada mucho más rápida que las implementaciones habituales. Se basa en el siguiente documento Clasificadores algebraicos: un enfoque genérico para la validación cruzada rápida, formación en línea y formación paralela. Los autores afirman una velocidad 400x en comparación con la misma tarea en Weka.

 1
Author: RUser4512,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-02 10:43:58