2011-02-19 4 views
8

현재 신경망을 최적화하기 위해 유전자 알고리즘을 사용하는 프로젝트를 진행하고 있습니다. 나는 이것이 아마도 최적화 할 수있는 최선의 방법이 아니라는 것을 알고 있지만 두 가지를 처음 접했을 뿐이 기 때문에 사용하려고했습니다.신경망을위한 유전자 알고리즘 사용

내 계획은 다음과 같습니다 (변경 될 수 있음, 많이). 내 입력 뉴런은 거의 양수를 가질 수있는 데이터 세트를 사용합니다 (소수점 두 자리까지 포함하여 실제로는 부동 소수점 숫자가 될 수 있음). 0에서 20000 사이의 값을 가질 가능성이 가장 높습니다. 숫자는 얼마나 큰가보다는 가치가 서로 비교되며, 먼저 입력되는 모든 값 중에서 가장 큰 수로 나뉩니다. 그들은 숨겨진 레이어로 이동하기 전에 가중치 (양수 또는 음수 부동 소수점)로 곱해집니다. 숨겨진 레이어의 각 뉴런은 계산이 완료 될 때까지 모든 입력을 합산합니다. 그런 다음 물류 기능을 통해 실행되어 출력됩니다.

내 환경은 Visual Studio C++ 2010 Express이고 clr을 사용하고 있습니다.

내 문제는 유전자 알고리즘과 작동 방식에 있습니다. 그것은 무게를 조절하는 것입니다. 내 문제는 무작위로 가중치 (변이 비율) 중 하나에서 비트를 임의로 변경하면 가중치를 매우 높게 또는 낮게 만들 수있어 입력에 곱하여 다른 값을 더할 때 오버플로 또는 다른 오류가 발생할 수 있다는 것입니다. 나는 나의 염색체를 어떻게 구성 할 것인지 잘 모른다. 그래서 무작위로 비트가 아닌 선택 가중치로 무작위 추출을 수행하고이를 정의 된 범위 내에서 임의의 숫자로 변경하는 것이 더 좋을까요? 기본적으로 성능을 유지하면서 값을 너무 크게 또는 작게 만드는 경우 오류를 발생시키지 않고 구성하는 방법에 대한 제안을 찾고 있습니다.

감사합니다, (미안이 이론 컴퓨터 과학에 있어야하는 경우,하지만 난 거기에 맞지 않는 것이라고 생각) 신경망 (앤스)를 최적화 할 어렵기로 악명이 있고, 유전자 알고리즘

+0

세부 정보는 기억이 나지 않지만이 책의 내용은 다음과 같습니다. http://www.amazon.com/Techniques-Programming-Premier-Press-Development/dp/193184108X, 저자는 당신이 묘사하는 것을 꽤 많이합니다. 즉, 신경 회로망을 최적화하기 위해 유 전적으로 변형 된 가중치를 사용합니다. –

+0

당신이 생각해내는 해결책과 더 일반적인 과정 (아마도 비 신경적 과정) 사이의 성능 비교를 보는 것은 흥미로울 것입니다. – Predictor

답변

6

(인공를) (GA)는 그렇게하기위한 합리적으로 좋은 접근법입니다 (주로 모든 것이 잘 작동하는 데있어 매우 제한적이기 때문에). 물론 잘 작동하는 대안도 있지만, 프로그램과 조정이 더 복잡하고 미묘합니다 (시뮬레이트 된 어닐링 및 학습 기세와 함께 역 전파). 그리고 당신이이 프로젝트를 주로하고 있다는 것을 이해합니다.

진화 신경 조절기 (ENC)를 보길 원할 것입니다. 유전자 알고리즘 (진화론 적 알고리즘)이 복잡한 탐색 작업을 위해 ANN을 학습하는 데 사용되는 분야입니다 (예 : 행성 간 우주 임무는 응용 프로그램 중 하나입니다. 그 중 개인적으로 연구를했다).

