ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [강화학습 RL] Q-Learning (1)
    AI/강화학습 2024. 6. 29. 01:10

    Q 함수

    Q에 내가 가진 상태(state)와 행동(action)을 주면 Q는 이런 상태에서 이런 행동을 하면 받을 수 있는 보상을 알려줌.

    Q-Learning 예제로 많이 사용되는 Frozen Lake 게임

    간단하게, 마지막 보상 전 칸 s14 (왼쪽 위 부터 s0~s15)에서 우측으로 가는 행동을 하면 보상을 받을 수 있게 된다.

    따라서, s14의 Q 함수는 {0:좌, 0:하, 1:우, 0:상} 정도로 추측할 수 있다.

     

    전체 state에서의 Q 함수 구하기

    Q함수

    위 식은, Q 함수를 구하는 식이다. r은 보상(reward)이고, s', a'은 다음 상태와 행동이다.

    Frozen Lake를 예로 들면, Q 함수는 {0, 1, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 1} 등의 값을 가질 수 있고, max(Q) = 1이다.

     

    다시, s14에서의 Q 함수 부터 다시 구하면, 

    오른쪽으로 이동했을 때 Q(s14, a_right) = r + max(Q(s15, a))이고, 목적지이므로 보상은 1, 목적지 도착 시 게임은 끝나므로 목적지에서의 Q 함수는 반드시 {0, 0, 0, 0}. max(Q(s15, a)) = 0.

    따라서 Q(s14, a_right) = 1로 Q 함수가 업데이트 된다.

     

    이제 목적지에서 두 칸 떨어진 s13에서의 Q 함수를 구하면,

    오른쪽으로 이동했을 때, 빙판일 뿐이므로 보상은 0, s14의 Q 함수는 {0, 0, 1, 0}이므로 max(Q(s14, a))=1.

    따라서 Q(s13, a_right) = 1로 Q 함수가 업데이트 된다.

     

    최초, 모든 Q 함수의 값이 0으로 동일할 때 부터, 랜덤하게 움직여 우연히 목적지에 도달했다면, 위 방식으로 Q 함수가 업데이트 되어 경로가 설정된다. 재귀함수 혹은 점화식을 생각하면 좋을 것 같다.

    업데이트 된 Q 함수

     

    import gym
    import numpy as np
    import matplotlib.pyplot as plt
    from gym.envs.registration import register
    import random
    
    # Q 함수에 동일한 max(Q)가 있을 때 행동을 랜덤하게 선택
    def rargmax(vector):
        m = np.amax(vector)
        indices = np.nonzero(vector == m)[0]
        return random.choice(indices)
    
    register(
        id='FrozenLake-v3',
        entry_point='gym.envs.toy_text:FrozenLakeEnv',
        kwargs={'map_name': '4x4',
                'is_slippery': False}
    )
    
    env = gym.make('FrozenLake-v3')
    
    Q = np.zeros([env.observation_space.n, env.action_space.n])
    num_episodes = 2000
    
    rList = []
    for i in range(num_episodes):
        state, _ = env.reset()
        rAll = 0
        done = False
    
        while not done:
            action = rargmax(Q[state, :])
        
            new_state, reward, done, _, _ = env.step(action)
    
            Q[state, action] = reward + np.max(Q[new_state, :])
    
            rAll += reward
            state = new_state
    
        rList.append(rAll)

     

    for ~ 이 시나리오(1시나리오가 게임 시작 ~ 끝) while이 끝날 때 까지 1시나리오입니다.

    action이 max(Q)의 index로 움직이는 역할, while 반복문의 끝에 state를 옮겨주는 코드가 있습니다.

     

    Sung Kim - 모두를 위한 RL강좌

Designed by Tistory.