강화학습/OpenAI gym

OpenAI gym을 이용해 TD prediction 구현하기

APinCan 2020. 3. 20. 22:09

이번에는 OpenAI의 FrozenLake-v0를 이용해 temporal difference, 시간차 예측을 구현해보자

몬테카를로 예측의 경우 하나의 에피소드를 끝내야지 return값을 얻고 그걸 이용해서 value function을 업데이트하는데 시간차 예측의 경우 그렇지 않고 몬테카를로와 비슷하지만 각 타임스텝마다 value function을 업데이트함.

몬테카를로의 공식을 거의 그대로 사용하다보니 사실 구현도 그렇게 크게 다르진 않음

 

 

import gym
import numpy as np
import random

GAMMA=0.9
POLICY = [0.25, 0.25, 0.25, 0.25]
TIMES = 5000000
ALPHA = 0.1

언제나 먼저 나오는 선언부

이번에는 에피소드를 사용하지 않고 오로지 타임스텝만 사용, 그리고 value function을 업데이트하는데 필요한 alpha값은 0.1로 설정

 

env = gym.make('FrozenLake-v0')

언제나 그렇듯 얼음호수 환경만들기

 

def select_action():
    sum_policy = 0
    rand_prob = random.random()
    
    # policy에 따른 action 계산
    for idx, action_prob in enumerate(POLICY):            
        sum_policy += action_prob
        if rand_prob <= sum_policy:
            action = idx
            return action

사전에 설정한 policy에 따라 action을 선택하는 함수

몬테카를로 예측에서 한번 썼던 코드임. 각 action을 선택할 확률은 모두 동일.

 

value_func = np.zeros(env.observation_space.n)
observation = env.reset()

for t in range(TIMES):
    action = select_action()
    next_observation, reward, done, info = env.step(action)
    
    state_value = value_func[observation] + ALPHA*(reward + GAMMA*value_func[next_observation] - value_func[observation])
    value_func[observation] = state_value    
    observation = next_observation
    
    if done:
        observation = env.reset()

그리고 value function을 계산 및 main부분.

몬테카를로 예측에 비해서 굉장히 심플함. return값을 계산하는 부분이 없어서 그런듯. 첫번째로 action을 policy에 따라 선택하고 선택한 action을 환경에 알려주면 환경은 그에 맞는 return값들을 줌.

그 다음 한줄이 시간차예측 공식을 그대로 쓴 것임. (실제 받은 reward를 가지고 계산한 value function) - (이전에 예측한 value function) 이렇게 시간 간격을 두고 두 value function의 차이를 계산해서 업데이트하므로 시간차라고 부르는듯.

그리고 이렇게 계산한 값을 현재 state의 value function으로 설정. 이렇게 한 후 결과를 봐보자.

 

타임스텝을 100만번 준경우

500만번

7백만번

 

딱히 수렴하는 것 같아보이지는 않는데 천만번이든 이천만번이든 돌려보면 수렴하지 않을까?