더블 Q-러닝

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Fouad Trad

Machine Learning Engineer

Q-러닝

  • 최적 행동-가치 함수를 추정
  • 최대 Q에 기반해 업데이트하여 Q값을 과대평가할 수 있음
  • 비최적 정책 학습으로 이어질 수 있음

 

Q-러닝 업데이트 규칙의 수식 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

더블 Q-러닝

  • 두 개의 Q-테이블 유지
  • 각 테이블은 서로를 기반으로 업데이트
  • Q값 과대평가 위험 감소

두 개의 Q-테이블 Q0와 Q1이 서로를 기반으로 업데이트되는 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

더블 Q-러닝 업데이트

  • 무작위로 테이블 선택

두 개의 Q-테이블 Q0와 Q1이 서로를 기반으로 업데이트되는 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Q0 업데이트

두 개의 Q-테이블 Q0와 Q1이 서로를 기반으로 업데이트되는 이미지.

Q0 업데이트 시 다음 최적 행동을 찾는 방법을 보여주는 이미지.

Q0의 업데이트 규칙을 보여주는 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Q1 업데이트

두 개의 Q-테이블 Q0와 Q1이 서로를 기반으로 업데이트되는 이미지.

Q1 업데이트 시 다음 최적 행동을 찾는 방법을 보여주는 이미지.

Q1의 업데이트 규칙을 보여주는 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

더블 Q-러닝

두 개의 Q-테이블 Q1과 Q2가 서로를 기반으로 업데이트되는 이미지.

  • 과대평가 편향 감소
  • Q0와 Q1 업데이트를 번갈아 수행
  • 두 테이블이 학습에 함께 기여
Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Frozen Lake로 구현하기

env = gym.make('FrozenLake-v1', 
               is_slippery=False)

num_states = env.observation_space.n
n_actions = env.action_space.n
Q = [np.zeros((num_states, n_actions))] * 2

num_episodes = 1000 alpha = 0.5 gamma = 0.99

에이전트가 Frozen Lake 환경을 탐색하는 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

update_q_tables() 구현

def update_q_tables(state, action, reward, next_state):
    # Select a random Q-table index (0 or 1)
    i = np.random.randint(2)

# Update the corresponding Q-table best_next_action = np.argmax(Q[i][next_state])
Q[i][state, action] = (1 - alpha) * Q[i][state, action] + alpha * (reward + gamma * Q[1-i][next_state, best_next_action])

Q1의 업데이트 규칙을 보여주는 이미지.

Q2의 업데이트 규칙을 보여주는 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

학습(Training)

for episode in range(num_episodes):
    state, info = env.reset()
    terminated = False

    while not terminated:
        action = np.random.choice(n_actions)  
        next_state, reward, terminated, truncated,  info = env.step(action)
        update_q_tables(state, action, reward, next_state)
        state = next_state

final_Q = (Q[0] + Q[1])/2 # OR final_Q = Q[0] + Q[1]
Python으로 배우는 Gymnasium 기반 Reinforcement Learning

에이전트의 정책

policy = {state: np.argmax(final_Q[state]) 
          for state in range(num_states)}
print(policy)
{ 0: 1,  1: 0,  2: 0,  3: 0, 
  4: 1,  5: 0,  6: 1,  7: 0, 
  8: 2,  9: 1, 10: 1, 11: 0, 
 12: 0, 13: 2, 14: 2, 15: 0}

에이전트가 학습한 정책: 각 상태에서 수행할 행동을 표시한 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

연습해 봅시다!

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Preparing Video For Download...