Python으로 배우는 강화 학습: 가치 반복과 Q-러닝
강화 학습에서 에이전트는 환경 안에서 행동하고 보상을 받습니다. 각 상태나 행동이 얼마나 좋은지 배워서 시간이 지남에 따라 가장 많은 보상을 가져다주는 행동을 고를 수 있게 됩니다.
쉬운 말로 이해하는 개념
강화 학습에서 에이전트는 환경 안에서 행동하고 보상을 받습니다. 각 상태나 행동이 얼마나 좋은지 배워서 시간이 지남에 따라 가장 많은 보상을 가져다주는 행동을 고를 수 있게 됩니다.
에이전트에게 목표에 도달하는 법을 가르칩니다. 가치 반복으로 상태 가치를 계산한 뒤, Q-러닝으로 시행착오를 통해 학습합니다.
핵심 아이디어
- 할인율 γ는 더 빨리 받는 보상을 더 가치 있게 만듭니다.
- 가치 반복에는 환경의 모델이 필요하지만, Q-러닝은 경험으로 배웁니다.
- Q(s, a)는 상태 s에서 행동 a를 했을 때 기대되는 총 보상입니다.
- 에이전트가 목표를 발견하려면 탐색(여기서는 20%의 무작위 이동)이 필요합니다.
언제 사용하나요?
- 신경망과 AI 라이브러리 내부에서 무슨 일이 일어나는지 이해합니다.
- 해당 챌린지에서 직접 구현하기 전에 아이디어를 익힙니다.
- 머신러닝 강의, 면접, 프로젝트를 준비합니다.
직접 움직여 보기
왼쪽의 재생을 누르면 목표에서부터 가치가 격자 전체로 퍼집니다. 오른쪽에서는 에이전트가 시행착오로 같은 경로를 배우는 모습을 볼 수 있습니다.
예제 코드
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 컴파일러에서 실행하세요.
연습 문제
입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.
- 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
- 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
- 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
- 가치 반복 벨만 최적 업데이트를 반복해 마르코프 결정 과정의 각 상태가 얼마나 가치 있는지 계산합니다. 보통
- Q-러닝 업데이트 경험의 흐름에 Q-러닝 업데이트를 적용하고 보상이 이전 상태로 거슬러 전달되는 모습을 확인합니다. 보통