Машинное обучение в OCaml или Haskell? - PullRequest
62 голосов
/ 16 февраля 2010

Я надеюсь использовать Haskell или OCaml в новом проекте, потому что R слишком медленный. Мне нужно иметь возможность использовать машины векторов поддержки, идеально выделяя каждое выполнение для параллельной работы. Я хочу использовать функциональный язык, и у меня есть ощущение, что эти два являются лучшими в плане производительности и элегантности (мне нравится Clojure, но в коротком тесте это было не так быстро). Я склоняюсь к OCaml, потому что, как представляется, больше поддержки интеграции с другими языками, поэтому он может быть лучше в долгосрочной перспективе (например, OCaml-R ).

Кто-нибудь знает хороший учебник для такого анализа или пример кода на Haskell или OCaml?

Ответы [ 10 ]

52 голосов
/ 22 февраля 2010

Хэл Дауме написал несколько основных алгоритмов машинного обучения во время своей кандидатской диссертации. (сейчас он доцент и восходящая звезда в сообществе машинного обучения)

На его веб-странице в OCaml есть SVM, простое дерево решений и логистическая регрессия. Читая этот код, вы можете почувствовать, как модели машинного обучения реализованы в OCaml.

Другим хорошим примером написания базовых моделей машинного обучения является Библиотека сов для научных и численных расчетов в OCaml.

Я также хотел бы упомянуть F #, новый язык .Net, похожий на OCaml. Вот модель факторного графа , написанная на F #, анализирующая данные игры в шахматы. Это исследование также имеет публикацию NIPS.

В то время как FP подходит для реализации моделей машинного обучения и интеллектуального анализа данных. Но то, что вы можете получить здесь больше всего, это НЕ производительность. Это правда, что FP поддерживает параллельные вычисления лучше, чем императивные языки, такие как C # или Java. Но реализация параллельного SVM или дерева решений имеет очень мало общего с языком! Параллель есть параллель. Численная оптимизация машинного обучения и интеллектуального анализа данных, как правило, обязательна, писать их чисто функционально, как правило, сложно и менее эффективно. Создание параллельных этих сложных алгоритмов - очень сложная задача на уровне алгоритма, а не на уровне языка. Если вы хотите запустить 100 SVM параллельно, FP поможет здесь. Но я не вижу трудности в запуске 100 libsvm параллельно в C ++, не считая того, что однопотоковый libsvm более эффективен, чем плохо протестированный пакет haskell svm.

Тогда что дают языки FP, такие как F #, OCaml, Haskell?

  1. Легко проверить ваш код. Языки FP обычно имеют интерпретатора верхнего уровня, вы можете проверить свои функции на лету.

  2. Несколько изменяемых состояний. Это означает, что, передавая один и тот же параметр функции, эта функция всегда дает один и тот же результат, поэтому отладка в FP проста.

  3. Код лаконичен. Вывод типа, сопоставление с образцом, замыкания и т. Д. Вы больше сосредоточены на логике домена, а не на языковой части. Поэтому, когда вы пишете код, ваш разум в основном думает о самой логике программирования.

  4. Написание кода в FP - это весело.

22 голосов
/ 16 февраля 2010

Единственная проблема, которую я вижу, состоит в том, что OCaml на самом деле не поддерживает многоядерный параллелизм, в то время как GHC имеет отличную поддержку и производительность.Если вы хотите использовать несколько потоков выполнения, для нескольких вызовов GHC Haskell будет намного проще.

