문제

인공 신경망을 사용하여 TIC-TAC-TOE를 재생하고 싶습니다. 네트워크의 구성은 다음과 같습니다. 9 개의 필드 각각에 대해 2 개의 입력 뉴런을 사용합니다. 물론 18 개의 입력 뉴런이 있습니다. 모든 필드에 대해, 나는 플레이어 1의 플레이어 1에 대한 1 개의 입력 뉴런을 가지고 있습니다. 플레이어 2에 대한 1 개의 뉴런이 있습니다. 그 외에도 현재 보드 위치를 평가하는 1 개의 출력 뉴런이 있습니다. 출력 값이 높을수록 플레이어 1의 위치가 더 좋을수록 플레이어 2의 경우 더 좋습니다.

그러나 내 문제는 다음과 같습니다. 어떻게 해당 신경망을 코딩 할 수 있습니까? 내 생각은 입력 뉴런에 배열 [1-18]을 사용하는 것이 었습니다. 이 배열의 값은 입력 가중치입니다. 나는 루프를 사용하여 배열을 걸을 것이다. 활성화 될 뉴런이있을 때마다 출력 값에 무게를 추가합니다. 따라서 출력 값은 활성화 된 입력 뉴런의 가중치의 합입니다.

Output = SUM(ActivatedInputNeurons)

이것이 네트워크를 프로그래밍하는 좋은 방법이라고 생각하십니까? 더 나은 아이디어가 있습니까?

나는 당신이 나를 도울 수 있기를 바랍니다. 미리 감사드립니다!

도움이 되었습니까?

해결책

글쎄, 당신은 18 개의 뉴런의 입력 층과 1 뉴런의 출력 층이 있습니다. 괜찮아. 그러나 신경 그물에 입력을 관계에 넣을 수있는 기회를 제공해야합니다. 이를 위해서는 하나 이상의 중간 층이 필요합니다. 중간 층에 9 개의 뉴런을 사용하도록 제안합니다. 이들 각각은 각 입력 뉴런에 연결되어야하며 출력 뉴런은 각 중간체에 연결되어야합니다. 각각의 연결은 무게를 가지며 각 뉴런은 활성화 수준을 갖는다.

그런 다음 한 번에 모든 뉴런, 층을 겪습니다. 입력 레이어는 보드 상태로 활성화됩니다. 모든 추가 뉴런의 경우, 연결된 모든 연결을 거치고 연결된 뉴런의 활성화 수준과 연결 중량의 산물에 대한 합계. 마지막으로,이 합계에 sigmoid 함수를 적용하여 활성화 수준을 계산합니다.

이것이 작동 원리입니다. 이제 더 나은 결과를 얻으려면이 그물을 훈련시켜야합니다. 이를위한 여러 알고리즘이 있습니다. 인터넷 검색과 독서를해야합니다. 마지막으로, 결과가 충분히 빨리 설득력이 없을 때 뉴런과 층의 수를 조정할 수 있습니다. 예를 들어, 입력 층을 9 개의 뉴런으로 줄이고 O의 경우 x에 대해 +1, -1로 활성화 할 수 있습니다. 아마도 다른 중간 계층을 추가하면 더 나은 결과를 얻거나 층의 뉴런 수를 늘릴 수 있습니다.

다른 팁

나는 당신이 하나의 출력 뉴런에서 보드 상황에 대한 의미있는 요약을 어떻게 얻을 것으로 예상되는지 특별히 이해하지 못합니다. 나는 더보고 싶다 :

    I I I             O O O
    I I I      x      O O O
    I I I             O O O
9 input neurons  9 output neurons

완전히 연결된 네트워크에서, 즉 81 무게. 그런 다음 해당 위치에서 연주하는 상대적 바람직 함을 위해 출력 뉴런을 훈련시킵니다.

내 TIC 프로젝트를 살펴보십시오. 신경망과 유전자 알고리즘 으로이 문제를 해결했습니다. 소스 코드를 자유롭게 사용할 수 있습니다.

http://www.roncemer.com/tic-tac-toe-an-experiment-in-machine-learning

나는 당신이 '전통적'을 구현해야한다고 생각합니다 피드 포워드 앤 전송 기능을 사용하면 역전을 사용하여 훈련 할 수 있습니다. 이들에 대한 코드는 일반적으로 다음과 같은 몇 줄의 코드입니다.

SetupInputs();
for (l = 1 .. layers.count)
    for (i = 0 .. layers[l].count)
        sum = 0
        for (j = 0 .. layers[l-1].count)
            sum += layers[l-1][j] * weights[l-1][j]
        layers[l][i] = TransferFunction(sum)

이것은 AI 코딩을위한 훌륭한 스타터 프로젝트이지만, 완전한 솔루션을 제공하는 것은 그렇게 큰 답을 얻을 수 있습니다.

대부분의 소프트웨어와 마찬가지로 객체 지향 디자인을 사용하는 것이 좋습니다. 예를 들면 : 정의 a Neuron 입력, 가중치 및 출력 기능이있는 클래스. 그런 다음이 중 몇 가지를 만듭니다 Neuron 네트워크를 구축하기 위해 개체.

Wikipedia 기사를 참조하십시오 인공 신경망 좋은 출발점을 위해.

코드와 함께 행운을 빕니다! 많은 재미처럼 들립니다.

질문에 대한 직접적인 답은 아니지만 다음 프레임 워크/도구를 살펴 봐야합니다. snns 또는 그 자바 상대 Javanns. 나는 당신이 당신의 질문에 대한 답을 찾을 것이라고 확신합니다.

가중치를 추가 한 후에는 함수를 사용하여 합계를 정규화해야합니다.

편집하다:

다음은 Java Multilayer Perceptron입니다 몇 년 전에 내가 일한 구현. 이것은 체커에 사용되었지만 입력이 적 으면 체커에도 사용할 수 있습니다.

또한, 당신은 아마도 그것을이기도록 가르치는 방법을 알아 내야 할 것입니다. 그러나 그것은 또 다른 문제입니다.

Fann 또는 Neuroph와 같은 신경망 라이브러리를 사용하면 시간을 절약 할 수 있습니다.

입력을 인코딩하는 한 가지 방법은 9 개의 입력 뉴런입니다. 출력은 또한 9 개의 뉴런이기도합니다. 다른 리플레이에서 볼 수없는 것은 숨겨진 레이어의 크기입니다. 나는 당신이 전통적인 3 층과 함께 MLP를 사용한다고 생각합니다. 숨겨진 층의 크기는 항상 미스터리입니다. 나는 10 개의 숨겨진 뉴런을 시도 할 것입니다.

전송 함수가 sigmoid 인 경우 다음과 같이 입력을 인코딩 할 수 있습니다.

0.0 -O 플레이어.

1.0 -x 플레이어.

0.5- 빈.

ANN의 출력은 9 개의 실수입니다. 이 경우 일부 세포는 이미 점유 될 것입니다. 빈 셀에 해당하는 가장 높은 출력 값을 검색 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top