Lecture 6: Q-Network를 활용한 강화 학습
지난 강의에서 우리는 Q-테이블을 사용하여 Q-learning을 학습하는 방법을 배웠습니다. Q-테이블을 활용하면 간단한 환경에서 최적의 정책을 쉽게 학습할 수 있습니다. 그러나 현실 세계의 복잡한 문제를 해결하려면 더 큰 상태 공간이 필요합니다. 이번 강의에서는 Q-Network를 사용하여 이러한 문제를 해결하는 방법을 학습하고, 실제로 구현해 보겠습니다.
https://www.youtube.com/watch?v=w9GwqPx7LW8
Q-테이블의 한계와 Q-Network의 필요성
Q-테이블은 간단한 문제를 해결하는 데는 효과적이지만, 상태 공간이 커지면 실용적이지 않습니다. 예를 들어, 100x100 크기의 격자 환경을 생각해 봅시다. 이 경우 상태 공간은 10,000개가 되며, 각 상태마다 가능한 행동이 4개라면 총 40,000개의 Q값을 저장해야 합니다. 이러한 큰 상태 공간에서는 Q-테이블 방식은 비효율적입니다.
Q-테이블의 한계 극복
더 복잡한 환경, 특히 이미지를 입력으로 받는 경우 상태 공간은 엄청나게 커집니다. 예를 들어, 80x80 크기의 이미지에서 각 픽셀이 2가지 색상을 가질 수 있다면 상태 공간의 크기는 264002^{6400}입니다. 이는 엄청난 수의 상태를 의미하며, Q-테이블로는 처리가 불가능합니다.
이러한 문제를 해결하기 위해 Q-Network를 사용합니다. Q-Network는 상태와 행동을 입력으로 받아 Q값을 예측하는 신경망입니다. 이를 통해 상태 공간이 커도 효율적으로 학습할 수 있습니다.
Q-Network의 구조와 작동 원리
Q-Network는 신경망을 사용하여 주어진 상태에 대한 모든 가능한 행동의 Q값을 출력합니다. 이는 Q-테이블을 대체하며, 복잡한 환경에서도 효과적으로 작동할 수 있습니다.
Q-Network의 기본 구조
Q-Network의 입력은 현재 상태이고, 출력은 가능한 모든 행동에 대한 Q값입니다. 예를 들어, 네 가지 행동이 가능한 환경에서는 네 개의 Q값을 출력합니다. 이 신경망은 다음과 같은 구조를 가질 수 있습니다:
- 입력층: 현재 상태를 입력으로 받습니다.
- 은닉층: 여러 개의 은닉층을 통해 입력을 처리합니다.
- 출력층: 각 행동에 대한 Q값을 출력합니다.
import torch.nn as nn
import torch.optim as optim
class QNetwork(nn.Module):
def __init__(self, state_size, action_size):
super(QNetwork, self).__init__()
self.fc1 = nn.Linear(state_size, 64)
self.fc2 = nn.Linear(64, 64)
self.fc3 = nn.Linear(64, action_size)
def forward(self, state):
x = torch.relu(self.fc1(state))
x = torch.relu(self.fc2(x))
return self.fc3(x)
위의 코드에서는 간단한 Q-Network를 정의했습니다. 이 신경망은 상태를 입력으로 받아 가능한 모든 행동에 대한 Q값을 출력합니다.
Q-Network의 학습 방법
Q-Network는 주어진 상태와 행동에 대한 Q값을 예측하고, 이를 통해 학습합니다. 학습 과정은 다음과 같습니다:
- 상태와 행동 선택: 현재 상태에서 행동을 선택합니다. 이는 ε-탐욕 정책을 사용하여 탐험과 착취의 균형을 맞춥니다.
- 행동 수행 및 보상 수집: 선택한 행동을 수행하고, 새로운 상태와 보상을 수집합니다.
- Q값 업데이트: 다음 상태에서의 최대 Q값을 사용하여 현재 Q값을 업데이트합니다.
# 환경 설정
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
q_network = QNetwork(state_size, action_size)
optimizer = optim.Adam(q_network.parameters(), lr=0.001)
criterion = nn.MSELoss()
# Q-learning 알고리즘
for episode in range(1000):
state = env.reset()
done = False
while not done:
state_tensor = torch.FloatTensor(state).unsqueeze(0)
if np.random.rand() < epsilon:
action = env.action_space.sample() # 탐험
else:
with torch.no_grad():
q_values = q_network(state_tensor)
action = q_values.argmax().item() # 착취
next_state, reward, done, _ = env.step(action)
next_state_tensor = torch.FloatTensor(next_state).unsqueeze(0)
with torch.no_grad():
next_q_values = q_network(next_state_tensor)
max_next_q_value = next_q_values.max().item()
target_q_value = reward + (gamma * max_next_q_value)
q_value = q_network(state_tensor)[0, action]
loss = criterion(q_value, torch.tensor(target_q_value))
optimizer.zero_grad()
loss.backward()
optimizer.step()
state = next_state
print("학습 완료 후 Q-Network의 가중치:")
print(q_network.state_dict())
위의 코드는 Q-Network를 사용하여 강화 학습을 수행하는 예시입니다. ε-탐욕 정책을 사용하여 행동을 선택하고, Q값을 업데이트하여 학습합니다.
Q-Network의 학습과 Q-테이블 비교
Q-Network는 Q-테이블에 비해 더 큰 상태 공간에서도 효율적으로 학습할 수 있습니다. 이는 Q-Network가 상태와 행동을 매핑하는 함수를 학습하기 때문입니다. 이를 통해 복잡한 환경에서도 효과적으로 작동할 수 있습니다.
Q-테이블과 Q-Network의 비교
- Q-테이블: 작은 상태 공간에서는 효과적이지만, 상태 공간이 커지면 비효율적입니다.
- Q-Network: 상태 공간이 커도 효과적으로 학습할 수 있으며, 복잡한 환경에서도 잘 작동합니다.
결론
이번 강의를 통해 Q-Network를 사용하여 강화 학습을 수행하는 방법을 배웠습니다. Q-테이블의 한계를 극복하고, 더 복잡한 환경에서도 효과적으로 학습할 수 있는 Q-Network의 중요성을 이해하셨을 것입니다. 앞으로 Q-Network를 활용하여 다양한 응용 분야에 적용할 수 있기를 기대합니다.
태그: Q-Network, 강화학습, 딥러닝, Q-learning, 신경망, 머신러닝, Python, 인공지능, ε-탐욕정책, Q-테이블
'IT' 카테고리의 다른 글
Lab 6-2: Q-Network를 활용한 카트폴 강화 학습 (0) | 2024.07.18 |
---|---|
Lab 6-1: Q-Network를 활용한 프로즌 레이크 강화 학습 (0) | 2024.07.18 |
Lab 05-1: 비결정론적 세계에서의 Q-learning 학습 (0) | 2024.07.18 |
딱 10분 투자해서 만드는 SNS 자동 포스팅 시스템 (100% AI 자동화) (4) | 2024.07.17 |
초간단 AI활용 상세페이지 만들기: 2024년 기술 총정리 (0) | 2024.07.17 |
댓글