Во-вторых, Haskell FFI более мощный (то есть он делает больше при меньшем количестве кода)OCaml и другие библиотеки доступны (через Hackage: http://hackage.haskell.org), поэтому я не думаю, что сторонние интерфейсы будут решающим фактором.

15 голосов
/ 16 февраля 2010

Что касается многоязыковой интеграции, объединение C и Haskell на удивление легко, и я говорю это как человек, который (в отличие от dons ) на самом деле не слишком опытный эксперт. Любой другой язык, который хорошо интегрируется с C, не должен быть намного хитрее; вы всегда можете вернуться к тонкому слою интерфейса в C, если ничего больше. К лучшему или к худшему, C по-прежнему является языком программирования lingua franca , поэтому Haskell более чем приемлем для большинства случаев.

... но. Вы говорите, что мотивированы проблемами с производительностью и хотите использовать «функциональный язык». Из этого я делаю вывод, что вы ранее не знакомы с языками, о которых спрашиваете. Среди определяющих особенностей Haskell является то, что он по умолчанию использует нестрогая оценка и неизменяемые структуры данных - которые невероятно полезны во многих отношениях, но это также означает, что оптимизация Haskell потому что производительность часто резко отличается от других языков, а отточенные инстинкты могут сбить вас с толку непонятными способами. Возможно, вы захотите просмотреть темы, связанные с производительностью, на вики Haskell , чтобы получить представление о проблемах.

Это не означает, что вы не можете делать то, что хотите в Хаскеле - вы, конечно, можете. На самом деле, и лень, и неизменность могут быть использованы для повышения производительности ( тезис Криса Окасаки дает несколько хороших примеров). Но имейте в виду, что когда дело доходит до работы, будет немного кривой обучения.

И Haskell, и OCaml предоставляют прекрасные преимущества использования языка семейства ML, но для большинства программистов OCaml, вероятно, предложит более мягкую кривую обучения и лучшие немедленные результаты.

13 голосов
/ 16 февраля 2010

Трудно дать однозначный ответ на этот вопрос. У Haskell есть преимущества, о которых упоминал Дон, а также более мощная система типов и более чистый синтаксис. OCaml будет легче выучить, если вы будете использовать практически любой другой язык (это потому, что Haskell функционирует так же, как функциональные языки), а работа с изменчивыми структурами произвольного доступа может быть немного неудобной в Haskell. Вы также, вероятно, найдете характеристики производительности своего кода OCaml более интуитивно понятными, чем Haskell, из-за ленивой оценки Haskell.

Действительно, я бы порекомендовал вам оценить оба, если у вас есть время. Вот некоторые важные ресурсы Haskell:

О, если вы загляните дальше в Haskell, обязательно подпишитесь на списки Haskell Beginners и Haskell Cafe . Сообщество дружелюбно и готово помочь новичкам (мой уклон показывает?).

9 голосов
/ 19 мая 2010

Если скорость - ваша главная задача, тогда выбирайте C. Haskell довольно хорош с точки зрения производительности, но вы никогда не достигнете такой же высокой скорости, как C. Насколько мне известно, единственным функциональным языком, который улучшил C в эталоне, является схема Сталина, но это очень старо, и никто не знает, как это работает.

Я написал библиотеки генетического программирования, где производительность была ключевой, и я написал это в функциональном стиле на C. Функциональный стиль позволил мне легко распараллелить его, используя OMP, и он линейно масштабируется до 8 ядер в одном процессе. Вы, конечно, не можете сделать это в OCaml, хотя Haskell все время совершенствуется в отношении параллелизма и параллелизма.

Недостатком использования C было то, что мне потребовались месяцы, чтобы, наконец, найти все ошибки и остановить дампы ядра, что было чрезвычайно сложно из-за параллелизма. Haskell, вероятно, поймал бы 90% этих ошибок в первой компиляции.

Так, скорость любой ценой? Оглядываясь назад, я бы хотел использовать Haskell, поскольку я мог бы выдержать его в 2–3 раза медленнее, если бы сэкономил больше месяца на разработке.

8 голосов
/ 18 февраля 2010

Хотя Донс и прав, что многоядерный параллелизм на уровне потоков лучше поддерживается в Haskell, похоже, вы могли бы жить с параллелизмом на уровне процессов (из вашей фразы: , идеально выделяя каждое выполнение работать параллельно .), что довольно хорошо поддерживается в OCaml. Кит отметил, что Haskell имеет более мощную систему типов, но также можно сказать, что OCaml имеет более мощную модульную систему, чем Haskell.

Как уже отмечали другие, кривая обучения OCaml будет ниже, чем у Хаскелла; Скорее всего, вы будете быстрее работать в OCaml. Тем не менее, изучение OCaml является отличной отправной точкой в ​​изучении Haskell, потому что многие базовые концепции очень похожи, поэтому вы всегда можете перейти на Haskell позже и найти там много знакомого. И, как вы указали, существует мост OCaml-R.

6 голосов
/ 03 мая 2010

Обновив OCaml-R, у меня есть несколько замечаний по интеграции OCaml и R. Возможно, стоит использовать OCaml для вызова кода R, это работает, но пока не совсем просто. Так что использовать его для пилотирования R стоит. Более тщательная интеграция функциональности R по-прежнему обременительна, так как, например, многое еще предстоит сделать для беспрепятственного экспорта системы типов R и данных в OCaml (у вас будет много работы). Более того, взаимодействие RC GC и OCaml GC является деликатным моментом: вы освобождаете n значений за O (n ^ 2) времени, что нехорошо (для решения этой проблемы вам либо нужен более гибкий R API, насколько это возможно). насколько я понимаю, или реализовать GC в самой привязке как большой массив R для правильного взаимодействия между GC).

В двух словах, я бы выбрал подход "пилот R из OCaml".

Вклады в слой взаимодействия ГХ и в отображение типов данных R в OCaml приветствуются.

6 голосов
/ 19 февраля 2010

В качестве примеров использования Haskell и Ocaml в машинном обучении см. Домашние страницы Hal Daume и Lloyd Allison . IMO, гораздо проще достичь C ++ - подобной производительности в Ocaml, чем в Haskell. Благодаря, как уже было сказано, Haskell имеет гораздо более приятное сообщество (пакеты, инструменты и поддержку), синтаксис и функции (например, FFI, вероятностные монады через классы типов) и поддержку параллельного программирования.

2 голосов
/ 05 мая 2010

Вы можете взглянуть на это: http://www.haskell.org/pipermail/haskell-cafe/2010-May/077243.html

1 голос
/ 02 марта 2016

Поздний ответ, но библиотека машинного обучения на Хаскеле доступна здесь: https://github.com/mikeizbicki/HLearn

Эта библиотека реализует различные алгоритмы ML, которые разработаны так, чтобы иметь намного более быструю перекрестную проверку, чем обычные реализации. Он основан на следующей статье Алгебраические классификаторы: общий подход к быстрой перекрестной проверке, онлайн-обучение и параллельное обучение . Авторы заявляют об ускорении в 400 раз по сравнению с той же задачей в Weka.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...