시간차 학습
TD
여기서 나오는 게 시간차 학습이라는 개념입니다
이게 강화학습에서 일종의 약간 기념비적인 발견이에요
굉장히 중요한 발견입니다
그리고 이거는 강화학습에만 나오는 게 아니라 당연히 심리학에도 나오고 뇌과학에도 나오고 약간 생물학에서부터 AI까지 모든 분야에 굉장히 중요한 발견인데 사실 따지고 보면 별거 없어요
우리가 계속 하고 있는 이 재규적 형태 그래서 Vs는 R 플러스 간마 Vs 프라임 이 식에서 우리가 지금 g를 구하는데 g를 평균 내면 v란 말이에요
g를 평균으로 v라서 우리가 이제 이거를 구하는 건데 그러면 아까 우리가 g를 구해서 g-v를 해가지고 이거를 1분의 1 한 다음에 원래 v에다 이렇게 더해주는데 그럼 이 g는 이거랑 똑같으니까 그거를 싹 바꿔넣자 이거죠
그래서 이제 몬테카를로랑 차이는 몬테카를로에는 색깔을 조금 바꿀까요 빨간색으로 합시다
몬테카를로에는 여기에 g가 들어갑니다
여기에 g가 실제 g가 들어가는데 시간차 학습은 어떻게 하냐면 g를 이렇게 바꾼 거예요
그러면 이 식에서 우리가 필요한 건 뭐냐면 이것만 필요합니다
R만 필요해요
왜냐하면 이거는 어차피 추정치거든요
우리가 추정치로 갖고 있습니다
이거는 우리가 가지고 있는 추정치고 이것도 우리가 가지고 있는 추정치죠
그러니까 이거 두 개는 추정치고 나는 이번에 뭔가 액션을 R이란 건 내가 액션하면 바로 나오는 보상이잖아요
지금 이 순간에 보상만 있으면 시간차 학습은 할 수가 있습니다
끝까지 기다릴 필요가 없어요
그리고 이 보상은 굉장히 짧기 때문에 우리가 바로바로 학습을 할 수 있어요 끝까지 기다릴 필요가 없고 그리고 이 보상 하나는 분산이 커버야 그렇게 크지 않기 때문에 이 추정의 분산도 굉장히 작아집니다
그 대신에 이제 편향이 굉장히 커지는데 왜 커지냐면 우리가 이걸 부트 스트래핑을 하기 때문에 부위를 처음에는 우리가 굉장히 임의로 정한 부위에서 시작을 한단 말이에요
근데 그 부위가 정확하지가 않으니까 만약에 우리가 운 좋게 처음에 부위를 적당히 잘 잡아서 만약에 실제 가치랑 좀 비슷하게 잡아줬다 그러면 우리가 가진 편향이 실제 값과 가까우니까 금방 갈 건데 만약에 편향을 굉장히 멀리 있는 데서 잡았다
그럼 여기까지 가는데 굉장히 오래 걸리겠죠
굉장히 편향되어 있으니까 이걸 극복하려면 굉장히 오래 걸립니다
MC는 애초에 편향이 없기 때문에 데이터만 많이 모으면 편향이 없어가지고 이렇게도 나오고 이렇게도 나오지만 데이터를 많이 모으면 이리로 가는데 여기서 시작했으면 여기서 찔끔찔끔 고쳐가지고 여기까지 오려면 한참 걸린단 말이에요
그래서 일장일단이 있는 거죠
그래서 이게 시간차 학습의 아이디어가 됩니다
이것도 비유할 것까지는 없죠
이해 되시죠
그래서 결국에는 재기적 형태가 굉장히 중요합니다
계속 재기적 형태가 나오니까 그래서 시간차 학습은 아까 이 앞에 보시면 몬테카를로 장표를 보면 여기서 시작해서 여기까지 간 다음에 학습을 하는 건데 시간차 학습은 이것만 하고 학습을 하는 거예요
한 스텝만 하면 됩니다
그다음에 제가 이게 다 강학습에만 나오는 게 아니라 심리학계도 나오고 생물학교도 나오고 굉장히 중요하다
이렇 게 얘기를 했는데 우리가 심리학에서 20세기 초중반에 행동주의 심리학이라는 게 있었는데 요즘에는 없어요
왜냐하면 맨날 전기 충격이나 주고 있으니까 그게 뭐냐
약간 이렇게 해서 사람들이 다 회의에 빠져가지고 이건 좀 아닌 것 같아
그래서 요즘에는 안 하지만 그래도 여전히 그 잔재는 되게 남아 있습니다
그래서 약간 심리학하면 좀 마음을 연구할 것 같지만 여전히 또 약간 마음보다는 행동이 우선이에요 눈에 보이는 객관적인 게 먼저고 심리적 개념은 나중에 예를 들면 설문 같은 걸 하잖아요
설문을 하면 그 설문의 내용이 별로 중요한 게 아니고 어쨌든 그 설문에 응답한다는 것도 결국에는 행동이기 때문에 우리가 그 행동을 가지고 뭘 예측할 수 있느냐
이런 거가 더 중요합니다
여기서 심리학 얘기를 할 건 아니니까 어쨌든 그래서 시간차 학습이라는 게 이것도 행동주의 심리학에서 나온 건데 행동주의 심리학의 결국 핵심 원리는 뭐냐면 보상을 받으면 더 많이 하고 벌을 받으면 별로 안 하더라
이게 결국에는 핵심이거든요
행동주의 심리학의 핵심 그래서 행동주의 심리학은 모든 걸 보상과 처벌로 다 환원합니다 네가 그 행동하는 이유는 네가 그걸 보상을 많이 받아서 그래
넌 이거 안 하는 이유는 너가 그걸로 처벌을 많이 받아서 그래
다 이걸로 환원이 됩니다
그래서 다 보상과 처벌로 환원이 되고 그래서 이제 제가 첫날 얘기 드렸는데 군대가 행동주의 심리학을 많이 응용을 하고 있다고 했잖아요
그래서 여러분 군대 갔다 오신 분들이나 군대 안 갔다 오셔도 군대가 대충 우리가 미디어를 통해서 어떻게 돌아왔는지 대충 듣잖아요
그러면 군대가 각각 개인의 마음을 이해해 주고 심리를 우리가 일반적으로 말하는 의미의 심리를 파악을 해서 그거에 따라 합니까
무조건 보상과 처벌이죠
잘하면 뭐 주고 못하면 벌 주고 그게 그냥 군대 작동 원리인데 서로 약간 물고 물리는 게 있어요
행동주의 심리학을 받아들여서 그렇게 된 것도 있고 군대라는 어떤 시스템의 사정상 일일이 그렇게 개개인을 케어해 줄 수 있는 환경이 안 된단 말이에요 전쟁 나서 총알 날라가지고 이런데 언제 그래
너 참 힘들구나 언제 이러고 있습니까
그죠 나가야 돼 해야 되는 거죠
그래서 서로서로 그게 잘 맞아떨어지는 부분인데 하여간 이걸 모든 걸 이렇게 하는데 행동주의 심리학 중의 유명한 에드워드 톨먼이라는 사람이 있습니다
톨먼이라는 사람이 보니까 동물이 어떤 행동을 하는데 그 행동을 그냥 하는 게 아니라 동물이 뭔가 보상을 예측을 하더라
내가 이 정도 보상은 받을 거야 라는 거를 예측을 해요
그럼 그게 그 예측이 뭡니까
결국 V죠
내가 이 정도 하면은 예를 들면 주인이 공을 던지길래 저거 물었다 주면은 나한테 간식 하나 주지 않을까
이런 예측을 합니다 예측을 해가지고 주인한테 물어 줬더니 나는 한 이만큼 줄 줄 알았는데 갑자기 이만큼 줬어
오 그러면 더 그 행동을 하는 거죠
만약에 내가 예측을 했는데 그만큼 안 해주면은 이 자식이?
뭐 이러면서 별로 안 해요
그래서 이런 것들을 관찰을 하게 되고 그래서 절대적으로 내가 보상을 준다 안 준다 중요한 게 아니고 내 어떤 기대 수준에 미치느냐 못 미치느냐가 더 중요합니다
여러분들 회사 생활 해보시면 알지
잖아요 회사에서 돈을 안 줍니까
뭘 안 줍니까
복지를 안 해줍니까
다 해주지만 우리 회사에 대한 불만은 어디서 나와요
내 기대 수준에 미치느냐 못 미치느냐에 나오잖아요
회사에서 다 월급 안 밀리고 제 때 나와도 내 기대에 못 미치면은 아니 옆 회사는 저만큼 준다는데 우리 회사는 왜 이거밖에 안 줍니까
이렇게 되는 거죠
내 기대에 못 미치니까 그리고 반대로 회사가 좀 어려워 보이는데 회사가 의외로 올해 뭐 보너스도 잘 주고 잘해준다
뭐지?
사장님이 미쳤어요
뭐 약간 이러면서 이상하네 좋은데 이렇게 되는 거죠
그래서 우리의 어떤 기대 수준보다 높으냐 못 하냐
이게 중요하게 됩니다
그래서 기대한 보상하고 실제로 받은 보상의 차이를 시간 차, 오차, Td, 줄여서 그냥 Td, 오차라고 하고 이 Td, 오차는 앞에 있는 수식에서 보시면 요거가 됩니다
내가 기대한 거는 그렇죠
기대한 게 되고 결국에는 여기서 우리가 이 두 개는 추정치로 가지고 있는 거니까 이 두 개의 차이보다 내가 이제 크거나 작거나 실제로 그거에서 오차가 좌우가 되는 거죠
그래서 여러분들 이제 뭐 요즘에 도파민 이런 얘기 많이 하잖아요
근데 도파민이 그게 뭐 유튜브 본다고 도파민 나오고 컴퓨터 게임 한다고 도파민 나오고 이런 얘기가 아니고 도파민이 약간 그...
좀 대중화 되면서 약간 오해가 있는데 도파민 자체는 그냥 신경에서 나오는 물질입니다
근데 이제 주로 어떤 기능을 하냐면 학습에 기여를 해요
근데 언제 기여를 하느냐
우리가 이제 이거는 동물한테 어떤 식으로 한 거냐면 동물 두 개골을 열어가지고 뇌에다가 이렇게 탐침 같은 걸 꽂아놓습니다
그러면은 이제 도파메네민에 반응하는 신경세포가 있으면 그 신경세포들을 활성화 되는 것에 대해서 그 회로가 활성화될 때 전기가 지식하고 오겠죠
그래서 이제 동물한테 어떤 거를 해가지고 언제 그 회로에 전기가 들어오는가 이거를 이제 볼 수가 있어요
그래서 동물한테 이제 마른 먹이만 한 일주일 먹입니다
그러면 동물이 이제 일주일 동안 물을 못 먹고 맨날 마른 먹이만 먹으니까 입안이 톡톡 하고 이러겠죠
그때 그 동물한테 이제 그 동물한테 이제 마른 먹이만 먹으니까 입안이 톡톡 하고 이러겠죠
그때 갑자기 물 한 방울을 딱 줘요
그래서 이제 노 CS 이건 뭐냐면 갑자기 그 예고도 없이 아니면은 뭔가
그 전등 같은 거를 반짝 하고 편다면 근데 동물은 이 전등이 의미한 게 뭔지 모른단 말이에요
아니면 종소리를 땡 하고 들려준다면 뭐지?
했는데 갑자기 주스가 한 방울 똑 하고 입에 들어와요
그러면은 여기서 도파민이 미친 듯이 나옵니다 으아!
하면서 왜 이 도파민이 나오느냐 예상치 못한 보상이 나왔기 때문에 그래서 여러분들이 이제 그 도박 중독 이런 거 나는 절대 안 걸릴 거야
이런 도박은 계속 손을 대시면 안 됩니다
왜냐하면 도박이 딱 전형적으로 이런 특성이거든요
예상치 못한 보상이 예상치 못한 순간이 옵니다
물론 나와라 나와라 나와라
하지만 안 나올 때가 많단 말이에요
그래서 갑자기 나오면 으아!
하면서 사람이 이제 도파민이 미치는 듯이 나오면서 그거에 학습이 됩니다
그러면 이제 계속 도박을 하게 되는 거예요
그래서 도박 중독이 무섭습니다
그래서 카지노 가지 마시고요 재미로 가셨다가 도박 중독 걸린 사람 전부 재미로 갔다가 도박 중독이 빠지는 거거든요
그래서 재미로 또 안 가시면 됩니다
어쨌든 그래서 그거를 이제 학습을 이제 이걸 계속 반복을 하면 이제 종소리 아니면 불빛 이런 걸 보면은 이제 이 과일 주스를 준다는 걸 학습을 했어요
그러면은 이제 동물의 뇌가 어떻게 변하냐면 이제 이 CS가 나오죠
그럼 CS가 나오기만 해도 도파민이 막 나옵니다 으아!
하면서 과일 주스다
물론 동물이 그렇게 말한다는 게 아니고 뇌세포가 그런 식으로 반응한다는 거죠
주스는 이때 나오거든요
보시면은 반응이 없어요
이거는 예상한 반응이라서 그렇습니다
예상한 결과라서 그렇습니다
그래서 보상을 예상했는데 예상대로 나오면 뭐 그렇지 뭐 이렇게 되는 거예요
당연히 월급날이 다가오면 여러분이 기분이 좋고 월급 봉투를 열어봤는데 예상대로면 그냥 만족하는 거죠
그때 기분이 좋지는 않잖아요
아 오늘 월급 나왔겠네
하고 그때 이제 기분이 좋은 거죠 월급이 나올 거라는 예상 그게 우리의 이제 동물은 종소리를 딸랑딸랑 해 주면 침도 흘리고 뭐 이러듯이 우리는 이제 오늘이 월급날이네 하면 이제 우리 종이 딸랑딸랑 하고 있는 겁니다
그래서 열어봤는데 예상대로 월급이 들어왔으면 하고 이제 넘어가는 거죠
근데 동물한테 이걸 여러 번 시켜서 이제 학습을 시킨 다음에 딸랑딸랑 해가지고 동물이 이제 도파민이 미친 듯이 나왔는데 주스를 안 줘요 사쿠라네 확인 들어가겠습니다 사쿠라네 사쿠라요 뭐 이러면서 그러면 도파민이 오히려 평소에 한 이만큼은 나왔는데 갑자기 훅 하고 떨어집니다
그래서 결국 이 도파민이 보여주는 건 뭐냐면 결국에는 뭐냐면 이 TDO차를 보여준다
내가 예상한 예상치보다 지금 내가 받고 있는 보상이 더 높으냐
낮으냐
그래서 동물도 시간차 학습을 한다
우리도 보면은 평생 다 산 다음에 뭔가 학습하는 게 아니라 몬테카를로로 학습하는 게 아니라 인간도 시간차 학습을 합니다
내가 기대하는 것보다 높으냐 낮으냐
from collections import defaultdict
import gymnasium as gym
import numpy as np
import matplotlib.pyplot as plt
class TDPrediction(MCPrediction):
def __init__(self, env, gamma=0.9, alpha=0.1):
super().__init__(env, gamma)
self.alpha = alpha
def update_value(self, episode):
for t in range(len(episode)):
state, action, reward, next_state, done = episode[t]
td_target = reward + self.gamma * self.V[next_state] * (not done)
self.V[state] += self.alpha * (td_target - self.V[state])
실험
env = SlipperyWalk(9)
init_state, info = env.reset()
gamma = 1.0
n_episodes = 500
P = env.unwrapped.P
pi = {i: 0 for i in range(env.observation_space.n)}
agent = TDPrediction(env)
V, V_track = agent.evaluate_policy(pi)
V_true = policy_evaluation(pi, P)
V_true[-1] -= 1
rmse(V, V_true)
0.012146213687059858
plot_value_track(V_track, V_true, env)
<Figure size 640x480 with 1 Axes>
N-step TD
자 그 다음에 우리가 이제 시간차 학습하고 몬테카를로를 알아봤는데 보통 머신러닝 하는 사람들이 연구를 하는 방법이 있습니다
머신러닝 연구는 어떻게 하는가 물론 이제 아주 세계 탑 클래스들은 좀 다를 수도 있지만 제 생각에는 본질적으로 별로 다른 것 같지는 않고요 어떻게 하냐면 가만히 앉아서 아이디어를 생각을 합니다 무슨 방법이 없나 이러다가 A라는 방법이 있고 B라는 방법이 있어요
그럼 대충 섞습니다
그럼 A하고 B를 섞은 AB를 만드는 거죠
그래서 이제 논문 제목들이 날이 갈수록 점점 길어져요
앞에 붙는 말이 구질구질하게 많아지기 때문에 약간 머신러닝만 그런 것 같지 않고 분야별로 대충 보통 연구를 보면은 뭐 비슷해요
예를 들면은 통계에 보면은 요즘에 한창 유행하던 게 미디에이션이 있고 모더레이션이라는 게 있는데 요즘에 이제 논문 쓰는 거 보면은 미디에이티드 모더레이션 모더레이티드 미디에이션 뭐 이런 식으로 논문이 나오거든요
그러니까 자꾸 섞는 거죠
사람들의 아이디어가 다 거기서 거기라 별 뾰족한 수가 없으면 자꾸 섞어야 됩니다
그래서 우리가 몬테카를로가 있고 이 몬테카를로는 편향이 작고 분산이 큰데 그러면은 Td를 만들어서 편향은 좀 있지만 분산을 작게 만든 그래서 빨리빨리 샘플링 효율성을 높인 방법을 만들었는데 그럼 아까도 이제 편향 분산 교환을 얘기하면서 이거 둘 사이에 적절한 균형이 필요하다고 했잖아요
근데 이게 양쪽 끝 이란 말이에요
몬테카를로는 편향이 너무 적고 시간차 학습은 편향이 너무 강합니다
그럼 균형을 어떻게 맞출 거냐
그래서 나오는 방법이 두 가지가 있는데요 첫 번째에는 n-step Td라는 방법이 있습니다
여기 앞에 n-step은 뭐냐면 Td는 한 단계만 따라간 다음에 여기서 이제 받은 보상 있죠
그럼 나머지는 원래는 몬테카를로는 끝까지 가야 되는데 안 가고 Vs'로 그냥 대체를 하는 거예요
그래서 몬테카를로는 이것도 해보고 이것도 해보고 이것도 해보고 이것도 해보고 ...
그래서 끝까지 다 해보는 건데 이만큼을 V로 대체를 한 게 시간차 학습인데 그러면 사람들이 생각을 하는 거죠
이 두 개를 어떻게 섞을 수 있을까 가만히 뚫어지게 보다가 어차피 이 Vs'도 결국에는 r' 더하기 Vs' 2'로 될 거 아니에요 그러면 원래는 우리가 r 더하기 Vs'를 하는데 r 더하기 r' 더하기 Vs' 2' 이렇게 하면 되겠다
그래서 여기가 r이면 한 번 더 가면 r2' 될 거고 나머지는 안 가고 Vs' 2' 이렇게 하면 되겠다
이런 생각을 하는 거죠
그럼 이제 3 스텝도 가능하겠죠
r', r', r2', r3' 여기는 Vs'', ...
그래서 원래는 기본적으로 1 스텝만 따라가게 되는데 2 스텝도 가고 3 스텝도 가고 이렇게 하면 되겠다
그럼 어떻게 되겠습니까
이거가 r의 개수가 늘어나니까 r의 개수가 늘어난다는 거는 여러분이 주식을 한 달만 투자하셨을 때 수익률은 높아 봐야 몇 프로, 낮아 봐야 몇 프로겠죠
두 달 투자하시면 수익률 분산이 더 커질 거고 세 달 투자하시면 더 커질 거고 평생 보유하시면 더 더 더 더 커지겠죠
그러니까 어떻게 됩니까 분산이 점점 커져요 분산이 커지고 분산이 커진다는 얘기는 편향이 줄어든다는 얘기죠
그래서 이 n 스텝 7D에서 n이 무한대로 가면 몬테카를로랑 똑같아지고 n이 1이면 그냥 원래의 시간 착습이고 그래서 n을 조절을 해서 원하는 편향과 분산을 조절을 할 수가 있습니다
class NStepTDPrediction(TDPrediction):
def __init__(self, env, gamma=0.9, alpha=0.1, n=3):
super().__init__(env, gamma, alpha)
self.n = n
def update_value(self, episode):
T = len(episode)
for t in range(T):
G = 0
for k in range(t, min(t + self.n, T)):
state_k, action_k, reward_k, next_state_k, done_k = episode[k]
G += (self.gamma ** (k - t)) * reward_k
next_state_kp1 = episode[k + 1][0] if k + 1 < T else None
if t + self.n < T:
G += (self.gamma ** self.n) * self.V[next_state_kp1]
state_t, action_t, reward_t, next_state_t, done_t = episode[t]
self.V[state_t] += self.alpha * (G - self.V[state_t])
agent = NStepTDPrediction(env)
V, V_track = agent.evaluate_policy(pi)
rmse(V, V_true)
0.028422471393538002
plot_value_track(V_track, V_true, env)
<Figure size 640x480 with 1 Axes>
TD(λ)
람다 수익이라는 개념이 있어요
우리의 수익은 G를 말합니다
영어로는 return 그 return이 있는데 그냥 return이 아니라 람다 수익이에요
그래서 이 람다 수익은 뭐냐면 우리가 이제 nstep TD에서 다시 나오는데 nstep TD에서 n이 무한되면 mc면 모든 상태의 가치를 수정할 수 있지만 분산이 크고 끝날 때까지 기다려야 되고 이런 문제가 있어요
그 다음에 n이 1이면 우리가 그냥 TD죠
그냥 시간차 학습인데 우리가 뭔가 보상을 받으면 이 보상이 우리가 이제 스텝이 이렇게 있어요
스텝이 이렇게 있으면 이때 받은 보상은 이때의 v를 수정할 때만 씁니다
이전 스텝으로 가면 이때는 이때 받은 보상으로 이때의 v를 수정할 때 쓰고 그럼 이 수정된 v가 이 앞에 영향을 미치려면 한 번 더 가야 그 다음에만 된단 말이에요
그러니까 지금 우리가 r plus vs prime 이렇게 하니까 vs는 이런 식으로 하니까 이 보상만 여기다 영향을 미치고 vs prime은 저번 단계에 추정한 거에요 앞 단계에 추정한 거란 말이에요
그럼 이번에 내가 뭘 했는데 r prime을 받아도 r prime은 여기만 반영되지 여기는 반영이 안 돼요
그거는 다음 번에 가서 vs prime을 또 쓸 때가 와야 이 추정치가 반영이 됩니다
그래서 이 정보가 느리게 퍼진다는 얘기가 이런 얘기에요
그래서 만약에 우리가 이제 단계들이 쭉 이렇게 있는데 내가 여기서 뭔가 보상을 받았어요
그래서 여기가 이제 s9라고 합시다 그러면 v9에 영향을 미치겠죠
vs9에 영향을 미칠 건데 그러면 vs8을 추정을 다음 번에 할 때 vs9을 쓸 거니까 그때 여기에 영향을 미치는데 예를 들면 vs1에다가 이게 영향을 미치려면 어떻게 되냐
여기서 영향을 미친 게 s8이 s7에 영향을 주고 그 다음번에는 s7이 s6에 영향을 줄 거고 점점 좀 해내면 되니까 여기까지 영향을 미치는데 하세월이죠
굉장히 긴 세월이 걸립니다
그래서 상태가 굉장히 많으면 이쪽에서 뭔가 학습이 돼도 이 시간차 학습에서는 이 학습된 게 퍼지는 데는 시간이 굉장히 오래 걸려요
그래서 이거를 하나 극복하는 방법은 n을 키우는 건데 n을 키우면 n을 넘어가는 만큼은 이제 어쨌든 반영 안 되는 건 똑같습니다
람다 수익
그래서 여기서 이제 람다 수익이라는 개념이 나오는데요
람다 수익이라는 거는 뭐냐면 우리가 예를 들면 1스텝에 g가 있고 2스텝에 g가 있고 3스텝에 g가 있으면 얘네를 다 평균을 낸 거예요
근데 평균을 내는데 같은 비율로 평균을 낸 게 아니라 여기 보시면 람다를 곱해서 약간 할인하듯이 평균을 낸 겁니다
일종의 할인과 같은 개념으로 그래서 이제 식이 굉장히 복잡해지는데 이 식 자체를 정확하게 이해하실 필요 없고 여기 보시면 람다 n- 이렇게 들어가니까 n이 하나 늘어날 때마다 할인을 더 많이 하는 거죠
우리가 미래의 수익을 할인하듯이 g가 여러 개 있으니까 이 각각의 g들을 람다, 람다 제곱 이런 식으로 해서 할인을 해주는 거예요
그래서 MC하고, 몬테카를로하고 시간치 학습하고, n-스텝하고 람다 수익하고 비교를 하면 몬테카를로는 처음부터 끝까지 쭉 다 하는 거예요
한 번 다 하는 겁니다
시간치 학습은 처음부터 끝까지 하지 않고 한 스텝만 간 다음에 나머지는 그냥 V로 퉁 치고 넘어가는 겁니다 했다 치고 넘어가는 거고 n-스텝은 예를 들면 두 스텝이다
두 단계까지 한 다음에 나머지는 V로 퉁 치고 넘어가는 거 했다 치고 이렇게 되는 거 예를 들면 여러분이 거제에서 서울까지 가야 돼요
그러면 누가 물어봐요
거제에서 서울까지 얼마나 걸려?
근데 여러분이 서울 간 지가 오래돼서 기억이 가물가물해요
글쎄 5시간, 6시간, 7시간?
7시간 걸렸던 거 같은데 근데 여러분이 거제에서 서울 가는 방법이 여러 가지 있는데 차원까지 간 다음에 차원에서 KTX 타고 서울을 간다
근데 여러분이 뭐가 일이 있어서 거제에서 차원까지 가봤어요
차원까지 가는데 길이 막혀가지고 2시간이 걸려
근데 여러분은 차원에서 서울까지 4시간이 걸린다고 알고 있습니다
이거는 실제로 지금 가본 건 아니고 그냥 알기로 그렇게 안다는 거 이게 이제 원스텝 TD인 거죠
만약에 차원에서 또 일이 있어서 대전까지 가봤어요 대전까지 가는데 3시간 걸렸네?
근데 여러분이 알기로 대전에서 서울까지는 2시간 걸린다고 들어서 알고 있거든요
그러면 여러분은 대전까지만 가봤지만 서울까지 걸리는 시간을 추정을 할 수 있습니다
그런 논리로 우리가 두 스텝만 가본 다음에 나머지는 한 이 정도 걸리겠지 이렇게 하는 게 2스텝이고 N스텝이고 람다는 어떻게 하냐면 MC랑 똑같아요
처음부터 끝까지 다 해봅니다
처음부터 끝까지 다 하는데 MC는 이거를 그냥 동일 비율로 반영을 하는데 람다는 어떻게 하냐면 요만큼 만 가지고 원스텝을 한 것처럼 계산을 해서 1-람다죠 1-람다만큼 반영을 하고 예를 들면 람다가 0.1이다 그러면 여기를 90%를 반영을 하고 그 다음에 2스텝을 한 다음에 여기는 나머지 추정체로 떼오고 2스텝 했을 때 G가 나오는데 그러면 어떻게 됩니까?
1-람다에 람다를 곱하니까 9%가 되겠죠
이거를 9% 반영을 하고 그 다음에 3스텝으로 한 다음에 나오는 또 우리가 G가 있겠죠
그거를 0.9% 반영을 하겠죠
이런 식으로 계속 반영하면 답진 100%가 될 거 아니에요
그래서 일정 비율 비율로 반영을 하게 됩니다
Forward-View
그럼 왜 이런 방식으로 하느냐 이거를 조금 더 얘기를 들어보시면 헉 하고 신기한 얘기가 나오는데 일단 우리가 이거를 Td-람다라고 하는데 이 Td-람다는 포워드 뷰와 백워드 뷰가 있어요
그래서 포워드 뷰는 지금 방금 제가 설명드린 방식대로 계산을 하는 겁니다
이렇게 계산을 하면 결국에는 몬테카를로랑 똑같이 끝날 때까지 기다렸다가 이 람다 수익을 계산을 해야 됩니다
Backward-View
똑같은데 이걸 반대로 보는 방법이 있어요
이걸 백워드 뷰라고 합니다
이게 굉장히 기발한 부분인데 일단 우리가 그냥 백워드 뷰로 보는 거 뷰기 때문에 실제로는 똑같아요
실제로는 똑같은데 보는 방식이 달라지는 거 백워드 뷰 Td-람다는 어떻게 하냐면 일단 그냥 우리가 평범한 시간 착습처럼 매번 Td-오차를 계산을 해요
그래서 우리가 그냥 Td-람다로 어떻게 하냐면 오차 계산하면 바로 업데이트 하거든요
적격 흔적
바로 업데이트를 하는데 백워드 뷰에서는 어떻게 하냐면 적격 흔적이라는 걸 사용을 합니다
그래서 적격 흔적이라는 게 뭐냐면 그냥 저장을 해 놓는 거예요
적격 흔적에 저장된 이걸 이용해서 가치를 업데이트를 합니다
그래서 일반적으로 Td-람다라고 하면 백워드 뷰를 말해요 그래서 적격 흔적이 뭐냐 적격 흔적은 일종의 기억이라고 생각하시면 됩니다
이름이 적격 흔적이라서 말이 어려운데 그냥 쉽게 말하면 기억이에요 저장을 해 놓는 거기 때문에 그래서 우리가 아직 어떤 상태도 방문하지 않았으면 모든 상태에 대한 기억은 아무것도 없겠죠
나는 간 적이 없으니까 다 0이고 여러분이 어떤 상태를 지나가면 그 상태에 대한 기억 흔적이 남습니다
기억이 남아요
그래서 적격 흔적을 구현하는 방식이 여러 가지가 있는데 제일 쉬운 방법은 대체 흔적이라고 해서 한 번 어떤 상태를 방문하면 그냥 거기가 0에서 1로 바뀌는 거예요
그리고 누적 흔적은 뭐냐면 만약에 여기 두 번 방문했다
그럼
1이었는데 2가 되고 3번 방문했다
3이 되고 4번 방문했다
4가 되고 이렇게 되는 겁니다
내가 거기를 많이 방문하면 적격 흔적이 증가를 하는 거죠
기억이 증가를 하는 거 쉬운 말로 하면 뭐가 될까요?
그냥 카운트 세는 거예요 몇 번 방문했다
이렇게 되는 건데 근데 여기에 앞에 수식을 보면 여기도 람다가 없고 아직까지도 람다가 없거든요
람다 어디 갔어?
이게 td람다인데 람다 어디 갔어?
람다가 여기 맨 끝에 나옵니다
우리가 원래 적격 흔적이 있으면 내가 예를 들어서 여기 한 번 방문했어요
근데 여기 방문하고 지나갔습니다
그러면 여기에 1이었는데 람다가 예를 들면 0.9예요
그러면 내가 여기로 넘어가는 순간 이 1이었던 적격 흔적이 0.9로 감쇄가 됩니다
기억이 슬슬 흐려져요
그래서 여러분이 예를 들면 어디랄까요?
근처에 어디죠?
남해 한번 놀러 갔다 왔어요
놀러 갔다 온지 한 10년쯤 되면 다시 가보시면 기억이 가물가물해가지고 내가 여길 왔었나?
그러면 가족들이 그때 여기 왔었잖아
그러면 그래 나 기억이 하도 안 나는데 이러잖아요
그러니까 뭡니까?
적격 흔적이 시간이 지나면서 서서히 감쇄가 된 거죠
그래서 우리가 예를 들면 여기를 갔다가 여기로 갔다
이 옆 칸으로 갔다
그럼 이제 옆 칸이 0에서 1로 바뀝니다
그리고 앞에 칸이 0.9로 감쇄가 됐죠
그럼
다음 칸으로 또 가요 다음 칸으로 가면 여기가 1로 바뀌고 이 앞에 갔던 칸은 기억이 감쇄가 돼서 0.9가 되겠죠
더 앞에 있던 0.9는 한 번 더 감
쇄 돼서 0.8을 이렇게 줄어듭니다
시간이 지나면 이 기억이 점점 약해지는 거야
감쇄가 돼서 그래서 결국에는 이 T가 시간이 지날 때마다 람다, 람다 제곱, 람다 3승, 람다 4승 이렇게 감쇄가 되기 때문에 결국 이 T, D, O 차에다가 람다를 계속 제곱을 해주는 형태가 됩니다
그래서 우리가 이제 끝까지 가면 맨 처음에 방문했던 거는 람다가 이제 우리가 N 스텝 후에 결국 끝에 도달했다
그럼 이제 람다의 N승 이렇게 되겠죠
그래서 이걸 수식을 잘 정리를 해주면 결과적으로는 원래 이렇게 하는 거랑 똑같은 결과가 됩니다
재미있는 아이디어죠
그래서 이런 식으로 우리가 이제 방문한 지 오래 지난 시간은 업데이트를 할 때 조금 업데이트 해주고 최근에 방문한 데는 업데이트를 많이 하고 그래서 우리도 보면은 이것도 약간 생물학적인 아이디어 사실 이런 거 아이디어가 그냥 허공에서 나온 건 아니고 생물학에 비슷한 연구들이 있어요
그래서 이거를 생물학이나 심리학에서 비슷한 연구를 한 거를 강화학습 AI 하는 사람들이 보고 아이디어를 얻는 거죠
아 생물도 이렇게 되니까 이렇게 되는구나
예를 들면은 여러분들 파블로프의 개 아시죠
종을 따라랑 울린 다음에 먹이를 주는 거를 계속 반복하면 나중에 종만 울려도 개가 침을 흘린다
이게 파블로프의 개잖아요
그러면 종을 울린 시간하고 이 먹이를 주는 시간하고 간격을 조금씩 늘리면 어떻게 될까요 나중에 종을 울려도 침을 안 흘립니다
그리고 이 시간을 짧게 하면 종을 울리면 침이 많이 나와요 종을 울려주고 바로 먹이를 주면은 종만 울려도 침이 막 나오는데 그 종을 울리는 시간하고 먹이를 주는 시간을 서서히 늘리면 침이 점점 줄어들다가 나중에는 별로 종이 울려도 별로 침이 안 나와요
그래서 여러분들이 예를 들면 음식 냄새 이런 것만 맡아도 군침이 막 돌잖아요
와 군침이 싹 돈다
이러면서 그럼 뭡니까
이게 냄새하고 음식은 간격이 굉장히 짧잖아요 냄새 맡고 먹을 때까지 보통 간격이 되게 짧기 때문에 여러분들이 그게 이제 학습이 되어 있는 거예요
근데 예를 들면 메뉴판만 봐도 내가 군침이 싹 돈다
이러지 않잖아요
메뉴판만 보면 이제 입맛을 그냥 쩝쩝 다시죠
그거는 침이 조금만 돌아서 그래요
왜냐하면 메뉴판하고 이제 시간간격이 좀 기니까 그래서 이제 그런 적격 흔적 기억이 시간이 지날수록 서서히 감쇄가 되기 때문에 학습에 비치는 영향이 줄어듭니다
네, 아 이름 때문에 헷갈리시는데요
사실은 계산 순서가 반대입니다
포워드뷰는 계산을 역순으로 하고요 백워드뷰는 계산을 정순으로 해요
근데 왜 이름이 포워드뷰, 백워드뷰냐면 포워드뷰는 우리가 지금 이 시점에 있으면 이 시점부터 끝까지 이렇게 있으면 이게 현재고 이게 미래거든요
그러면 이제 이게 끝난 거죠
종료 그럼 현재부터 종료할 때까지 반영 비율을 이렇게 줄여가면서 하겠다
요건데 실제로 계산을 할 때는 이때 계산을 하는 게 아니고 이제 미래까지 간 다음에 그러면은 이때의 지, 이때의 지, 이때의 지, 이때의 지, 이때의 지가 쭉 있을 거 아니에요
원 스텝, 투 스텝, 쓰리 스텝, 지가 있으면 걔네를 람다, 람다, 람다, 람다 해가지고 반영 비율을 달리해서 이때를 업데이트를 하는 건데 백워드뷰는 어떻게 하는 거냐면 우리가 여기 적격 흔적, 엘리저빌리티 트레이스에다가 저장을 해놔요
내가 지나온 상태들을 그래서 여기 이제 2가 있어 가지고 내가 이렇게 지나왔다
여기까지 왔다
그러면은 이제 얘가 람다를 먹여 가지고 예를 들면 여기는 0.81, 0.9, 지금 현재는 1 이렇게 와 있겠죠
그러면은 여기까지 온 상태에서 요거를 여기다가 반영해 주고 여기다 반영해 주고 현재에도 반영을 해 주는 겁니다
그래서 계산을 그리고 다음 스텝으로 넘어가면 다음 스텝에서 또 앞에 거에다가 반영을 해 주는 거예요
그래서 이름이 백워드뷰인데 실제 계산은 정순으로 하는 거죠
내가 앞으로 나가면서 계속 반영을 해 준다
그래서 결국에는 어떻게 되냐면 요 시점하고 요 시점 간격이 멀어지면 멀어질수록 내가 여기에 대한 기억이 흐려지니까 내가 반영하는 비율이 계속 줄어든단 말이에요
그래서 결국 요 시점 기준으로 보면은 요렇게 되는 거죠
왜냐면 이제 시점이 멀어져 가지고 반영 비율이 줄어들었으니까 실제 계산은 앞에서 뒤로 가면서 합니다
그래서 포워드뷰 Td는 끝까지 가봐야 계산을 할 수 있기 때문에 기다려야 되는데 백워드뷰는 기다릴 필요가 없어요
바로바로 반영을 해 줍니다
근데 이제 수치가 완벽하게 지진 않은 거죠
아직 우리가 이제 예를 들면 요 시점 기준으로 봤을 때 요 시점은 끝난 다음에 이거를 다 고루 반영해야 완벽한 거 아니에요
여기까지 갔을 때 반영하면 요만큼만 반영이 되어 있으니까 모든 수치가 지금 완벽하지 않은 상태로 그냥 있는 거예요
내가 여기까지 가면은 이제 다 여기 중간 단계들이 다 완벽해지겠죠
그래서 이제 백워드뷰라고 하는 거는 계산하는 시점 기준으로 어디다 반영해 주냐
여기로 반영해 주냐 아니면 포워드뷰는 어디갔죠
포워드뷰는 내가 요거를 계산하려고 하는데 이쪽으로 본다고 해서 포워드뷰인데 계산을 이때 가야만 할 수 있습니다
그래서 좀 이름이 헷갈리게 되어 있어요
그래서 요런 얘기고 그래서 뭐 되게 헷갈리는데 제일 중요한 개념은 이겁니다
기억을 남겨놨다가 내가 이때까 지 지나온 상태들에 대한 기억을 남겨놨다가 기억나는 만큼 반영을 해준다
내가 지나온 상태를 기억을 한 다음에 기억나는 만큼 반영을 해준다
근데 기억은 점점 흐려지는 거죠
기억은 점점 흐려지는 거죠
그러니까 여러분들이 회사 생활을 하시는데 회사를 다녀보니까 아 이건 이렇고 저건 저래
근데 지금 와서 보니까 아 그때 이렇게 했어야 했는데 계속 후회가 들잖아요
그죠
아 2년 전에 이렇게 했어야 되는데 3년 전에 이렇게 했어야 되는데 그러다가 신입사원 때는 내가 회사 10년 다녀보니까 기억이 잘 안 나죠
신입사원 때 어떻게 했어야 했더라 그러면 신입사원 생활을 어떻게 해야 되는가에 대한 기억은 거의 안 남아 있으니까 지금 현재 10년 차 기준으로는 현재 경험을 별로 그때에 반영해줄 게 별로 없는 거죠
만약에 내가 신입사원 때 이거 했는데 내가 한 10년 차 되어보니까 그래도 이거는 했어야 된다
뭐 이런 얘기는 할 수 있잖아요
그래서 이제 포워드뷰나 백워드뷰나 결국 유도를 해보면 수학적으로는 똑같다
근데 계산하는 방식이 서로 다른 건데 당연히 포워드뷰로 하면은 2점이 별로 없기 때문에 다 백워드뷰로 합니다
그래서 이렇게 td람다를 하면은 우리가 얻게 되는 장점은 원래 td가 어떤 경험이 있으면 이 경험이 전파되는데 오래 걸린다고 했잖아요
td람다는 금방 반영이 되는 거죠
왜냐하면 백워드뷰로 기억나는 만큼 어쨌든 반영을 해주니까 그리고 아주 멀어지면은 어차피 기억이 안 나니까 반영 안 된 건 똑같은데 뭐 그 정도 되면 반영을 안 해도 별로 상관없다
어차피 기억도 안 나는데 반영해서 뭐 할 거예요
이런 얘기고 그래 서 여기 업데이트 밸류를 보시면 여기 이제 2 이라고 있는데 이게 이제 엘리자빌티 트레이스거든요
그래서 어떤 상태에 방문할 때마다 여기다 방문할 때마다 방문 카운트를 플러스 1을 해줍니다
그래서 이제 이것도 사람으로 생각해 보면 지나온 상태를 기억이 나는데 여러분들이 회사 오래 다니시다보면은 맨날 가던 길은 가니까 이제 기억이 잘 나잖아요
맨날 가니까 그럼
어떠십니까?
거기는 트레이스가 아주 흔적이 강해지겠죠
여러분 기억에서 근데 가끔 뭐 가는데 이런 데에는 기억이 잘 안 나겠죠 자주 방문하는 데는 굉장히 기억이 강해집니다
그래서 여기 이제 TDO차를 계산을 하고요
TDO차를 계산하는데 TDO차를 여기다가 상태에다가 반영을 하는데 바로 반영을 하는 게 아니라 이 흔적만큼 반영을 해준다
이거 내가 남아있는 흔적만큼 그래서 과거에 방문했던 것 중에 흔적이 강하면 반영이 많이 되고 흔적이 약하면 반영이 조금 되는 겁니다
그리고 그렇다
이런 얘기고 그다음에 이제 원래 흔적이 요만큼 있었는데 여기다 이제 람다를 곱해서 흔적을 좀 약하게 해줍니다
시간이 지나면 흔적이 점점 점점 사라지는 거죠
그래서 내가 이제 여기 앞에 보시면 지금 그래프가 보면은 이렇게 방문을 할 때마다 올라가요
그다음에 시간이 지나면 서서히 줄어들죠 그러다가 또 방문하면 늘어났다가 또 서서히 줄어들었다가 연속으로 방문하면 팍팍팍 올라갔다가 또 시간이 지나면 이렇게 줄어들죠
그리고 이제 덧치는 흔적은 제가 설명을 안 드렸는데 덧치는 흔적은 뭐냐면 누적 흔적은 그냥 방문할 때마다 플러스 1씩 늘어나는 거고 덧치는 흔적은 연속으로 방문하 면 늘어나는 폭이 조금씩 줄어듭니다
그러니까 예를 들면 여러분이 여기 이 건물에도 첫날에 오면 흔적이 팍 남는데 두 번째 오면 두 배로 느는 건 아니고 그거보다 조금 덜 적게 느는 흔적이 그러니까 우리가 같은 거를 100번 한다고 해서 기억이 100배 강해지진 않잖아요
보통 해보시면 알지만 한 번 한 거보단 10번 하는 게 강한데 10번 하나 100번 하나 그때부터는 별로 그렇게 흔적의 강도가 강해지진 않는단 말이에요
그래서 그런 아이디어인데 보통은 누적 흔적을 그냥 많이 씁니다
덧치는 흔적도 써보기도 해요
TD(0)과 TD(1)
그래서 성능만 좋으면 그뿐이긴 한데 그래서 이렇게 되고요 그래서 이제 이 람다에 따라서 여러 가지 조절이 가능한데 N 스텝에서도 N을 조절하면 TD에 가까워지기도 하고 MC에 가까워지기도 하잖아요
그래서 만약에 람다가 0이라면 어떻게 됩니까 람다가 0이면 람다가 0이라는 얘기는 우리가 지나올 때마다 람다를 곱해 주니까 람다가 0이라는 얘기는 지나간 것은 기억에서 안 남겨두는 거죠
그냥 기억에서 없애버리니까 그냥 원래 TD랑 똑같아집니다
그래서 적격 흔적에서 곱하기 0이 돼서 사라진다
이런 얘기고 TD1은 뭐냐면 람다가 1인데 람다가 1이라는 건 절대 잊지 않는다는 거죠
내가 모든 걸 다 기억한다 나는 잊는 법이 없다 그러면은 결국 뭡니까
모든 지를 그냥 다 더하는 거랑 똑같으니까 그럼 원래의 몬테카를로랑 똑같아집니다
그래서 이렇게 하면은 원래 MC랑 똑같아집니다
그래서 우리가 이제 TD가 있고 MC가 있는데 몬테카를로 다시 얘기하면 TD는 분산이 작아요
분산이 작고 편향이 큽니다
MC는 편향이 작고 몬테카를로 분산이 커요
그래서 좀 균형을 맞추고 싶은데 방법이 두 가지가 있는 거죠
엔스텝으로 하는 방법은 TD에서 몇 단계 더 가고는 그런 방식입니다
그러면은 편향과 분산의 교환을 할 수 있겠죠
그다음에 TD람다가 있는데 TD람다는 어떻게 하냐면 어쨌든 끝까지 다 해요 끝까지 다 하는데 반영 비율을 우리가 이 람다만큼만 하는 거예요
그래서 이렇게 줄어들게 반영을 하는 거죠
그러면은 MC는 람다가 1이기 때문에 모든 경우를 똑같이 반영을 합니다
그리고 람다를 줄이면 좀 그림을 크게 그려드릴까요?
람다가 1이라는 건 이렇게 반영 비율이 이렇게 된다는 거죠
람다는 1인 경우 람다는 0인 경우는 이때만 반영하고 나머지는 반영을 안 합니다
이렇게 돼 있는 거죠
이게 람다는 0인 경우 그다음에 람다가 얼마가 있으면 반영 비율이 이렇게 줄어들겠죠
그래서 우리 람다를 조절하면 람다를 키우면 이 선이 점점 위로 올라갈 거고 람다를 낮추면 이게 점점 내려가겠죠
그래서 람다를 이용을 해서 우리가 편향과 분산을 조절할 수 있습니다
보통은 어느 쪽을 쓰느냐 N스텝보다 람다를 많이 씁니다
왜냐하면 람다가 매끄럽게 조절이 되기도 하고 아이디어 자체가 더 설득이 있잖아요
우리가 기억을 하는데 예를 들면 3스텝 TD를 한다
그럼 딱 3스텝만 하고 4스텝부터는 기억을 안 해
이건 좀 약간 상식적으로도 좀 이상하단 말이에요
논리적으로 3스텝은 하고 4스텝을 안 할 이유는 뭐가 있습니다
근데 람다를 조절하면 반영이 서서히 되니까 우리가 조금만 반영하고 싶다면 람다를 줄이면 되고
좀 오래 기억하고 싶다면 람다를 늘리면 됩니다
그러니까 매끄럽게 변하기 때문에 훨씬 좀 상식적으로 생각해도 더 말이 되는 방법입니다
물론 모든 게 상식대로 되지는 않는데 좀 더 논리가 자연스럽다
이렇게 되고 구현하기도 사실 N스텝하고 보시면 N스텝이 구현하기가 더 복잡해요
논리는 람다가 더 복잡한데 구현은 N스텝이 더 까다롭습니다
이걸 딱 N스텝까지만 계산해야 되기 때문에 구현이 복잡한데 람다는 그냥 기억나는 만큼 반영해 주면 되니까 이 기업에다가 이 eligibility trace만 잘 저장해 주면 되거든요
그래서 상식 자체가 훨씬 더 간단합니다
class TDLambdaPrediction(TDPrediction):
def __init__(self, env, gamma=0.9, alpha=0.1, lambd=0.9):
super().__init__(env, gamma, alpha)
self.lambd = lambd
def update_value(self, episode):
T = len(episode)
for t in range(T):
state, action, reward, next_state, done = episode[t]
td_error = reward + (self.gamma * self.V[next_state] * (not done)) - self.V[state]
E = np.zeros_like(self.V) # eligibility traces
E[state] += 1
for k in range(t, T):
state_k, _, reward_k, next_state_k, done_k = episode[k]
self.V[state_k] += self.alpha * td_error * E[state_k]
E[state_k] = self.gamma * self.lambd * E[state_k] if k < T - 1 else 0
agent = TDLambdaPrediction(env)
V, V_track = agent.evaluate_policy(pi)
plot_value_track(V_track, V_true, env)
<Figure size 640x480 with 1 Axes>
DP, MC, TD
그 다음에 우리가 그래서 지금까지 여러 가지 방법들을 배웠는데요 우리가 강학습에서 하는 방법들은 결국에는 이 4가지 틀 안에 다 끼워 맞출 수 있거든요
제일 먼저는 완전 검색이라는 게 있는데 이거는 모든 경우의 수를 다 검토를 하는 겁니다
근데 이거는 불가능해요
왜냐하면 경우의 수가 너무 많기 때문에 내가 예를 들면 1번, 2번, 3번을 거쳐서 꼴에 도착하는 가능성도 있고 1번, 3번, 2번, 3번을 거쳐서 꼴에 도착하는 가능성도 있고 이 모든 가능성을 다 검토해 보는 건데 그런 경우의 수가 너무 많기 때문에 완전 검색은 없습니다
이거는 하지 않아요
그래서 실제로는 이 3가지가 있는데 동적계획법은 딱 여기 까만 점이 action입니다
하얀 점이 상태고 내가 그러면 A1을 할 수도 있고 A2를 할 수도 있는데 A1을 하면 S1이 될 수도 있고 S2가 될 수도 있고 A2를 하면 S3, S4가 될 수도 있다
근데 이 다음에 이어지는 부분은 생각하지 않고 여기까지만 보고 어차피 우리가 여기서 여기로 갈 확률을 안단 말이에요
여기서 여기로 갈 확률을 알고 그래서 이렇게 하는 것이 동적계획법 그래서 우리가 했던 정책 반복 그 다음에 또 뭐죠
가치 반복이 이게 속합니다
이걸 하려면 전이 확률을 아셔야 돼요
전이 확률 P를 아셔야 되고 그 다음에 시간차 학습은 어떻게 하는 거냐면 그냥 여기서 한번 해보는 겁니다
내가 확률을 모르기 때문에 확률을 알면 여기로 가는 확률 여기로 가는 확률 여기로 가는 확률 여기로 가는 확률을 다 아니까 그걸 다 개선해가지고 더 하면 되는데 시간차 학습은 확률을 몰라요
이쪽은 다 예측 문제죠
확률을 모르니까 그냥 내가 해볼 수 밖에 없어요 해보면 결과는 항상 하나밖에 없죠
여러분들이 예를 들면 여기 미혼이신 분들 누가 마음에 들어요
그럼 그 사람한테 여기 뭐 커피 차라도 한잔하실래요
물어볼 수 밖에 없죠
근데 결과는 항상 확률은 있지만 확률은 잘 될 가능성 80% 친구들이 그런 것들 한번 얘기해 봐 커피라도 어디 토요일에 만나자고 얘기해 봐
그래서 내가 볼 때는 잘 될 확률이 90%야 확률이 90%면 뭐 합니까 여러분들이 토요일에 봅시다
이렇게 얘기했을 때 좋다
싫다는 결과는 하나뿐이죠
그러니까 가능성이 4가지가 있는데 우리가 하면 결과는 하나밖에 없단 말이에요
그럼 하나만큼의 결과를 반영을 해주면 이제 시간차 학습이 됩니다
그다음에 이제 몬테카를로는 끝까지 가보는 거죠 죽이 되든 밥이 되든 끝까지 가보는 거죠
그래서 끝까지 갔을 때 그 결과를 다 더하는 게 몬테카를로고 그러면 이 중간이 있겠죠
이 중간에 NSTEP이나 TD Lambda가 들어가게 됩니다