1

좋아요, 그렇다면 DeepMind의 Atari 알고리즘과 동일한 아이디어를 사용하여 신경 네트워크 Q-learner를 만들었습니다. (아직)).내 신경망 Q-learner가 tic-tac-toe를 배울 수없는 이유는 무엇입니까

신경망 빌드 : 9-50와

  • 1 은닉층 ("O"를 "X"-1 빈 자리가 0, 1)

    • 9 개 입력 뉴런

    • (8)로 출력한다 (다른 크기, 활성화 함수 S 자형으로 시도)

    • ,536 (모든 행동 1, Q 값, 기동 시그 모이 드 함수를 출력한다)
    • MSE 손실 함수 내가 100 % 확신 네트워크 때문에 그라데이션 점검 및 테스트의 많은 제대로 내장되어있어

  • 아담 backprop.

    Q-매개 변수 : 잃어버린 게임 이동이 이미 자리를 차지하려고 시도하는 경우

  • -1 보상에 대한

    • -1 보상 (예 : X는 플레이어 O 넣어하려고 자리에 이미 그의 "O")에 대한
    • 0 보상
    • 한 보상 원 게임
    • 를위한 터미널 상태로 이어질하지 않는 이동을 위해
    • 0 상을 그립니다
    • 다음 상태 (s, a, r, s ')는 자신과 상대방이 이동 한 후의 상태입니다. 예 : 빈 보드와 플레이어 X는 첫번째 턴을 가지며 "X"를 좌상 구석에 놓습니다. 그런 다음 플레이어 O는 오른쪽 상단 모서리에 "O"를 넣습니다. 그런 다음 s, a, r, s '는 s = [000000000], a = 0, r = 0, s'= [1,0, -

      1,0,0,0,0,0,0]

    문제는 내 모든 Q-값은 내가 주면 -1 보상을 이동이 이미 자리를 차지하려고 할 때 제로로 이동합니다. 내가하지 않으면 네트워크는 이미 점령 된 장소로 이동해서는 안되며 임의의 Q 값을 배우는 것으로 보인다는 것을 알지 못합니다. 또한 내 오류가 줄어들지 않는 것 같습니다. 작동하지 않았다

    솔루션

    • 나는 (0, 0.5, 1), (0, 1)하지만 여전히 배울하지 않았다에 보상을 변경하기 위해 노력했다.

    • 비어있는 상태를 0, O를 0.5, X를 1로 표시하려고했지만 작동하지 않았습니다.

    • 나는 이동이 이루어진 직후에 다음 상태를 제공하려고 시도했지만 도움이되지 않았습니다.

    • 저는 아담과 바닐라 백 소품으로 시도했지만 여전히 같은 결과가 있습니다.

    • 내가 ReLU에 재생 메모리와 확률 그라데이션 하강,하지만 여전히 같은
    • 변경된 시그 모이 드에서 일괄 적으로 시도했지만 도움이되지 않았다. 사물의
    • 모든 종류의 내가 GitHub의에서 지금

    프로젝트 불러올 수 없습니다 주로 때문에 이러한 코드 리팩토링의 모든 추한 코드 https://github.com/Dopet/tic-tac-toe (미안,이는 쉽게 테스트해야했는데 (U를 만든

    • TicTac 클래스는 게임 자체를 가지고 : 알고리즘이 작동하는 경우

    홈페이지 포인트)를 참조하십시오 추상적 인 게임 클래스 템플릿 메소드 패턴)을 노래

  • 신경망 클래스는
  • 블록 및 콤보 클래스는 단지 승리 상황
  • jblas-1.2.4을 만드는 데 사용되는 현재 디렉토리에 MyLogFile.log 호출 된 파일 몇 가지 데이터를 기록합니다. jar에 DoubleMatrix 라이브러리가 포함되어 있습니다.
  • +1

    이 게시는 가능한 한 우수합니다. 문제는 (a) 나는 당신의 접근 방식에있어서 어떤 잘못도 보이지 않는다. (b) 오류를 재현 할 수있는 코드를 제공하지 않았습니다. – Prune

    +0

    프로젝트를 GitHub에 추가했습니다. 불명확 한 것이 있는지 물어보십시오! https://github.com/Dopet/tic-tac-toe – Dope

    +0

    [최소한의 완전하고 검증 가능한 예] (http://stackoverflow.com/help/mcve)가 여기에 적용됩니다. – Prune

    답변

    1

    출력 레이어에서 보상 기능/제거 기능을 사용했습니다. 대부분 [-1, 1]과 출력 레이어 활성화 함수에 대한 보상은 [0, 1]에서 오는 S 자형이었습니다. 이로 인해 출력이 0보다 작을 수 없기 때문에 -1로 보충 할 때 네트워크에 항상 오류가 발생합니다. 이로 인해 값을 0으로 만들었으므로 오류를 수정하려고 시도했지만 수행 할 수 없었습니다.

    0

    제 생각에는 잘못된 표현입니다. NN이 다음 상태에 대해 제공하는 최대 값을 사용하여 상태 값을 업데이트하고 있습니다.

    expectedValue[i] = replay.getReward() + gamma *targetNetwork.forwardPropagate(replay.getNextState()).max();

    이 싱글 플레이어 설정을 사용할 수 있습니다. 하지만 틱택 발가락은 2 인 게임이기 때문에 '다음 국가'(상대방)의 가치가 현재 국가의 가치에 좋지 않습니다.

    최대 2 개 주를 앞으로 (NN을 사용하여 2 개 주를 예측하기 위해) 사용할 수 있지만, 두 번째 이동이 최적이라고 가정하고 잘못된 업데이트가 많이 발생한다고 가정 할 때 잘 작동하지 않습니다. .

    전달 값이 명확하지 않은 설정에는 policy gradients을 사용하는 것이 좋습니다. 이 접근 방식에서는 무작위 게임을합니다 (두 플레이어가 모두 무작위로 움직입니다). 플레이어 'O'가 모든 'O'이동에 긍정적으로이긴다면 (즉, 최종 이동은 더 많은 보상을 얻고 보상은 요인) 및 보상 'X'는 같은 방식으로 부정적으로 움직입니다. 게임 결과가 추첨으로 표시되면 두 플레이어 모두 적은 보상을받을 수 있습니다.

    하위 최적의 움직임을 긍정적으로, 또는 그 반대로 끝낼 수는 있지만 다수의 게임에서 긍정적으로 작용할 수 있습니다.

    +0

    내 다음 상태는 자신과 상대방의 이동 이후 상태이므로 문제가되지 않습니다 (위의 Q 파라미터 섹션 참조). 하지만 실제로이 작업을했습니다. 출력 레이어에서 보상 기능/제거 기능의 문제였습니다. 대부분 [-1, 1]과 출력 레이어 활성화 함수에 대한 보상은 [0, 1]에서 오는 S 자형이었습니다. 출력이 0보다 작아서 -1로 보충 할 때 네트워크에 항상 오류가 발생합니다. 이로 인해 값을 0으로 만들었으므로 오류를 수정하려고 시도했지만 값을 수정할 수 없습니다. – Dope