Temporal Difference 방법은 에피소드가 끝날때까지 기다렸다가 업데이트하는 몬테카를로 방법과는 다르게, 반드시 종료하는 MDP 환경이 아닌 에피소드 종료조건이 명확하지 않은 실제세계에서 사용할 수 있는 학습법이라 말씀드릴 수 있습니다. 종료하지 않는 MDP에서는 리턴이 존재하지 않기에 밸류 값을 업데이트하는 방법을 찾아야 하는데, 이러한 밸류라는 것이 결국 리턴의 기댓값이고, 리턴을 보지 않은 상태에서 업데이트 할수 있는 방법이 TD학습법입니다. TD 학습의 핵심은 "시간적 차이"(Temporal Difference)라는 개념에 있습니다. 이는 실제로 관찰된 보상과 현재의 가치 추정 사이의 차이를 이용하여 가치 함수를 업데이트하는 것을 말합니다. TD 학습은 에피소드가 완전히 끝나지 않아도, 단계마다 가치 함수를 업데이트할 수 있습니다.
1)초기화: 가치 함수를 임의의 값으로 초기화합니다. 2)경험 수집: 에이전트가 환경과 상호 작용하면서, 각 시간 단계에서의 상태, 행동, 보상을 관찰합니다. 3)가치 함수 업데이트: 에이전트가 경험한 각 상태에 대해, TD 오류(Temporal Difference Error)를 계산하고 이를 사용하여 가치 함수를 업데이트합니다. TD 오류는 실제 받은 보상과 다음 시간 단계의 가치 추정을 기반으로 계산됩니다. TD오류 = (보상 r + 감마 γ * V(s'))-V(s) 로 계산할 수 있습니다. 여기서 r은 보상, γ 감마는 할인율, V(s)는 현재 상태의 가치, V(s')은 다음 상태의 가치입니다. 4)반복: 이 과정을 여러 번 반복하여, 경험을 통해 가치 함수를 점차적으로 개선합니다.
비모델 기반: TD 학습은 환경의 전이 확률이나 보상 함수를 미리 알 필요가 없습니다. 온라인 학습: 에피소드가 완료되기 전에도, 각 시간 단계에서 바로 가치 함수를 업데이트할 수 있습니다. 효율성: 몬테카를로 방법에 비해 적은 수의 샘플로도 효과적인 학습이 가능합니다. TD 학습은 강화학습에서 효율적이고 유연한 학습 방법으로, 복잡한 환경에서도 에이전트가 효과적으로 학습하고 적응할 수 있도록 도와줍니다.
우리의 에이전트가 1에서 10개의 에피소드 상태 s를 지나온다고 가정해 봅니다. s1, s2, s3,,,,s10까지 하고 종료가 된다고 하면, MC는 모든 에피소드가 끝난 후 업데이트 해줄 수 있고, TD는 에피소드가 끝나기 전 매번의 상태 전이 상황에서 테이블 값을 업데이트해 줄수 있습니다. 이것이 가장 큰 차이점인데, MC에서의 가치함수의 정의는 리턴의 기댓값 Gt를 사용하고, TD에서의 가치함수의 정의는 Gt를 사용하지 않고 대신 그 자리에 다음 타임에서 받은 보상 + 할인계수 감마에 다음 상태의 가치함수를 곱해주는 것입니다. MC에서 상태 가치함수 식은 다음과 같습니다. V(s)에 V(s)+학습률 알파*(Gt-V(s))를 대입시킵니다. TD에서 상태 가치함수 식은 다음과 같습니다. V(s)에 V(s)+학습률 알파*(다음 타임에서 받은 보상 r + 할인계수 감마 * 다음 상태의 가치함수)-V(s))의 식을 대입하게 됩니다. TD방법은 한 에피소드가 완전히 끝나고 업데이트하는 것이 아닌 한 번의 액션마다 데이터 테이블이 업데이트 되기 때문에, 모든 에피소드를 완전히 끝내고 업데이트 하는 MC방법보다 학습률 알파를 더 크게 설정해도 됩니다. 자세한 비교는 다른 글에서 또 다루도록 하겠습니다.
기본 환경 class는 MC와 같습니다. 하지만 메인함수 부분에서 차이가 납니다. 여기에는 먼저 만들어놓은 환경 class와 에이전트 class를 불러와 초기화시킵니다. 환경의 기본 좌표값을 지정합니다. 할인계수 감마값을 지정합니다. 알파값 즉 학습률을 지정합니다.(MC보다 높게 지정) 총 훈련할 에피소드의 범위를 지정해 for문을 사용해 학습을 이터레이션 코드를 작성합니다. while loop를 넣어 환경, 그에따른 액션을 하고 한번의 step이 진행되자마자 바로 테이블의 데이터를 업데이트 합니다. 이 부분 코드만 살펴보자면 위에서 살펴본 TD학습법을 그대로 코드에 담은 것입니다. data[x][y] = data[x][y] + alpha*(reward+gamma*data[x_prime][y_prime]-data[x][y]) 이 방법은 MC때보다 간결해집니다.