Apprentissage automatique en OCaml ou Haskell?

J’espère utiliser Haskell ou OCaml sur un nouveau projet car R est trop lent. Je dois être capable d’utiliser des machines vectory de support, en séparant idéalement chaque exécution pour qu’elle s’exécute en parallèle. Je veux utiliser un langage fonctionnel et j’ai le sentiment que ces deux aspects sont les meilleurs en ce qui concerne la performance et l’élégance (j’aime Clojure, mais ce n’était pas aussi rapide dans un test court). Je me penche vers OCaml, car il semble y avoir plus de soutien pour l’intégration avec d’autres langages, ce qui pourrait être plus adapté à long terme (par exemple, OCaml-R ).

Est-ce que quelqu’un connaît un bon tutoriel pour ce type d’parsing, ou un exemple de code, dans Haskell ou OCaml?

Hal Daume a écrit plusieurs algorithmes d’apprentissage automatique majeurs au cours de son doctorat. (maintenant il est professeur assistant et écanvas montante dans la communauté de l’apprentissage automatique)

Sur sa page Web, il y a un SVM, un arbre de décision simple et une régression logistique tous en OCaml. En lisant ces codes, vous pouvez avoir le sentiment que les modèles d’apprentissage automatique sont implémentés dans OCaml.

Un autre bon exemple d’écriture de modèles d’apprentissage de base est la bibliothèque Owl pour les calculs scientifiques et numériques dans OCaml.

Je voudrais également mentionner F #, un nouveau langage .Net similaire à OCaml. Voici un modèle de graphe factoriel écrit en F # analysant les données de jeu d’échecs. Cette recherche a également une publication de NIPS.

Alors que FP est adapté à la mise en œuvre de modèles de machine learning et de data mining. Mais ce que vous pouvez obtenir ici le plus, ce n’est PAS la performance. Il est vrai que FP prend mieux en charge le calcul parallèle que les langages impératifs, tels que C # ou Java. Mais l’implémentation d’un arbre SVM parallèle, ou arbre de décision, a très peu de rapport avec le langage! Le parallèle est parallèle. Les optimisations numériques derrière l’apprentissage automatique et l’exploration de données sont généralement impératives, leur écriture fonctionnellement pure est généralement difficile et moins efficace. Rendre ces algorithmes sophistiqués parallèles est une tâche très difficile au niveau de l’algorithme, pas au niveau du langage. Si vous voulez exécuter 100 SVM en parallèle, FP vous aide ici. Mais je ne vois pas la difficulté à exécuter 100 libsvm parallel en C ++, sans considérer que le thread unique libsvm est plus efficace qu’un paquet haskell svm mal testé.

Alors, que font les langages FP, comme F #, OCaml, Haskell,?

  1. Facile à tester votre code. Les langages de PF ont généralement un interprète de haut niveau, vous pouvez tester vos fonctions à la volée.

  2. Peu d’états mutables. Cela signifie que passer le même paramètre à une fonction, cette fonction donne toujours le même résultat, donc le débogage est facile dans les PC.

  3. Code est succinct. Inférence de type, correspondance de modèle, fermetures, etc. Vous vous concentrez davantage sur la logique du domaine et moins sur la partie de langage. Ainsi, lorsque vous écrivez le code, votre esprit pense principalement à la logique de programmation elle-même.

  4. Ecrire du code dans les points de repère est amusant.

Le seul problème que je peux voir est que OCaml ne supporte pas vraiment le parallélisme multicœur, alors que GHC a un excellent support et performance. Si vous souhaitez utiliser plusieurs threads d’exécution, sur plusieurs appels, GHC Haskell sera beaucoup plus facile.

