close_btn
로그인, 회원가입후 더 많은 혜택을 누리세요 로그인 회원가입 닫기

https://github.com/modulabs/RL4RWS/blob/master/reinforcement-learning/04_qlearning_on_nondeterministic_env.py

 

<< Q-Learning on Stochastic World >>
이번 강에서는 Stochastic / Nondeterministic한 환경에서의 Q-Learning 방식을 소개한다.
Deterministic하다는 것은 어떤 함수가 무조건 parameter에 따라 결과가 결정된다는 의미이다.
즉, 같은 인자에 같은 결과가 나온다는 것. 앞서서 우리가 가정했던 Frozen Lake의 환경은
입력한 action 그대로 다음 state가 결정되는 상황이었다. 
그에 반해 non-deterministic한 환경에서는 입력과 관계없이 랜덤한 결과가 나온다.
gym에서 is_slippery 값을 True로 설정하게 되면 호수에서 움직일 때 미끄러져서 action과 무관하게
다음 state가 결정된다. 그렇기 때문에 이전 시간까지 우리가 Q-테이블을 채우는 방식을 그대로 가져오면
성공률이 현저하게 떨어지게 된다. Q-테이블은 내가 그대로 움직일 것을 가정하고 최대 reward 값을 리턴하는데
실제로 나는 그 방향대로 움직이지 않을 것이기 때문이다.
그렇다면 이런 상황에서 Q-테이블은 쓸모가 없어지는 것인가?
가끔씩 action대로 움직이는 경우도 발생하기 때문에 Q-table을 완전히 무시하는 것도 비효율적일 수 있다. 
그래서 제안하는 것이 Q-테이블을 보되, 업데이트할 때 다음 state의 reward를 적게 반영하는 것이다.
Q[state, action] = r + max(Q[new_state])
이 식은 내가 원하는대로 움직이는 것을 가정한 식이기 때문에 non-deterministic 상황에서는 Q[state] 값을 왜곡하므로
이 부분이 반영되는 비율을 적게 하고, 현재의 값을 많이 반영하면, Q-table 값을 어느정도 보정할 수 있다.
보정하는 비율을 learning rate라고 하고 Q값 업데이트는 아래와 같이 한다.
Q[state] = (1-a)*Q[state] + a*(r + Q[new_state])

 


1. Random Noise 기반 업데이트

 

 
import gym
import numpy as np      ####  http://yujuwon.tistory.com/entry/NumPy
import random
import matplotlib.pyplot as plt

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

Q = np.zeros([env.observation_space.n, env.action_space.n])    # (16,4) : 4*4 map + 상하좌우 4개

num_episodes = 2000
rList = []
successRate = []

###e = 0.1 # exploit & exploration
learning_rate = 0.8
r = 0.9 # discount rate

def rargmax(vector) :
    m = np.amax(vector)                    # Return the maximum of an array or maximum along an axis (0 아니면 1)
    indices = np.nonzero(vector == m)[0]   # np.nonzero(True/False vector) => 최대값인 요소들만 걸러내
    return random.choice(indices)          # 그 중 하나 랜덤으로 선택

for i in range(num_episodes) :             # 학습을 num_episodes 만큼 시키면서 업데이트
    state = env.reset()                    # 리셋
    total_reward = 0                       # 나중에 그래프를 그리기 위한 (성공하면 1, 실패하면 0)
    done = None
    while not done:
        ###rand = random.random()
        action = rargmax(
            Q[state, :] + np.random.random(env.action_space.n) / (i + 1))
        new_state, reward, done, _ = env.step(action) 
        Q[state, action] = (1 - learning_rate) * Q[state, action] + \
            learning_rate * (reward + r * np.max(Q[new_state, :]))
        total_reward += reward
        state = new_state
    rList.append(total_reward)                 # 이번 게임에서 reward가 0인지 1인지
    successRate.append(sum(rList)/(i+1))       # 지금까지의 성공률
print("Final Q-Table")
print(Q)
print("Success Rate : ", successRate[-1])
plt.plot(range(len(successRate)), successRate) # 성공률 그래프
plt.plot(range(len(rList)), rList)             # reward 그래프
plt.show()


 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
공지 RL4RWS 이용 안내 모두의연구소 2017.09.04 1757
37 2월 13일 세미나 진행 내용 cosmos 2018.02.13 61
36 강화학습 실습 7. FrozonLake : Q-network cosmos 2018.02.11 59
35 강화학습 실습 6. Tensorflow 설치 및 간단한 테스트 cosmos 2018.02.11 343
» 강화학습 실습 5. FrozonLake - Q-Learning on Stochastic World cosmos 2018.02.09 107
33 강화학습 실습 4. FrozonLake - Q-Learning : Exploit & Exploration cosmos 2018.02.09 109
32 강화학습 실습 3. FrozonLake - dummy Q-learning cosmos 2018.02.09 156
31 강화학습 실습 2. FrozonLake 동작 시켜 보기 cosmos 2018.02.09 139
30 강화학습 실습 1. Python과 OpenAI Gym 설치 및 간단한 동작 cosmos 2018.02.09 278
29 1차 아두이노 및 부품 리스트 file cosmos 2018.02.07 95
28 2월 6일 세미나 진행 내용 cosmos 2018.02.06 60
27 아두이노 기반 실물 제작 발표자료 file cosmos 2018.02.02 87
26 아두이노 설치 및 초음파센서, 모터, 블루투스 예제 사이트 정리 cosmos 2018.02.01 427
25 향후 일정 정리 file cosmos 2018.01.31 145
24 1월 30일 세미나 진행 내용 cosmos 2018.01.31 30
23 강화학습의 진화 : 3차원 및 물리환경의 적용 - LG blog file cosmos 2018.01.26 90
22 1월 23일 세미나 진행 내용 cosmos 2018.01.23 81
21 Autonomous self-learning systems 영문 번역 1차 file cosmos 2018.01.22 77
20 이산 시간 확률 과정, 마르코프 체인, 마르코프 의사결정 과정 관련 사이트 정리 cosmos 2018.01.18 383
19 시즌 2에 사용할 실물 회로 및 부품 file cosmos 2018.01.12 81
18 10월 31일 세미나에서 진행할 내용 cosmos 2017.10.31 62