건조젤리의 저장소

5-2. Windy Frozen Lake 구현 본문

공부 기록/모두를 위한 딥러닝 (RL)

5-2. Windy Frozen Lake 구현

건조젤리 2019. 11. 19. 17:13

김성훈 교수님의 강의내용을 정리한 내용입니다.

출처 : http://hunkim.github.io/ml/

 

모두를 위한 머신러닝/딥러닝 강의

 

hunkim.github.io


 

새로운 Q-learning 알고리즘

번경된 업데이트 식을 그대로 적어 구현하자!

FrozenLake-v0을 사용하여 (is_slippery = True) 구현하자.

 

빠른 학습을위해 학습률을 0.85로 설정하자.

이전보다 더 나은 결과를 보인다!

 

이유?

-> 가끔일어나는 slippery때문에 Q값이 적절하지 않은 값으로 설정될 수 있다.

이를 방지하기 위해 이전의 학습을 어느정도 반영하는 방법이 필요하다!


구현 코드 (환경: ubuntu:16.04 python 3.6)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import time
 
import gym
import numpy as np
 
import utils.prints as print_utils
 
N_ACTIONS = 4
N_STATES = 16
 
LEARNING_RATE = .5
DISCOUNT_RATE = .98
 
N_EPISODES = 2000
 
def main():
    """Main"""
    frozone_lake_env = gym.make("FrozenLake-v0")
 
    # Initialize table with all zeros
    Q = np.zeros([N_STATES, N_ACTIONS])
 
    # Set learning parameters
 
    # create lists to contain total rewards and steps per episode
    rewards = []
 
    for i in range(N_EPISODES):
        # Reset environment and get first new observation
        state = frozone_lake_env.reset()
        episode_reward = 0
        done = False
 
        # The Q-Table learning algorithm
        while not done:
            # Choose an action by greedily (with noise) picking from Q table
            noise = np.random.randn(1, N_ACTIONS) / (i + 1)
            action = np.argmax(Q[state, :] + noise)
 
            # Get new state and reward from environment
            new_state, reward, done, _ = frozone_lake_env.step(action)
 
            reward = -1 if done and reward < 1 else reward
 
            # Update Q-Table with new knowledge using learning rate
            Q[state, action] = (
                1 - LEARNING_RATE) * Q[state, action] + LEARNING_RATE * (
                    reward + DISCOUNT_RATE * np.max(Q[new_state, :]))
 
            episode_reward += reward
            state = new_state
 
        rewards.append(episode_reward)
 
    print("Score over time: " + str(sum(rewards) / N_EPISODES))
    print("Final Q-Table Values")
 
    for i in range(10):
        # Reset environment and get first new observation
        state = frozone_lake_env.reset()
        episode_reward = 0
        done = False
 
        # The Q-Table learning algorithm
        while not done:
            # Choose an action by greedily (with noise) picking from Q table
            action = np.argmax(Q[state, :])
 
            # Get new state and reward from environment
            new_state, reward, done, _ = frozone_lake_env.step(action)
            print_utils.clear_screen()
            frozone_lake_env.render()
            time.sleep(.1)
 
            episode_reward += reward
            state = new_state
 
            if done:
                print("Episode Reward: {}".format(episode_reward))
                print_utils.print_result(episode_reward)
 
        rewards.append(episode_reward)
 
    frozone_lake_env.close()
 
 
if __name__ == '__main__':
    main()

 

cs

utils.prints 함수 참고 : https://github.com/hunkim/ReinforcementZeroToAll

'공부 기록 > 모두를 위한 딥러닝 (RL)' 카테고리의 다른 글

6-2. Q-Network 구현 (Frozen Lake)  (0) 2019.11.20
6-1. Q-Network  (0) 2019.11.19
5-1. Windy Frozen Lake (Non-deterministic world)  (0) 2019.11.19
4-2. Q-learning 구현 (table)  (0) 2019.11.19
4-1. Q-learning  (0) 2019.11.19
Comments