Stochastic이란?

지금까지 우리는 미끄러짐이 없는 FrozenLake 게임으로 학습시켜 왔습니다. 그런데 만약 얼음에서 미끄러질 수 있도록 설정한다면 어떻게 될까요? 키보드로 액션을 입력받는 예제를 통해 한번 알아보도록 하겠습니다.

import gym
import sys, tty, termios

class _Getch:
    def __call__(self):
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(3)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

inkey = _Getch()

# MACROS in Gym
LEFT = 0
DOWN = 1
RIGHT = 2
UP = 3

# key mapping
arrow_keys = {
    '\x1b[A': UP,
    '\x1b[B': DOWN,
    '\x1b[C': RIGHT,
    '\x1b[D': LEFT}

# is_slippery true
env = gym.make('FrozenLake-v0')
env.reset()
env.render()

while True:
    # Choose an action from keyboard
    key = inkey()
    if key not in arrow_keys:
        print("Game aborted")
        break

    action = arrow_keys[key]
    state, reward, done, info = env.step(action)
    env.render()
    print("state: ", state, "action: ", action, "reward: ", reward, "info: ", info)

    if done:
        print("finish with reward: ", reward)
        break

위 코드를 실행하여 Right→Right→Right→Right→Right→Right로 입력했을 때,
실제로는 제자리→Down→Down→Up→Down→Down으로 랜덤하게 이동하는 것을 확인할 수 있습니다.

이와 같이, 다음 action을 예측할 수 없을 때 Stochastic(non-deterministic) 하다고 말합니다. Stochastic 상태에서 기존의 Q-table 업데이트 알고리즘을 그대로 사용한다면 아래 이미지와 같이 성공률이 현저하게 줄어듭니다. 그렇다면 어떤 방법으로 Stochastic 상태의 성공률을 올릴 수 있을까요?

Sarsa 알고리즘

Temporal-Difference Learning

value function 이 최대가 되는 policy을 찾는 알고리즘 중에는 Dynamic Programming과 와 Monte Carlo Methods가 있습니다.

dynamic progamming은 environment의 model을 다 알고 문제를 푸는 planning입니다.

Monte Carlo Methods 엄청나게 많은 수를 일일이 다 다루지 않더라도 그 가운데에서 샘플링을 하여 확률적 연산을 수행함으로써 최선의 수를 찾아가는 기법으로 알려져 있습니다. 게임 프로그램에서는 이미 많이 사용된다고 합니다.

Temporal-Difference는 Dynamic Programming과 와 Monte Carlo Methods를 조합한 것입니다.

Q-Learning: Off-Policy TD Control

Off-Policy

look over someone's shoulder 간접 경험

Sarsa: On-Policy TD Control

On-Policy

learn on the job 직접 경험

results matching ""

    No results matching ""