- 技術 💻
強化学習とは|仕組み・Q学習・RLHFをPythonの迷路で実演
結論
強化学習とは、試行錯誤で得る「報酬」の合計が最大になる行動を、AIが自分で学ぶ機械学習です。正解データは要りません。
この記事でわかること
- 5つの用語の図と、教師あり・教師なし学習との違い表
- 迷路のQ学習で報酬が−59.8から1.7に増えた数値の表
- ε-greedy・割引率・報酬設計の失敗を比べた実行結果
強化学習では、エージェント(学ぶ側)が環境の中で行動し、その結果として次の状態と報酬を受け取ります。これを何度も繰り返し、報酬が多くなる行動の選び方(方策)を身につけます。
flowchart TD
A[エージェント<br>学ぶ側 AI] -->|行動| E[環境<br>迷路・ゲーム]
E -->|次の状態| A
E -->|報酬 +10 や −1| A
A -.-> P[方策<br>状態ごとの行動の選び方]
急いでいる人向けに、よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| 一言でいうと | 報酬を手がかりに試行錯誤で学ぶ | とは |
| 教師あり学習との違い | 正解ラベルが無く、報酬だけがある | 違い |
| 身近な例 | ゲームAI・囲碁・ロボット・推薦 | 使われている例 |
| 代表的な手法 | Q学習・SARSA・DQN・PPO | 種類 |
| 探索と活用 | ε-greedy:確率εでランダムに試す | 探索と活用 |
| 生成AIとの関係 | RLHF で LLM の応答を人の好みに合わせる | RLHF |
| いちばん難しい所 | 報酬の設計と、試行の回数の多さ | 難しさ |
| Python で試すなら | NumPy で Q 表、Gymnasium で環境 | Python |
確認環境:Ubuntu 24.04・Python 3.11.15・NumPy 2.4.6・Gymnasium 1.4.0。5×5 の迷路の Q 学習(20回の学習の平均)、割引率と探索率の比較、報酬設計の失敗例、10本腕のバンディット(2000回×1000ステップ)、Gymnasium の CliffWalking-v1(Q 学習と SARSA)・FrozenLake-v1 を自作の NumPy のコードで実行し、出力をそのまま載せています。用語と歴史は Wikipedia「強化学習」と Sutton・Barto『Reinforcement Learning: An Introduction(第2版)』、DQN・PPO・RLHF・DPO・DeepSeek-R1 は各論文(Nature・arXiv)、環境の仕様は Gymnasium の公式ドキュメント、ライブラリの対応表は Stable-Baselines3 の公式ドキュメントで確かめました(確認日 2026年10月22日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「強化学習とは|仕組み・Q学習・RLHFをPythonの迷路で実演」
強化学習とは(意味をわかりやすく・身近な例)
この節では、強化学習が「何を学ぶ方法なのか」を、身近な例で一言でつかめます。
強化学習(きょうかがくしゅう、Reinforcement Learning・RL)は、エージェントが環境の中で行動し、受け取る報酬の合計(累積報酬)が最大になるように、行動の選び方を学ぶ機械学習の方法です。 Wikipedia「強化学習」は、教師あり学習・教師なし学習と並ぶ機械学習の3つの基本の考え方の1つと説明しています。
いちばん近いのは「ゲームを初めて遊ぶ人」です。説明書を読まずに、適当にボタンを押し、点数が増えた操作を覚え、減った操作を避けます。何百回も遊ぶうちに、高い点が取れる遊び方になります。強化学習の AI も同じで、誰も「正しい操作」を教えず、点数(報酬)だけを手がかりに上達します。
1ゲームを覚える
クリアで点が増え、ミスで減る。点数を報酬にして、高得点の操作を覚える。DQN は Atari の49本のゲームを画面と得点だけから学んだ。
2犬のしつけ
お座りできたらおやつ。ほめる(報酬)ことで行動が増える。心理学の「強化」が名前の由来で、考え方は同じ。
3迷路のロボット
ゴールで +10、1歩ごとに −1。早くゴールに着く道ほど合計が大きいので、最短の道を覚える(この記事で実行)。
4チャットAIの調整
人が「良い」と選んだ応答を報酬にして LLM を調整する。RLHF と呼ばれ、生成AIで使われている。
強化学習の特徴は次の3つです。
- 正解ではなく報酬で学ぶ:「この場面ではこの手」という答えは与えない。結果の良し悪しだけを数値で返す。
- 報酬が遅れて届く:迷路のゴールの +10 は最後にしか出ない。途中の1歩がどれだけ良かったかは、AI が後から割り振る。
- 自分の行動がデータを作る:どう動くかで、次に見るデータが変わる。試さなかった道の良さは分からない(探索と活用の問題)。
強化学習の仕組み(エージェント・環境・状態・行動・報酬)
この節では、強化学習に出てくる用語を、迷路の例に当てはめて1枚の表で整理します。
強化学習は「状態を見る → 行動する → 報酬と次の状態を受け取る」の繰り返しです。 1回のスタートからゴール(または失敗)までをエピソードと呼びます。
| 用語(英語) | 意味 | 迷路の例 |
|---|---|---|
| エージェント(agent) | 学んで行動する側 | 迷路を歩くロボット |
| 環境(environment) | エージェント以外のすべて | 迷路そのもの |
| 状態(state) | 今の様子 | 今いるマス (行, 列) |
| 行動(action) | エージェントが選べる操作 | 上・右・下・左 |
| 報酬(reward) | 行動の結果の良し悪しの数値 | ゴール +10、穴 −10、1歩 −1 |
| 方策(policy) | 状態ごとの行動の選び方 | 各マスでどちらへ進むか |
| エピソード(episode) | 開始から終わりまでの1回 | スタートからゴールか穴まで |
| 収益(return) | これから得る報酬の合計 | ゴールまでの −1 の合計 +10 |
数学では、この枠組みをマルコフ決定過程(MDP、Markov decision process)と呼びます。「次の状態と報酬は、今の状態と行動だけで決まる(それより前の経緯には左右されない)」という仮定を置き、状態・行動・遷移の確率・報酬の4つで環境を表します。Wikipedia「強化学習」も、基本的な強化学習はマルコフ決定過程としてモデル化されると書いています。
flowchart TD
S[状態 s を見る] --> A[方策で行動 a を選ぶ]
A --> E[環境が 報酬 r と<br>次の状態 s′ を返す]
E --> U[経験 s a r s′ で<br>価値や方策を更新]
U --> S
強化学習と教師あり学習・教師なし学習の違い
この節では、機械学習の3つの方法の違いを、データ・学ぶもの・例で比べます。
教師あり学習は「正解つきのデータ」から、教師なし学習は「正解の無いデータの構造」から、強化学習は「行動した結果の報酬」から学びます。
| 比べる点 | 教師あり学習 | 教師なし学習 | 強化学習 |
|---|---|---|---|
| 与えるもの | 入力と正解ラベルの組 | 入力だけ | 環境と報酬の決め方 |
| 学ぶもの | 入力→正解の対応 | まとまり・特徴 | 報酬が最大になる行動 |
| データの集め方 | 先に用意する | 先に用意する | 行動しながら集める |
| フィードバック | 1件ごとに正解 | なし | 報酬(遅れて届く) |
| 代表的な手法 | 回帰・決定木・NN | k-means・PCA | Q学習・DQN・PPO |
| 例 | 画像の分類・売上予測 | 顧客のグループ分け | ゲームAI・ロボット制御 |
迷路を解かせたいとき
正解を用意できない・正解が1つに決まらない問題で強化学習が向く
ディープラーニング(深層学習)は、これら3つと並ぶ方法ではなく、ニューラルネットワークを使うという「道具」の名前です。強化学習にニューラルネットワークを組み合わせたものを深層強化学習と呼びます(後の節)。
価値関数と方策(割引率γの意味)
この節では、強化学習の中心になる「価値」と「方策」の意味と、割引率 γ で行き先が変わる様子が分かります。
方策は「どの状態でどの行動をとるか」、価値関数は「その状態(や行動)から先に、報酬が合計でどれくらい得られそうか」を表します。 強化学習は、価値を正しく見積もり、価値の高い行動を選ぶ方策に近づけていく作業です。
| 名前 | 書き方 | 意味 |
|---|---|---|
| 方策 | π(a|s) | 状態 s で行動 a を選ぶ確率(または決まった行動) |
| 状態価値関数 | V(s) | 状態 s から方策に従ったときの収益の期待値 |
| 行動価値関数 | Q(s, a) | 状態 s で行動 a をとり、その後方策に従ったときの収益の期待値 |
| 最適な価値 | V(s)・Q(s, a) | いちばん良い方策での価値。Q が分かれば、Q 最大の行動を選べばよい |
収益(これから得る報酬の合計)は、先の報酬ほど割り引いて足します。
収益 G = r1 + γ × r2 + γ² × r3 + γ³ × r4 + …
γ(ガンマ、割引率)は 0〜1 の数。0.9 なら 1歩先の報酬は 0.9 倍、2歩先は 0.81 倍として数える
γ が小さいと「すぐもらえる報酬」を重く見て、大きいと「遠くの大きな報酬」まで見て行動します。 1列の通路で確かめました。スタート S から2歩右に小さなゴール g(+3)、6歩左に大きなゴール G(+10)があり、1歩ごとに −0.1 です。
G.....S.g
γ だけを変えて Q 学習で学ばせ(行動は完全にランダムにして全部の道を十分に試させ、2000エピソード)、学んだ方策がどちらのゴールへ向かうかを10回ずつ数えました。理論値は、各ゴールまでの収益を式で計算した値です。
gamma=0.5 greedy->G 0/10 ->g 10/10 theory V(G)=0.12 V(g)=1.40
gamma=0.7 greedy->G 0/10 ->g 10/10 theory V(G)=1.40 V(g)=2.00
gamma=0.8 greedy->G 10/10 ->g 0/10 theory V(G)=2.94 V(g)=2.30
gamma=0.9 greedy->G 10/10 ->g 0/10 theory V(G)=5.50 V(g)=2.60
gamma=0.99 greedy->G 10/10 ->g 0/10 theory V(G)=9.02 V(g)=2.87
γ が 0.7 以下では近くの +3、0.8 以上では遠くの +10 を選び、理論値で大きい方と全部一致しました。 γ は「どれだけ先まで見るか」を決める設定で、迷ったら 0.9〜0.99 がよく使われます。
探索と活用(ε-greedy)
この節では、強化学習に特有の「試すか、知っている良い手を使うか」の問題と、ε-greedy での解き方が分かります。
探索(exploration)は「まだよく知らない行動を試すこと」、活用(exploitation)は「今いちばん良いと分かっている行動を選ぶこと」です。 活用ばかりだと、もっと良い手に気づけません。探索ばかりだと、せっかく覚えた良い手を使えません。この釣り合いを、探索と活用のトレードオフと呼びます。
いちばん簡単な方法が ε-greedy(イプシロン・グリーディ)です。
確率 ε :行動をランダムに選ぶ(探索)
確率 1 − ε :Q が最大の行動を選ぶ(活用)
例:ε = 0.1 なら、10回に1回はランダムに動く
前の節と同じ通路(γ = 0.9)で、ε だけを変えて2000エピソード学ばせ、20回の結果をまとめました。最後の列は、学習の最後の100エピソードで実際に得た報酬の平均です(探索の分も含む)。
eps=0.0 greedy->G 0/20 G reached 0.3/2000 avg reward last100 2.90
eps=0.1 greedy->G 0/20 G reached 0.9/2000 avg reward last100 2.88
eps=0.3 greedy->G 0/20 G reached 1.4/2000 avg reward last100 2.82
eps=0.5 greedy->G 0/20 G reached 5.0/2000 avg reward last100 2.70
eps=1.0 greedy->G 20/20 G reached 478.4/2000 avg reward last100 2.28
eps=1.0->0.05 greedy->G 20/20 G reached 1820.1/2000 avg reward last100 9.47
| ε | 大きいゴール G を見つけたか | 最後の報酬の平均 | 起きたこと |
|---|---|---|---|
| 0〜0.5 | 20回中0回 | 2.70〜2.90 | 近くの +3 で満足し、遠くを試さない |
| 1.0(ずっとランダム) | 20回中20回 | 2.28 | G は覚えたが、ランダムに動くので報酬は低い |
| 1.0 から 0.05 へ減らす | 20回中20回 | 9.47 | 最初に広く試し、後半は覚えた道を使う |
ε を固定すると「探索が足りず小さい報酬で止まる」か「探索しすぎて報酬が低い」のどちらかになり、最初は大きく、だんだん小さくする(減衰)と G を見つけたうえで平均 9.47 を得ました。 ε = 0.5 でも、6歩続けて左にランダムに進む確率は低く、2000エピソードで G に着いたのは平均5回でした。探索の量は、問題の形で必要な量が大きく変わります。
Q学習とは(更新式を1ステップずつ)
この節では、代表的な強化学習の手法である Q 学習が、何を覚えて、どう更新するのかが分かります。
Q 学習(Q-learning)は、状態と行動の組ごとに「その行動の良さ Q(s, a)」を表(Q 表)に持ち、経験するたびに少しずつ正しい値へ近づける方法です。 1989年にワトキンスが提案しました(Wikipedia「強化学習」)。環境の仕組み(遷移の確率)を知らなくても学べるので、モデルフリーの手法に分類されます。
更新式は次の1行です。
Q(s, a) ← Q(s, a) + α × ( r + γ × max Q(s′, a′) − Q(s, a) )
α(アルファ) :学習率。0.1 なら差の 1 割だけ近づける
r + γ × max Q(s′, a′) :目標(今の報酬 + 次の状態でいちばん良い行動の価値)
目標 − Q(s, a) :TD 誤差。予想と結果のずれ
ゴールなど終わりの状態に入ったときは、目標 = r
最初は全部 0
Q 表は 25マス × 4行動 = 100個の数。最初は全部 0 で、どの行動も同じ良さ。
1歩目:壁のない下へ進んだ
(0,0) で下へ。報酬 −1、次のマス (1,0) の Q は全部 0。目標は −1 + 0.9 × 0 = −1。
差の1割だけ近づける
Q = 0 + 0.1 × (−1 − 0) = −0.1。実行した出力も Q=0.000 -> -0.100 だった。
ゴールの価値がさかのぼる
ゴール直前で Q = 6.0、報酬 −1、次のマスの最大 Q が 10 なら、目標は −1 + 9 = 8、Q は 6.0 + 0.1 × 2.0 = 6.2 になる。
ゴールの +10 という情報は、最初はゴールの1つ手前のマスにしか入りません。 何度も歩くうちに、2つ手前、3つ手前…と価値が少しずつさかのぼり、最後にはスタートのマスでも「右へ進むのが良い」と分かるようになります。
このとき Q 表は、次のベルマン方程式を満たす値(最適な Q*)に近づきます。
Q*(s, a) = r + γ × max Q*(s′, a′)
(今の行動の価値 = すぐもらえる報酬 + 次の状態でいちばん良い行動の価値を割り引いたもの)
Q学習とSARSAの違い
Q 学習によく似た手法に SARSA(サルサ)があります。違いは目標の作り方だけです。
| 手法 | 目標に使う次の行動の価値 | 分類 | 性格 |
|---|---|---|---|
| Q 学習 | 次の状態で最大の Q(実際には選ばないかもしれない) | 方策オフ型 | 最適な道を学ぶ。探索中の失敗は気にしない |
| SARSA | 次の状態で実際に選んだ行動の Q | 方策オン型 | 探索のランダムさも込みで安全な道を学ぶ |
名前は、更新に使う s・a・r・s′・a′(State, Action, Reward, State, Action)の頭文字です。違いが結果にどう出るかは、後の節「Gymnasium で試す」で実行します。
Pythonで迷路をQ学習で解く(報酬が増える数値の表)
この節では、5×5 の迷路を Q 学習で解くコピペで動く完成コードと、学習が進むにつれて報酬が増える数値の表が分かります。
迷路は次のとおりです。S がスタート、G がゴール(+10)、X が落とし穴(−10、そこで終わり)、# が壁で、1歩ごとに −1 です。壁に向かって進むとその場にとどまります。左の列は行き止まりで、ゴールへの最短は右回りの8歩です。
S..#.
.#...
.#X#.
.#.#.
##..G
NumPy だけで書いたコードです(α = 0.1、γ = 0.9、ε = 0.1、500エピソード、1エピソード最大100歩)。
import numpy as np
# 迷路:S=スタート G=ゴール(+10) X=落とし穴(-10) #=壁。1歩ごとに -1
MAZE = ["S..#.",
".#...",
".#X#.",
".#.#.",
"##..G"]
H, W = len(MAZE), len(MAZE[0])
ACTIONS = [(-1, 0), (0, 1), (1, 0), (0, -1)] # 上 右 下 左
ARROW = "↑→↓←"
START = (0, 0)
def step(s, a):
"""環境:状態 s で行動 a をとった結果 (次の状態, 報酬, 終わりか) を返す"""
r, c = s[0] + ACTIONS[a][0], s[1] + ACTIONS[a][1]
if not (0 <= r < H and 0 <= c < W) or MAZE[r][c] == "#":
r, c = s # 壁ならその場にとどまる
if MAZE[r][c] == "G":
return (r, c), 10.0, True
if MAZE[r][c] == "X":
return (r, c), -10.0, True
return (r, c), -1.0, False
def choose(Q, s, eps, rng):
"""ε-greedy:確率 eps でランダム(探索)、それ以外は Q 最大の行動(活用)"""
if rng.random() < eps:
return int(rng.integers(4))
return int(rng.choice(np.flatnonzero(Q[s] == Q[s].max())))
def q_learning(episodes=500, alpha=0.1, gamma=0.9, eps=0.1, seed=0):
rng = np.random.default_rng(seed)
Q = np.zeros((H, W, 4)) # Q[行, 列, 行動]
log = []
for ep in range(episodes):
s, total = START, 0.0
for n in range(1, 101): # 1エピソード最大100歩
a = choose(Q, s, eps, rng)
s2, r, done = step(s, a)
target = r if done else r + gamma * Q[s2].max()
Q[s][a] += alpha * (target - Q[s][a]) # Q 学習の更新式
total += r
s = s2
if done:
break
log.append((total, n, MAZE[s[0]][s[1]] == "G"))
return Q, log
def greedy_path(Q):
s, path = START, [START]
for _ in range(30):
s, _, done = step(s, int(np.argmax(Q[s])))
path.append(s)
if done:
break
return path
if __name__ == "__main__":
logs = [q_learning(seed=k)[1] for k in range(20)] # 20回学習して平均
print("episodes avg_reward avg_steps goal_rate")
for a, b in [(0, 10), (10, 20), (20, 50), (50, 100), (100, 200), (200, 300), (300, 500)]:
x = np.array([row for log in logs for row in log[a:b]], dtype=float)
print(f"{a+1:>3}-{b:<4} {x[:, 0].mean():>9.2f} {x[:, 1].mean():>9.1f} {x[:, 2].mean():>8.0%}")
Q, _ = q_learning(seed=0)
print("policy:")
for r in range(H):
print(" " + "".join(ch if (ch := MAZE[r][c]) in "#GX"
else ARROW[int(np.argmax(Q[r, c]))] for c in range(W)))
p = greedy_path(Q)
print("path:", " -> ".join(f"({r},{c})" for r, c in p), f"[{len(p)-1} steps]")
print("Q(start) up/right/down/left:", np.round(Q[START], 3))
実行結果です。
episodes avg_reward avg_steps goal_rate
1-10 -59.77 63.7 57%
11-20 -28.05 37.4 92%
21-50 -6.71 17.1 97%
51-100 1.44 9.0 97%
101-200 1.67 8.8 98%
201-300 1.66 8.8 97%
301-500 1.65 8.7 97%
policy:
→→↓#↓
↑#→→↓
←#X#↓
↓#↑#↓
##↑↑G
path: (0,0) -> (0,1) -> (0,2) -> (1,2) -> (1,3) -> (1,4) -> (2,4) -> (3,4) -> (4,4) [8 steps]
Q(start) up/right/down/left: [-1.996 -0.434 -3.641 -2.243]
| エピソード | 1回の報酬の平均 | 歩数の平均 | ゴール率 |
|---|---|---|---|
| 1〜10 | −59.77 | 63.7 | 57% |
| 11〜20 | −28.05 | 37.4 | 92% |
| 21〜50 | −6.71 | 17.1 | 97% |
| 51〜100 | 1.44 | 9.0 | 97% |
| 101〜200 | 1.67 | 8.8 | 98% |
| 301〜500 | 1.65 | 8.7 | 97% |
---
config:
xyChart:
width: 480
height: 300
---
xychart-beta
title "1エピソードの報酬の平均(20回の平均)"
x-axis "エピソード" ["1-10", "11-20", "21-50", "51-100", "101-200", "201-300", "301-500"]
y-axis "報酬" -60 --> 5
bar [-59.77, -28.05, -6.71, 1.44, 1.67, 1.66, 1.65]
最初の10エピソードは平均 −59.77(63.7歩さまよい、ゴール率 57%)でしたが、100エピソードを過ぎると約 1.7(約8.8歩)まで増えました。 学んだ方策で歩かせると、右回りの最短8歩でゴールしました。
- 最適な報酬は 3(7歩分の −1 と、ゴールの +10)です。平均が 1.7 前後で止まるのは、ε = 0.1 で10回に1回ランダムに動き、遠回りや落とし穴(ゴール率 97%)が混ざるためです。学んだ方策そのものは最短です。
- Q(スタート, 右) = −0.434 は、答え合わせの理論値と一致しました。 環境の仕組みを知っている前提で最適な価値を計算する「価値反復法」で求めた V*(スタート) も −0.434 でした(7歩の −1 を割り引いた合計 −5.217 と、+10 × 0.9⁷ = 4.783 の和)。
- 何回学習させれば足りるかも数えました。学習後の Q で ε = 0 で歩かせると、10・20エピソード後は20回中0回でゴールに着かず(同じ所を往復)、50エピソード後からは20回とも最短8歩でした。
よく通るマスは正確、通らないマスはずれる
学んだ Q の最大値と、価値反復法の正解 V* を並べました(nan は壁・穴・ゴール)。
学んだ max Q: 正解 V*:
[[-0.43 0.63 1.81 nan 3.09] [[-0.43 0.63 1.81 nan 4.58]
[-2.22 nan 3.12 4.58 6.2 ] [-1.39 nan 3.12 4.58 6.2 ]
[-3.87 nan nan nan 8. ] [-2.25 nan nan nan 8. ]
[-3.88 nan 0. nan 10. ] [-3.03 nan 6.2 nan 10. ]
[ nan nan 0. 0. nan]] [ nan nan 8. 10. nan]]
最短の道のマス(右回り)は正解とぴったり同じで、行き止まりの左の列は値がずれていました。 左の列の矢印(←・↓)も最適ではありません。Q 学習は「経験したところ」しか直せないので、あまり通らない状態は不正確なまま残ります。右下の 0 の3マスは、落とし穴の先にあってたどり着けないマスです。
Gymnasiumで試す(CliffWalking・FrozenLake)
この節では、強化学習の標準的な環境ライブラリ Gymnasium で、Q 学習と SARSA の違いと、確率で滑る環境の学び方を実行結果で示します。
Gymnasium は、強化学習の環境(迷路・ゲーム・物理シミュレーション)を同じ書き方で使えるようにする Python のライブラリです(OpenAI Gym の後継)。pip install gymnasium で入り、環境は reset() と step(行動) で動かします。
import gymnasium as gym
env = gym.make("CliffWalking-v1")
print(env.observation_space, env.action_space) # Discrete(48) Discrete(4)
s, info = env.reset(seed=0) # 36 {'prob': 1}
print(env.step(0)) # (24, -1, False, False, {'prob': 1.0})
step は(次の状態, 報酬, 終わったか terminated, 打ち切りか truncated, 補足情報)の5つを返します。
| 環境 | 中身(公式ドキュメント) | 報酬 |
|---|---|---|
| CliffWalking-v1 | 4×12 のマス。下の端の10マスが崖。崖に入るとスタートに戻る | 1歩 −1、崖 −100 |
| FrozenLake-v1 | 4×4 の凍った湖。穴に落ちると終わり。滑る設定では意図した方向に進む確率が 1/3 | ゴール +1、ほかは 0 |
CliffWalking:Q学習は崖ぎわ、SARSAは遠回り
Sutton・Barto の教科書でも Q 学習と SARSA の比較に使われている問題です。α = 0.5、γ = 1、ε = 0.1、500エピソードで、Q 学習と SARSA を10回ずつ学ばせました。違いは更新式の目標の1行だけです。
if algo == "q": # Q 学習:次の状態の最大値を使う(方策オフ)
nxt = Q[s2].max()
else: # SARSA:実際に選んだ次の行動の値を使う(方策オン)
nxt = Q[s2, a2]
Q[s, a] += alpha * (r + (0 if term else gamma * nxt) - Q[s, a])
q online return (eps=0.1) ep1-50 -115.0 ep451-500 -48.4 greedy return -13.0
sarsa online return (eps=0.1) ep1-50 -109.5 ep451-500 -26.2 greedy return -54.0
Q学習の greedy(10回):全部 13歩(崖のすぐ上の行を通る)
SARSA の greedy(10回):17歩が6回、19歩が2回(上の行を通る)、200歩で着かないが2回
Q 学習(方策オフ)
学んだ道は最短の13歩(崖のすぐ上)
学習中は ε のランダムで崖に落ち、後半50回の平均は −48.4
「探索をやめた後」に最も良い道を学ぶ
SARSA(方策オン)
学んだ道は崖から離れた17〜19歩
学習中に落ちにくく、後半50回の平均は −26.2
「ランダムに動くこともある自分」にとって安全な道を学ぶ
学習中の成績は SARSA(−26.2)が良く、学んだ道は Q 学習(13歩)が短い、という、教科書で説明されているとおりの結果になりました。 学習中の失敗が高くつく場面(実機のロボットなど)では、方策オン型の性格が役に立ちます。なお SARSA の2回は、500エピソードでは学びきれず、ε = 0 で歩かせると同じ所を往復しました。
FrozenLake:滑る床では成功率 71.6%
滑る設定(is_slippery=True)の 4×4 で、Q 学習(α = 0.05、γ = 0.99、ε = 0.1)を20000エピソード学ばせ、学んだ方策を別の1000回で試しました。
train success rate first 1000 ep 8.6% last 1000 ep 38.3%
greedy policy success over 1000 test episodes: 71.6%
学んだ方策でのゴール率は 71.6% でした。 意図した方向に進むのは 1/3 なので、どんなに良い方策でも100% にはなりません。強化学習が「確率で結果が変わる環境」でも、期待値として良い行動を学べる例です。
多腕バンディットとは(強化学習のいちばん小さい形)
この節では、状態が1つしかない強化学習「多腕バンディット」と、ε-greedy・UCB の比べ方が分かります。
多腕バンディット(multi-armed bandit)は、当たりの確率が違う何台ものスロットマシン(腕)から、どれを引くと合計の報酬が最大になるかを、引きながら学ぶ問題です。 状態の移り変わりが無く、「探索と活用」だけを取り出した形なので、強化学習の入口としてよく使われます。広告やおすすめの表示を、反応を見ながら良いものに寄せていく仕組みにも使われ、ZOZO 研究所は ZOZOTOWN のファッション推薦で集めたバンディットのデータセット「Open Bandit Dataset」を公開しています。
Sutton・Barto の教科書と同じ「10本腕のテストベッド」(各腕の平均は正規分布 N(0, 1) から決め、報酬はその平均 + N(0, 1) のノイズ)を、2000回×1000ステップ実行しました。
policy avg reward @10 @100 @1000 | optimal action @10 @100 @1000 | total(1000)
greedy (eps=0) 0.56 1.01 1.02 | 21% 35% 35% | 1012
eps=0.01 0.56 1.05 1.30 | 21% 38% 59% | 1184
eps=0.1 0.51 1.17 1.37 | 20% 53% 80% | 1300
UCB c=2 0.00 1.23 1.48 | 10% 59% 86% | 1387
ideal (always best arm): 1.53 per step
- 探索しない greedy は、最良の腕を選べたのが35% のまま止まりました。 最初にたまたま良かった腕を引き続けるためです。
- ε = 0.1 は 80%、UCB は 86% まで最良の腕を選べるようになりました。UCB(Upper Confidence Bound)は、まだあまり引いていない腕に「不確かさの分のおまけ」を足して選ぶ方法で、ランダムではなく「試す価値の高い腕」を探索します。
- UCB は最初の10回の平均が 0.00 です。最初は全部の腕を1回ずつ引くためで、序盤の損と後半の得の引き換えです。
ウェブの A/B テストを、途中から良い案に多く振り分けるバンディット型で行う考え方は、関連記事「ABテストとは|やり方・サンプルサイズ・有意差の判定をPythonで実演」で扱っています。
強化学習の種類(モデルベース・価値ベース・方策ベース)
この節では、強化学習の手法を見分けるための3つの分け方と、代表的なアルゴリズムの位置が分かります。
| 分け方 | 種類 | 中身 | 例 |
|---|---|---|---|
| 環境のモデルを使うか | モデルベース | 環境の仕組み(遷移・報酬)を知る・学ぶ。計画を立てて行動 | 価値反復法・Dyna・AlphaZero の探索 |
| 環境のモデルを使うか | モデルフリー | 仕組みを知らずに、経験から直接学ぶ | Q 学習・SARSA・DQN・PPO |
| 何を学ぶか | 価値ベース | 価値 Q を学び、Q 最大の行動を選ぶ | Q 学習・SARSA・DQN |
| 何を学ぶか | 方策ベース | 方策(行動の確率)を直接学ぶ | REINFORCE・方策勾配法 |
| 何を学ぶか | アクター・クリティック | 方策(アクター)と価値(クリティック)を両方学ぶ | A2C・PPO・SAC |
| データの使い方 | 方策オフ | 別の方策で集めた経験からも学べる | Q 学習・DQN・SAC |
| データの使い方 | 方策オン | 今の方策で集めた経験で学ぶ | SARSA・REINFORCE・PPO |
価値ベースは「行動が数個に限られる」問題(ゲームのボタン)に、方策ベースは「行動が連続値」の問題(ロボットの関節の角度)に向きます。オラクルの解説などで見かける「モデルベース・ポリシーベース・バリューベース」の3種類は、この表の2つの分け方を合わせたものです。
深層強化学習とは(DQN・PPO)
この節では、Q 表の代わりにニューラルネットワークを使う深層強化学習と、代表の DQN・PPO が分かります。
状態の数が多すぎて Q 表を作れないとき(ゲームの画面、ロボットのセンサー値など)、Q 表の代わりにニューラルネットワークで Q や方策を近似するのが深層強化学習(Deep RL)です。 5×5 の迷路の Q 表は100個の数でしたが、ゲーム画面の状態は数え切れないほどあります。
| 手法 | 発表 | 学ぶもの | 特徴 |
|---|---|---|---|
| DQN(Deep Q-Network) | 2015年 Nature(DeepMind) | Q をニューラルネットで近似 | 経験を貯めて混ぜて学ぶ(経験再生)、目標用のネットを別に持つ |
| PPO(Proximal Policy Optimization) | 2017年 arXiv(OpenAI) | 方策と価値(アクター・クリティック) | 1回の更新で方策を変えすぎないよう制限し、安定させる |
| SAC・TD3 | 2018年ごろ | 連続値の行動 | ロボット制御などで使われる |
| AlphaGo・AlphaZero | 2016〜2017年(DeepMind) | 方策と価値+木探索 | 囲碁でトップ棋士に勝利 |
- DQN の論文「Human-level control through deep reinforcement learning」(Nature、2015年2月)は、画面のピクセルと得点だけを入力に、同じアルゴリズムで Atari 2600 の49本のゲームを学び、プロのゲームテスターに匹敵する水準に達したと報告しています。
- PPO の論文(Schulman ほか、2017年7月)は、TRPO の利点を持ちながら実装が簡単で、サンプル効率も良いと書いています。後の節の RLHF でも使われました。
- Python で試すときは、Stable-Baselines3 というライブラリがよく使われます。公式ドキュメントでは、本体に A2C・DDPG・DQN・HER・PPO・SAC・TD3 があり、DQN は離散の行動(Discrete)だけ、PPO は離散・連続の両方に対応しています。PyTorch が必要です。
Stable-Baselines3 で PPO を学ばせる基本の書き方は、公式ドキュメントの使用例と同じ次の形です。
from stable_baselines3 import PPO
model = PPO("MlpPolicy", "CartPole-v1", verbose=1) # 方策はニューラルネット(MLP)
model.learn(total_timesteps=10_000)
ニューラルネットワークの重み・誤差逆伝播の仕組みは、関連記事「ニューラルネットワークとは|仕組み・学習・AttentionをNumPyで実演」で扱っています。深層強化学習ではこのネットワークを、正解ラベルの代わりに TD 誤差(目標 − 予想)を小さくするように学ばせます。
RLHFとは(強化学習と生成AI・LLMの関係)
この節では、ChatGPT などの LLM(大規模言語モデル)の調整に強化学習がどう使われているかが分かります。
RLHF(Reinforcement Learning from Human Feedback、人間のフィードバックによる強化学習)は、人が「どちらの応答が良いか」を選んだデータから報酬を作り、その報酬が高くなるように LLM を強化学習で調整する方法です。 LLM が「行動=文章を出す」エージェント、「報酬=人の好みに合うか」という形に当てはめます。
お手本で教師あり学習(SFT)
人が書いた望ましい応答の例で、事前学習済みのモデルを微調整する。
応答を人が順位づけ
同じ質問への複数の応答を人が比べて並べる。そのデータで「良さ」を点数にする報酬モデルを作る。
強化学習で調整
報酬モデルの点が高くなるように、PPO などで LLM を更新する。元のモデルから離れすぎないよう制限をかける。
- OpenAI の InstructGPT の論文(2022年、arXiv:2203.02155)はこの手順で GPT-3 を調整し、パラメーター数が100分の1の 1.3B の InstructGPT の出力が、175B の GPT-3 の出力より人に好まれたと報告しています。
- 報酬モデルと強化学習を使わずに、選好データから直接学ぶ DPO(Direct Preference Optimization、2023年、arXiv:2305.18290)も広く使われています。論文は、RLHF が複雑で不安定になりやすい点を挙げ、単純な分類の損失で同じ問題を解けると書いています。
- 推論(考える力)を伸ばすためにも強化学習が使われています。DeepSeek-R1 の論文(2025年1月、arXiv:2501.12948)は、人が書いた推論の過程のデータなしに、純粋な強化学習で LLM の推論能力を引き出せたと書いています。答えが正しいかを自動で判定できる問題(数学・プログラミング)では、正解を報酬にできます。
| 方法 | 学ぶデータ | 強化学習を使うか |
|---|---|---|
| 事前学習 | 大量の文章(次の単語を当てる) | 使わない |
| SFT(教師ありの微調整) | 人が書いたお手本の応答 | 使わない |
| RLHF | 人の順位づけ → 報酬モデル | 使う(PPO など) |
| DPO | 人の選好(2つの応答のどちらが良いか) | 使わない |
| 正解を報酬にする強化学習 | 自動で採点できる問題 | 使う |
自社のデータで LLM を調整するか、検索で知識を渡すかの選び方は、関連記事「RAGとファインチューニングの違いと使い分け判断基準の早見表」で扱っています。LLM が道具を使って何手も行動する仕組み(AI エージェント)は、関連記事「AIエージェントとは|仕組みとワークフローとの違い・作り方入門」で扱っています。
強化学習が使われている例
この節では、強化学習が実際にどんな分野で使われているかを一覧で示します。
| 分野 | 例 | 報酬にしているもの |
|---|---|---|
| ゲーム・囲碁 | DQN(Atari)、AlphaGo(2016年3月、李世乭九段に4勝1敗) | 得点・勝ち負け |
| 生成AI・LLM | RLHF、推論モデルの学習 | 人の好み・正解かどうか |
| 推薦・広告 | 多腕バンディットで表示する商品や広告を選ぶ | クリック・購入 |
| 工場・プラント | 横河電機と JSR が強化学習の AI で化学プラントを35日間自律制御(2022年発表) | 品質・安定・省エネ |
| ロボット | 物をつかむ・歩く動作の学習(シミュレーションで学び実機へ) | 目標の達成・転ばないこと |
| 自動運転 | シミュレーターでの車線変更・合流の判断の研究 | 安全・到着時間 |
| 金融 | 資産の配分・売買の判断の研究 | 収益・リスク |
共通点は「正解は分からないが、結果の良し悪しは数値で測れる」「何度も試せる(シミュレーションがある)」ことです。 逆に、試行の失敗が許されず、シミュレーションも作れない問題では使いにくくなります(次の節)。
強化学習の難しさ(報酬設計・サンプル効率)
この節では、強化学習でつまずきやすい点を、報酬の設計を間違えた実行例とともに示します。
報酬設計の失敗:AIは「書いた報酬」を最大にする
強化学習の AI は、人が意図した目的ではなく、数値として書かれた報酬を最大にします。 2×5 の通路で、ゴール(+10、1歩 −1)に向かわせるつもりで、途中のチェックポイント c に入るたびに +1 を足しました。
S.c..
....G
[goal only] greedy path (5 steps, ends at G):
0,0 0,1 1,1 1,2 1,3 1,4
avg steps last100: 5.6 goal rate last100: 100% avg reward last100: 5.4
[checkpoint +1] greedy path (30 steps, ends at c):
0,0 0,1 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 ...
avg steps last100: 100.0 goal rate last100: 0% avg reward last100: 82.8
「途中も励まそう」と報酬を足したら
報酬が多い方が「失敗」している。報酬の数字ではなく行動を見て確かめる
チェックポイントの報酬を足すと、AI はゴールに行かず、c にとどまって +1 を取り続けました(報酬の平均は 82.8 と高いのに、ゴール率は 0%)。 これを報酬ハッキング(reward hacking)と呼びます。途中の報酬は「何度でも取れないか」「本当の目的と矛盾しないか」を確かめます。
そのほかの難しさ
- 1報酬が目的と一致しているかチェックポイント +1 で、ゴール率 100% → 0% になった。売上だけを報酬にすると利益や満足度が下がることもある
- 2試行の回数が足りるか(サンプル効率)25マスの迷路でも最短を覚えるまで約50エピソード。FrozenLake は20000エピソード。実物で試すには多すぎることがある
- 3探索が足りているかε を固定すると、通路の例では20回中0回しか遠くの +10 を見つけられなかった。ε を減らしていく・UCB を使う
- 4シミュレーションと実物の差シミュレーターで学んだ方策が、摩擦やノイズの違う実物で同じように動くとは限らない(sim-to-real の問題)
- 5学習中の失敗が許されるかQ 学習は学習中に崖へ何度も落ちた。実機や本番の顧客では、SARSA のような安全側の手法・過去のログで学ぶ方法を考える
- 6結果が乱数で変わっていないかSARSA は10回中2回、学びきれなかった。seed を変えて複数回まわし、平均と幅で判断する
- 7設定値(α・γ・ε)を確かめたかγ が 0.7 と 0.8 で行き先が逆になった。設定を変えたら行動を見直す
強化学習を始める・業務で使うときの進め方
この節では、強化学習を学ぶ順番と、業務の課題に使うかを決めるまでの流れが分かります。
課題を5つの要素に書き分ける
エージェント・環境・状態・行動・報酬を書き出す。報酬が数値で書けない、何度も試せないなら、教師あり学習やルールの方が向くことが多い。
小さな環境で試す
この記事の迷路やバンディットのように、NumPy の Q 表で動かし、報酬が増えるかを数値の表で確かめる。
シミュレーターを作る
本番で試行錯誤できないなら、過去のデータや物理モデルで環境を作る。Gymnasium の reset と step の形にそろえると、ライブラリをそのまま使える。
深層強化学習のライブラリで学ぶ
状態が多いなら Stable-Baselines3 の DQN・PPO などを使う。seed を変えて複数回まわす。
小さく試して評価し、広げる
決まった範囲で試し、報酬の数字だけでなく実際の行動(報酬ハッキングが無いか)を確かめてから広げる。
学ぶ順番は「NumPy の配列 → 多腕バンディット → Q 学習(表) → ニューラルネットワーク → DQN・PPO → RLHF」が、この記事の節の順です。配列の作り方・argmax などの書き方は、関連記事「NumPyの使い方 基本一覧|配列の作成・演算・形状変更」で扱っています。定番の教科書は Sutton・Barto『Reinforcement Learning: An Introduction』(第2版、MIT Press、2018年)で、著者のサイトで PDF が公開されています。
よくある質問
Q. 強化学習とは簡単に言うと何ですか? A. 試行錯誤して得た報酬の合計が最大になる行動を、AI が自分で学ぶ機械学習です。正解のデータは与えず、結果の良し悪し(報酬)だけを数値で与えます。
Q. 強化学習の身近な例は? A. ゲームの AI、囲碁の AlphaGo、ネット通販のおすすめや広告の出し分け(バンディット)、ChatGPT などの LLM の調整(RLHF)があります。犬のしつけで「できたらおやつ」と同じ考え方です。
Q. 強化学習と教師あり学習の違いは? A. 教師あり学習は入力ごとの正解(ラベル)から学び、強化学習は行動した結果の報酬から学びます。強化学習では正解が無く、データも自分の行動で集めます。
Q. 強化学習とディープラーニングの違いは? A. 強化学習は「報酬から学ぶ」という学び方、ディープラーニングは「多層のニューラルネットワーク」という道具です。組み合わせたものが深層強化学習(DQN・PPO など)です。
Q. 強化学習は AI ですか、機械学習ですか? A. 機械学習の一分野で、機械学習は AI(人工知能)の一分野です。教師あり学習・教師なし学習と並ぶ、機械学習の3つの基本の考え方の1つです。
Q. Q学習とは何ですか? A. 状態と行動の組ごとの良さ Q(s, a) を表に持ち、「報酬 + γ × 次の状態の最大の Q」に少しずつ近づけて学ぶ方法です。5×5 の迷路では、約50エピソードで最短8歩の道を学びました。
Q. ε-greedy とは何ですか? A. 確率 ε でランダムに行動し(探索)、それ以外は今いちばん良い行動を選ぶ(活用)方法です。最初は ε を大きく、だんだん小さくすると、探索と活用の両方を取りやすくなります。
Q. 強化学習と生成AIは同じものですか? A. 別のものです。生成AI(LLM)は主に大量の文章からの事前学習で作られ、その後の調整の段階で強化学習(RLHF や、正解を報酬にする学習)が使われます。
Q. RLHF とは何ですか? A. 人が応答を比べて選んだデータから報酬モデルを作り、その報酬が高くなるように LLM を強化学習で調整する方法です。InstructGPT では、1.3B のモデルの出力が 175B の GPT-3 より好まれました。
Q. 強化学習を Python で試すには?
A. 小さな問題なら NumPy だけで Q 学習が書けます(この記事のコード)。標準の環境は Gymnasium(pip install gymnasium)、深層強化学習は Stable-Baselines3(PyTorch が必要)がよく使われます。
Q. 強化学習のデメリット・難しい点は? A. 報酬の設計を間違えると意図しない行動を覚えること(報酬ハッキング)、学ぶのに多くの試行が要ること、探索が足りないと良い答えを見逃すこと、シミュレーションと実物の差です。
Q. 逆強化学習・模倣学習・オフライン強化学習とは? A. 逆強化学習は、上手な人の行動から「何を報酬にしているか」を推定する方法です。模倣学習は、お手本の行動をまねて学ぶ方法です。オフライン強化学習は、新たに試行せず、過去に集めたデータだけで方策を学ぶ方法です。
まとめ
- 強化学習は、エージェントが環境の中で行動し、報酬の合計が最大になる方策を試行錯誤で学ぶ機械学習。正解ラベルは要らない。
- 用語は、エージェント・環境・状態・行動・報酬・方策・価値。数学ではマルコフ決定過程で表す。
- 割引率 γ は「どれだけ先まで見るか」。通路の例では 0.7 以下で近くの +3、0.8 以上で遠くの +10 を選び、理論値と一致した。
- 探索と活用:ε を固定すると遠くの +10 を見つけられず、1.0 から 0.05 へ減らすと平均報酬 9.47 になった。
- Q 学習は Q(s, a) ← Q(s, a) + α × (r + γ × max Q(s′, a′) − Q(s, a))。迷路では報酬の平均が −59.77 から約 1.7 に増え、最短8歩を学び、Q(スタート) は理論値 −0.434 と一致した。
- Q 学習は崖ぎわの最短(13歩)、SARSA は安全な遠回り(17〜19歩)を学んだ。
- 多腕バンディットでは、探索しない greedy は最良の腕を35% しか選べず、UCB は86% まで選べた。
- 深層強化学習(DQN・PPO)はニューラルネットで Q や方策を近似する。RLHF は人の好みを報酬にして LLM を調整する。
- 報酬はチェックポイント +1 のような足し方で簡単に「ハック」される。報酬の数字だけでなく行動を見て確かめる。
参考・出典
確認日はいずれも 2026年10月22日です。
- Wikipedia「強化学習」:https://ja.wikipedia.org/wiki/強化学習
- Richard S. Sutton, Andrew G. Barto「Reinforcement Learning: An Introduction(2nd edition)」:http://incompleteideas.net/book/the-book-2nd.html
- Gymnasium「Cliff Walking」:https://gymnasium.farama.org/environments/toy_text/cliff_walking/
- Gymnasium「Frozen Lake」:https://gymnasium.farama.org/environments/toy_text/frozen_lake/
- Stable-Baselines3「Reinforcement Learning Algorithms」:https://stable-baselines3.readthedocs.io/en/master/guide/algos.html
- Mnih et al.「Human-level control through deep reinforcement learning」(Nature, 2015):https://www.nature.com/articles/nature14236
- Schulman et al.「Proximal Policy Optimization Algorithms」(arXiv:1707.06347):https://arxiv.org/abs/1707.06347
- Ouyang et al.「Training language models to follow instructions with human feedback」(arXiv:2203.02155):https://arxiv.org/abs/2203.02155
- Rafailov et al.「Direct Preference Optimization」(arXiv:2305.18290):https://arxiv.org/abs/2305.18290
- DeepSeek-AI「DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning」(arXiv:2501.12948):https://arxiv.org/abs/2501.12948
- Wikipedia (English)「AlphaGo versus Lee Sedol」:https://en.wikipedia.org/wiki/AlphaGo_versus_Lee_Sedol
- Saito et al.「Open Bandit Dataset and Pipeline」(arXiv:2008.07146):https://arxiv.org/abs/2008.07146
- MONOist「強化学習AIで化学プラントの35日間自律制御に成功、完全自律工場へ道筋」:https://monoist.itmedia.co.jp/mn/articles/2203/29/news094.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「強化学習とは|仕組み・Q学習・RLHFをPythonの迷路で実演」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。