아래 코드는 시간차 학습의 구현입니다. 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으로 초기화됩니다.
전체 코드가 표시되지 않으면 디버깅하기가 정말 어렵습니다. 이 주사위 놀이인가? 게임 코드에 이상이없는 것이 확실합니까? 또한, 나는 약간의 우려를 분리했을 것이다. 신경망 코드를 TD 학습 코드와 분리하고 게임 논리 코드를 분리하여 보관합니다. 그런 다음 코드 조각을 별도로 확인할 수도 있습니다. 당신이 벌레가 어디 있는지 전혀 알지 못하는 것 같아요. TD (람다)를 사용하기 전에 TD (0)도 구현했습니다. [Sutton & Barto] http://webdocs.cs.ualberta.ca/~sutton/book/the-book.html을 참조하십시오. 6 장 – oysteijo
이들은 이미 분리되어 있습니다. 나는 2 개의 다른 게임 (체커와 4-in-a-row)을 위해 그것을 사용하고, 나는 게임에 버그가 없다는 것을 확신하게되었다. 게임이 끝나면 updateToNextState 메서드를 호출합니다 (승리의 경우 1,0,0, 실패의 경우 0,1,0, 그리기의 경우 0,0,1). 그렇지 않으면 정상적으로 다음 상태 출력과 함께합니다. 그리고 상태의 현재 값이 무엇인지 알기 위해 네트워크를 업데이트하지 않고 네트워크를 통해 상태 출력을주는 다른 메서드를 호출합니다. – Asqan