ANN 부분에 대해서는 물류 기능에 국한하지 말 것을 제안합니다. (Sigmoid는 생물학적 뉴런에서 영감을 얻었으나 항상 최고라고 할 수는 없습니다.) 다른 많은 기능도 존재합니다. 물류 기능은 역 전파를 훨씬 빠르고 간단하게하기 때문에 부분적으로 사용됩니다. 그러나 Radial-Basis 함수는 놀라운 기능을 수행합니다 (IMO 및 내가 본 것으로부터 ANN의 가장 성공적인 응용 프로그램은 RBF-NN과 같은 Radial-Basis 함수를 사용했습니다). 일반적으로 사람들은 가우스 함수, 하이퍼 구형 함수 및 매우 자주 삼각형 함수 (ANN의 다른 거대한 클래스 인 퍼지 네트워크라고 함)를 사용합니다.

GA의 경우 언급 한 이유로 돌연변이 유형 (즉, 플립 비트)을 권장하지 않습니다. 사람들은 실제 유전자를 다루는 경우 이런 돌연변이를 사용하지 않습니다. 하나의 아주 쉬운 돌연변이 방법은 개체를 돌연변이로 결정한 다음 (임의의 확률로) 돌연변이 될 유전자의 한 요소를 선택한 다음 난수 생성기 (rand())를 사용하여 대체 할 새 유전자 요소를 간단히 생성하는 것입니다. .이를 통해 생성 된 유전자 요소의 크기를 제한하여 개개인이 퇴화되는 문제를 피할 수 있습니다 (즉, 완전히 잘못된 유전자 요소로 인해 전체 개체를 쓸모 없게 만들 수 있음). 유전자는 무엇입니까? 음, ANN의 경우 일반적으로 그물에있는 모든 뉴런의 모든 가중치를 포함하는 큰 벡터입니다. 뉴런 수가 너무 많으면 사람들이 GA를 거의 사용하지 않는다고 추측 할 수 있습니다. 재생산을 위해 개인을 선발하기 위해 Tournament Selection을 사용할 것을 권장합니다. 교차 (예 : 두 부모를 섞어 아이를 낳기)에 관해서는, 가중치의 순서를 유지하고 부모 중 한 명으로부터 무작위로 동일한 확률로 가중치를 어린이의 각 요소에 대해 선택하십시오.

나는 개인적으로 위에서 설명한 것을 수행했으며 특정 문제 (축소 된 크기 및 높은 복잡성, 즉 명확한 최적의 솔루션 없음)에 대해서는 매우 잘 작동합니다.

마지막으로 쉽게 작동 할 것이라고 기대하지 마십시오. 일반적으로 인구 규모와 세대 수는 예상했던 것보다 훨씬 높습니다 (결국 진화는 매우 느린 과정입니다!). 따라서 10 명의 개인을 고용하여 50 세대 동안 실행하지 마십시오. 슬프게도 "오하이오는 작동하지 않습니다 ..."라고 말합니다. 당연히 적용되는 문제의 규모에 따라 인구 수천 명과 수천에서 수천 세대의 순서로 더 시도하십시오.

+0

나는 네가하는 말을 많이 이해하고 매우 정교한 대답에 감사하지만 질문이있다. 난수 생성과 관련하여 정수 (.net, 표준 C 라이브러리, 부스트 등)가 아닌 소수 자리를 포함한 범위 내에서 부동 소수점 난수를 생성하는 최상의 임의 생성기는 무엇입니까? – contrapsych

+0

Boost.Random은 "정교한"솔루션입니다. 하지만 가장 쉬운 방법은'double num = (rand() % 10000) * 0.001; '과 같은 rand()의 수식을 사용하는 것입니다. 소수점 이하 자릿수가 0.001에서 0에서 10 사이의 숫자가 생성됩니다. 그것만큼이나 간단합니다. 그러나 통계 및 확률 분포 함수에 대해 약간의 배경 지식이 있다면 Boost.Random이 조금 더 우아 할 수 있습니다. –

3

당신의 문제는 염색체 표현에 있습니다. 해밍 클리프 문제으로 알려져 있습니다. 해밍 클리프 (Hamming Cliff) 문제가없는 염색체 표현에 Gray Code을 사용할 수 있습니다.

+0

어, 자세히 설명해 주시겠습니까? "회색 코드"가 ANN 또는 GA와 어떻게 관련되는지 이해하지 못했습니다 ... –

관련 문제