- AI ⚙️
強化学習とは|Q学習とSARSAの違いを迷路で自作して実測【Python】
結論
強化学習とは、行動を選び、その結果として返ってくる「報酬」の合計が大きくなるような選び方(方策)を、試行錯誤で身につける機械学習です。正解のラベルは与えられず、良し悪しは報酬として後から分かります。numpy で作った 5×8 マスの迷路では、Q学習が最初の 1 回目に 125 手かかったところを 30 回目には最短の 15 手で抜け、学習 300 回は 0.14 秒で終わりました。崖のそばを通る道では、Q学習は崖ぎわの最短 13 手を、SARSA は崖から離れた 17 手の道を選び、学習中に崖へ落ちた回数は 174.6 回と 53.0 回に分かれました。
この記事でわかること
- 強化学習の要素(エージェント・環境・状態・行動・報酬・方策・価値)と、教師あり学習との違い
- Q学習と SARSA を numpy で 30 行ほどで書き、ε(探索の割合)・学習率 α・Q の初期値・割引率 γ で学習の速さや結果がどう変わるか(実測の表)
- 報酬の設計で意図しない行動を覚える例、価値反復・多腕バンディットとの比較、深層強化学習と RLHF を論文で確かめた範囲
この記事で実際に動かしたもの:numpy だけで書いた迷路(グリッドワールド)と Q学習・SARSA・価値反復・多腕バンディットの自作コード、PyPI から入れた gymnasium 1.4.0 の CliffWalking-v1・FrozenLake-v1、それぞれのエラーの原文。
強化学習の解説は、「試行錯誤で学ぶ」「囲碁や自動運転に使われる」という説明で終わることが多く、どんな計算をして、どの数字を変えると何が起きるのかまでは見えにくいものです。この記事では、小さな迷路を自分で作り、Q学習と SARSA を一から書いて動かします。前半は図と短いコードでやさしく、後半は更新式・パラメータの比較・報酬の設計の失敗まで、すべて手元の実行結果で確かめます。
flowchart TD
A[エージェント 行動を選ぶ側] -->|行動 a を選ぶ| B[環境 迷路やゲーム]
B -->|次の状態 s2 と 報酬 r| A
A --> C[Q表を更新 良かった行動の値を上げる]
C --> A
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| 強化学習とは | 行動して報酬を受け取り、報酬の合計が大きくなる行動の選び方を試行錯誤で学ぶ機械学習 | 強化学習とは |
| 教師あり学習との違い | 正解のラベルは無い。行動の良し悪しは報酬として、しかも何手も後にまとめて分かる | 強化学習とは |
| Q学習とは | 「状態×行動」の価値 Q を、報酬+次の状態で一番良い Q に近づける更新をくり返す | Q学習とは |
| SARSA とは・Q学習との違い | 次に実際に選ぶ行動の Q を使う。崖の道では Q学習が崖ぎわ 13 手、SARSA が遠回り 17 手を選んだ | SARSA とは/崖の道で比べる |
| ε と学習率の決め方 | 手元の迷路では α=0.9 が α=0.1 の約 1/11 の回数で最短に落ち着いた。ε の差は Q の初期値しだいで小さくも大きくもなる | ε・学習率・初期値 |
| 報酬の設計で失敗する例 | 何度も取れる +2 を置くと迷路を出なくなった。1 手 0・γ=1 では Q がすべて 1 になり道が決まらない | 報酬の設計 |
| 強化学習を Python で書くには | numpy だけで 30 行ほど。環境は自作するか gymnasium(pip で入る)を使う | 最初の5分 |
| 深層強化学習・RLHF とは | Q 表をニューラルネットワークに置き換えたのが DQN など。RLHF は人の比較から報酬モデルを作り、言語モデルを PPO で調整する | 深層強化学習と RLHF |
確認環境:Ubuntu 24.04.5 LTS(Intel Xeon 2.10GHz・CPU 2 コア・メモリ 8GB、ほかの処理と共用)の Python 3.13.18、numpy 2.5.3、gymnasium 1.4.0(PyPI から作業用の venv に入れたもの。ライセンスは MIT)。OPENBLAS_NUM_THREADS=1 で 1 スレッドに固定しました。迷路・Q学習・SARSA・価値反復・多腕バンディットは numpy で自作し、乱数の種を変えて 10〜20 回ずつ動かした中央値・平均を載せています。scikit-learn 1.9.1 のモジュール一覧(sklearn.__all__)には強化学習のものが無いため、自作の答え合わせは、遷移が分かっているときの厳密な解(価値反復)と、gymnasium の環境で同じ結論になるかで行いました。DQN・AlphaZero・PPO・RLHF・Constitutional AI・DPO・GRPO・DeepSeek-R1 の内容は arXiv の論文ページ(abstract と InstructGPT の本文の一部)で確かめた範囲で、これらの実装は動かしていません。図は mermaid で描画を確かめています(確認日 2026年11月5日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「強化学習とは|Q学習とSARSAの違いを迷路で自作して実測【Python】」
強化学習とは:報酬の合計が大きくなる行動を試行錯誤で学ぶ
この節では、強化学習という言葉の意味と、教師あり学習・教師なし学習との違いが分かります。
強化学習(Reinforcement Learning、RL)は、「ある状況で、どの行動を選べば、この先もらえる報酬の合計が大きくなるか」を、実際に行動してみた結果から学ぶ方法です。迷路なら「1 手ごとに −1 点、ゴールで終わり」と決めておくと、点の合計を大きくする=少ない手数でゴールする道を、誰も正解の道を教えなくても見つけます。
「強化」や「報酬」は、ふだんの言葉としても使われます。意味のずれを先に整理します。
| 言葉 | ふだんの意味 | 強化学習での意味 |
|---|---|---|
| 強化 | 強くすること(守備を強化する) | 心理学の「強化」から来た言葉で、良い結果が続いた行動ほど選ばれやすくなること |
| 報酬 | 働いたことへの対価・ごほうび | 1 手ごとに環境が返す数値。マイナス(罰)も 0 もある |
| エージェント | 代理人。最近は「AI エージェント」 | 行動を選ぶ側(迷路を歩く主体)。LLM の AI エージェントとは別の使い方 |
| 方策 | 物事をうまく運ぶための策 | 状態を受け取って行動を返す決まり(policy) |
| 価値 | 大事さ・値打ち | その状態(や行動)から先にもらえる報酬の合計の見込み |
教師あり学習
入力と正解(ラベル)の組がはじめからある
1 件ごとに「どれだけ外れたか」がすぐ分かる
データは集めたものを使う(自分では増やさない)
強化学習
正解は無く、報酬という点数だけがある
良し悪しは何手も後に分かる(ゴールしてはじめて分かる)
自分の行動しだいで、集まるデータが変わる
教師なし学習(クラスタリングなど)は、正解も報酬も無く、データの中の形を見つける方法です。強化学習は「点数はあるが正解は無い」という、その間に位置します。機械学習の全体像は、この技術ブログの「機械学習とは|種類・ディープラーニングとの違いを実行結果で解説」で、教師あり・教師なしの例と並べています。強化学習の中身をニューラルネットワークで近似する話は後半の節で扱い、ニューラルネットワーク自体の仕組みは関連記事「ニューラルネットワークとは|仕組み・学習・AttentionをNumPyで実演」で扱っています。
最初の5分:30行の Q学習で迷路を解く(強化学習を Python で)
この節では、numpy だけで書いた最小の強化学習のコードと、それを動かした結果が分かります。
まず動くものを見ます。S がスタート、G がゴール、# が壁の迷路です。1 手ごとに −1 点で、壁に向かうとその場にとどまります(それでも −1 点)。この後の節の実験では、同じ迷路で「ゴールに入る最後の 1 手だけ 0 点」にしていますが、学ぶ道は変わりません。下のコードを fivemin.py として保存し、numpy が入った Python で実行すると、0.2 秒ほどで終わります。
import numpy as np
MAZE = ["S..#....",
".#.#.##.",
".#...#..",
".####.#.",
"......#G"]
H, W = len(MAZE), len(MAZE[0])
MOVES = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 上 下 左 右
def step(y, x, a):
ny, nx = y + MOVES[a][0], x + MOVES[a][1]
if not (0 <= ny < H and 0 <= nx < W) or MAZE[ny][nx] == "#":
ny, nx = y, x # 壁なら動かない
return ny, nx, -1.0, MAZE[ny][nx] == "G" # 1手ごとに -1
rng = np.random.default_rng(0)
Q = np.zeros((H, W, 4))
alpha, gamma, eps = 0.5, 0.95, 0.1
for ep in range(200):
y, x, n = 0, 0, 0
while True:
if rng.random() < eps:
a = int(rng.integers(4))
else:
q = Q[y, x]; a = int(rng.choice(np.flatnonzero(q == q.max())))
ny, nx, r, done = step(y, x, a)
target = r if done else r + gamma * Q[ny, nx].max() # Q学習
Q[y, x, a] += alpha * (target - Q[y, x, a])
y, x, n = ny, nx, n + 1
if done: break
if ep in (0, 9, 49, 199): print(f"{ep+1:>3}回目: {n}手でゴール")
y, x, route = 0, 0, ""
while MAZE[y][x] != "G" and len(route) < 50:
a = int(np.argmax(Q[y, x])); route += "↑↓←→"[a]; y, x, _, _ = step(y, x, a)
print("学習後の道順:", route, f"({len(route)}手)")
実行した結果です。
1回目: 482手でゴール
10回目: 138手でゴール
50回目: 20手でゴール
200回目: 16手でゴール
学習後の道順: →→↓↓→→↑↑→→→↓↓↓↓ (15手)
最初は何も知らないので、壁にぶつかりながら 482 手さまよいます。回を重ねるとゴールまでの手数が減り、学習後に「各マスで Q が一番大きい行動」をたどると、幅優先探索で求めた最短の 15 手と同じ道になりました。200 回目が 16 手なのは、学習中は 10% の確率でわざとランダムに動く(探索する)ためです。
自分で確かめる 1:コードの alpha, gamma, eps = 0.5, 0.95, 0.1 の alpha を 0.1 にして実行し直すと、50 回目の手数が大きく残るはずです。何を変えると何が変わるかは、後の「ε・学習率・初期値」の節で 20 回ずつの平均で比べています。
強化学習の仕組み:状態・行動・報酬・方策・価値と割引率
この節では、強化学習を組み立てる 7 つの要素と、割引率 γ の意味が分かります。
強化学習は「エージェントが状態を見て行動を選ぶ → 環境が次の状態と報酬を返す」のくり返しです。この形を数学ではマルコフ決定過程(MDP)と呼びます。「次に何が起きるかは、今の状態と行動だけで決まる(それより前の道のりには依らない)」という前提です。
1エージェントと環境
行動を選ぶ側がエージェント、それ以外すべてが環境。迷路なら、歩く主体がエージェント、マス目と壁とゴールが環境。
2状態 s と行動 a
状態は今いるマス(40 通り)、行動は上下左右の 4 通り。ゲームなら画面、ロボットなら関節の角度が状態になる。
3報酬 r
1 手ごとに環境が返す数値。この記事の迷路では毎手 −1、ゴールで終わり。何を目指すかは、報酬の決め方だけで伝わる。
4方策 π
状態から行動を決める決まり。学習のゴールは、報酬の合計が最大になる方策(最適方策)を見つけること。
5価値 V と Q
V(s) は状態 s から先の報酬の合計の見込み、Q(s,a) は「s で a を選んでから先」の見込み。Q が分かれば、一番大きい a を選ぶだけで方策になる。
割引率 γ:先の報酬をどれだけ軽く見るか
報酬の合計は、G = r1 + γ×r2 + γ²×r3 + … のように、先の報酬ほど γ(0〜1)を掛けて小さく数えます。γ=0.95 で 15 手かかる道(実験の設定では最後の 1 手が 0 点なので、−1 が 14 回続く)なら、価値は −(1 − 0.95^14) ÷ (1 − 0.95) = −10.2465 です。手元の価値反復で求めたスタートの価値も −10.2465 で、式どおりでした。γ を 1 に近づけるほど遠い先まで見ますが、後の節で見るように、γ=1 と報酬の決め方の組み合わせによっては道が決まらなくなります。
探索と活用のジレンマ
今いちばん良さそうな行動を選ぶ(活用)だけだと、試していない良い行動に気づけません。かといってランダムに動いて(探索)ばかりだと、点数が伸びません。ε-greedy(イプシロン・グリーディ)法は、確率 ε でランダム、残りは Q が最大の行動を選ぶという、もっとも単純な折り合いのつけ方です。
Q学習とは:更新式を手計算で確かめる
この節では、Q学習の更新式の意味と、1 回の更新で数字がどう動くかが分かります。
Q学習は、行動するたびに「Q(s,a) を、受け取った報酬+次の状態で一番良い Q に近づける」ことをくり返す方法です。式で書くと次のとおりです。
Q(s,a) ← Q(s,a) + α × ( r + γ × max Q(s′, a′) − Q(s,a) )
かっこの中の r + γ × max Q(s′,a′) を「目標(TD ターゲット)」、目標と今の値の差を「TD 誤差」と呼びます。α(学習率)は、その差のうち何割だけ動かすかです。Watkins と Dayan の 1992 年の論文は、「すべての状態ですべての行動がくり返し試され、値が表で持たれる」なら、Q学習は確率 1 で最適な行動価値に収束すると示しています。
今の状態 s で行動 a を選ぶ
ε-greedy で選ぶ。たとえば Q(s,右) = 0、まだ何も学んでいない。
環境から r と s′ を受け取る
右へ 1 歩進み、報酬 r = −1。次の状態 s′ の Q のうち一番大きいものが −2 だったとする。
目標を計算する
−1 + 0.95 × (−2) = −2.9。「右へ行くと、この先およそ −2.9 点」という見込み。
差の α 倍だけ近づける
0 + 0.5 × (−2.9 − 0) = −1.45。Q(s,右) は 0 から −1.45 になる。ゴールに着いた手なら、次の状態は無いので目標は r だけ。
自作の迷路で Q学習を 300 回動かしたときの、回ごとの手数です(α=0.5、γ=0.95、ε=0.1、種 0)。
| 何回目 | Q学習の手数 | SARSA の手数 |
|---|---|---|
| 1 | 125 | 347 |
| 2 | 322 | 114 |
| 10 | 172 | 59 |
| 20 | 20 | 19 |
| 30 | 15 | 39 |
| 100 | 15 | 15 |
| 300 | 17 | 19 |
学習後、各マスで Q が最大の行動を矢印にすると、最短の道に沿って矢印が並びます(道の上のマスだけ表示)。
S→↓#→→→↓
.#↓#↑##↓
.#→→↑#.↓
.####.#↓
......#G
Q[S]= [-10.731 -11.183 -10.734 -10.247] ← Q学習(上 下 左 右)
Q*[S]= [-10.734 -11.197 -10.734 -10.247] ← 価値反復で求めた厳密な値
(「←」の注記は出力に後から書き足したものです。)スタートでの「右」の Q は、厳密な値 −10.247 と小数第 3 位まで一致しました。「下」は −11.183 と −11.197 で少しずれています。下へ行く道は行き止まりで、ε の分しか試されず、まだ値が固まりきっていないためです。
SARSA とは:Q学習との違いは「次に実際に選ぶ行動」を使うこと
この節では、SARSA の更新式と、Q学習とのたった 1 か所の違いが分かります。
SARSA は、目標に「次の状態で一番良い行動の Q」ではなく、「次の状態で実際に選んだ行動の Q」を使います。更新に使う 5 つの値 s・a・r・s′・a′ の頭文字が名前の由来です。コードの違いは 1 行です。
# Q学習:次の状態で「いちばん良い行動」の値を使う(実際に何を選ぶかは見ない)
target = r + (0 if done else gamma * Q[s2].max())
# SARSA:次の状態で「実際に選んだ行動 a2」の値を使う(探索の失敗も入る)
a2 = eps_greedy(Q, s2, eps, rng)
target = r + (0 if done else gamma * Q[s2, a2])
# どちらも、今の値を目標へ α の割合だけ近づける
Q[s, a] += alpha * (target - Q[s, a])
次の状態の値をどう見積もるか
見分ける問い:「学習に使う行動の選び方と、学ぶ方策は同じか」
手計算の例でいうと、次の状態で ε のせいでたまたま Q = −3 の行動を選んだなら、SARSA の目標は −1 + 0.95 × (−3) = −3.85、更新後は −1.925 です。Q学習なら、同じ場面でも max の −2 を使うので −1.45 のままです。迷路では、この差がスタートの Q にも表れ、SARSA の Q[S] は [-11.241 -11.921 -11.601 -11.086] と、Q学習(右 −10.247)より全体に低くなりました。「探索込みで歩くと、平均ではこのくらいかかる」という値を学んでいるためです。
この違いがはっきり出るのが、次の崖の道です。
崖の道で Q学習と SARSA の違いを実測(gymnasium の CliffWalking)
この節では、同じ問題で Q学習と SARSA が別の道を選ぶ様子と、学習中の点数・崖に落ちた回数の差が分かります。
gymnasium の CliffWalking-v1 は、4×12 マスの一番下の段がスタート(左端)・崖・ゴール(右端)になっている環境です。公式ドキュメントでは、1 手ごとに −1、崖に入ると −100 でスタートへ戻され、Sutton と Barto の教科書『Reinforcement Learning: An Introduction』の例 6.6 を元にしていると説明されています。gymnasium は pip install gymnasium で入り、この環境は描画しなければ追加の依存なしで動きました。
import numpy as np
import gymnasium as gym
env = gym.make("CliffWalking-v1") # 4×12 マス、0=上 1=右 2=下 3=左
rng = np.random.default_rng(0)
def eps_greedy(Q, s, eps, rng): # 確率 eps でランダム、ほかは Q 最大(同点はランダム)
if rng.random() < eps:
return int(rng.integers(Q.shape[1]))
return int(rng.choice(np.flatnonzero(Q[s] == Q[s].max())))
Q = np.zeros((env.observation_space.n, env.action_space.n))
for ep in range(500):
s, info = env.reset(seed=ep) # (観測, info) の2つが返る
a = eps_greedy(Q, s, 0.1, rng)
while True:
s2, r, terminated, truncated, info = env.step(a) # 5つが返る
a2 = eps_greedy(Q, s2, 0.1, rng)
target = r + (0 if terminated else Q[s2].max()) # SARSA なら Q[s2, a2]
Q[s, a] += 0.5 * (target - Q[s, a])
s, a = s2, a2
if terminated or truncated:
break
ε=0.1・α=0.5・γ=1 で 500 回ずつ学習し、種を変えて 10 回くり返した結果です。
== q: 学習中の1エピソード平均収益 ep1-50 -115.0 / ep401-500 -49.5 崖に落ちた回数(500回中・平均) 174.6 貪欲方策の手数 [13]
............
............
************
SCCCCCCCCCCG
== sarsa: 学習中の1エピソード平均収益 ep1-50 -109.5 / ep401-500 -26.2 崖に落ちた回数(500回中・平均) 53.0 貪欲方策の手数 [17, 19, 100]
************
*..........*
*..........*
SCCCCCCCCCCG
| 比べた値(10 回の平均) | Q学習 | SARSA |
|---|---|---|
| 学習後の道(貪欲方策) | 崖のすぐ上を通る 13 手(10/10) | 一番上の段を回る 17 手(7/10)・19 手(1/10) |
| 学習中の点数(401〜500 回目) | −49.5 | −26.2 |
| 学習中に崖へ落ちた回数(500 回中) | 174.6 回 | 53.0 回 |
| ε を 0.1→0 に減らして 2,000 回 | 13 手(10/10)、落ちた回数 323.8 | 17 手(9/10)・19 手(1/10)、落ちた回数 69.5 |
Q学習は「最短の道」を学びますが、学習中は ε のランダムな 1 歩で崖に落ち続けるので、学習中の点数は低くなります。SARSA は「ランダムな 1 歩があっても落ちない道」を学ぶので、学習中の点数が高く、落ちる回数も約 3 分の 1 でした。どちらが正しいかではなく、「学習が終わった後の最良の道」がほしいなら Q学習、「学習している間の失敗」が痛い(実機のロボットなど)なら SARSA が向きます。ε を 0 へ減らしていけば SARSA も最短の道に近づくとされますが、手元で 2,000 回かけて線形に減らした範囲では、SARSA は遠回りの道のままでした。
SARSA の表の「100」は、10 回中 2 回、学習後の方策が一番上の段で壁にぶつかり続けて 100 手でも着かなかったものです。原因は学習ではなく評価のコードで、Q がほぼ同じ値の行動が並んだとき np.argmax が必ず先頭(上)を選び、上の壁に向かって止まっていました。同点をランダムに選ぶように直すと、同じ学習で 10 回とも 17〜19 手で着きました。
自分で確かめる 2:上のコードの Q[s2].max() を Q[s2, a2] に変えるだけで SARSA になります。学習後に np.argmax(Q, axis=1) を 4×12 に並べ替えて表示すると、選ぶ道の違いが矢印で見えます。
ε・学習率 α・Q の初期値で強化学習の速さはどう変わるか
この節では、ε-greedy の ε と学習率 α を変えたときに、最短の道に落ち着くまでの回数がどう変わるか、そして Q の初期値が探索に効く理由が分かります。
自作の迷路で、種を変えて 20 回ずつ学習し、「その回から 400 回目まで、学習後の道がずっと最短 15 手のまま」になった回数の中央値を測りました。総ステップ数は、そこまでに歩いた手数の合計(データの量)です。
| 方法 | α | ε | 落ち着いた回(中央値) | 総ステップ(中央値) |
|---|---|---|---|---|
| Q学習 | 0.1 | 0.1 | 200.5 回 | 12,996 |
| Q学習 | 0.5 | 0.01/0.1/0.3 | 38.0/35.0/32.0 回 | 2,795/2,810/2,943 |
| Q学習 | 0.9 | 0.1 | 18.5 回 | 1,770 |
| SARSA | 0.1 | 0.1 | 271.0 回(20 回中 1 回は落ち着かず) | 14,410 |
| SARSA | 0.5 | 0.1 | 389.0 回(1 回落ち着かず) | 9,377 |
| SARSA | 0.9 | 0.3 | 400 回(18 回落ち着かず) | 22,269 |
- この迷路は壁にぶつかっても位置が変わらない「決まった動き」の環境なので、Q学習では α が大きいほど速く落ち着きました。α=0.9 は α=0.1 の約 1/11 の回数です。FrozenLake のように動きが確率で変わる環境では、α が大きいと 1 回の偶然に振り回されるので、後の節では α=0.1 を使っています。
- SARSA は α を大きくするほど落ち着きませんでした。目標にランダムな行動の Q が入るので、α が大きいと値が毎回大きく揺れ、道が入れ替わり続けます。ε=0.3・α=0.9 では 20 回中 18 回が 400 回目まで落ち着きませんでした。
- Q学習では ε の差が小さく出ました。理由は次の初期値の実験で分かります。
Q を 0 で始めると、ε=0 でも探索する(楽観的な初期値)
この迷路の本当の Q は 0 〜 −15 ほどで、ほとんどがマイナスです。Q を 0 で始めると、まだ試していない行動は「0 点=今より良さそう」に見えるので、ε が 0 でも順に試していきます。逆に、本当の値より低い −100 で始めると何が起きるかを、Q学習(α=0.5)で 10 回ずつ比べました。
| Q の初期値 | ε | 落ち着いた回(中央値) | 落ち着かなかった数 | 201〜300 回目の平均手数 |
|---|---|---|---|---|
| 0 | 0(探索なし) | 37.0 回 | 0/10 | 15.0 |
| 0 | 0.1 | 35.0 回 | 0/10 | 16.9 |
| 0 | 0.3 | 32.5 回 | 0/10 | 21.7 |
| −100 | 0(探索なし) | — | 10/10 | 500.0(毎回打ち切り) |
| −100 | 0.1 | 204.0 回 | 9/10 | 450.9 |
| −100 | 0.3 | 127.0 回 | 7/10 | 374.1 |
初期値 −100・ε=0 では、10 回とも一度もゴールに着かず、毎回 500 手の上限で打ち切られました。一度通った行動は −1 + 0.95 × (−100) = −96 に向かって値が上がるので、「通ったことのある所のほうが良く見える」状態になり、同じ所を回り続けます。初期値 0 なら ε=0 でも学べたのは、初期値そのものが探索の役をしていたからです。一方で ε を大きくすると、学習後も 21.7 手のように、ランダムな手の分だけ毎回の手数が増えます。
学習率
差の何割だけ値を動かすか。決まった動きの環境では大きめ、確率で変わる環境では 0.1 前後から。
SARSA は大きいと揺れる
探索の割合
ランダムに動く確率。学習中の点数と引き換えに、知らない行動を試す。だんだん減らすことが多い。
0 にするなら初期値に注意
割引率
先の報酬をどれだけ重く見るか。0.9〜0.99 がよく使われる。1 にすると報酬の決め方によっては道が決まらない。
報酬の設計とセット
初期値
本当の値より高く始めると自然に探索する。低く始めると、通った所に引きこもる。
報酬が負なら 0 で楽観的
報酬の設計で意図しない行動を覚える例
この節では、報酬の決め方ひとつで、エージェントが作り手の意図と違うことを覚える様子と、その直し方が分かります。
強化学習のエージェントは、「報酬の合計を大きくする」ことだけを目指します。作り手が思っていた目的とずれた報酬を書くと、そのずれを正確に突いてきます。手元で 3 つの失敗を再現しました。
失敗 1:何度でも取れる「コイン」を置いた
ゴールまでの道の途中のマス (2,2) に、入るたびに +2 点(1 手の −1 と合わせて +2)のコインを置きました。作り手の気持ちとしては「寄り道してでもコインを拾ってからゴールしてほしい」ですが、結果は次のとおりです。
C (2,2)に入るたび+2: 貪欲方策 60手で未到達 末尾の状態 [10, 18, 10, 18, 10, 18]
学習中の手数(最後の5回) [200, 200, 200, 200, 200] 収益 [70. 76. 58. 73. 76.]
S→↓#....
.#↓#.##.
.#↑..#..
.####.#.
......#G
コインのマスとその上のマスを行ったり来たりし続け、毎回 200 手の上限で打ち切られました。収益は +58〜+76 点で、ゴールする(−14 点前後)よりずっと高いので、エージェントにとってはこれが正しい答えです。「ゴールしてほしい」は報酬に書いていないので、伝わっていません。直すには、コインを 1 回きりにし、「拾ったかどうか」を状態に含める必要があります(状態が 2 倍になる)。
失敗 2:1 手 0 点・ゴール +1 点・γ=1 にした
壁の無い 5×5 マスで、1 手ごとの罰を無くし、ゴールだけ +1 点、割引も無し(γ=1)にしました。最短は 8 手です。
| 設定 | 学習の回数 | 学習後の道(10 回) | スタートの Q(上 下 左 右) |
|---|---|---|---|
| γ=1 | 500 回 | 8 手(10/10) | 0.998・0.9901・0.9994・1.0 |
| γ=1 | 3,000 回 | 着かない(10/10) | 1.0・1.0・1.0・1.0 |
| γ=0.95 | 3,000 回 | 8 手(10/10) | 0.6634・0.6982・0.6634・0.6983 |
γ=1 で 1 手の罰が無いと、「何手かかってもいずれゴールすれば 1 点」なので、学習が進むほどすべての行動の Q が 1 にそろい、どれを選んでも同じになります。3,000 回学習すると、同点で先頭の「上」を選び、上の壁にぶつかり続けました。500 回では値がそろいきる前だったので、たまたま最短の道になっていただけです。γ=0.95 にすると、遠回りほど値が小さくなり、最短の 8 手に決まりました。
直し方:潜在関数による報酬の整形(意味を変えずに学習を速める)
報酬に手を加えて学習を助けることを「報酬の整形(reward shaping)」と呼びます。Ng・Harada・Russell の 1999 年の論文は、元の報酬に「γ×Φ(次の状態) − Φ(今の状態)」の形(Φ は状態だけで決まる関数)を足すなら最適方策は変わらないこと、そうでない形の足し方では最適でない方策になりうることを示しています。ゴールまでの距離を Φ にして試しました。
# 潜在関数 Φ(s) = -(ゴールまでのマンハッタン距離)
def phi(p):
return 0.0 if p == goal else -(abs(p[0] - goal[0]) + abs(p[1] - goal[1]))
# 元の報酬 r に「γΦ(次) − Φ(今)」を足す(Ng ら 1999 の形)
r_shaped = r + gamma * phi(p_next) - phi(p_now)
| 報酬 | 落ち着いた回(中央値・10 回) | 総ステップ(中央値) | 学習後の道 |
|---|---|---|---|
| 1 手 −1 だけ | 35.0 回 | 2,810 | 15 手 |
| 1 手 −1 + 潜在関数で整形 | 18.0 回 | 1,365 | 15 手 |
学習後の道は同じ最短 15 手のまま、必要な手数の合計がおよそ半分になりました。コインのように「ある場所に入ると点が増える」だけの足し方は、この形になっていないので、最適な行動そのものが変わってしまいます。
報酬の書き方
確かめる問い:「この報酬を最大にする一番ずるいやり方は何か」
価値反復と比べる:環境のしくみが分かっているなら一度の計算で解ける
この節では、Q学習の答えが正しいかを厳密な解(価値反復)で確かめる方法と、Q学習が「学ばない場所」、確率で滑る環境での比較が分かります。
「この状態でこの行動をすると、どの状態へ何点で移るか」がすべて分かっているなら、試行錯誤せずに動的計画法(価値反復)で最適な価値を計算できます。Q学習・SARSA は、その「しくみ」が分からないときに、歩いてみたデータから同じものを近似する方法です。
def value_iteration(env, gamma=0.95, tol=1e-10):
V = np.zeros(env.n_states)
while True:
delta = 0.0
for y in range(env.h):
for x in range(env.w):
if env.g[y][x] == "#" or (y, x) == env.goal:
continue # 壁とゴールは飛ばす
q = []
for a in range(4):
p2, r, done = env.model((y, x), a) # 遷移と報酬が「分かっている」
q.append(r + (0 if done else gamma * V[env.s(p2)]))
s = env.s((y, x))
delta = max(delta, abs(max(q) - V[s]))
V[s] = max(q)
if delta < tol:
return V
迷路では、価値反復は 25 回の掃き出し(全マスの更新)・2.8 ミリ秒で収束しました。Q学習の結果と比べます。
| Q学習の条件 | 歩いた総ステップ | 最短路の上で最適と一致 | 全マスで最適と一致 | Q と厳密な値の差(最大) |
|---|---|---|---|---|
| ε=0.1・50 回 | 3,062 | — | 57.7% | 4.5234 |
| ε=0.1・5,000 回 | 85,868 | 100% | 65.4% | 4.5234 |
| ε=1.0(毎手ランダム)・300 回 | 287,978 | 100% | 100% | 0.0000 |
ε=0.1 では 5,000 回学習しても、全マスの一致は 65.4% で止まりました。違っていたのは、左下の行き止まりの袋小路など、最短の道から外れたマスです。ほとんど行かない場所の値は学ばれず、0 に近い楽観的な値が残ったままでした。道の上は 100% 一致しているので、迷路を解く目的には困りません。
一方、毎手ランダムに歩かせた(ε=1.0)Q学習は、300 回で全マスの値が厳密な値と一致しました。Q学習は目標に max を使うので、どんな歩き方で集めたデータからでも最適な値を学べます(方策オフ型)。同じことを SARSA でやると、学ぶのは「ランダムに歩いたときの値」になり、スタートの Q はすべて約 −20(= −1 ÷ (1 − 0.95))にそろい、学習後の方策ではゴールに着きませんでした。
確率で滑る環境:FrozenLake で比べる
gymnasium の FrozenLake-v1 は 4×4 マスの凍った湖で、穴に落ちると終わり、ゴールで +1 点です。公式ドキュメントによると、is_slippery=True(既定)では、選んだ方向へ進む確率が 1/3 で、残りは左右の直角の方向に同じ確率でずれ、4×4 では 100 手で打ち切り(truncated)になります。遷移の確率は env.unwrapped.P で読めるので、価値反復の厳密な解も作れます。
| 環境 | 価値反復 | Q学習(α=0.1・γ=0.99) | 成功率(2,000 回)ランダム/Q学習/価値反復 |
|---|---|---|---|
| 滑らない | 7 回・1 ミリ秒未満 | 2,000 回・0.3 秒 | 0.017/1.000/1.000 |
| 滑る(既定) | 571 回・51 ミリ秒 | 20,000 回・11.1 秒 | 0.010/0.743/0.744 |
滑る湖では、最適な方策でもおよそ 4 回に 1 回はゴールに着けません。Q学習の方策は、価値反復の最適方策と、値が同点のマスを除いてすべて同じ行動になり、成功率も 0.743 と 0.744 でほぼ同じでした。必要な時間は、遷移が分かっている価値反復が 51 ミリ秒、歩いて学ぶ Q学習が 11.1 秒です。しくみが分かっていて状態が数えられる大きさなら、まず価値反復のような計画の方法を考え、分からない・大きすぎるときに強化学習を使う、という順番が手間の少ない選び方です。
環境の速さも測りました。1 秒あたりの step の回数は、自作の迷路が約 234 万回、gymnasium の CliffWalking-v1 が約 20 万回でした。gymnasium は入力の確認や打ち切りのラッパーを通る分だけ重く、学習の回数が多いときは自作の環境のほうが速く回せます。
多腕バンディット:状態が1つだけの強化学習
この節では、強化学習の一番小さな形である多腕バンディット問題と、ε-greedy・UCB・楽観的初期値の比べ方が分かります。
多腕バンディットは、当たりの平均が違うスロットマシンが何台かあり、どれを引くかを毎回選ぶ問題です。状態が 1 つしか無く、「先の状態」を考えずに済むので、探索と活用のジレンマだけを取り出して見られます。広告やおすすめの表示を選ぶ問題も、この形で書かれることがあります。
よく使われる 10 本腕の設定(各腕の平均は標準正規分布から、報酬は平均のまわりに分散 1)で、500 通りの台を用意し、1,000 回ずつ引きました。
# 10本の腕・500回分を行列でまとめて動かす(R=500, K=10)
if kind == "ucb":
bonus = c * np.sqrt(np.log(t + 1) / np.maximum(N, 1))
a = np.where(N == 0, np.inf, Q + bonus).argmax(1) # まだ引いていない腕を優先
else:
a = Q.argmax(1)
explore = rng.random(R) < eps
a[explore] = rng.integers(0, K, explore.sum()) # ε の割合でランダム
r = rng.normal(mu[idx, a], 1) # 報酬は平均 mu・分散 1
N[idx, a] += 1
Q[idx, a] += (r - Q[idx, a]) / N[idx, a] # 標本平均の逐次更新
| 選び方 | 1〜100 回目の平均報酬 | 901〜1000 回目の平均報酬 | 最良の腕を選んだ割合(901〜1000) | 累積リグレット |
|---|---|---|---|---|
| 貪欲(ε=0) | 0.951 | 1.029 | 35.8% | 516.2 |
| ε=0.01 | 0.978 | 1.307 | 59.0% | 353.2 |
| ε=0.1 | 1.008 | 1.366 | 80.3% | 233.9 |
| ε=0.3 | 0.863 | 1.080 | 67.5% | 494.3 |
| 楽観的初期値(Q=5)・貪欲 | 1.217 | 1.402 | 68.2% | 156.1 |
| UCB(c=2) | 0.943 | 1.489 | 87.0% | 148.7 |
リグレットは「毎回最良の腕を引いていたら得られた分との差」の合計で、小さいほど良い選び方です(最良の腕の平均は 1.536)。探索しない貪欲法は、最初に当たった腕に固まって 35.8% しか最良の腕を選べず、ε=0.3 は探索しすぎて点数が伸びませんでした。UCB は「まだ回数の少ない腕ほど、見込みに上乗せして選ぶ」方法で、最後の 100 回で 87.0% と最も高く、累積リグレットも最小でした。
深層強化学習と RLHF:論文で確かめた範囲
この節では、Q 表では扱えない問題へ強化学習を広げた深層強化学習と、言語モデルの調整に使われる RLHF の要点が、論文の記述の範囲で分かります。
ここまでの Q 表は、状態が 40 マス程度だから持てました。画面の画素がそのまま状態になるゲームでは、表にできません。そこで Q(や方策)をニューラルネットワークで近似するのが深層強化学習です。以下は、それぞれの論文の abstract(InstructGPT は本文の一部も)で確かめた内容だけを書いています。
- 11992 年 Q学習の収束(Watkins・Dayan)すべての状態・行動がくり返し試され、値を表で持つなら確率 1 で最適な行動価値に収束
- 22013 年 DQN(Mnih ら)画素を入力にした畳み込みネットワークを Q学習の変形で学習。Atari 2600 の 7 本中 6 本で以前の手法を上回り、3 本で人の熟練者を上回った
- 32017 年 PPO(Schulman ら)方策勾配法の一種。データ集めと「代わりの目的関数」の最適化を交互に行い、TRPO より実装が簡単
- 42017 年 人の好みからの深層強化学習(Christiano ら)報酬を手で書く代わりに、2 つの動きの断片のどちらが良いかを人が比べる。Atari とロボットの模擬で、人の判断は環境とのやり取りの 1% 未満
- 52017 年 AlphaZero(Silver ら)ルール以外の知識なしにランダムな手から自己対戦で学び、24 時間以内にチェス・将棋・囲碁で人を超える強さに達し、それぞれ世界チャンピオンのプログラムに勝った
- 62022 年 InstructGPT(Ouyang ら)・Constitutional AI(Bai ら)人の比較から報酬モデルを作り PPO で調整(RLHF)。CAI は比較を AI が行う RLAIF
- 72023〜2025 年 DPO・GRPO・DeepSeek-R1報酬モデルと強化学習の手順を分類のような損失にまとめる DPO、PPO の変形 GRPO、強化学習で推論の力を引き出す R1
RLHF とは:人の好みを報酬にする
flowchart TD
A[1 人が書いた手本で教師あり学習 SFT] --> B[2 出力を人が比べて順位を付ける]
B --> C[報酬モデルを学習 好まれる出力を予測]
C --> D[3 報酬モデルの点を報酬にして PPO で調整]
RLHF(Reinforcement Learning from Human Feedback)は、「どちらの回答が良いか」という人の比較から報酬を作り、その報酬で言語モデルを強化学習で調整する方法です。InstructGPT の論文(Ouyang ら、2022 年)では、①人が書いた望ましい応答の手本で GPT-3 を教師あり学習で調整し、②モデルの出力を人が順位付けしたデータで「人が好む出力を予測する報酬モデル」を学習し、③その報酬を最大にするよう PPO で調整する、という 3 段階です。論文の本文では報酬モデルは 6B の大きさで、人の評価では 1.3B の InstructGPT の出力が 175B の GPT-3 より好まれたと報告されています。
この記事の言葉に置きかえると、エージェントは言語モデル、行動は出力する文章、報酬は報酬モデルの点数です。迷路で見た「報酬の合計を最大にする方へ正確に動く」性質は同じです。報酬モデルは人の好みを近似したものにすぎないので、そのずれを突く出力を覚えるおそれがある点も、前の節のコインの例と同じ構図です。
1RLAIF(Constitutional AI)
Bai ら(2022 年)は、2 つの出力のどちらが良いかを AI のモデルが判定し、その好みのデータで作った好みモデルを報酬にして強化学習する方法を「RL from AI Feedback(RLAIF)」と呼んでいる。人が与えるのは短い原則の一覧。
2DPO
Rafailov ら(2023 年)は、報酬モデルの置き方を変えると最適な方策を直接書けることを使い、RLHF を分類のような簡単な損失にした。感情の制御・要約・対話で PPO の RLHF と同等以上と報告。
3GRPO
DeepSeekMath の論文(Shao ら、2024 年)で導入された PPO の変形。数学の推論を伸ばしつつ、PPO のメモリ使用量を減らすと書かれている。
4DeepSeek-R1
DeepSeek-AI(2025 年)は、人が書いた推論の手順を使わずに、純粋な強化学習で LLM の推論の力を引き出せると述べ、自己点検や方針の切り替えといった振る舞いが現れたと報告している。
言語モデルの全体のしくみは関連記事「生成AI(LLM)の仕組み8選|ハルシネーション・トークン」、LLM に道具を使わせて目的を達成させる仕組みは関連記事「AIエージェントとは|仕組みとワークフローとの違い・作り方入門」で扱っています。強化学習の「エージェント」と言葉は同じですが、後者は学習の方法ではなく、LLM を組み込んだプログラムの作り方の話です。
強化学習でよくあるエラー・つまずき(原文つき)
この節では、Q学習・SARSA を自作したり gymnasium を使ったりしたときに手元で出たエラーの原文と、直し方が分かります。
gymnasium 1.4.0 で出たエラーの原文です(手元のスクリプトで 1 つずつ起こし、例外の型と文言をそのまま表示したもの)。
[reset前にstep] gymnasium.error.ResetNeeded: Cannot call env.step() before calling env.reset()
[範囲外の行動] builtins.KeyError: 4
[resetの戻り値をそのまま添字] builtins.IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
[stepを4つで受ける] builtins.ValueError: too many values to unpack (expected 4)
[v0] gymnasium.error.DeprecatedEnv: Environment version v0 for `FrozenLake` is deprecated. Please use `FrozenLake-v1` instead.
[human描画] gymnasium.error.DependencyNotInstalled: pygame is not installed, run `pip install "gymnasium[toy-text]"`
[α=2.5] 結果 (4.26415283649789e+104, False)
[打ち切り] 結果 (100, 0, 0, False, True)
| 症状・エラーの原文 | 原因 | 直し方 |
|---|---|---|
ResetNeeded: Cannot call env.step() before calling env.reset() | reset の前に step を呼んだ | エピソードの最初に必ず env.reset()。終わった後も reset し直す |
ValueError: too many values to unpack (expected 4) | 前の版の gym の書き方(4 つで受ける)。今の step は 5 つを返す | s2, r, terminated, truncated, info = env.step(a) |
IndexError: only integers, slices … | reset は (観測, info) のタプルを返すので、そのまま Q の添字にした | s, info = env.reset() と分けて受ける |
KeyError: 4 | FrozenLake の行動は 0〜3。4 を渡した | env.action_space.n で行動の数を確かめる |
DeprecatedEnv: Environment version v0 … deprecated | 以前の記事の FrozenLake-v0・CliffWalking-v0 | メッセージのとおり -v1 にする |
DependencyNotInstalled: pygame is not installed | render_mode="human" の画面表示には pygame が要る | pip install "gymnasium[toy-text]"。文字だけなら render_mode="ansi" |
| Q の値が 4.26×10104 に膨らむ | 学習率 α を 1 より大きくした(2.5)。差を行き過ぎて振動が広がる | α は 0 より大きく 1 以下。確率で変わる環境では 0.1 前後から |
| 学習後の方策が壁にぶつかり続ける | Q が同点のとき np.argmax は必ず先頭を選ぶ | 同点はランダムに選ぶ(np.flatnonzero(q == q.max()) から選ぶ) |
| 毎回打ち切られ、一度もゴールしない | Q の初期値が低すぎるうえに ε=0(探索なし) | 初期値を 0 など本当の値より高めに、または ε を 0.1 ほどにする |
| 打ち切りの手で値がおかしくなる | truncated=True(時間切れ)を終了と同じに扱い、次の値を 0 にした | 次の値を 0 にするのは terminated のときだけ |
最後の行は、gymnasium の公式ドキュメントでも区別が説明されています。terminated は「課題そのものが終わった(ゴール・失敗)」、truncated は「時間切れなど外の都合で止めた」で、先の価値を使う手法では扱いを分けます。FrozenLake で上へ押し続けると、100 手目に terminated=False, truncated=True が返りました。
学習がうまく進まないときは、次の順に見ていくと原因を絞れます。
- 1ランダムな方策の点数を先に測るFrozenLake ならランダムで成功率 0.010〜0.017。これを超えないなら学習のコードを疑う
- 2手で 1 回分の更新を計算して合わせるr・γ・max Q を書き出し、コードの更新後の値と一致するか見る
- 3小さな問題で厳密な解と比べる遷移が分かる小さな環境で価値反復を解き、Q の差を数値で出す
- 4学習後の行動を目で見る矢印や道順で表示する。点数が高いのに変な動きなら、報酬の設計を疑う
- 5種を変えて何回か動かす1 回の結果は偶然に左右される。この記事でも 10〜20 回の中央値で比べた
強化学習を使うか・Q学習と SARSA のどちらを選ぶかの判断表
この節では、自分の問題に強化学習が合うか、合うならどの方法から始めるかが分かります。
| 状況 | 向く方法 | 理由(この記事での根拠) |
|---|---|---|
| 入力と正解の組がそろっている | 教師あり学習 | 強化学習は正解が無いときの方法。正解があるなら直接学ぶほうが早い |
| 遷移と報酬がすべて分かり、状態が数えられる | 価値反復などの動的計画法 | FrozenLake で 51 ミリ秒、Q学習は 11.1 秒で同じ成功率 |
| 状態が無く、選択肢の中から選び続ける | 多腕バンディット(UCB・ε-greedy) | 10 本腕で UCB が最良の腕 87.0%、累積リグレット最小 |
| しくみは分からないが試せる・失敗が安い | Q学習 | どんな歩き方のデータからでも最適な値を学べる(ε=1.0 でも一致) |
| 学習中の失敗そのものが痛い | SARSA、または先に模擬環境で学ぶ | 崖の道で落ちた回数が Q学習の約 3 分の 1 |
| 状態が画像・連続値で表にできない | 深層強化学習(DQN・PPO など) | 表の代わりにネットワークで近似する(DQN の論文) |
| 言語モデルを人の好みに合わせたい | RLHF・DPO | 人の比較を報酬モデルや損失に変える(InstructGPT・DPO の論文) |
| 達成してほしいことを数値で書けない | 強化学習以外(ルール・手本からの学習)を先に検討 | 報酬がずれると、そのずれを正確に突いた行動を覚える(コインの例) |
この記事の自作コードは numpy の基本操作(配列の作成・添字・argmax)だけで書いています。配列の扱いに慣れていない場合は、関連記事「NumPyの使い方 基本一覧|配列の作成・演算・形状変更」が近道です。バンディットの報酬に使った正規分布などは、関連記事「確率分布とは|種類一覧・平均と分散・選び方をPythonで実演」で扱っています。
よくある質問
Q. 強化学習とは、ひとことで言うと何ですか。
A. 行動して受け取る報酬(点数)の合計が大きくなるように、行動の選び方を試行錯誤で学ぶ機械学習です。正解は教えられず、点数だけが手がかりです。
Q. 教師あり学習と強化学習の違いは何ですか。
A. 教師あり学習は入力ごとに正解があり、外れ具合がすぐ分かります。強化学習は正解が無く、良し悪しは報酬として何手も後に分かります。また、自分の行動しだいで集まるデータが変わります。
Q. Q学習と SARSA はどちらを使えばよいですか。
A. 学習が終わった後に最良の行動がほしいなら Q学習、学習中の失敗を減らしたいなら SARSA です。崖の道では、Q学習が最短 13 手、SARSA が安全な 17 手を選び、学習中に落ちた回数は 174.6 回と 53.0 回でした。
Q. Q学習の α・γ・ε はいくつにすればよいですか。
A. 出発点としては γ=0.9〜0.99、ε=0.1、α は決まった動きの環境なら 0.5 前後、確率で変わる環境なら 0.1 前後です。手元の迷路では α=0.9 が最速でしたが、SARSA では逆に落ち着かなくなりました。種を変えて何回か動かして比べるのが確実です。
Q. 強化学習を Python で始めるには何が要りますか。
A. numpy があれば、この記事の迷路と Q学習は 30 行ほどで動きます。決まった環境で試したいなら pip install gymnasium で CliffWalking・FrozenLake などが使えます。画面に描くには gymnasium[toy-text](pygame)が追加で要ります。
Q. 報酬はどう決めればよいですか。
A. 達成してほしい結果(ゴール・かかった時間・失敗)に点を付け、手段には点を付けないのが基本です。何度も取れる +2 を置いた迷路では、エージェントはゴールせずにその場を往復し続けました。学習を助けたいときは、潜在関数の差の形で足すと最適な行動を変えずに済みます。
Q. 割引率 γ を 1 にしてはいけないのですか。
A. 必ず終わる問題で、1 手ごとに罰があるなら γ=1 でも最短を学べます(崖の道は γ=1)。1 手の罰が無く、ゴールだけに点があると、何手かかっても同じ点になるので、学習が進むほど Q がすべて同じ値になり道が決まりませんでした。
Q. 深層強化学習は Q学習と何が違いますか。
A. 考え方は同じで、Q(または方策)を表ではなくニューラルネットワークで持つ点が違います。DQN の論文では、ゲーム画面の画素を入力にした畳み込みネットワークを Q学習の変形で学習しています。
Q. ChatGPT などの学習に強化学習は使われていますか。
A. InstructGPT の論文では、人が出力を比べたデータから報酬モデルを作り、PPO(強化学習の方法)で言語モデルを調整する RLHF が使われています。各社の今の製品の学習の詳細は、公開されている範囲が会社ごとに違うため、この記事では論文に書かれた内容だけを扱いました。
Q. 強化学習はどんなところに使われていますか。
A. 論文で確かめた範囲では、Atari のゲーム(DQN)、チェス・将棋・囲碁(AlphaZero)、ロボットの模擬環境(PPO・人の好みからの学習)、言語モデルの調整(RLHF)です。どれも、たくさん試せる模擬環境か、報酬を作る仕組みがあることが前提になっています。
まとめ
- 強化学習は、報酬の合計が大きくなる行動の選び方を試行錯誤で学ぶ方法。正解は無く、点数だけが手がかりで、自分の行動が集まるデータを変える。
- Q学習は「報酬+次の状態の最大の Q」に近づける更新をくり返すだけで、numpy の 30 行で迷路を最短 15 手で解けた。学んだ値は価値反復の厳密な値と小数第 3 位まで一致した。
- SARSA は次に実際に選ぶ行動の Q を使う。崖の道では Q学習が崖ぎわの 13 手、SARSA が安全な 17 手を選び、学習中に落ちた回数は約 3 分の 1 だった。
- α・ε・初期値・γ で結果は大きく変わる。初期値 −100・ε=0 では一度もゴールせず、何度も取れるコインや「1 手 0・γ=1」では意図しない行動を覚えた。学習後の行動を必ず目で見る。
- しくみが分かる小さな問題なら価値反復のほうが速く、状態が無ければバンディット、画像のような状態なら深層強化学習、言語モデルを人に合わせるなら RLHF・DPO と、問題の形で選ぶ。
参考・出典
いずれも 2026年11月5日に確かめました。
- Sutton, Barto『Reinforcement Learning: An Introduction』第 2 版(MIT Press、2018 年。著者のサイトで PDF を公開):http://incompleteideas.net/book/the-book-2nd.html
- Watkins, Dayan「Technical Note: Q-Learning」Machine Learning 8, pp.279–292, 1992:https://mlanthology.org/mlj/1992/watkins1992mlj-technical
- Ng, Harada, Russell「Policy Invariance Under Reward Transformations: Theory and Application to Reward Shaping」ICML 1999:https://mlanthology.org/icml/1999/ng1999icml-policy/
- Gymnasium ドキュメント「Basic Usage」:https://gymnasium.farama.org/introduction/basic_usage/
- Gymnasium ドキュメント「Cliff Walking」:https://gymnasium.farama.org/environments/toy_text/cliff_walking/
- Gymnasium ドキュメント「Frozen Lake」:https://gymnasium.farama.org/environments/toy_text/frozen_lake/
- Mnih ら「Playing Atari with Deep Reinforcement Learning」arXiv:1312.5602:https://arxiv.org/abs/1312.5602
- Schulman ら「Proximal Policy Optimization Algorithms」arXiv:1707.06347:https://arxiv.org/abs/1707.06347
- Christiano ら「Deep reinforcement learning from human preferences」arXiv:1706.03741:https://arxiv.org/abs/1706.03741
- Silver ら「Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm」arXiv:1712.01815:https://arxiv.org/abs/1712.01815
- Ouyang ら「Training language models to follow instructions with human feedback」arXiv:2203.02155:https://arxiv.org/abs/2203.02155
- Bai ら「Constitutional AI: Harmlessness from AI Feedback」arXiv:2212.08073:https://arxiv.org/abs/2212.08073
- Rafailov ら「Direct Preference Optimization: Your Language Model is Secretly a Reward Model」arXiv:2305.18290:https://arxiv.org/abs/2305.18290
- Shao ら「DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models」arXiv:2402.03300:https://arxiv.org/abs/2402.03300
- DeepSeek-AI「DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning」arXiv:2501.12948:https://arxiv.org/abs/2501.12948
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「強化学習とは|Q学習とSARSAの違いを迷路で自作して実測【Python】」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。