TD(Temporal Difference Learning) 예제

시간차 학습(TD)은 에이전트가 한 스텝 이동할 때마다 다음 상태의 보상과 예측된 가치를 바탕으로 현재 상태의 가치를 바로 갱신하는 방식이다. 간단한 예제를 통해 이 과정을 직접 확인해보자.

import numpy as np
import random
 
# (1) 상태 정의 및 인덱스 매핑
states = ['S', 'R1', 'R2', 'R3', 'F']
state_to_index = {s: i for i, s in enumerate(states)}
V = np.zeros(len(states))  # 상태 가치 초기화
 
# (2) 가능한 모든 경로 정의 (상태쌍과 보상 포함)
paths = [
    [('S', 'R1', 0), ('R1', 'R3', 0), ('R3', 'F', 1)],       # 경로 1
    [('S', 'R1', 0), ('R1', 'F', 1)],                        # 경로 2
    [('S', 'R2', 0), ('R2', 'R3', 0), ('R3', 'F', 1)],       # 경로 3
    [('S', 'R2', 0), ('R2', 'F', 1)],                        # 경로 4
    [('S', 'R1', 0), ('R1', 'R2', 0), ('R2', 'R3', 0), ('R3', 'F', 1)]  # 경로 5 (신규)
]
 
# (3) 학습 파라미터
alpha = 0.1
gamma = 0.9
episodes = 500
 
# (4) TD(0) 학습 루프
for ep in range(episodes):
    trajectory = random.choice(paths)  # (5) 무작위 경로 선택
 
    for (s, s_next, reward) in trajectory:
        i = state_to_index[s]
        j = state_to_index[s_next]
        V[i] += alpha * (reward + gamma * V[j] - V[i])  # (6) TD 업데이트
 
# (7) 결과 출력
print("상태 가치 함수 (V):")
for s in states:
    print(f"V({s}) = {V[state_to_index[s]]:.2f}")
상태 가치 함수 (V):
V(S) = 0.83
V(R1) = 0.92
V(R2) = 0.93
V(R3) = 1.00
V(F) = 0.00

TD

(1) 우선 이 환경에는 총 다섯 개의 상태가 등장한다. 시작 상태 S를 포함해 중간 상태 R1, R2, R3, 그리고 종료 상태 F로 구성되어 있다. 각 상태는 배열 내의 위치에 따라 고유한 인덱스를 부여 받는다. 이러한 인덱스는 나중에 상태 가치를 저장하고 갱신할 때 사용된다. 모든 상태의 가치 값은 0으로 초기화되어 학습을 통해 점차 업데이트된다.

(2) 에이전트가 매 에피소드마다 탐험할 수 있는 다섯 가지 경로를 정의한다. 각 경로는 상태 간 이동의 순서와 해당 전이에서의 보상을 포함하고 있다. 예를 들어, S → R1 → R3 → F 경로는 세 개의 단계로 구성되어 있으며, 마지막 R3 → F에서만 보상이 1로 주어진다. 모든 경로는 종착점이 F이며, 그 외의 전이에는 보상이 없다. 경로 중에는 S → R2 → F처럼 짧고 직접적인 경로도 있고, S → R1 → R2 → R3 → F처럼 길고 우회적인 경로도 포함되어 있다. 이 다양성은 에이전트가 여러 경험을 통해 균형 있게 학습할 수 있도록 해준다.

(3) 학습률 α는 새로 관측된 정보가 현재 상태 가치에 얼마나 영향을 줄 것인지를 결정한다. 0.1이라는 값은 새로운 정보가 전체 가치에 10% 정도 반영된다는 의미이다. 할인율 γ는 미래 보상에 대한 중요도를 나타낸다. 여기서 설정된 0.9는, 미래 보상을 현재보다 조금 덜 중요하게 여기지만 여전히 강하게 고려하겠다는 의도이다. 총 500번의 에피소드를 통해 학습을 반복한다.

(4) 학습은 500개의 에피소드를 반복하면서 이루어진다. 각 에피소드마다, 에이전트는 정의된 다섯 경로 중 하나를 무작위로 선택하여 따라간다. 경로를 따라가면서 상태 가치를 한 단계씩 TD 방식으로 업데이트한다.

(5) 각 에피소드에서 하나의 경로가 무작위로 선택된다. 이로 인해 에이전트는 반복 학습 중 다양한 경로를 고르게 경험할 수 있으며, 그 결과 학습이 편향되지 않고 여러 상태를 두루 평가할 수 있다.

(6) TD(0) 방식은 한 스텝 단위로 상태 가치를 갱신하는 방식이다. 현재 상태의 가치는, 해당 상태에서 다음 상태로 이동했을 때 받은 보상과 다음 상태의 예측된 가치의 합을 고려하여 조금씩 조정된다. 이 방식은 모델 없이 환경과의 상호작용만으로도 학습이 가능하다는 장점이 있다.

(7) 출력된 결과를 해석해 보면 다음과 같다.

ž   R3의 가치가 1.00이라는 것은, 이 상태에 도달하면 바로 다음 단계에서 종료 상태 F로 이동하여 보상 1을 확정적으로 받을 수 있다는 것을 학습했다는 의미이다.

ž   R1과 R2의 가치는 0.9 이상으로 높게 나왔다. 이는 이 두 상태에서 R3나 F로 이어지는 경로가 자주 사용되었으며, 실제로 대부분의 경우 보상으로 연결되었다는 경험이 축적된 결과이다.

ž   R2의 가치가 R1보다 약간 더 높은 이유는, 학습 중에 R2에서 보상으로 이어지는 경우가 더 자주 등장했거나 빠르게 수렴했기 때문일 수 있다. 또는 R2 → F와 같은 짧은 경로가 더 자주 선택되어 학습에 긍정적인 영향을 주었을 가능성도 있다.

ž   시작 상태 S의 가치가 0.83이라는 것은, 다양한 경로를 통해 대부분 보상을 받을 수 있지만 중간에 여러 단계를 거쳐야 하므로 일부 불확실성이나 할인율의 영향을 반영한 결과이다.

ž   F의 가치가 0.00인 것은 자연스러운 결과이다. 종료 상태는 더 이상 이동이 없고, 보상도 없기 때문에 가치가 고정된 상태로 유지된다.

예제에서 최적경로는 S → R2 → R3 → F이다. 탐욕적인(greedy) 정책은 각 상태에서 다음 상태들 중 가치가 가장 높은 방향으로 이동하는 방식이다. S에서는 R1보다 가치가 높은 R2를 선택하고, R2에서는 F보다 가치가 높은 R3를 선택하게 된다. 비록 경로가 길어지지만, R3의 높은 가치 덕분에 전체 기대 보상이 더 크기 때문에 TD는 이 경로를 최적의 경로로 학습한다. 즉, 보상을 빨리 받기보다는 더 확실하게 받을 수 있는 길을 선택하는 것이다.

댓글 쓰기

Please Select Embedded Mode To Show The Comment System.*

다음 이전