Python으로 배우는 AI 개념

Python으로 배우는 마르코프 체인과 탐색-활용 트레이드오프

AI는 불확실한 상황에서 행동해야 할 때가 많습니다. 마르코프 체인은 시스템이 정해진 확률로 상태 사이를 이동하는 모습을 모델링하고, 멀티 암드 밴딧은 강화 학습의 핵심 선택을 보여 줍니다. 새로운 것을 시도할지, 지금까지 가장 잘 된 것을 쓸지입니다.

쉬운 말로 이해하는 개념

AI는 불확실한 상황에서 행동해야 할 때가 많습니다. 마르코프 체인은 시스템이 정해진 확률로 상태 사이를 이동하는 모습을 모델링하고, 멀티 암드 밴딧은 강화 학습의 핵심 선택을 보여 줍니다. 새로운 것을 시도할지, 지금까지 가장 잘 된 것을 쓸지입니다.

마르코프 체인으로 미래 상태를 예측하고, epsilon-greedy 밴딧으로 탐색과 활용의 균형을 잡습니다.

핵심 아이디어

  • 마르코프 체인에서 다음 상태는 현재 상태에만 의존합니다.
  • 한 상태에서 나가는 전이 확률의 합은 항상 1입니다.
  • 탐색은 더 좋은 선택지를 찾고, 활용은 알려진 최선의 선택지에서 보상을 얻습니다.
  • epsilon이 균형을 조절하며, 클수록 더 많이 탐색합니다.

언제 사용하나요?

  • 신경망과 AI 라이브러리 내부에서 무슨 일이 일어나는지 이해합니다.
  • 해당 챌린지에서 직접 구현하기 전에 아이디어를 익힙니다.
  • 머신러닝 강의, 면접, 프로젝트를 준비합니다.

직접 움직여 보기

날씨 전이 확률을 바꿔 체인이 어디에 안정되는지 보세요. 재생을 누르면 밴딧이 어떤 기계가 보상을 더 주는지 배웁니다.

예제 코드

코드 실행 →
main.py
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 컴파일러에서 실행하세요.

연습 문제

입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.

  1. 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
  2. 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
  3. 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
Python IDE에서 실행 →

챌린지로 연습하기

이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.

모든 챌린지