0

아래 코드는 시간차 학습의 구현입니다. TD 알고리즘을 사용하는 에이전트는 게임을하기 위해 mini-max 절차를 사용하는 에이전트에 대해 75 만 건 이상의 게임을하지만, 문제는 TD 에이전트가 배우지 못한다는 것입니다.이 구현에있어 잘못된 점은 무엇입니까?Java에서 시간차 학습의 구현

에이전트가 다음 이동을 선택할 때 updateToNextState가 호출됩니다.

public void updateToNextState(int[] currentState, double[] nextStateOutput) { 
    double[] outputOfNext = nextStateOutput; 
    double[] outputOfCurrent = getOutput(currentState); 
    double[] error = getDifferenceOfOutputs(outputOfNext, outputOfCurrent); 

    lastHandledState = currentState; 

    for (int j = 0; j < layers[HIDDEN].neurons.length; j++) { 

     for (int k = 0; k < layers[OUTPUT].neurons.length; k++) { 

      double toBeUpdatedValueForJToK = BETA * error[k] 
        * eligibilityTraces.getEjk(j, k); 
      layers[HIDDEN].neurons[j].updateWeightToNeuron(
        layers[OUTPUT].neurons[k].getNeuronId(), 
        toBeUpdatedValueForJToK); 

      for (int i = 0; i < layers[INPUT].neurons.length; i++) { 

       double toBeUpdatedValueForIToJ = ALPHA * error[k] 
         * eligibilityTraces.getEijk(i, j, k); 

       layers[INPUT].neurons[i].updateWeightToNeuron(
         layers[HIDDEN].neurons[j].getNeuronId(), 
         toBeUpdatedValueForIToJ); 

      } 

     } 
    } 

    updateEligibilityTraces(currentState); 
} 



private void updateEligibilityTraces(int[] currentState) { 
    // to ensure that the values in neurons are originated from current 
    // state 
    feedForward(currentState); 
    for (int j = 0; j < layers[HIDDEN].neurons.length; j++) { 
     for (int k = 0; k < layers[OUTPUT].neurons.length; k++) { 

      double toBeUpdatedValueForJK = gradient(layers[OUTPUT].neurons[k]) 
        * layers[HIDDEN].neurons[j].output; 
      eligibilityTraces.updateEjk(j, k, toBeUpdatedValueForJK); 
      for (int i = 0; i < layers[INPUT].neurons.length; i++) { 
       double toBeUpdatedValueForIJK = gradient(layers[OUTPUT].neurons[k]) 
         * gradient(layers[HIDDEN].neurons[j]) 
         * layers[INPUT].neurons[i].output 
         * layers[HIDDEN].neurons[j] 
           .getWeightToNeuron(layers[OUTPUT].neurons[k] 
             .getNeuronId()); 
       eligibilityTraces.updateEijk(i, j, k, 
         toBeUpdatedValueForIJK); 
      } 
     } 
    } 
} 


private double gradient(Neuron neuron) { 
    return neuron.output * (1 - neuron.output); 
} 


    public void updateToNextWhenOpponentEndsGame(double[] outputOfEndState) { 

    updateToNextState(lastHandledState, outputOfEndState); 

} 


    private double[] getDifferenceOfOutputs(double[] outputNext, 
     double[] outputCurrent) { 
    double[] differencesVector = new double[outputNext.length]; 

    for (int i = 0; i < outputNext.length; i++) { 
     double difference = outputNext[i] - outputCurrent[i]; 
      differencesVector[i] = difference; 

    } 

    return differencesVector; 
} 

나는 가이드 라인으로 this link을 사용했다. 나는 ALPHA & 베타, 숨겨진 뉴런의 양에 대해 다른 값을 시도했습니다. 적격성 흔적은 0으로 초기화됩니다.

+2

전체 코드가 표시되지 않으면 디버깅하기가 정말 어렵습니다. 이 주사위 놀이인가? 게임 코드에 이상이없는 것이 확실합니까? 또한, 나는 약간의 우려를 분리했을 것이다. 신경망 코드를 TD 학습 코드와 분리하고 게임 논리 코드를 분리하여 보관합니다. 그런 다음 코드 조각을 별도로 확인할 수도 있습니다. 당신이 벌레가 어디 있는지 전혀 알지 못하는 것 같아요. TD (람다)를 사용하기 전에 TD (0)도 구현했습니다. [Sutton & Barto] http://webdocs.cs.ualberta.ca/~sutton/book/the-book.html을 참조하십시오. 6 장 – oysteijo

+0

이들은 이미 분리되어 있습니다. 나는 2 개의 다른 게임 (체커와 4-in-a-row)을 위해 그것을 사용하고, 나는 게임에 버그가 없다는 것을 확신하게되었다. 게임이 끝나면 updateToNextState 메서드를 호출합니다 (승리의 경우 1,0,0, 실패의 경우 0,1,0, 그리기의 경우 0,0,1). 그렇지 않으면 정상적으로 다음 상태 출력과 함께합니다. 그리고 상태의 현재 값이 무엇인지 알기 위해 네트워크를 업데이트하지 않고 네트워크를 통해 상태 출력을주는 다른 메서드를 호출합니다. – Asqan

답변

0

문제는 주로 신경망 함수 근사를 조정할 수 없다는 것과 "학습하지 못한다"라고 가정 할 수있는 것에서 알고리즘이 수렴하지 않는다는 것을 의미합니다.

TD와 NN을 함께 사용하면 이런 현상이 발생합니다. 그리고 이전에 이런 일이 있었고, 오랫동안 그것을 찾았습니다. 리처드 서튼에 따르면

: 기능 approximators로 신경 회로망을 사용하지 마십시오 정확히을 알지 못한다면, 함께 TD 방법과 어떻게 조정할 신경망에 내가 배운 교훈은 다음과 같다. 그렇지 않으면 많은 문제가 발생할 것입니다.

그것에 대해 자세히 알아 보려면 Sutton의 이야기를 YouTube에서 찾으십시오.