소개: 보상을 통해 배우기
Il 강화 학습(RL) 학습 패러다임은 기본적으로 지도 학습과 비지도 학습과는 다릅니다. 레이블이 지정된 데이터에서 학습하는 대신 대리인 상호작용하다 환경, 작업을 수행하고 수신합니다. 보상. 목표는 하나를 배우는 것입니다. 정책 (전략) 그 시간이 지남에 따라 누적 보상을 최대화합니다.
체스 게임(AlphaZero)부터 로봇 공학(객체 조작), 알고리즘 거래까지 자율 주행, 강화 학습 및 가장 인기 있는 일부 AI 애플리케이션의 기초까지 인상적이다. 이 기사에서는 고전적인 Q-Learning의 기본 개념을 살펴보겠습니다. DQN 및 PPO와 같은 최신 심층 RL 알고리즘까지.
무엇을 배울 것인가
- 마르코프 결정 과정(MDP): 상태, 행동, 보상, 전환
- Q-Learning: 작업 상태 값 테이블
- 심층 Q-네트워크(DQN): 신경망을 사용하여 Q 근사화
- Policy Gradient: 정책을 직접 최적화
- PPO(근위 정책 최적화): 안정성 및 성능
- 탐색과 활용: 발견과 활용의 균형
- Gymnasium(OpenAI)을 활용한 실무 구현
마르코프 결정 프로세스(MDP)
공식적인 RL 프레임워크와 마르코프 결정 과정, 4개로 정의됨 구성요소:
- 주(S): 에이전트가 자신을 찾을 수 있는 가능한 상황(예: 그리드에서의 위치, 게임 프레임)
- 작업(A): 각 상태에서 사용 가능한 이동(예: 위, 아래, 왼쪽, 오른쪽)
- 보상(R): 각 행동 후에 받은 수치 피드백(예: 승리하면 +1, 패배하면 -1)
- 전환(P): 어떤 행동이 주어졌을 때 다음 상태로 이동할 확률입니다. 마르코프 속성은 미래는 역사가 아니라 현재 상태에만 달려 있다고 말합니다.
상담원이 찾고 있어요. 최적의 정책 이는 할인된 금액을 최대화하는 것입니다. 미래의 보상. 그만큼 할인율 범위 (0과 1 사이) 잔액 보상 즉시 대 미래: 감마가 0에 가까울수록 에이전트는 근시안이 되고, 1에 가까울수록 원시가 됩니다.
Q-Learning: 작업 상태 값
Il Q-러닝 그리고 함수 Q(s, a)를 학습하는 정책 외 알고리즘: 상태 s에서 행동 a를 선택하고 다음을 수행함으로써 누적 보상의 기대값 그 시점부터 최적의 정책. 업데이트 규칙은 다음과 같습니다.
Q(s, a) = Q(s, a) + 알파 * [R + 감마 * max_a'(Q(s', a')) - Q(s, a)]
import numpy as np
import gymnasium as gym
class QLearningAgent:
def __init__(self, n_states, n_actions, lr=0.1, gamma=0.99, epsilon=1.0):
self.q_table = np.zeros((n_states, n_actions))
self.lr = lr
self.gamma = gamma
self.epsilon = epsilon
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
def choose_action(self, state):
"""Epsilon-greedy: esplora con prob epsilon, sfrutta altrimenti"""
if np.random.random() < self.epsilon:
return np.random.randint(self.q_table.shape[1])
return np.argmax(self.q_table[state])
def learn(self, state, action, reward, next_state, done):
"""Aggiornamento Q-table"""
target = reward
if not done:
target += self.gamma * np.max(self.q_table[next_state])
self.q_table[state, action] += self.lr * (target - self.q_table[state, action])
# Decay epsilon
self.epsilon = max(self.epsilon_min, self.epsilon * self.epsilon_decay)
# Training su FrozenLake
env = gym.make('FrozenLake-v1', is_slippery=False)
agent = QLearningAgent(n_states=16, n_actions=4)
for episode in range(5000):
state, _ = env.reset()
total_reward = 0
done = False
while not done:
action = agent.choose_action(state)
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
agent.learn(state, action, reward, next_state, done)
state = next_state
total_reward += reward
if episode % 1000 == 0:
print(f"Episode {episode}, Reward: {total_reward}, "
f"Epsilon: {agent.epsilon:.3f}")
탐험과 착취
RL의 근본적인 딜레마: 에이전트는 다음을 수행해야 합니다. 탐구하다 (행동을 시도 더 나은 보상을 발견하기 위한 새로운 것) e 악용하다 (지식을 사용하다 보상을 극대화하기 위해 현재). 전략 엡실론 탐욕 저울 두 가지 측면: 확률 엡실론은 무작위 행동을 선택하고, 그렇지 않으면 최선의 행동을 선택합니다. 참고. 엡실론은 훈련 중에 점차적으로 감소합니다.
딥 Q 네트워크(DQN)
테이블을 사용한 Q-Learning은 작고 이산된 상태 공간에서만 작동합니다. 환경용 복합체(이미지, 연속 상태), 딥 Q 네트워크(DQN) 대체합니다 Q 함수에 근접한 신경망이 있는 Q 테이블입니다. 두 가지 핵심 혁신이 안정화되었습니다. 훈련:
- 리플레이를 경험해보세요: 전환은 버퍼에 저장되고 훈련을 위해 무작위로 샘플링되어 연속 샘플 간의 시간적 상관 관계를 깨뜨립니다.
- 대상 네트워크: 주기적으로 업데이트되는 별도의 네트워크 복사본이 목표 Q 값을 계산하여 학습을 안정화합니다.
import torch
import torch.nn as nn
from collections import deque
import random
class DQN(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, 128),
nn.ReLU(),
nn.Linear(128, action_dim)
)
def forward(self, x):
return self.net(x)
class DQNAgent:
def __init__(self, state_dim, action_dim, lr=1e-3, gamma=0.99):
self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
self.q_net = DQN(state_dim, action_dim).to(self.device)
self.target_net = DQN(state_dim, action_dim).to(self.device)
self.target_net.load_state_dict(self.q_net.state_dict())
self.optimizer = torch.optim.Adam(self.q_net.parameters(), lr=lr)
self.memory = deque(maxlen=100000)
self.gamma = gamma
self.batch_size = 64
def store(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def learn(self):
if len(self.memory) < self.batch_size:
return
batch = random.sample(self.memory, self.batch_size)
states, actions, rewards, next_states, dones = zip(*batch)
states = torch.FloatTensor(states).to(self.device)
actions = torch.LongTensor(actions).to(self.device)
rewards = torch.FloatTensor(rewards).to(self.device)
next_states = torch.FloatTensor(next_states).to(self.device)
dones = torch.FloatTensor(dones).to(self.device)
q_values = self.q_net(states).gather(1, actions.unsqueeze(1))
with torch.no_grad():
next_q = self.target_net(next_states).max(1)[0]
targets = rewards + (1 - dones) * self.gamma * next_q
loss = nn.functional.mse_loss(q_values.squeeze(), targets)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
def update_target(self):
self.target_net.load_state_dict(self.q_net.state_dict())
정책 변화도 및 행위자 비평가
방법 정책 변화 별도의 과정을 거치지 않고 직접 정책을 최적화합니다. Q 함수. 정책 경사 정리(Policy Gradient Theorem)에 따르면 보상의 경사는 다음과 같습니다. 정책 매개변수와 관련하여 예상되며 해당 정책에 대한 가중 보상에 비례합니다. 행동의 로그 확률.
배우 평론가
아키텍처 배우 평론가 두 가지 접근 방식을 결합합니다.배우 (정책 네트워크)는 행동을 선택하고, 비평가 (가치 네트워크)는 그리고 현재 상태는 좋습니다. 비평가는 배우 업데이트의 변동성을 줄입니다. 훈련을 더욱 안정적으로 만듭니다.
PPO: 업계 표준
PPO(근위 정책 최적화)OpenAI가 개발한 RL 알고리즘 실무에서 가장 많이 사용됩니다. 그 핵심 혁신은 잘린 대물렌즈: 한계 각 업데이트마다 새 정책이 이전 정책과 얼마나 다를 수 있는지, 훈련을 불안정하게 만드는 너무 급격한 변화.
PPO는 InstructGPT 및 RLHF(LLM 정렬), OpenAI Five 등 많은 성공의 기초입니다. (Dota 2), 로봇 에이전트 훈련 등이 있습니다.
시리즈의 다음 단계
- 다음 기사에서는 고급 전이 학습 BERT, GPT 및 Hugging Face 사용
- 미세 조정, 신속한 엔지니어링 및 RAG(Retrieval-Augmented Generation)를 살펴보겠습니다.
- 오픈 소스 모델인 Llama, Mistral, Falcon을 비교해 보겠습니다.







