Lab 05-1: 비결정론적 세계에서의 Q-learning 학습
이번 강의에서는 여러분을 무시무시한 바람이 심하게 부는 프로즌 레이크의 세계로 초대합니다. 이전 강의에서 소개한 비결정론적(nondeterministic) 환경에서 Q-learning 알고리즘이 어떻게 동작하는지 실제로 구현하고 실습해보겠습니다. 이를 통해 비결정론적 환경에서 Q-learning이 얼마나 효과적으로 작동하는지 확인해볼 것입니다.
https://www.youtube.com/watch?v=ZCumo_6qTsU
https://www.youtube.com/watch?v=B-CZv9WD5eM
비결정론적 환경 이해하기
비결정론적 환경이란 동일한 행동을 반복해도 항상 동일한 결과를 얻지 못하는 환경을 의미합니다. 예를 들어, 꽁꽁 얼어붙은 호수 위를 걷는 상황을 상상해 봅시다. 여러분이 오른쪽으로 이동하려 하지만, 바닥이 미끄러워서 오른쪽으로 가지 않고 다른 방향으로 미끄러질 수도 있습니다. 이는 비결정론적 환경의 전형적인 예입니다.
결정론적 환경과의 차이점
결정론적 환경에서는 행동의 결과가 항상 예측 가능합니다. 예를 들어, 오른쪽으로 이동하려고 하면 항상 오른쪽으로 이동하고, 보상도 일정하게 주어집니다. 반면, 비결정론적 환경에서는 같은 행동을 해도 결과가 매번 달라질 수 있습니다.
(이미지를 입력하세요)
결정론적 (Deterministic) 환경에서의 Q-learning
먼저, 데이터미니스틱(deterministic) 환경에서의 Q-learning 알고리즘을 구현해보겠습니다. 이 환경에서는 행동의 결과가 항상 동일하게 나타나므로, 알고리즘의 작동 방식과 결과를 쉽게 예측할 수 있습니다.
다음은 데이터미니스틱 환경에서의 Q-learning 알고리즘을 구현한 예시입니다:
import gym
# 환경 설정
env = gym.make('FrozenLake-v0', is_slippery=False)
Q = np.zeros((env.observation_space.n, env.action_space.n))
alpha = 0.1 # 학습률
gamma = 0.99 # 할인율
epsilon = 0.1 # 탐험 확률
def epsilon_greedy(Q, state, epsilon):
if np.random.rand() < epsilon:
# 탐험: 랜덤한 행동 선택
action = env.action_space.sample()
else:
# 착취: Q값이 최대인 행동 선택
action = np.argmax(Q[state])
return action
# Q-learning 알고리즘
for episode in range(1000):
state = env.reset()
done = False
while not done:
action = epsilon_greedy(Q, state, epsilon)
next_state, reward, done, info = env.step(action)
# Q값 업데이트
best_next_action = np.argmax(Q[next_state])
td_target = reward + gamma * Q[next_state][best_next_action]
td_error = td_target - Q[state][action]
Q[state][action] += alpha * td_error
state = next_state
print("최종 Q-테이블:")
print(Q)
위 코드는 데이터미니스틱 환경에서 Q-learning 알고리즘을 적용하여 최적의 정책을 학습하는 과정입니다. 환경 설정에서 is_slippery=False로 설정하여 결정론적 환경을 만듭니다.
비결정론적(Nondeterministic, Stochastic) 환경에서의 Q-learning
이제 비결정론적 환경에서 Q-learning 알고리즘을 적용해보겠습니다. 비결정론적 환경에서는 행동의 결과가 예측 불가능하므로, ε-탐욕 정책(ε-greedy policy)과 할인된 보상(Discounted Reward)을 효과적으로 활용해야 합니다.
비결정론적 환경에서의 Q-learning 코드
다음은 비결정론적 환경에서의 Q-learning 알고리즘을 Python으로 구현한 예시입니다:
import gym
# 환경 설정
env = gym.make('FrozenLake-v0', is_slippery=True)
Q = np.zeros((env.observation_space.n, env.action_space.n))
alpha = 0.1 # 학습률
gamma = 0.99 # 할인율
epsilon = 0.1 # 탐험 확률
def epsilon_greedy(Q, state, epsilon):
if np.random.rand() < epsilon:
# 탐험: 랜덤한 행동 선택
action = env.action_space.sample()
else:
# 착취: Q값이 최대인 행동 선택
action = np.argmax(Q[state])
return action
# Q-learning 알고리즘
for episode in range(1000):
state = env.reset()
done = False
while not done:
action = epsilon_greedy(Q, state, epsilon)
next_state, reward, done, info = env.step(action)
# Q값 업데이트
best_next_action = np.argmax(Q[next_state])
td_target = reward + gamma * Q[next_state][best_next_action]
td_error = td_target - Q[state][action]
Q[state][action] += alpha * td_error
state = next_state
print("최종 Q-테이블:")
print(Q)
위 코드는 비결정론적 환경에서 Q-learning 알고리즘을 적용하여 최적의 정책을 학습하는 과정입니다. 환경 설정에서 is_slippery=True로 설정하여 비결정론적 환경을 만듭니다.
새로운 Q-learning 알고리즘 적용하기
이제 새로운 Q-learning 알고리즘을 적용하여 비결정론적 환경에서 얼마나 잘 동작하는지 확인해보겠습니다. 기존의 Q-learning 알고리즘은 비결정론적 환경에서 좋은 성능을 보이지 않았지만, 새로운 알고리즘을 통해 개선된 결과를 얻을 수 있습니다.
새로운 알고리즘의 핵심 아이디어
새로운 알고리즘의 핵심 아이디어는 Q값을 업데이트할 때, 현재의 Q값과 새로운 Q값을 적절히 혼합하여 사용하는 것입니다. 이를 통해 에이전트는 새로운 정보를 반영하면서도 기존의 지식을 유지할 수 있습니다.
import gym
# 환경 설정
env = gym.make('FrozenLake-v0', is_slippery=True)
Q = np.zeros((env.observation_space.n, env.action_space.n))
alpha = 0.1 # 학습률
gamma = 0.99 # 할인율
epsilon = 0.1 # 탐험 확률
def epsilon_greedy(Q, state, epsilon):
if np.random.rand() < epsilon:
# 탐험: 랜덤한 행동 선택
action = env.action_space.sample()
else:
# 착취: Q값이 최대인 행동 선택
action = np.argmax(Q[state])
return action
# Q-learning 알고리즘
for episode in range(1000):
state = env.reset()
done = False
while not done:
action = epsilon_greedy(Q, state, epsilon)
next_state, reward, done, info = env.step(action)
# Q값 업데이트
best_next_action = np.argmax(Q[next_state])
td_target = reward + gamma * Q[next_state][best_next_action]
td_error = td_target - Q[state][action]
Q[state][action] = (1 - alpha) * Q[state][action] + alpha * td_target
state = next_state
print("최종 Q-테이블:")
print(Q)
위 코드에서 Q값 업데이트 부분이 (1 - alpha) * Q[state][action] + alpha * td_target 형태로 변경되었습니다. 이는 새로운 정보를 10%만 받아들이고, 기존의 정보를 90% 유지하는 방식입니다. 이를 통해 비결정론적 환경에서도 안정적으로 학습할 수 있습니다.
실습 결과 분석
위의 새로운 알고리즘을 통해 학습한 결과를 분석해보면, 비결정론적 환경에서도 안정적인 학습 성능을 보여줍니다. 여러 번 실행하여 성공률을 확인해보면, 기존 알고리즘에 비해 향상된 결과를 얻을 수 있습니다.
성공률 확인
다음은 실습 결과를 확인하는 예시입니다:
for _ in range(100):
state = env.reset()
done = False
while not done:
action = np.argmax(Q[state])
next_state, reward, done, info = env.step(action)
state = next_state
if done and reward == 1:
successes += 1
print(f"성공률: {successes}%")
위 코드에서는 학습한 Q 테이블을 사용하여 100번의 에피소드를 실행하고, 성공한 횟수를 측정합니다. 이를 통해 학습된 정책의 성능을 평가할 수 있습니다.
결론
이번 강의를 통해 비결정론적 환경에서 Q-learning 알고리즘을 효과적으로 적용하는 방법을 배웠습니다. 새로운 알고리즘을 통해 비결정론적 환경에서도 안정적인 학습 성능을 얻을 수 있음을 확인했습니다. 앞으로 강화 학습을 더욱 심화하여 다양한 응용 분야에 적용할 수 있기를 기대합니다.
태그: 비결정론적, Q-learning, 강화학습, 탐험, 착취, 할인된보상, ε-탐욕정책, 새로운알고리즘, Python, 인공지능
'IT' 카테고리의 다른 글
Lab 6-1: Q-Network를 활용한 프로즌 레이크 강화 학습 (0) | 2024.07.18 |
---|---|
Lecture 6: Q-Network를 활용한 강화 학습 (0) | 2024.07.18 |
딱 10분 투자해서 만드는 SNS 자동 포스팅 시스템 (100% AI 자동화) (4) | 2024.07.17 |
초간단 AI활용 상세페이지 만들기: 2024년 기술 총정리 (0) | 2024.07.17 |
챗GPT를 활용하여 1일 1콘텐츠 쉽게 만드는 비법 (0) | 2024.07.17 |
댓글