OCaml 또는 Haskell의 기계 학습?
R이 너무 느리기 때문에 새 프로젝트에서 Haskell 또는 OCaml을 사용하고 싶습니다. 지원 벡터 머신을 사용할 수 있어야합니다. 이상적으로는 각 실행을 분리하여 병렬로 실행할 수 있습니다. 나는 기능적인 언어를 사용하고 싶고 성능과 우아함에 관한 한이 두 가지가 최고라는 느낌이 있습니다 (저는 Clojure를 좋아하지만 짧은 테스트에서는 빠르지 않았습니다). 다른 언어와의 통합에 대한 더 많은 지원이있는 것처럼 보이기 때문에 OCaml에 기대고 있으므로 장기적으로 더 잘 맞을 수 있습니다 (예 : OCaml-R ).
누구든지 Haskell 또는 OCaml에서 이런 종류의 분석에 대한 좋은 자습서 또는 코드 예제를 알고 있습니까?
Hal Daume 은 박사 과정에서 몇 가지 주요 기계 학습 알고리즘을 작성했습니다. (현재 그는 기계 학습 커뮤니티의 조교수이자 떠오르는 스타입니다)
그의 웹 페이지에는 OCaml에 SVM, 간단한 의사 결정 트리 및 로지스틱 회귀가 있습니다. 이 코드를 읽으면 기계 학습 모델이 OCaml에서 구현되는 방식을 느낄 수 있습니다.
기본적인 기계 학습 모델을 작성하는 또 다른 좋은 예는 OCaml에서 과학 및 숫자 계산을위한 Owl 라이브러리 입니다.
OCaml과 유사한 새로운 .Net 언어 인 F #도 언급하고 싶습니다. 다음은 체스 플레이 데이터를 분석하는 F #으로 작성된 요인 그래프 모델 입니다. 이 연구에는 NIPS 간행물도 있습니다.
FP는 기계 학습 및 데이터 마이닝 모델을 구현하는 데 적합합니다. 그러나 여기서 가장 많이 얻을 수있는 것은 성능이 아닙니다. FP가 C # 또는 Java와 같은 명령형 언어보다 병렬 컴퓨팅을 더 잘 지원하는 것은 옳습니다. 그러나 병렬 SVM 또는 의사 결정 트리를 구현하는 것은 언어와 관련이 거의 없습니다! 병렬은 병렬입니다. 기계 학습 및 데이터 마이닝의 수치 최적화는 일반적으로 필수적이며, 순수 기능적으로 작성하는 것은 일반적으로 어렵고 효율성이 떨어집니다. 이러한 정교한 알고리즘을 병렬로 만드는 것은 언어 수준이 아닌 알고리즘 수준에서 매우 어려운 작업입니다. 100 개의 SVM을 병렬로 실행하려면 FP가 도움이됩니다. 그러나 단일 스레드 libsvm이 잘 테스트되지 않은 haskell svm 패키지보다 효율적이라는 점을 고려하지 않고 C ++에서 100 개의 libsvm을 병렬로 실행하는 데 어려움을 느끼지 않습니다.
그렇다면 F #, OCaml, Haskell과 같은 FP 언어는 무엇을 제공합니까?
코드를 테스트하기 쉽습니다. FP 언어에는 일반적으로 최상위 인터프리터가 있으므로 즉시 기능을 테스트 할 수 있습니다.
변경 가능한 상태가 거의 없습니다. 즉, 동일한 매개 변수를 함수에 전달하면이 함수는 항상 동일한 결과를 제공하므로 FP에서 디버깅이 쉽습니다.
코드는 간결합니다. 유형 추론, 패턴 일치, 클로저 등. 도메인 로직에 더 집중하고 언어 부분에 더 집중하지 않습니다. 따라서 코드를 작성할 때 마음은 주로 프로그래밍 논리 자체에 대해 생각합니다.
FP로 코드를 작성하는 것은 재미 있습니다.
내가 볼 수있는 유일한 문제는 OCaml이 실제로 멀티 코어 병렬 처리를 지원하지 않는 반면 GHC는 뛰어난 지원과 성능을 제공한다는 것입니다. 여러 실행 스레드를 사용하려는 경우 여러 호출에서 GHC Haskell이 훨씬 쉽습니다.
둘째, Haskell FFI는 OCaml보다 더 강력하고 (즉, 더 적은 코드로 더 많은 작업을 수행) 더 많은 라이브러리를 사용할 수 있으므로 (Hacksage : http://hackage.haskell.org 를 통해 ) 외국 인터페이스가 결정적인 요소가됩니다.
다국어 통합에 관한 한, C와 Haskell을 결합하는 것은 놀랍도록 쉽습니다. 그리고 저는 ( dons 와는 달리) 어느 쪽에 대해서도 그다지 전문가가 아닌 사람으로서 이것을 말합니다 . C와 잘 통합되는 다른 언어는 그다지 까다로울 수 없습니다. 다른 것이 없다면 항상 C의 얇은 인터페이스 레이어로 돌아갈 수 있습니다. 좋든 나쁘 든 C는 여전히 프로그래밍 의 언어 프랑카 이므로 Haskell은 대부분의 경우에 허용됩니다.
...그러나. 당신은 당신이 성능 문제에 동기를 부여하고 "기능적 언어"를 사용하고 싶다고 말합니다. 이것에서 나는 당신이 이전에 당신이 묻는 언어에 익숙하지 않은 것으로 추측합니다. Haskell의 정의 기능 중 하나는 기본적 으로 엄격하지 않은 평가 와 불변 데이터 구조를 사용한다는 것입니다. 이는 둘 다 여러면에서 매우 유용하지만 성능을 위해 Haskell을 최적화하는 것이 종종 다른 언어와 크게 다르다는 것을 의미합니다. -연마 된 본능은 당신을 당혹스럽게 만들 수 있습니다. 문제에 대한 느낌을 얻기 위해 Haskell wiki에서 성능 관련 주제 를 찾아 볼 수 있습니다 .
Haskell에서 원하는 것을 할 수 없다는 말은 아닙니다. 확실히 할 수 있습니다. 게으름과 불변성은 실제로 성능상의 이점을 위해 악용 될 수 있습니다 ( Chris Okasaki의 논문 은 몇 가지 좋은 예를 제공합니다). 그러나 성능을 다룰 때 약간의 학습 곡선이 있음을 유의하십시오.
Haskell과 OCaml은 모두 ML 계열 언어 사용의 멋진 이점을 제공하지만 대부분의 프로그래머에게 OCaml은보다 부드러운 학습 곡선과 더 나은 즉각적인 결과를 제공 할 것입니다.
이것에 대한 확실한 답을 제공하기는 어렵습니다. Haskell은 Don이 언급 한 장점과 함께 더 강력한 유형 시스템과 더 깨끗한 구문을 가지고 있습니다. OCaml은 거의 모든 다른 언어에서 온다면 배우기가 더 쉬울 것이고 (이는 Haskell이 기능적 언어가 얻는 것과 같은 기능이기 때문입니다), Haskell에서는 가변 랜덤 액세스 구조로 작업하는 것이 약간 어색 할 수 있습니다. 또한 Haskell의 지연 평가로 인해 OCaml 코드의 성능 특성이 Haskell보다 더 직관적임을 알 수 있습니다.
정말 시간이 있다면 둘 다 평가하는 것이 좋습니다. 다음은 관련 Haskell 리소스입니다.
- http://hackage.haskell.org/package/hslibsvm
- http://hackage.haskell.org/package/HSvm
- Real World Haskell : 이것은 Haskell을 위해 무료로 구할 수있는 훌륭한 책입니다.
- 하스켈 배우기 :이 튜토리얼은 읽기에 재미 있습니다
오, Haskell에 대해 더 자세히 살펴보면 Haskell Beginners 및 Haskell Cafe 목록에 등록하십시오. 커뮤니티는 친절하고 신규 이민자를 돕고 싶어합니다 (내 편견이 보이나요?).
속도가 주요 관심사라면 C로 가십시오. Haskell은 성능면에서 꽤 좋지만 C만큼 빠르지는 않을 것입니다. 제가 아는 한 벤치 마크에서 C를 향상시킨 유일한 기능적 언어는 Stalin Scheme이지만 그것은 매우 오래되고 아무도 그것이 어떻게 작동하는지 정말로 모릅니다.
저는 성능이 핵심 인 유전자 프로그래밍 라이브러리를 작성했고 C로 함수 스타일로 작성했습니다. 함수 스타일을 사용하면 OMP를 사용하여 쉽게 병렬화 할 수 있으며 단일 프로세스 내에서 최대 8 개 코어까지 선형으로 확장됩니다. Haskell이 동시성 및 병렬 처리와 관련하여 항상 개선되고 있지만 OCaml에서는 그렇게 할 수 없습니다.
C 사용의 단점은 마침내 모든 버그를 찾아 내고 동시성으로 인해 매우 어려운 코어 덤프를 중지하는 데 몇 달이 걸렸다는 것입니다. Haskell은 아마도 첫 번째 컴파일에서 이러한 버그의 90 %를 잡았을 것입니다.
어떤 대가를 치르더라도 속도? 되돌아 보면 개발 시간을 한 달 이상 절약했다면 2 ~ 3 배 더 느리게 견딜 수 있기 때문에 Haskell을 사용했으면합니다.
Dons는 스레드 수준의 멀티 코어 병렬 처리 가 Haskell에서 더 잘 지원 된다는 것이 정확하지만 OCaml에서 매우 잘 지원되는 프로세스 수준 병렬 처리 (당신의 문구에서 : 이상적으로는 각 실행을 병렬로 실행 분리)로 살 수있는 것처럼 들립니다 . . Keith는 Haskell이 더 강력한 유형 시스템을 가지고 있다고 지적했지만 OCaml이 Haskell보다 더 강력한 모듈 시스템을 가지고 있다고 말할 수도 있습니다.
다른 사람들이 지적했듯이 OCaml의 학습 곡선은 Haskell의 학습 곡선보다 낮을 것입니다. OCaml에서 더 빠르게 생산성을 높일 수 있습니다. 즉, OCaml을 배우는 것은 많은 기본 개념이 매우 유사하기 때문에 Haskell을 배우기위한 훌륭한 디딤돌입니다. 따라서 나중에 Haskell로 마이그레이션하여 익숙한 많은 것을 찾을 수 있습니다. 그리고 당신이 지적했듯이 OCaml-R 다리가 있습니다.
기계 학습에서 Haskell과 Ocaml의 예는 Hal Daume 및 Lloyd Allison 홈페이지 에서 내용을 참조하십시오 . IMO는 Haskell보다 Ocaml에서 C ++와 같은 성능을 달성하는 것이 훨씬 더 간단합니다. 이미 말했듯이 Haskell은 훨씬 더 멋진 커뮤니티 (패키지, 도구 및 지원), 구문 및 기능 (예 : FFI, 유형 클래스를 통한 확률 모나드) 및 병렬 프로그래밍 지원을 제공합니다.
Having revamped OCaml-R, I've got a few comments to make on integrating OCaml and R. It might be worthwile to use OCaml to call R code, it works, but is not yet exactly straightforward. So using it to pilot R is worthwile. Integrating R functionality much more thoroughly is still cumbersome as, for example, much remains to be done to export R's type system and data to OCaml in a seamless way (you will have work to do). Moreover, the interaction of R's GC and OCaml's GC is a delicate point: you free n values in O(n^2) time, which isn't nice (to solve this point, you either need a more flexible R API, as far as I understand it, or to implement a GC in the binding itself as a big R array for proper interaction between GCs).
In a nutshell, I'd go for the "pilot R from OCaml" approach.
Contributions on the GC interaction layer and on mapping R datatypes to OCaml are most welcome.
You may want to take a look at this : http://www.haskell.org/pipermail/haskell-cafe/2010-May/077243.html
Late answer but a machine learning library in Haskell is available here : https://github.com/mikeizbicki/HLearn
This library implements various ML algorithms who are designed to have a much faster cross-validation than the usual implementations. It is based on the following paper Algebraic classifiers: a generic approach to fast cross-validation, online training, and parallel training. The authors claims a 400x speed-up compared to the same task in Weka.
참고URL : https://stackoverflow.com/questions/2268885/machine-learning-in-ocaml-or-haskell
'IT박스' 카테고리의 다른 글
Ruby에서 'Monkey Patching'은 정확히 무엇을 의미합니까? (0) | 2020.11.27 |
---|---|
jQuery 슬라이드가 불안정합니다. (0) | 2020.11.27 |
필요한 경우 URL에 스키마 추가 (0) | 2020.11.27 |
C #에서 세 가지 메서드를 병렬로 실행하는 가장 간단한 방법 (0) | 2020.11.27 |
루비 셀프 키워드 사용? (0) | 2020.11.26 |