Python으로 배우는 마르코프 체인과 탐색-활용 트레이드오프
AI는 불확실한 상황에서 행동해야 할 때가 많습니다. 마르코프 체인은 시스템이 정해진 확률로 상태 사이를 이동하는 모습을 모델링하고, 멀티 암드 밴딧은 강화 학습의 핵심 선택을 보여 줍니다. 새로운 것을 시도할지, 지금까지 가장 잘 된 것을 쓸지입니다.
쉬운 말로 이해하는 개념
AI는 불확실한 상황에서 행동해야 할 때가 많습니다. 마르코프 체인은 시스템이 정해진 확률로 상태 사이를 이동하는 모습을 모델링하고, 멀티 암드 밴딧은 강화 학습의 핵심 선택을 보여 줍니다. 새로운 것을 시도할지, 지금까지 가장 잘 된 것을 쓸지입니다.
마르코프 체인으로 미래 상태를 예측하고, epsilon-greedy 밴딧으로 탐색과 활용의 균형을 잡습니다.
핵심 아이디어
- 마르코프 체인에서 다음 상태는 현재 상태에만 의존합니다.
- 한 상태에서 나가는 전이 확률의 합은 항상 1입니다.
- 탐색은 더 좋은 선택지를 찾고, 활용은 알려진 최선의 선택지에서 보상을 얻습니다.
- epsilon이 균형을 조절하며, 클수록 더 많이 탐색합니다.
언제 사용하나요?
- 신경망과 AI 라이브러리 내부에서 무슨 일이 일어나는지 이해합니다.
- 해당 챌린지에서 직접 구현하기 전에 아이디어를 익힙니다.
- 머신러닝 강의, 면접, 프로젝트를 준비합니다.
직접 움직여 보기
날씨 전이 확률을 바꿔 체인이 어디에 안정되는지 보세요. 재생을 누르면 밴딧이 어떤 기계가 보상을 더 주는지 배웁니다.
예제 코드
import random
# Markov chain: tomorrow's weather depends only on today's.
transitions = {"sunny": {"sunny": 0.8, "rainy": 0.2}, "rainy": {"sunny": 0.4, "rainy": 0.6}}
dist = {"sunny": 1.0, "rainy": 0.0}
for day in range(1, 4):
dist = {s: sum(dist[p] * transitions[p][s] for p in dist) for s in dist}
print(f"day {day}:", {s: round(v, 3) for s, v in dist.items()})
# Epsilon-greedy bandit: usually pick the best arm so far, sometimes explore.
random.seed(1)
true_payouts = [0.3, 0.7]
counts, totals = [0, 0], [0.0, 0.0]
epsilon = 0.1
for _ in range(500):
if random.random() < epsilon or 0 in counts:
arm = random.randrange(2) # explore
else:
arm = max(range(2), key=lambda a: totals[a] / counts[a]) # exploit
reward = 1 if random.random() < true_payouts[arm] else 0
counts[arm] += 1
totals[arm] += reward
print("pulls per arm:", counts)
print("estimated payouts:", [round(t / c, 2) for t, c in zip(totals, counts)])
예상 출력
day 1: {'sunny': 0.8, 'rainy': 0.2}
day 2: {'sunny': 0.72, 'rainy': 0.28}
day 3: {'sunny': 0.688, 'rainy': 0.312}
pulls per arm: [25, 475]
estimated payouts: [0.16, 0.7]
작동 원리
매일 새 확률은 이전 확률에 전이 확률을 곱한 값이므로, 맑을 확률은 사흘 동안 1.0에서 0.688로 떨어집니다. 밴딧은 10%의 확률로 무작위 팔을 고르고, 나머지는 지금까지 평균이 가장 좋은 팔을 당깁니다. 곧 대부분의 시도를 더 좋은 팔에 쓰고, 그 보상을 약 0.7로 추정합니다.
값을 변경하고 Python 설치 없이 CodeUtility 온라인 Python 컴파일러에서 실행하세요.
연습 문제
입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.
- 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
- 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
- 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
- 마르코프 체인 상태 분포 마르코프 체인의 전이 행렬을 통해 확률 분포를 정해진 단계만큼 전파합니다. 쉬움
- 엡실론-그리디 멀티암드 밴딧 엡실론-그리디 행동 선택으로 멀티암드 밴딧에서 탐험과 활용의 균형을 맞춥니다. 쉬움