오늘은 파이썬을 사용하여 강화 학습의 Q-러닝 알고리즘을 구현해보겠습니다.
Q-러닝은 강화 학습의 한 종류로, 에이전트가 환경과 상호작용하며 최적의 행동을 학습하는 방법입니다. Q-러닝은 상태-행동 쌍에 대한 가치를 학습하여 최적의 정책을 찾습니다.
이번 포스팅에서는 간단한 그리드 월드 환경에서 Q-러닝을 구현해보겠습니다. 그리드 월드는 에이전트가 목표 지점에 도달하기 위해 이동해야 하는 격자 형태의 환경입니다.
먼저 필요한 라이브러리를 설치합니다.
pip install numpy matplotlib
그리드 월드 환경을 설정합니다. 아래는 간단한 4×4 그리드 월드의 예시입니다.
import numpy as np
class GridWorld:
def __init__(self, size):
self.size = size
self.state = (0, 0) # 에이전트의 초기 위치
self.goal = (size-1, size-1) # 목표 지점
def reset(self):
self.state = (0, 0)
return self.state
def step(self, action):
# 행동에 따른 상태 변화
x, y = self.state
if action == 0: # 위
x = max(x - 1, 0)
elif action == 1: # 아래
x = min(x + 1, self.size - 1)
elif action == 2: # 왼쪽
y = max(y - 1, 0)
elif action == 3: # 오른쪽
y = min(y + 1, self.size - 1)
self.state = (x, y)
reward = 1 if self.state == self.goal else 0
return self.state, reward
이제 Q-러닝 알고리즘을 구현합니다.
class QLearningAgent:
def __init__(self, actions, learning_rate=0.1, discount_factor=0.9):
self.q_table = np.zeros((4, 4, len(actions))) # Q-테이블 초기화
self.learning_rate = learning_rate
self.discount_factor = discount_factor
self.actions = actions
def choose_action(self, state):
if np.random.rand() < 0.1: # 탐사
return np.random.choice(self.actions)
else: # 활용
return np.argmax(self.q_table[state[0], state[1]])
def learn(self, state, action, reward, next_state):
best_next_action = np.argmax(self.q_table[next_state[0], next_state[1]])
td_target = reward + self.discount_factor * self.q_table[next_state[0], next_state[1], best_next_action]
td_delta = td_target - self.q_table[state[0], state[1], action]
self.q_table[state[0], state[1], action] += self.learning_rate * td_delta
이제 에이전트를 학습시키는 코드를 작성합니다.
actions = [0, 1, 2, 3] # 위, 아래, 왼쪽, 오른쪽
env = GridWorld(size=4)
agent = QLearningAgent(actions)
for episode in range(1000):
state = env.reset()
done = False
while not done:
action = agent.choose_action(state)
next_state, reward = env.step(action)
agent.learn(state, action, reward, next_state)
state = next_state
if reward == 1:
done = True
Q-테이블의 학습 결과를 확인해보겠습니다.
print(agent.q_table)
위 코드를 실행하면 Q-테이블이 출력됩니다. 각 상태에서 가능한 행동의 Q-값이 표시됩니다.