-
[강화학습 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강좌