Python으로 배우는 AI 개념

Python으로 배우는 강화 학습: 가치 반복과 Q-러닝

강화 학습에서 에이전트는 환경 안에서 행동하고 보상을 받습니다. 각 상태나 행동이 얼마나 좋은지 배워서 시간이 지남에 따라 가장 많은 보상을 가져다주는 행동을 고를 수 있게 됩니다.

쉬운 말로 이해하는 개념

강화 학습에서 에이전트는 환경 안에서 행동하고 보상을 받습니다. 각 상태나 행동이 얼마나 좋은지 배워서 시간이 지남에 따라 가장 많은 보상을 가져다주는 행동을 고를 수 있게 됩니다.

에이전트에게 목표에 도달하는 법을 가르칩니다. 가치 반복으로 상태 가치를 계산한 뒤, Q-러닝으로 시행착오를 통해 학습합니다.

핵심 아이디어

  • 할인율 γ는 더 빨리 받는 보상을 더 가치 있게 만듭니다.
  • 가치 반복에는 환경의 모델이 필요하지만, Q-러닝은 경험으로 배웁니다.
  • Q(s, a)는 상태 s에서 행동 a를 했을 때 기대되는 총 보상입니다.
  • 에이전트가 목표를 발견하려면 탐색(여기서는 20%의 무작위 이동)이 필요합니다.

언제 사용하나요?

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

직접 움직여 보기

왼쪽의 재생을 누르면 목표에서부터 가치가 격자 전체로 퍼집니다. 오른쪽에서는 에이전트가 시행착오로 같은 경로를 배우는 모습을 볼 수 있습니다.

예제 코드

코드 실행 →
main.py
import random

# A corridor of 5 cells: start in cell 0, reward +10 for reaching cell 4.
N, GOAL, GAMMA = 5, 4, 0.9

# Value iteration: a cell is worth its reward plus the discounted best neighbour.
values = [0.0] * N
for _ in range(50):
    values = [0.0 if s == GOAL else max((10 if n == GOAL else 0) + GAMMA * values[n]
              for n in (max(0, s - 1), min(N - 1, s + 1))) for s in range(N)]
print("state values:", [round(v, 2) for v in values])

# Q-learning learns the same thing from trial and error.
random.seed(0)
Q = [[0.0, 0.0] for _ in range(N)]   # actions: 0 = left, 1 = right
for episode in range(200):
    s = 0
    while s != GOAL:
        a = random.randrange(2) if random.random() < 0.2 else Q[s].index(max(Q[s]))
        n = max(0, s - 1) if a == 0 else min(N - 1, s + 1)
        reward = 10 if n == GOAL else 0
        target = reward + (0 if n == GOAL else GAMMA * max(Q[n]))
        Q[s][a] += 0.5 * (target - Q[s][a])   # move the estimate toward the target
        s = n
print("best action per cell:", ["right" if q[1] >= q[0] else "left" for q in Q[:GOAL]])
print("Q(0, right):", round(Q[0][1], 2))

예상 출력

state values: [7.29, 8.1, 9.0, 10.0, 0.0]
best action per cell: ['right', 'right', 'right', 'right']
Q(0, right): 7.29

작동 원리

가치 반복은 벨만 업데이트를 반복합니다. 한 칸의 가치는 가장 좋은 보상에 다음 칸의 할인된 가치를 더한 값이며, 목표에서 멀어질수록 10, 9, 8.1, 7.29가 됩니다. Q-러닝은 규칙을 모릅니다. 매 단계 후 추정치를 reward + γ·max Q(next) 쪽으로 옮기며, 항상 오른쪽으로 가야 한다는 것을 배웁니다.

값을 변경하고 Python 설치 없이 CodeUtility 온라인 Python 컴파일러에서 실행하세요.

연습 문제

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

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

챌린지로 연습하기

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

모든 챌린지