Deuxièmement, le Fask Haskell est plus puissant (c’est-à-dire qu’il fait plus avec moins de code) que celui d’OCaml, et d’autres bibliothèques sont disponibles (via Hackage: http://hackage.haskell.org ). être un facteur décisif.

En ce qui concerne l’intégration multilingue, la combinaison de C et de Haskell est extrêmement facile, et je le dis en tant que personne (contrairement à Dons ) qui n’est pas vraiment un expert non plus. Tout autre langage qui s’intègre bien avec C ne devrait pas être beaucoup plus compliqué. vous pouvez toujours vous rabattre sur une couche d’interface mince en C, sinon rien. Pour le meilleur ou pour le pire, C rest la lingua franca de la programmation, donc Haskell est plus que acceptable dans la plupart des cas.

…mais. Vous dites que vous êtes motivé par les problèmes de performance et que vous souhaitez utiliser “un langage fonctionnel”. J’en déduis que vous n’êtes pas familier avec les langues dont vous parlez. Parmi les caractéristiques de Haskell, notons que, par défaut, elle utilise une évaluation non ssortingcte et des structures de données immuables, qui sont à la fois incroyablement utiles à bien des égards, mais que l’optimisation des performances de Haskell est souvent très différente des autres langages. Les instincts ornés peuvent vous induire en erreur. Vous voudrez peut-être parcourir des sujets liés aux performances sur le wiki Haskell pour avoir une idée des problèmes.

Ce qui ne veut pas dire que vous ne pouvez pas faire ce que vous voulez à Haskell – vous le pouvez certainement. La paresse et l’immuabilité peuvent en effet être exploitées pour des bénéfices de performance ( la thèse de Chris Okasaki fournit quelques exemples intéressants). Mais sachez qu’il y aura un peu de temps pour apprendre à gérer les performances.

Haskell et OCaml offrent tous deux les avantages de l’utilisation d’un langage de la famille ML, mais pour la plupart des programmeurs, OCaml est susceptible d’offrir une courbe d’apprentissage plus douce et de meilleurs résultats immédiats.

Il est difficile de donner une réponse définitive à ce sujet. Haskell a les avantages que Don a mentionnés avec un système de type plus puissant et une syntaxe plus propre. OCaml sera plus facile à apprendre si vous venez de presque n’importe quel autre langage (c’est parce que Haskell est aussi fonctionnel que les langages fonctionnels), et travailler avec des structures à access aléatoire mutables peut être un peu compliqué dans Haskell. Vous trouverez également probablement les caractéristiques de performance de votre code OCaml plus intuitives que Haskell en raison de l’évaluation paresseuse d’Haskell.

Vraiment, je vous recommande d’évaluer les deux si vous avez le temps. Voici quelques ressources Haskell pertinentes:

Oh, si vous regardez plus loin dans Haskell, assurez-vous de vous inscrire aux listes Haskell Beginners et Haskell Cafe . La communauté est amicale et désireuse d’aider les nouveaux arrivants (est-ce que mon parti pris montre quelque chose?).

Si la vitesse est votre principale préoccupation, alors optez pour C. Haskell est plutôt une bonne performance, mais vous ne serez jamais aussi rapide que C. À ma connaissance, le seul langage fonctionnel qui a amélioré C dans un benchmark est Stalin Scheme vieux et personne ne sait vraiment comment ça marche.

J’ai écrit des bibliothèques de programmation génétique dans lesquelles les performances étaient essentielles et je les ai écrites dans un style fonctionnel en C. Le style fonctionnel m’a permis de le paralléliser facilement à l’aide d’OMP et de moduler linéairement jusqu’à 8 cœurs dans un même processus. Vous ne pouvez certainement pas faire cela dans OCaml bien que Haskell améliore tout le temps en ce qui concerne la concurrence et le parallélisme.

L’inconvénient de l’utilisation de C était qu’il m’a fallu des mois pour trouver tous les bogues et arrêter les vidages de mémoire, ce qui était extrêmement difficile à cause de la concurrence. Haskell aurait probablement attrapé 90% de ces bugs sur la première compilation.

Donc, la vitesse à tout prix? En y repensant, j’aurais aimé utiliser Haskell car je pouvais le supporter 2 à 3 fois plus lentement si j’avais économisé plus d’un mois en développement.

Alors que Dons a raison de dire que le parallélisme multicœur au niveau du thread est mieux pris en charge par Haskell, il semble que vous puissiez vivre avec le parallélisme au niveau du processus ( séparant idéalement chaque exécution pour qu’elle s’exécute en parallèle ). . Keith a souligné que Haskell avait un système de type plus puissant, mais on peut aussi dire qu’OCaml a un système de modules plus puissant que Haskell.

Comme d’autres l’ont souligné, la courbe d’apprentissage d’OCaml sera inférieure à celle d’Haskell; vous serez probablement plus productif plus rapidement dans OCaml. Cela dit, apprendre OCaml est un grand pas en avant vers l’apprentissage de Haskell, car de nombreux concepts sous-jacents sont très similaires, vous pouvez donc toujours migrer vers Haskell plus tard et y trouver beaucoup de choses. Et comme vous l’avez souligné, il existe un pont OCaml-R.

Comme exemples d’Haskell et d’Ocaml dans l’apprentissage automatique, consultez les pages d’accueil de Hal Daume et Lloyd Allison . IMO est beaucoup plus simple à réaliser que dans Haskell pour obtenir des performances de type C ++ dans Ocaml. Grâce à, comme déjà dit, Haskell a beaucoup plus de communauté (paquets, outils et support), de syntaxe et de fonctionnalités (ex: FFI, monades de probabilité via des classes de types) et de support de programmation parallèle.

Après avoir réorganisé OCaml-R, j’ai quelques commentaires à faire sur l’intégration d’OCaml et de R. Il peut être utile d’utiliser OCaml pour appeler du code R, cela fonctionne, mais ce n’est pas encore tout à fait simple. Donc, l’utiliser pour piloter R vaut la peine. L’intégration de la fonctionnalité R de manière beaucoup plus approfondie est encore lourde car, par exemple, il rest beaucoup à faire pour exporter le système de type R et les données vers OCaml de manière transparente (vous aurez du travail à faire). De plus, l’interaction des GC de R et des GC d’OCaml est un point délicat: vous libérez n valeurs en O (n ^ 2), ce qui n’est pas bien (pour résoudre ce problème, vous avez besoin d’une API R plus flexible) si je comprends bien, ou pour implémenter un GC dans la liaison elle-même comme un grand tableau R pour une interaction correcte entre les GC).

En résumé, je choisirais l’approche «pilote R de OCaml».

Les consortingbutions sur la couche d’interaction GC et sur le mappage des types de données R à OCaml sont les bienvenues.

Vous voudrez peut-être jeter un coup d’oeil à ceci: http://www.haskell.org/pipermail/haskell-cafe/2010-May/077243.html

Réponse tardive, mais une bibliothèque d’apprentissage automatique dans Haskell est disponible ici: https://github.com/mikeizbicki/HLearn

Cette bibliothèque implémente différents algorithmes ML conçus pour avoir une validation croisée beaucoup plus rapide que les implémentations habituelles. Il est basé sur les classificateurs algébriques suivants : une approche générique de la validation croisée rapide, de la formation en ligne et de la formation parallèle . Les auteurs revendiquent une accélération de 400x par rapport à la même tâche dans Weka.