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

강화학습 실습 7. FrozonLake : Q-network

cosmos 2018.02.11 13:12 조회 수 : 23

 

<< Q-Network >>
Q-테이블이 학습을 시키기에 효과적인 방법이긴 하지만, 가능한 state 수가 많아지거나
action이 많아지면 학습해야 할 Q-테이블의 크기가 급격하게 늘어나는 단점이 있다.
예를 들어, 80*80의 게임판에서 각 픽셀마다 표현할 수 있는 색이 검/흰 두가지만 하더라도
우리가 가정해야 하는 게임판의 종류는 2 ^ (80 * 80) 이 되어버린다.
즉, Q-테이블은 단순하고 직관적이지만 그만큼 확장성에 제약이 있다는 것이다. 
그럼 다양한 케이스를 처리하기 위해서 어떤 방법을 사용할 수 있을까? 
6강에서는 Q-Network를 가져왔다. 머신러닝에서 뉴런네트워크를 사용한 방식과 동일하다.
Layer을 지날 때 관계식 Y = w*X + b 을 계산하고 Y에 활성화 함수를 적용하여 다음 Layer로 전달한다.
이때 Q-Network에서의 input(X)은 state가 되고 output(Y)은 해당 state에서 각 action을 취할 때의 reward이다.
학습을 진행하면서 우리가 찾아야 하는 값은 오차를 가장 작게 하는 hidden layer의 weight과 bias이다. 
Q-table을 사용할 때는 테이블에 있는 값을 업데이트에 사용했는데,
Q-Network의 경우에는 현재 가지고 있는 w와 b 값을 토대로 계산된 Q값을 업데이트에 사용한다. 
오차는 관계식을 토대로 얻어낸 기대값 y'와 실제값 y의 차이를 제곱한 갑으로 정한다. 
즉, 우리는 min(sum((y - y')^2))인 weight을 찾아야 한다.
강의에서는 tensorflow를 활용해서 최적값을 우리가 직접 구현하는 것이 아니라 tensorflow 함수를 통해서 편하게 찾아낼 수 있게 하였다.

 

one_hot_encoder(state)
Frozen-Lake에서는 각 state를 0~15의 숫자로 표현하는데, 
Q-Network를 사용하여 강화학습을 구현할 때는 Y = W*X + b와 같은 산술 연산이 필요한 관계식을 적용하기 때문에 
state를 단순히 숫자 하나로 표현할 경우, 결과값이 input 정보를 충분히 담지 못한다.
그래서 one-hot encoding 이라는 방식을 사용하여 state를 표현하는데,
각 state는 0으로 초기화된 크기 16의 벡터에 표현하고자 하는 state만 1로 설정하여 표현한다. 
예를 들어, state 2를 표현하고자 한다면,
[0 0 1 0 0 ...] 과 같이 표현할 수 있다.
one_hot_encoder()에서는 기본행렬(대각선만 1이고 모두 0인 행렬)에서 state에 해당하는 행만 리턴하여 one-hot encoding을 구현하였다.

 

 

 


1. Decaying E-greedy - DQN 활용

 

 
import numpy as np
import matplotlib.pyplot as plt
import gym
import random
import tensorflow as tf

def one_hot_encoder(state_in):
    return np.identity(16)[state_in:state_in + 1]                      # 해당 state값만 1인 16 크기 행렬 리턴

env = gym.make("FrozenLake-v0")
input_size = env.observation_space.n
output_size = env.action_space.n
learning_rate = 0.7

X = tf.placeholder(shape=[1, input_size], dtype=tf.float32)            # placeholder는 데이터 input이 들어가는 자리
W = tf.Variable(tf.random_uniform([input_size, output_size], 0, 0.01)) # Variable은 학습시킬 변수의 자리

Qpredict = tf.matmul(X, W)                                             # (1, input_size) X (input_size, output_size) = (1, output_size)
Y = tf.placeholder(shape=[1, output_size], dtype=tf.float32)
loss = tf.reduce_sum(tf.square(Y-Qpredict)) # 오차 제곱의 합
train = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss) # 경사하강법을 사용하여 오차를 최소화하는 방향으로 학습을 시키겠다

num_episodes = 1000
e = 0.2
r = 0.9
rList = []
successRate = []

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(num_episodes):
        state = env.reset() # 초기 state 설정
        total_reward = 0
        done = None
        local_loss = []
        while not done :
            Qs = sess.run(Qpredict, feed_dict={X:one_hot_encoder(state)}) # feed_dict은 placeholder에 실제 값을 넣기 위해 설정하는 옵션
            
            rand = random.random()
            if (rand < e / (i/50 + 10)):
                action = env.action_space.sample()
            else :
                action = np.argmax(Qs) # 예측값에서 가장 큰 기대값을 다음 action으로 선택
            
            new_state, reward, done, _ = env.step(action) # new_state: 다음 state
            if done:
                Qs[0, action] = reward
            else:
                new_Qs = sess.run(Qpredict, feed_dict={X:one_hot_encoder(new_state)})
                Qs[0:action] = reward + r * np.max(new_Qs)
            sess.run(train, feed_dict={X:one_hot_encoder(state), Y:Qs})
            total_reward += reward
            state = new_state
        rList.append(total_reward)
        successRate.append(sum(rList) / (i + 1))

print("Final DQN")
print(Qs)
print("Success Rate : ", successRate[-1])
plt.plot(range(len(rList)), rList)
plt.plot(range(len(successRate)), successRate)
plt.show()


 

번호 제목 글쓴이 날짜 조회 수
공지 RL4RWS 이용 안내 모두의연구소 2017.09.04 1490
39 2월 20일 세미나 진행 내용 cosmos 2018.02.20 46
38 [아두이노] 초음파 센서 연결 예제 [2] file 쪼알 2018.02.16 35
37 2월 13일 세미나 진행 내용 cosmos 2018.02.13 42
» 강화학습 실습 7. FrozonLake : Q-network cosmos 2018.02.11 23
35 강화학습 실습 6. Tensorflow 설치 및 간단한 테스트 cosmos 2018.02.11 44
34 강화학습 실습 5. FrozonLake - Q-Learning on Stochastic World cosmos 2018.02.09 22
33 강화학습 실습 4. FrozonLake - Q-Learning : Exploit & Exploration cosmos 2018.02.09 17
32 강화학습 실습 3. FrozonLake - dummy Q-learning cosmos 2018.02.09 30
31 강화학습 실습 2. FrozonLake 동작 시켜 보기 cosmos 2018.02.09 36
30 강화학습 실습 1. Python과 OpenAI Gym 설치 및 간단한 동작 cosmos 2018.02.09 61
29 1차 아두이노 및 부품 리스트 file cosmos 2018.02.07 47
28 2월 6일 세미나 진행 내용 cosmos 2018.02.06 53
27 아두이노 기반 실물 제작 발표자료 file cosmos 2018.02.02 43
26 아두이노 설치 및 초음파센서, 모터, 블루투스 예제 사이트 정리 cosmos 2018.02.01 54
25 향후 일정 정리 file cosmos 2018.01.31 108
24 1월 30일 세미나 진행 내용 cosmos 2018.01.31 21
23 강화학습의 진화 : 3차원 및 물리환경의 적용 - LG blog file cosmos 2018.01.26 65
22 1월 23일 세미나 진행 내용 cosmos 2018.01.23 67
21 Autonomous self-learning systems 영문 번역 1차 file cosmos 2018.01.22 54
20 이산 시간 확률 과정, 마르코프 체인, 마르코프 의사결정 과정 관련 사이트 정리 cosmos 2018.01.18 164