はじめに: 報酬から学ぶ
Il 強化学習 (RL) そして基本的に学習パラダイム 教師あり学習と教師なし学習とは異なります。ラベル付きデータから学習するのではなく、 エージェント と対話します 環境、アクションを実行し、受信します 報酬。目標は 1 つを学ぶことです ポリシー (戦略)それは 時間の経過とともに累積報酬を最大化します。
From the game of chess (AlphaZero) to robotics (object manipulation), from algorithmic trading to autonomous driving, reinforcement learning and the basis of some of the most popular AI applications 印象的です。 In this article we will explore the fundamental concepts, from classic Q-Learning up to modern deep RL algorithms such as DQN and PPO.
何を学ぶか
- マルコフ決定プロセス (MDP): 状態、アクション、報酬、遷移
- Q-Learning: アクション状態値テーブル
- ディープ Q ネットワーク (DQN): ニューラル ネットワークを使用して Q を近似する
- ポリシーの勾配: ポリシーを直接最適化します。
- Proximal Policy Optimization (PPO): 安定性とパフォーマンス
- 探索と活用: 探索と活用のバランスをとる
- Gymnasium(OpenAI)による実用化
マルコフ決定プロセス (MDP)
正式な RL フレームワークと マルコフ決定プロセス、4 によって定義されます。 コンポーネント:
- 州 (S): エージェントが自分自身を見つける可能性のある状況 (例: グリッド内の位置、ゲームのフレーム)
- アクション(A): 各状態で利用可能な動き (例: 上、下、左、右)
- 報酬(R): 各アクションの後に受け取った数値フィードバック (例: 勝ちの場合は +1、負けの場合は -1)
- トランジション(P): アクションが与えられたときに次の状態に移行する確率。マルコフの性質は、未来は歴史ではなく現在の状態のみに依存するというものです。
エージェントが探しているのは、 最適な政策 の割引額を最大化するもの 将来の報酬。の 割引率の範囲 (0から1の間) バランス報酬 即時と将来: ガンマが 0 に近いとエージェントは近視的となり、1 に近いと遠視的になります。
Q ラーニング: アクション状態の値
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}")
探索 vs 搾取
RL の根本的なジレンマ: エージェントは次のことを行う必要があります。 探検する (アクションを試してください より良い報酬を見つけるための新しいもの) e エクスプロイト (知識を使う 報酬を最大化するために電流を流します)。戦略 イプシロン貪欲 天秤 2 つの側面: 確率的にはイプシロンはランダムなアクションを選択し、それ以外の場合は最適なアクションを選択します。 注意してください。イプシロンはトレーニング中に徐々に減少します。
ディープ Q ネットワーク (DQN)
テーブルを使用した Q 学習は、小さな離散状態空間でのみ機能します。環境向け 複合体 (画像、連続状態)、 ディープ Q ネットワーク (DQN) を置き換えます Q 関数を近似するニューラル ネットワークを備えた Q テーブル。 2 つの主要なイノベーションにより安定化 トレーニング:
- 体験リプレイ: トランジションはバッファに保存され、トレーニングのためにランダムにサンプリングされ、連続するサンプル間の時間的な相関関係が破壊されます。
- ターゲットネットワーク: ネットワークの別のコピーが定期的に更新され、目標の 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関数。政策勾配定理では、報酬の勾配は次のようになります。 政策パラメータに関して期待され、その重み付けされた報酬に比例します。 アクションの対数確率。
俳優・評論家
アーキテクチャ 俳優・評論家 2 つのアプローチを組み合わせたものです。俳優 (政策ネットワーク) アクションを選択します。 評論家 (バリューネットワーク) はいくらになるかを見積もる そして現状は良好です。 Critic は Actor の更新の差異を減らします。 トレーニングをより安定させます。
PPO: 業界標準
近接ポリシーの最適化 (PPO)OpenAI によって開発された、RL アルゴリズム 実際に最もよく使われます。その主要なイノベーションは、 切り取られた対物レンズ: 限界 更新のたびに、新しいポリシーが古いポリシーからどの程度逸脱する可能性があるか、 あまりにも急激な変更はトレーニングを不安定にします。
PPO は多くの成功の基礎です: InstructGPT および RLHF (LLM アライメント)、OpenAI Five (Dota 2)、ロボットエージェントのトレーニングなど。
シリーズの次のステップ
- 次の記事では、 高度な転移学習 BERT、GPT、ハグフェイス付き
- 微調整、迅速なエンジニアリング、RAG (検索拡張生成) が登場します。
- オープンソース モデルを比較します: Llama、Mistral、Falcon







