出版日: 2025年7月6日
|
最新更新日: 2025年7月7日
Q学習は、エージェントが未知の環境で最適な決定を学習するモデルフリー強化学習アルゴリズムです。教師あり学習とは異なり、エージェントは試行錯誤を通じて学習し、教師やラベル付きデータを必要とせずに、どの行動が最高の長期的報酬をもたらすかを発見します。
Q学習更新式:
Q(s,a) ← Q(s,a) + α[r + γ max Q(s',a') - Q(s,a)]
計算例:
エージェントが位置(2,3)にいて、右移動の現在のQ値が5.2です。エージェントが右に移動し、報酬-1(標準的なステップペナルティ - より短いパスを見つけることを促すため、各移動に-1のコストがかかります)を受け取り、(3,3)に着地します。
移動前 (2,3)
移動後 (3,3)
ステップ1: 右行動の現在のQ値 = 5.2
ステップ2: 受け取った報酬 = -1(ステップペナルティ - より短いパスを促進)
ステップ3: 新しい位置(3,3)での最高Q値 = 12.5(上方向)
ステップ4: 式を適用:
新しいQ = 5.2 + 0.1 × [-1 + 0.9 × 12.5 - 5.2]
新しいQ = 5.2 + 0.1 × [-1 + 11.25 - 5.2]
新しいQ = 5.2 + 0.1 × [5.05]
新しいQ = 5.2 + 0.505 = 5.7
(2,3)から右に移動するためのQ値は、エージェントが素晴らしい将来の見込みを持つ位置を発見したため、5.2から5.7に改善されました!
STEPモード: 各個別の行動とQ値の更新を見る。 AUTOモード: 連続エピソードでの迅速な学習。
こちらは学習ループを含む完全なQ学習実装です:
import random
import numpy as np
class QLearningAgent:
def __init__(self, grid_size=10, alpha=0.1, gamma=0.9, epsilon=0.1):
self.grid_size = grid_size
self.alpha = alpha # 学習率
self.gamma = gamma # 割引係数
self.epsilon = epsilon # 探索率
self.q_table = {} # 各(状態, 行動)ペアのQ値
self.actions = ['上', '右', '下', '左']
# Q-テーブルを初期化
for x in range(grid_size):
for y in range(grid_size):
for action in self.actions:
self.q_table[(x, y, action)] = 0.0
def choose_action(self, x, y):
"""ε-greedyポリシーを使用して行動を選択"""
if random.random() < self.epsilon:
return random.choice(self.actions) # 探索
# 利用:最高のQ値を持つ行動を選択
q_values = [self.q_table.get((x, y, action), 0) for action in self.actions]
max_q = max(q_values)
best_actions = [action for action, q in zip(self.actions, q_values) if q == max_q]
return random.choice(best_actions)
def update_q_value(self, state, action, reward, next_state):
"""Q学習の式を使用してQ値を更新"""
x, y = state
next_x, next_y = next_state
current_q = self.q_table.get((x, y, action), 0)
next_q_values = [self.q_table.get((next_x, next_y, a), 0) for a in self.actions]
max_next_q = max(next_q_values) if next_q_values else 0
# Q(s,a) = Q(s,a) + α[r + γ max Q(s',a') - Q(s,a)]
new_q = current_q + self.alpha * (reward + self.gamma * max_next_q - current_q)
self.q_table[(x, y, action)] = new_q
def train(self, walls, goal, episodes=1000):
"""指定されたエピソード数でエージェントを訓練"""
for episode in range(episodes):
x, y = 0, 0 # 開始位置
for step in range(200): # エピソードあたりの最大ステップ数
action = self.choose_action(x, y)
# 新しい位置と報酬を計算
moves = {'上': (0, -1), '右': (1, 0), '下': (0, 1), '左': (-1, 0)}
dx, dy = moves[action]
new_x, new_y = x + dx, y + dy
if (new_x < 0 or new_x >= self.grid_size or
new_y < 0 or new_y >= self.grid_size):
reward = -30 # グリッドから落下
new_x, new_y = x, y
elif (new_x, new_y) in walls:
reward = -30 # 壁に衝突
new_x, new_y = x, y
elif (new_x, new_y) == goal:
reward = 30 # ゴールに到達
else:
reward = -1 # 通常のステップ
# Q値を更新して移動
self.update_q_value((x, y), action, reward, (new_x, new_y))
x, y = new_x, new_y
if (x, y) == goal or reward == -30:
break
# 使用例
walls = [(1,1), (2,1), (3,1)]
goal = (9, 8)
agent = QLearningAgent()
agent.train(walls, goal, episodes=500)
このブログは英語からLLMによって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。
コメントを残す
コメント
現在コメントがありません。
その他のブログ
2025/07/06
最適化アルゴリズム:SGD、モメンタム、Adam
2025/07/05
文字から単語へ:日本語BPEトークナイザーの構築
2024/06/19
SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する
2024/06/17
JavaScriptを用いて東京都のインタラクティブな地図を作成する
2024/06/14
Matplotlibで日本語文字化けを解決できる簡単な方法
2024/06/13
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル
2024/06/07
日本語で最もよく使われる3000字の漢字
2024/06/07
VSCodeでRegexを使用してReplaceする方法
2024/06/06
SvelteではReadable Storeを使用するな
2024/06/05
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法
2024/05/31
JavaScriptを使用してWebページ上でマウスが指している単語を特定する
2024/05/29
SvelteとSVGを用いてインタラクティブな地図を作成する
2024/05/28
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ
2024/05/27
Javascriptを使用して数独を解く方法
2024/05/26
ウェブサイトへのトラフィックを1か月で10倍に増やした方法
2024/05/24
人生はサイクリングに似ている
2024/05/19
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する
2024/05/16
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか
2024/05/15
PythonとGitフックを使用してサイトマップを自動的に生成する
2024/05/14
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン
2024/05/13
SvelteとSvelteKitはなんですか?
2024/05/12
SvelteKitで国際化(多言語化)
2024/05/11
SvelteでCachingを用いてDeploy時間を短縮する方法
2024/05/10
SvelteとIntersection Oberverによるレイジーローディング
2024/05/10
遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法
2024/05/09
Pythonを用いてShapeFileをSVGに変換できる方法
2024/05/08
Svelteの反応性:変数、バインディング、およびキー関数
2024/05/07
書評 | 孫子の兵法
2024/05/06
スペシャリストは終了。ゼネラリスト万歳!
2024/05/03
トルコ人の有権者の投票行動をPythonでの分析
2024/05/01
Seleniumを用いてトルコ投票データベースを作る方法
2024/04/30
SvelteとTailwindを使用してInfinite Scrollできる方法
2024/04/29
1年間以内で日本語を駆使できるようになるための方法
2024/04/25
SvelteとTailwindを用いたWebサイトテンプレート
2024/01/29
怠惰なエンジニアとひどいデザイン
2024/01/28
偉大さについて
2024/01/28
MacBook で PDF を PNG に変換する
2023/12/31
2023年振り返り:24冊の読んだ本のまとめ
2023/12/30
Python PILを使用して写真コラージュを作成する方法
2024/01/09
ウェブサイトの訪問者のデバイスとブラウザを検出する方法
2024/01/19
ChatGPT回答の解析