2010-05-22 2 views
12

저는 Functional Programming에서 초보자입니다.함수 프로그래밍에서의 빅 데이터 구조

나는 수천 개의 뉴런을 가진 거대한 신경망을 가지고 있으며, 뉴런 사이의 모든 연결에는 그 무게가 있습니다. 이 가중치를 학습 세션 당 수천 번 업데이트해야합니다.

FP가 여전히 여기에 적용됩니까? 나는 fp에서 변수를 수정할 수없고 이전 값을 변경하지 않는 새로운 변수 만 반환 할 수 있음을 의미합니다. 이것은 모든 무게 갱신시 전체 네트워크를 다시 만들어야 함을 의미합니까?

답변

18

여기에 FP가 여전히 적용됩니까?

당신은 확실히 괜찮은 점근 적 알고리즘의 효율성과 기능적인 스타일이 쓸 수 있지만 순수 함수형 프로그래밍이 어려운 효율적으로 CPU의 캐시를 사용 할 수 있기 때문에 당신은 10 × 괜찮은 필수 솔루션의 성능을 얻을 가능성이 없습니다.

나는 fp에서 변수를 수정할 수없고 이전 값을 변경하지 않는 새 변수 만 반환 할 수 있음을 의미합니다. 이것은 모든 무게 갱신시 전체 네트워크를 다시 만들어야 함을 의미합니까?

아니오, 두 가지 이유 : 그들은 많은 작은 재귀 적으로 정의 된 구조로 대형 구조물 (예를 들어, 해시 테이블)을 분해하기 때문에

  1. 순수 기능 데이터 구조 (효율적으로 업데이트 할 수 있습니다 예를 들어, 균형 잡힌 바이너리 나무). 변경 불가능한 트리 내에서 단일 노드를 업데이트 할 때 경로의 모든 노드에서 루트까지 데이터를 복사하지만 불변이므로 변경 될 수 없다는 것을 알고 안전하게 참조로 다른 모든 분기를 참조합니다 . O (로그 n) 대신 O (n)가 작동합니다.

  2. 순전히 기능적 데이터 구조는 일반적으로과 같은 기능을 제공하여 모든 요소가 동일한 방식으로 업데이트되고 소스 트리의 구조를 복사하여 재조정을 피할 수 있습니다. 따라서 n 업데이트 시간은 O (n 로그 n) 대신 O (n)가됩니다.

그래서 당신은 유사하거나 동일한 점근 시간 복잡도를 달성 할 수 있어야하지만, 절대적인 측면에서, 당신은 필수 솔루션으로 많은 공간과 시간으로 여러 번 사용하는 것입니다. 나는이 책을 나의 책 Visual F# 2010 for Technical Computing에서 자세히 설명했고 OCaml Journal을 위해 Artificial Intelligence: Neural Networks (8th May 2010)이라는 기사를 썼다.

2

모나드에 변이 형을 포함하는 Haskell arrays을보십시오.

1

가중치 업데이트가 발생할 때마다 전체 네트워크를 다시 만들 필요는 없습니다. 아마도 뉴런은 개별 객체로 모델링됩니다. 즉, 개별 뉴런을 "업데이트"한다는 것은 실제로 업데이트 된 가중치로 새 뉴런을 생성한다는 것을 의미합니다. 그런 다음이 뉴런은 오래된 하나 대신에 네트워크에 삽입 될 것이며, 차례로 가비지 컬렉터에 의해 매립 될 것입니다.

나는 가변 상태를 사용하는 것에 동의하지 않습니다. 함수형 언어는 함수형이므로 함수형 프로그래밍을 최적화합니다. 함수 언어가 실제로 작업을위한 최상의 도구라면, 그 이점을 활용하십시오.

+0

단순한 나무가 있다고 가정 해 보겠습니다. 루트 | \ Node1 Node2 그래서 Node3을 만들고 Node1을 Node3으로 바꾼다면 전체 트리가 변경된다는 의미는 아닌가? –

+0

예제에는 두 가지 문제가 있습니다. 먼저, 귀하의 게시물은 모든 체중 업데이트에 대해 전체 네트워크를 재 작성해야하는지 여부를 묻습니다. "변경"여부가 아닙니다. 내 대답에서이 문제를 해결했습니다. 둘째, 모든 노드에 약간의 변화가있을만큼 작게 만들었습니다. 대신에 1000 개의 노드로 이루어진 네트워크가 있고 그 중 하나만 교체해야한다고 가정 해보십시오. 아직도 나무 전체가 바뀌고 있니? – danben

+0

당신의 말을하지 마십시오 "그러면이 뉴런은 이전 네트워크 대신에 네트워크에 삽입됩니다"라는 것은 신경망이 실제로 변경된다는 것을 의미합니까? 나는 전체의 일부를 대체한다는 것을 의미한다 - 변수의 변화 (이 경우에는 신경망)가 아닌가? –

1

영구 데이터 구조를 사용하여 신경 네트워크를 모델링 할 수있는 방식으로 데이터를 구조화하면 신경 네트워크 기능 업데이트가 저렴합니다 (적어도 전체를 복사하는 것과 비교할 때).

아직 충분히 빠르지 않은 경우 사용자 언어로 속도를 높이기 위해 다른 기술 (예 : 돌연변이주의)을 사용할 수 있습니다. 예를 들어, Clojure를 사용하고 있다면, 과도기를 약간의 속도로 사용할 수 있습니다.