強化学習(Reinforcement Learning)は、エージェントが環境との試行錯誤を通じて「最適な行動の仕方」を学ぶ枠組みです。教師あり学習が「正解データ」から学ぶのに対し、強化学習では正解が直接与えられません。代わりに、行動の結果として得られる「報酬」というスカラー信号だけを手がかりに、累積的な報酬を最大化する方策を獲得します。
この枠組みは、ゲームAI、ロボット制御、自動運転、推薦システム、さらには航空宇宙分野における軌道計画や姿勢制御など、逐次的な意思決定が求められるあらゆる場面で活用されています。強化学習を理解するための第一歩は、その数学的な土台であるマルコフ決定過程(MDP)とベルマン方程式を正しく押さえることです。
本記事の内容
- 強化学習の基本概念(状態、行動、報酬、方策、割引率)
- マルコフ決定過程(MDP)の定式化
- 状態価値関数 $V^{\pi}(s)$ と行動価値関数 $Q^{\pi}(s,a)$ の定義
- ベルマン期待方程式・ベルマン最適方程式の導出
- 動的計画法(方策反復・価値反復)のアルゴリズム
- グリッドワールドでの価値反復法のPython実装
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
教師あり学習との違い
教師あり学習では、入力 $\bm{x}$ に対して正解ラベル $y$ が与えられ、モデルは $\bm{x} \to y$ の写像を学習します。一方、強化学習では次のような特徴があります。
| 特徴 | 教師あり学習 | 強化学習 |
|---|---|---|
| フィードバック | 正解ラベル | 報酬(スカラー値) |
| データの独立性 | 各サンプルが独立 | 行動が次の状態に影響 |
| 評価のタイミング | 即時 | 遅延報酬あり |
| 目的 | 予測誤差の最小化 | 累積報酬の最大化 |
強化学習のポイントは、いま得られる報酬だけでなく、将来にわたる報酬の合計を最大化するという点です。目先の利益を犠牲にしてでも長期的に良い結果を得る、という戦略的な判断が求められます。
強化学習の基本概念
強化学習は「エージェント」と「環境」の相互作用として定式化されます。各時刻 $t$ で以下のサイクルが繰り返されます。
- エージェントが現在の状態 $s_t$ を観測する
- 方策に基づいて行動 $a_t$ を選択する
- 環境が次の状態 $s_{t+1}$ と報酬 $r_{t+1}$ を返す
この繰り返しの中で、エージェントは自分の方策を改善していきます。ここで登場する主要な概念を整理しましょう。
状態(State)
状態 $s \in \mathcal{S}$ は、環境の現在の状況を表す情報です。例えばチェスなら盤面の配置、ロボットなら関節角度と角速度が状態に相当します。
行動(Action)
行動 $a \in \mathcal{A}$ は、エージェントが選択できる操作です。行動集合 $\mathcal{A}$ は離散(上下左右の移動)でも連続(トルクの大きさ)でもかまいません。
報酬(Reward)
報酬 $r \in \mathbb{R}$ は、行動の良し悪しを示すスカラー信号です。ゴールに到達すれば $+1$、穴に落ちれば $-1$ といったように設計します。
方策(Policy)
方策 $\pi$ は、各状態でどの行動を選ぶかを決めるルールです。確率的方策は以下のように定義されます。
$$ \pi(a \mid s) = P(a_t = a \mid s_t = s) $$
つまり、状態 $s$ において行動 $a$ を選ぶ確率です。決定的方策の場合は $a = \pi(s)$ と書きます。
割引率(Discount Factor)
割引率 $\gamma \in [0, 1)$ は、将来の報酬をどれだけ重視するかを制御するパラメータです。$\gamma$ が $1$ に近いほど遠い将来の報酬を重視し、$0$ に近いほど目先の報酬を重視します。割引率を導入する理由は、無限ホライズンにおける累積報酬を有限に保つためでもあります。
マルコフ決定過程(MDP)
強化学習の問題を数学的に定式化するための枠組みが、マルコフ決定過程(Markov Decision Process, MDP)です。MDPは以下の5つ組で定義されます。
$$ \text{MDP} = (\mathcal{S},\; \mathcal{A},\; P,\; R,\; \gamma) $$
ここで各要素は次の通りです。
| 記号 | 名称 | 定義 |
|---|---|---|
| $\mathcal{S}$ | 状態空間 | すべての状態の集合 |
| $\mathcal{A}$ | 行動空間 | すべての行動の集合 |
| $P(s’ \mid s, a)$ | 状態遷移確率 | 状態 $s$ で行動 $a$ をとったときに状態 $s’$ に遷移する確率 |
| $R(s, a, s’)$ | 報酬関数 | 遷移 $(s, a, s’)$ に対して得られる即時報酬 |
| $\gamma$ | 割引率 | $0 \leq \gamma < 1$ |
マルコフ性
MDPの重要な仮定がマルコフ性(Markov property)です。これは「次の状態と報酬は、現在の状態と行動のみに依存し、過去の履歴には依存しない」という性質です。数式で書くと次のようになります。
$$ P(s_{t+1} \mid s_t, a_t, s_{t-1}, a_{t-1}, \dots, s_0, a_0) = P(s_{t+1} \mid s_t, a_t) $$
イメージとしては、「現在の状態さえわかれば、過去の経緯を知らなくても将来を予測できる」ということです。チェスの盤面が分かれば、そこに至るまでの手順の詳細は次の一手を考えるうえで不要です。
収益(Return)
時刻 $t$ 以降に得られる報酬の割引累積和を収益(return)$G_t$ と定義します。
$$ G_t = r_{t+1} + \gamma \, r_{t+2} + \gamma^2 \, r_{t+3} + \cdots = \sum_{k=0}^{\infty} \gamma^k \, r_{t+k+1} $$
$\gamma < 1$ であるため、この無限級数は有界です。報酬の絶対値が $r_{\max}$ で抑えられるなら、$G_t \leq r_{\max} / (1 - \gamma)$ となります。
また、収益には次のような再帰的な関係があります。
$$ G_t = r_{t+1} + \gamma \, G_{t+1} $$
この再帰構造がベルマン方程式の根幹です。
状態価値関数 $V^{\pi}(s)$
方策 $\pi$ のもとで状態 $s$ からスタートしたときの収益の期待値を状態価値関数(state-value function)と呼びます。
$$ V^{\pi}(s) = \mathbb{E}_{\pi} \left[ G_t \mid s_t = s \right] $$
ここで $\mathbb{E}_{\pi}[\cdot]$ は方策 $\pi$ に従って行動を選んだときの期待値です。直感的には、「状態 $s$ にいるとき、方策 $\pi$ に従い続けるとどれだけ良いか」を表す指標です。
$V^{\pi}(s)$ の値が大きいほど、その状態は方策 $\pi$ のもとで「良い状態」であると言えます。
行動価値関数 $Q^{\pi}(s, a)$
状態 $s$ で行動 $a$ をとり、その後は方策 $\pi$ に従ったときの収益の期待値を行動価値関数(action-value function)と呼びます。
$$ Q^{\pi}(s, a) = \mathbb{E}_{\pi} \left[ G_t \mid s_t = s, a_t = a \right] $$
状態価値関数 $V^{\pi}$ は「状態の良さ」を評価するのに対し、行動価値関数 $Q^{\pi}$ は「その状態でその行動をとることの良さ」を評価します。
$V^{\pi}(s)$ と $Q^{\pi}(s,a)$ の間には次の関係が成り立ちます。
$$ V^{\pi}(s) = \sum_{a \in \mathcal{A}} \pi(a \mid s) \, Q^{\pi}(s, a) $$
すなわち、状態価値は「方策に従ってすべての行動について行動価値を重み付き平均したもの」です。
ベルマン期待方程式の導出
収益の再帰構造 $G_t = r_{t+1} + \gamma \, G_{t+1}$ を使って、$V^{\pi}(s)$ の再帰的な表現を導出しましょう。これがベルマン期待方程式です。
$V^{\pi}(s)$ の定義から出発します。
$$ \begin{align} V^{\pi}(s) &= \mathbb{E}_{\pi} \left[ G_t \mid s_t = s \right] \\ &= \mathbb{E}_{\pi} \left[ r_{t+1} + \gamma \, G_{t+1} \mid s_t = s \right] \\ &= \mathbb{E}_{\pi} \left[ r_{t+1} \mid s_t = s \right] + \gamma \, \mathbb{E}_{\pi} \left[ G_{t+1} \mid s_t = s \right] \end{align} $$
最後の行は期待値の線型性を使いました。ここで、行動 $a$ と次状態 $s’$ について条件付き期待値を展開します。
$$ \begin{align} V^{\pi}(s) &= \sum_{a \in \mathcal{A}} \pi(a \mid s) \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, \mathbb{E}_{\pi} \left[ G_{t+1} \mid s_{t+1} = s’ \right] \right] \end{align} $$
マルコフ性により、$\mathbb{E}_{\pi}[G_{t+1} \mid s_{t+1} = s’] = V^{\pi}(s’)$ です。したがって次式を得ます。
$$ \boxed{ V^{\pi}(s) = \sum_{a \in \mathcal{A}} \pi(a \mid s) \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V^{\pi}(s’) \right] } $$
これがベルマン期待方程式(Bellman expectation equation)です。現在の状態 $s$ の価値が、即時報酬と次の状態 $s’$ の価値の割引和で再帰的に表されています。
同様に、行動価値関数 $Q^{\pi}(s, a)$ についてもベルマン期待方程式を導出できます。
$$ \begin{align} Q^{\pi}(s, a) &= \mathbb{E}_{\pi} \left[ G_t \mid s_t = s, a_t = a \right] \\ &= \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \sum_{a’ \in \mathcal{A}} \pi(a’ \mid s’) \, Q^{\pi}(s’, a’) \right] \end{align} $$
ここで $V^{\pi}(s’) = \sum_{a’} \pi(a’ \mid s’) \, Q^{\pi}(s’, a’)$ の関係を使いました。
$V^{\pi}$ と $Q^{\pi}$ の相互関係
ベルマン期待方程式をダイアグラム的に整理すると、$V^{\pi}$ と $Q^{\pi}$ の間には次の2つの関係があります。
$$ V^{\pi}(s) = \sum_{a} \pi(a \mid s) \, Q^{\pi}(s, a) $$
$$ Q^{\pi}(s, a) = \sum_{s’} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V^{\pi}(s’) \right] $$
第1式を第2式に代入すれば $Q^{\pi}$ だけのベルマン方程式が、第2式を第1式に代入すれば $V^{\pi}$ だけのベルマン方程式が得られます。
ベルマン最適方程式の導出
すべての方策の中で最も高い価値を実現するものを最適方策 $\pi^*$ と呼びます。最適方策のもとでの価値関数を最適価値関数と定義します。
$$ V^*(s) = \max_{\pi} V^{\pi}(s), \quad Q^*(s, a) = \max_{\pi} Q^{\pi}(s, a) $$
ベルマン期待方程式において、方策 $\pi$ による重み付き平均($\sum_a \pi(a \mid s) \cdot$)を最大化($\max_a$)に置き換えると、ベルマン最適方程式(Bellman optimality equation)が得られます。
$V^*$ のベルマン最適方程式
最適方策 $\pi^*$ は各状態で最も価値の高い行動を確定的に選びます。したがって、$\sum_a \pi(a \mid s) \cdot$ が $\max_a$ に置き換わります。
$$ \begin{align} V^*(s) &= \max_{a \in \mathcal{A}} Q^*(s, a) \\ &= \max_{a \in \mathcal{A}} \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V^*(s’) \right] \end{align} $$
$$ \boxed{ V^*(s) = \max_{a \in \mathcal{A}} \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V^*(s’) \right] } $$
$Q^*$ のベルマン最適方程式
同様に $Q^*$ については次のようになります。
$$ \begin{align} Q^*(s, a) &= \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V^*(s’) \right] \\ &= \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \max_{a’} Q^*(s’, a’) \right] \end{align} $$
$$ \boxed{ Q^*(s, a) = \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \max_{a’ \in \mathcal{A}} Q^*(s’, a’) \right] } $$
ベルマン最適方程式は非線形($\max$ 演算を含む)であるため、一般に解析的に解くことはできません。そこで動的計画法による反復的な解法を用います。
動的計画法
MDPの構造($\mathcal{S}, \mathcal{A}, P, R, \gamma$)がすべて既知の場合、動的計画法(Dynamic Programming, DP)によって最適方策を求めることができます。代表的な手法として方策反復法と価値反復法があります。
方策評価(Policy Evaluation)
与えられた方策 $\pi$ に対して $V^{\pi}$ を求める問題を方策評価と呼びます。ベルマン期待方程式を反復更新に用います。
$$ V_{k+1}(s) \leftarrow \sum_{a \in \mathcal{A}} \pi(a \mid s) \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V_k(s’) \right] $$
$V_0$ を任意の値(例えばすべて $0$)で初期化し、上の更新を全状態に対して繰り返します。$k \to \infty$ で $V_k \to V^{\pi}$ に収束することが保証されています。
方策改善(Policy Improvement)
方策評価で得られた $V^{\pi}$ を使って、方策をグリーディに改善します。
$$ \pi'(s) = \arg\max_{a \in \mathcal{A}} \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V^{\pi}(s’) \right] $$
方策改善定理により、$\pi’$ は元の方策 $\pi$ 以上の性能を持つことが保証されます。つまり、すべての状態 $s$ に対して $V^{\pi’}(s) \geq V^{\pi}(s)$ が成り立ちます。
方策反復法(Policy Iteration)
方策評価と方策改善を交互に繰り返すアルゴリズムが方策反復法です。
- 方策 $\pi$ を初期化(例: ランダム方策)
- 方策評価: $V^{\pi}$ を計算(ベルマン期待方程式の反復)
- 方策改善: $V^{\pi}$ に基づいてグリーディ方策 $\pi’$ を計算
- $\pi’ = \pi$ なら終了(最適方策に到達)。そうでなければ $\pi \leftarrow \pi’$ として 2 へ戻る
有限MDPにおいて、方策反復法は有限回のステップで最適方策 $\pi^*$ に収束します。
価値反復法(Value Iteration)
方策反復法では毎回方策評価を収束するまで繰り返す必要がありますが、価値反復法ではベルマン最適方程式を直接反復することで、方策評価と方策改善を同時に行います。
$$ V_{k+1}(s) \leftarrow \max_{a \in \mathcal{A}} \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V_k(s’) \right] $$
収束後、最適方策は次のように抽出できます。
$$ \pi^*(s) = \arg\max_{a \in \mathcal{A}} \sum_{s’ \in \mathcal{S}} P(s’ \mid s, a) \left[ R(s, a, s’) + \gamma \, V^*(s’) \right] $$
価値反復法はシンプルで実装しやすく、特に状態空間が小さいMDPに対して有効です。
具体例: グリッドワールド
理論を具体的に理解するために、$4 \times 4$ のグリッドワールドを考えましょう。
+----+----+----+----+
| S | | | |
+----+----+----+----+
| | X | | |
+----+----+----+----+
| | | | |
+----+----+----+----+
| | | | G |
+----+----+----+----+
- S: スタート(状態 $(0, 0)$)
- G: ゴール(状態 $(3, 3)$)、報酬 $+1$
- X: 壁(状態 $(1, 1)$)、進入不可
- それ以外のステップの報酬: $-0.04$(最短経路を促すための微小なペナルティ)
- 行動: 上下左右の4方向(確定的に遷移、壁やグリッド外への移動はその場にとどまる)
- 割引率: $\gamma = 0.99$
ゴールに到達したらエピソード終了(終端状態)とします。
価値反復法の適用
初期値 $V_0(s) = 0$(全状態)としてベルマン最適方程式を反復的に適用します。
反復1回目: ゴールに隣接する状態のみが正の価値を持ち始めます。ゴール $(3,3)$ からの報酬がバックアップされ、$(2,3)$ や $(3,2)$ の価値が $+1 – 0.04 = 0.96$ 程度になります。
反復が進むにつれ: 価値がゴールから波紋のように広がり、すべての状態の最適価値が確定していきます。壁の周辺では迂回経路の影響で価値が低めになります。
Python実装
グリッドワールドの価値反復法をPythonで実装し、結果を可視化します。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
# --- グリッドワールドの設定 ---
ROWS, COLS = 4, 4
GAMMA = 0.99
THETA = 1e-6 # 収束閾値
GOAL = (3, 3)
WALL = (1, 1)
STEP_REWARD = -0.04
GOAL_REWARD = 1.0
ACTIONS = {
"up": (-1, 0),
"down": (1, 0),
"left": (0, -1),
"right": (0, 1),
}
ACTION_LIST = list(ACTIONS.keys())
def step(s, action):
"""状態 s で行動 action をとったときの次状態と報酬を返す"""
dr, dc = ACTIONS[action]
nr, nc = s[0] + dr, s[1] + dc
# グリッド外や壁への移動はその場にとどまる
if nr < 0 or nr >= ROWS or nc < 0 or nc >= COLS or (nr, nc) == WALL:
next_s = s
else:
next_s = (nr, nc)
# 報酬の計算
if next_s == GOAL:
reward = GOAL_REWARD
else:
reward = STEP_REWARD
return next_s, reward
# --- 価値反復法 ---
V = np.zeros((ROWS, COLS))
iteration = 0
while True:
delta = 0
V_new = np.copy(V)
for r in range(ROWS):
for c in range(COLS):
s = (r, c)
# ゴールと壁はスキップ
if s == GOAL or s == WALL:
continue
# ベルマン最適方程式の更新
q_values = []
for action in ACTION_LIST:
next_s, reward = step(s, action)
# 確定的遷移なので P(s'|s,a) = 1
q = reward + GAMMA * V[next_s[0], next_s[1]]
# ゴール到達時は終端状態(将来報酬なし)
if next_s == GOAL:
q = reward
q_values.append(q)
V_new[r, c] = max(q_values)
delta = max(delta, abs(V_new[r, c] - V[r, c]))
V = V_new
iteration += 1
if delta < THETA:
break
print(f"収束までの反復回数: {iteration}")
print("最適状態価値関数 V*:")
print(np.round(V, 3))
# --- 最適方策の抽出 ---
policy = np.full((ROWS, COLS), "", dtype=object)
arrow_map = {"up": "^", "down": "v", "left": "<", "right": ">"}
for r in range(ROWS):
for c in range(COLS):
s = (r, c)
if s == GOAL:
policy[r, c] = "G"
continue
if s == WALL:
policy[r, c] = "X"
continue
best_action = None
best_q = -np.inf
for action in ACTION_LIST:
next_s, reward = step(s, action)
q = reward + GAMMA * V[next_s[0], next_s[1]]
if next_s == GOAL:
q = reward
if q > best_q:
best_q = q
best_action = action
policy[r, c] = arrow_map[best_action]
print("\n最適方策:")
for r in range(ROWS):
print(" ".join(policy[r]))
# --- 可視化 ---
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# (1) 状態価値関数のヒートマップ
ax1 = axes[0]
V_display = np.copy(V)
V_display[WALL[0], WALL[1]] = np.nan # 壁はNaN
im = ax1.imshow(V_display, cmap="YlOrRd", interpolation="nearest")
ax1.set_title("Optimal State-Value Function $V^*$", fontsize=14)
ax1.set_xticks(range(COLS))
ax1.set_yticks(range(ROWS))
for r in range(ROWS):
for c in range(COLS):
if (r, c) == WALL:
ax1.text(c, r, "WALL", ha="center", va="center", fontsize=10, fontweight="bold")
elif (r, c) == GOAL:
ax1.text(c, r, f"GOAL\n{V[r,c]:.3f}", ha="center", va="center", fontsize=9)
else:
ax1.text(c, r, f"{V[r,c]:.3f}", ha="center", va="center", fontsize=10)
fig.colorbar(im, ax=ax1, shrink=0.8)
# (2) 最適方策の矢印表示
ax2 = axes[1]
ax2.set_xlim(-0.5, COLS - 0.5)
ax2.set_ylim(ROWS - 0.5, -0.5)
ax2.set_xticks(range(COLS))
ax2.set_yticks(range(ROWS))
ax2.set_title("Optimal Policy $\\pi^*$", fontsize=14)
ax2.set_aspect("equal")
ax2.grid(True, linewidth=2)
arrow_dx = {"up": (0, -0.3), "down": (0, 0.3), "left": (-0.3, 0), "right": (0.3, 0)}
for r in range(ROWS):
for c in range(COLS):
if (r, c) == GOAL:
ax2.add_patch(mpatches.Rectangle((c - 0.5, r - 0.5), 1, 1, color="gold", alpha=0.5))
ax2.text(c, r, "G", ha="center", va="center", fontsize=16, fontweight="bold")
elif (r, c) == WALL:
ax2.add_patch(mpatches.Rectangle((c - 0.5, r - 0.5), 1, 1, color="gray", alpha=0.7))
ax2.text(c, r, "X", ha="center", va="center", fontsize=16, fontweight="bold", color="white")
else:
# 最適行動を矢印で描画
best_action = None
best_q = -np.inf
for action in ACTION_LIST:
next_s, reward = step((r, c), action)
q = reward + GAMMA * V[next_s[0], next_s[1]]
if next_s == GOAL:
q = reward
if q > best_q:
best_q = q
best_action = action
dx, dy = arrow_dx[best_action]
ax2.annotate("", xy=(c + dx, r + dy), xytext=(c, r),
arrowprops=dict(arrowstyle="->", lw=2, color="darkblue"))
plt.tight_layout()
plt.savefig("gridworld_value_iteration.png", dpi=150, bbox_inches="tight")
plt.show()
このコードを実行すると、以下の結果が得られます。
- 左図: 最適状態価値関数 $V^*$ のヒートマップ。ゴールに近い状態ほど高い価値を持ち、壁の裏側の状態は迂回が必要なため価値が低くなります。
- 右図: 最適方策 $\pi^*$ の矢印表示。各状態からゴールへ向かう最短経路に対応する行動が選ばれています。壁を避けて迂回するルートが自動的に発見されていることがわかります。
価値反復法はわずか数十回の反復で収束し、グリッドのすべての状態について最適な行動を決定できています。$\gamma = 0.99$ と高い割引率を設定しているため、エージェントは遠いゴールからの報酬もしっかり考慮して行動を選んでいます。
まとめ
本記事では、強化学習の基礎理論を体系的に解説しました。
- 強化学習は、エージェントが環境との試行錯誤を通じて累積報酬を最大化する枠組みである
- マルコフ決定過程(MDP) は $(\mathcal{S}, \mathcal{A}, P, R, \gamma)$ の5つ組で定義され、マルコフ性を前提とする
- 状態価値関数 $V^{\pi}(s)$ と行動価値関数 $Q^{\pi}(s, a)$ は、方策 $\pi$ のもとでの収益の期待値を表す
- ベルマン期待方程式は、$V^{\pi}$ と $Q^{\pi}$ の再帰的な関係を与える
- ベルマン最適方程式は、最適価値関数 $V^*$, $Q^*$ を特徴づける非線形方程式である
- 動的計画法(方策反復法・価値反復法)により、MDPが既知の場合に最適方策を計算できる
ここで扱った動的計画法は、MDPの遷移確率や報酬関数がすべて既知であることを前提としています。しかし現実の多くの問題では、環境のモデルが未知です。次のステップとして、モデルフリーな手法であるQ学習や方策勾配法について学ぶことで、より実践的な強化学習アルゴリズムを理解できるようになります。