자율주행/Deep Q Network

Reinforcement Learning

Tony Lim 2021. 2. 23. 15:55
728x90

각 state에서 어떤 액션을 취하는게 좋은것인지를 각각의 Q 값을 통해 알수있다. 학습이 잘되어있는 경우에는

하지만 Q table은 처음부터 정답을 알려주지 않는다. 학습을 계속 반복적으로 수행해가면서 쓸만하게 된다.

하지만 문제가 있다 예시로 아래와 같다.

학습초반임으로 optimal 한 보상을 원하지않고 0.1 보상만으로 만족하면서 Qtable을 계속 update하게 되는 문제가 생긴다.

일정확률(Epsilon)을 선택하여서 agent가 action 을 랜덤하게 고를수 있도록한다. 게임 후반에 갈수록 Epslion 확률 값을 낮추어주는 방향으로 간다.

유명한 taxi simulation 코드이다.

#!/usr/bin/env python

import numpy as np
import random 
import gym

env = gym.make("Taxi-v3")

action_size = env.action_space.n

discount_factor = 0.9
learning_rate = 0.1

run_step = 5000000
test_step = 20

print_episode = 100

epsilon_init = 1.0
epsilon_min = 0.1

train_mode = True



class Q_Agent():
    def __init__(self):
        self.Q_table = {}
        self.epsilon = epsilon_init
    
    def init_Q_table(self,state):
        if state not in self.Q_table.keys():
            self.Q_table[state] = np.zeros(action_size)
    
    def get_action(self,state):
        if self.epsilon > np.random.rand():
            return np.random.randint(0,action_size)

        else:
            self.init_Q_table(state)

            predict = np.argmax(self.Q_table[state])
            return predict

    def train_model(self,state,action,reward,next_state,done):
        self.init_Q_table(state)
        self.init_Q_table(next_state)

        target = reward + discount_factor * np.max(self.Q_table[next_state])
        Q_val = self.Q_table[state][action]

        if done:
            self.Q_table[state][action] = reward
        else:
            self.Q_table[state][action] = (1-learning_rate) * Q_val + learning_rate * target



if __name__ == '__main__':
    agent = Q_Agent()

    step =0
    episode = 0
    reward_list = []

    while step < run_step + test_step:
        state = str(env.reset())
        episode_rewards = 0
        done = False

        while not done:
            if step >= run_step:
                train_mode = False
                env.render()
            action = agent.get_action(state)

            next_state, reward, done, _ = env.step(action)

            next_state = str(next_state)
            episode_rewards += reward

            if train_mode:
                if agent.epsilon > epsilon_min:
                    agent.epsilon -= 1.0 / run_step
                agent.train_model(state,action,reward,next_state,done)
            
            else:
                agent.epsilon = 0.0

            
            state = next_state
            step += 1
        
        reward_list.append(episode_rewards)
        episode += 1

        if episode != 0 and episode % print_episode == 0:
            print("Step: {} / Episode: {} / Epsilon: {:.3f} / Mean Rewards: {:.3f}".format(step, episode, agent.epsilon, np.mean(reward_list)))
            reward_list = []

    env.close()

5백만번 훈련(step) 을 시키고 

20번 정도 env 를 print 해보았다.

 

728x90

'자율주행 > Deep Q Network' 카테고리의 다른 글

DQN Upgrade  (0) 2021.02.25
DQN(Deep Q Network)  (0) 2021.02.24
ANN ,CNN -> ㅡMNIST 분석  (0) 2021.02.22