数式とPython実装から理解するActorCritic法
強化学習はエージェントが環境と相互作用しながら最適な行動を学習する分野であり、その中でもActorCritic法は政策(Actor)と価値関数(Critic)を同時に学習する効率的な手法として注目されています。特に、状態価値関数を用いて行動方針を更新することで、より安定した学習が可能になる点が特徴です。
この記事では、ActorCritic法の基本的な数式の意味を丁寧に解説し、それをPythonコードで実装する方法をステップバイステップで紹介します。初心者の方でも理解しやすいように、理論と実装を結びつけることを重視しています。
この記事で学べることは以下の通りです。
- ActorCritic法の基本的な数式とその直感的な解釈
- 状態価値関数と政策勾配の関係性
- PythonによるActorCritic法の簡単な実装例
- 実装の各ステップが数式とどう対応しているかの理解
例えば、ActorCritic法の更新は以下のような政策勾配の形で表されます。
\[
\nabla_{\theta} J(\theta) = \mathbb{E}_{s,a} \left[ \nabla_{\theta} \log \pi_{\theta}(a|s) \cdot A(s,a) \right]
\]
ここで、\(A(s,a)\)はアドバンテージ関数であり、行動の良し悪しを示す指標として利用されます。この数式の理解が学習の鍵となります。
まとめと今後の学習に向けて
本記事ではActorCritic法の数式的背景とPython実装を通じて、強化学習におけるこの手法の基本を理解していただきました。特に、政策勾配の考え方と状態価値関数を用いたアドバンテージ推定に焦点を当て、理論と実装の橋渡しを行いました。
ActorCritic法は単独で強力な手法ですが、様々な強化学習アルゴリズムの基礎としても重要です。今後は、より高度なアルゴリズムや深層強化学習などへ応用していくための足掛かりとして役立ててください。
次に読むと良い関連記事候補の観点としては、「深層強化学習におけるActorCriticの拡張手法とその実装」が挙げられます。より複雑な環境での応用やニューラルネットワークを使った表現力の向上について学べるため、理解が深まるでしょう。
次に取るべきアクション
- 本記事のPythonコードを実際に手元で動かして動作を確認する
- 関連する強化学習の用語(例:アドバンテージ関数、価値関数)を復習する
- OpenAI Gymなどの環境を使い、ActorCritic法を実際の問題に適用してみる
- 深層強化学習の基礎記事を読み、ニューラルネットワークを活用したActorCritic法に挑戦する
ActorCritic法とは何か
ActorCritic法は、強化学習の中でも特に効率的に学習を進めるためのアルゴリズムの一つです。従来の手法では「方策(Policy)」を直接学習するか、「状態価値関数(Value Function)」を学習するかのどちらかに偏ることが多いですが、ActorCritic法はこれらを組み合わせて同時に学習します。
具体的には、Actor(行動者)は現在の状態に基づいてどの行動を取るかを決定し、Critic(批評家)はその行動の良し悪しを評価します。Criticの評価結果を受けて、Actorは方策を更新することで、より良い行動選択ができるように改善されていきます。
数学的には、Actorの方策はパラメータ \(\theta\) で表され、Criticの価値関数はパラメータ \(\omega\) で表されることが多いです。方策勾配法の基本として、方策の更新は以下の式で行われます。
方策のパラメータ更新式:
\[
\theta \leftarrow \theta + \alpha \delta \nabla_{\theta} \log \pi_{\theta}(a|s)
\]
ここで、
- \(\alpha\) は学習率
- \(\delta\) はTD誤差(Temporal Difference error)
- \(\pi_{\theta}(a|s)\) は状態 \(s\) で行動 \(a\) を取る方策の確率
TD誤差はCriticが計算し、以下のように定義されます。
\[
\delta = r + \gamma V_{\omega}(s’) – V_{\omega}(s)
\]
ここで、
- \(r\) は報酬
- \(\gamma\) は割引率
- \(V_{\omega}(s)\) は状態価値関数
- \(s’\) は次の状態
このTD誤差を使って、Criticの価値関数パラメータも更新されます。
以下に簡単なPythonコード例を示します。ここでは、状態価値関数 \(V\) と方策 \(\pi\) の更新をシンプルに表現しています。
import numpy as np
def update_actor_critic(theta, omega, s, a, r, s_next, gamma, alpha_actor, alpha_critic):
# 価値関数の推定
V_s = omega[s]
V_s_next = omega[s_next]
# TD誤差の計算
delta = r + gamma * V_s_next - V_s
# Criticの更新
omega[s] += alpha_critic * delta
# Actorの更新(方策勾配)
grad_log_pi = compute_policy_gradient(theta, s, a) # 仮想関数
theta += alpha_actor * delta * grad_log_pi
return theta, omega
def compute_policy_gradient(theta, s, a):
# ここでは単純な例として1を返す(実際は方策ネットワークの勾配を計算)
return 1
このように、ActorCritic法はActorとCriticの二つの役割を持つモデルを連携させて学習を進めるため、より安定かつ効率的に強化学習問題を解決できます。初心者の方は、まずはこの基本的な仕組みと数式の意味を理解することから始めると良いでしょう。
強化学習におけるActorCritic法の位置づけ
強化学習は、エージェントが環境と相互作用しながら最適な行動を学習する枠組みです。その中でも「ActorCritic法」は、ポリシー(行動方針)を直接最適化する「ポリシーベース」手法と、価値関数を推定する「バリューベース」手法の良いところを融合した手法として位置づけられています。
具体的には、ActorCritic法は2つの主要コンポーネントを持ちます:
- Actor(政策ネットワーク): 行動を選択するためのポリシーをパラメータ化し、環境においてどの行動を取るかを決定します。
- Critic(価値ネットワーク): 現在の状態の価値(将来得られる報酬の期待値)を評価し、Actorの学習を助けます。
この2つの役割を分けることで、Actorは直接的に行動方針を改善しつつ、Criticは価値推定の安定性を高めることで学習効率を向上させます。数学的には、状態 \( s \) における行動 \( a \) のポリシーをパラメータ \(\theta\) で表現し、価値関数をパラメータ \( w \) で表すとします。
まず、Criticは状態価値関数を以下のように定義し、TD誤差 \(\delta_t\) を計算します。
\[
V_w(s_t) \approx \mathbb{E}[R_t | s_t], \quad \delta_t = r_{t} + \gamma V_w(s_{t+1}) – V_w(s_t)
\]
ここで、\(r_t\) は時刻 \(t\) の報酬、\(\gamma\) は割引率です。TD誤差はCriticの評価誤差としてActorの学習信号になります。
次に、Actorはポリシー勾配を用いてパラメータを更新します。更新式は以下の通りです。
\[
\theta \leftarrow \theta + \alpha \delta_t \nabla_{\theta} \log \pi_{\theta}(a_t|s_t)
\]
ここで、\(\alpha\) は学習率、\(\pi_{\theta}(a_t|s_t)\) はポリシーの確率密度関数です。CriticのTD誤差を用いることで、Actorは行動の良し悪しをフィードバックとして受け取り、方針を改善します。
簡単なPython実装例を示します。
# Actorのパラメータ更新(擬似コード)
def update_actor(actor, state, action, td_error, lr):
# ログ確率の計算(例として離散行動空間)
log_prob = actor.get_log_prob(state, action)
# 勾配上昇のために負の符号を使わない点に注意
loss = -log_prob * td_error
loss.backward()
for param in actor.parameters():
param.data += lr * param.grad
このように、ActorCritic法は強化学習の中でもバリュー関数とポリシーを同時に学習することで、安定かつ効率的な学習を可能にしています。初心者の方には最初は複雑に感じられるかもしれませんが、この仕組みを理解することが、より高度な強化学習アルゴリズムの基礎となります。
ActorCritic法の基本的な数式の解説
ActorCritic法は、強化学習の中でも特に「方策(Policy)」と「価値関数(Value Function)」を同時に学習する手法です。ここでは、基本的な数式を通じて仕組みを理解しましょう。
まず、ActorCritic法では「Actor」と「Critic」の2つの要素が存在します。
- Actor: 方策 \(\pi_\theta(a|s)\) をパラメータ \(\theta\) で表し、状態 \(s\) に対して行動 \(a\) を選択する確率を決定します。
- Critic: 価値関数 \(V_w(s)\) をパラメータ \(w\) で表し、状態 \(s\) の価値(将来得られる報酬の期待値)を推定します。
ActorCritic法の学習の中心は、「行動価値の差分(TD誤差)」を利用することです。TD誤差 \(\delta\) は次のように定義されます:
式:
\[
\delta = r + \gamma V_w(s’) – V_w(s)
\]
ここで、
- \(r\):現在の報酬
- \(\gamma\):割引率(将来の報酬の重要度を示す、0から1の値)
- \(s’\):次の状態
この差分 \(\delta\) は、Criticがどれだけ正しく価値関数を推定できているかを示し、Actorの方策の更新のための指標にもなります。
次に、Actorのパラメータ \(\theta\) は以下の勾配上昇法により更新されます:
式:
\[
\theta \leftarrow \theta + \alpha \delta \nabla_\theta \log \pi_\theta(a|s)
\]
ここで、
- \(\alpha\):Actorの学習率
- \(\nabla_\theta \log \pi_\theta(a|s)\):方策の対数確率の勾配
この式は、TD誤差 \(\delta\) が正のとき、その行動の確率を増やし、負のときは減らす方向にパラメータを調整することを意味します。
最後に、Criticのパラメータ \(w\) はTD誤差の二乗誤差を最小化するように更新されます:
式:
\[
w \leftarrow w + \beta \delta \nabla_w V_w(s)
\]
ここで、\(\beta\) はCriticの学習率です。
これらの数式を踏まえ、Pythonで簡単にTD誤差の計算とActorの更新部分を実装すると次のようになります。
# TD誤差の計算
def compute_td_error(r, gamma, V_w_s_prime, V_w_s):
return r + gamma * V_w_s_prime - V_w_s
# Actorのパラメータ更新(簡略化例)
def update_actor(theta, alpha, delta, grad_log_pi):
return theta + alpha * delta * grad_log_pi
このように、ActorCritic法は価値関数の推定と方策の更新を組み合わせ、効率よく強化学習を進める仕組みになっています。数式を理解することで、実装時の動作原理がより明確になるでしょう。
ActorネットワークとCriticネットワークの役割
ActorCritic法は強化学習の中でも特に注目される手法で、名前の通り「Actor」と「Critic」という2つのネットワークが協調して動作します。ここでは、それぞれの役割とその数式的な背景、さらにシンプルなPythonコード例を通して理解を深めましょう。
Actorネットワークの役割
Actorネットワークは、環境における「行動方針(Policy)」を決定します。具体的には、現在の状態 \(s\) を入力として、どの行動 \(a\) を選ぶべきかの確率分布を出力します。数式で表すと:
\[
\pi_\theta(a|s) = P(a|s; \theta)
\]
ここで \(\theta\) はActorネットワークのパラメータです。Actorはこの方針に基づいて行動を選び、環境と相互作用します。
Criticネットワークの役割
一方Criticネットワークは、Actorが選んだ行動がどれだけ良かったかを評価します。これは状態価値関数 \(V^\pi(s)\) や行動価値関数 \(Q^\pi(s,a)\) を近似する役割を持ちます。Criticの出力は次のように表せます。
\[
Q_w(s,a) \approx Q^\pi(s,a)
\]
ここで \(w\) はCriticネットワークのパラメータです。Criticはこの評価を使ってActorの方針を改善します。
ActorとCriticの連携イメージ
Actorは環境に対して行動を選び、Criticはその行動の価値を評価。例えば、Actorが行動 \(a_t\) を状態 \(s_t\) で選んだとき、CriticはTD誤差(Temporal Difference Error)を計算します:
\[
\delta_t = r_{t+1} + \gamma Q_w(s_{t+1}, a_{t+1}) – Q_w(s_t, a_t)
\]
この誤差 \(\delta_t\) を用いて、Criticは自分のパラメータを更新し、Actorはこの誤差を使って方針 \(\pi_\theta\) を改善します。
Pythonによる簡単な例
以下は、Actorの方針を単純な確率分布で表現し、Criticの価値関数を更新する一連の流れを模擬したコード例です。
import numpy as np
# 簡単な方針(Actor):状態に対し行動の確率分布を返す
def actor_policy(state):
if state > 0.5:
return np.array([0.1, 0.9]) # 行動0の確率0.1, 行動1の確率0.9
else:
return np.array([0.8, 0.2])
# Criticの価値関数の初期化
Q = {0: [0.5, 0.5], 1: [0.5, 0.5]} # 状態0,1 それぞれの行動価値
# TD誤差の計算とCriticの更新
def critic_update(state, action, reward, next_state, next_action, gamma=0.9, alpha=0.1):
td_error = reward + gamma * Q[next_state][next_action] - Q[state][action]
Q[state][action] += alpha * td_error
return td_error
# 例:状態0で行動1を選択し報酬1を得て、次状態1で行動0を選択
state = 0
action = 1
reward = 1
next_state = 1
next_action = 0
td_error = critic_update(state, action, reward, next_state, next_action)
print(f'TD誤差: {td_error:.3f}')
print(f'更新後のQ値: {Q[state]}')
このように、Actorが行動方針を決め、Criticがその価値を評価し、双方が更新されることで強化学習が進展します。ActorCritic法の本質はこの「方針決定」と「価値評価」の役割分担にあります。
方策勾配法と価値関数の関係
強化学習におけるActorCritic法は、方策勾配法と価値関数の両方を活用することで、効率的に最適な行動方策を学習します。ここでは、方策勾配法の基本的な考え方と、価値関数がどのように関係しているかを初心者向けに解説します。
まず、方策勾配法では、方策パラメータ \(\theta\) を直接更新するために、方策の性能指標 \(J(\theta)\) の勾配を計算します。これが「方策勾配」と呼ばれるもので、次のように表されます。
方策勾配の代表的な式は以下の通りです。
\[
\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}}\left[ \nabla_{\theta} \log \pi_{\theta}(a|s) \, Q^{\pi}(s,a) \right]
\]
この式の意味を分解すると:
- \(\pi_{\theta}(a|s)\):行動 \(a\) を状態 \(s\) で選択する確率(方策)
- \(\nabla_{\theta} \log \pi_{\theta}(a|s)\):方策のパラメータに対する勾配
- \(Q^{\pi}(s,a)\):状態 \(s\)、行動 \(a\) における価値関数(期待報酬)
この式は「どのくらい方策を変化させれば報酬が増えるか」を示しており、価値関数 \(Q^{\pi}(s,a)\) が指標として重要な役割を果たしています。つまり、価値関数は方策の良し悪しを評価し、勾配計算の重み付けに使われるのです。
ActorCritic法では、この価値関数を「Critic」が推定し、方策の更新を担う「Actor」へフィードバックを送ります。価値関数を正確に推定することで、方策勾配の分散が減少し、学習が安定かつ効率的になります。
ここで、Pythonでの簡単な方策勾配の更新例を示します。ここでは、状態と行動から得られる報酬を利用して、方策パラメータを更新するイメージです。
import numpy as np
# 例:方策の勾配更新(単純化した例)
def policy_gradient_update(theta, states, actions, rewards, learning_rate=0.01):
for s, a, r in zip(states, actions, rewards):
# ログ方策の勾配(ここでは簡略化)
grad_log_pi = np.array(s) * (a - 0.5) # 仮の勾配計算
# 報酬を価値関数の代わりに使用
theta += learning_rate * grad_log_pi * r
return theta
# パラメータ初期値
theta = np.zeros(2)
# ダミーデータ
states = [np.array([1, 0]), np.array([0, 1])]
actions = [1, 0]
rewards = [1, -1]
theta = policy_gradient_update(theta, states, actions, rewards)
print("更新後のパラメータ:", theta)
このコードは非常に簡素化していますが、方策の勾配を計算し、報酬で重み付けしてパラメータを更新していることが分かります。実際のActorCritic法では、Criticが価値関数を推定し、その予測値を用いて勾配を調整することで、より効率よく学習が進みます。
まとめると、方策勾配法は「どの方向に方策を変えれば報酬が増えるか」を示し、価値関数はその指針となる期待報酬を提供する役割を持ちます。ActorCritic法はこの両者を組み合わせることで、強化学習の性能向上を実現しているのです。
“`html
ActorCritic法のアルゴリズムの流れ
ActorCritic法は強化学習の代表的な手法で、政策(Policy)を学習する「Actor」と価値関数(Value Function)を学習する「Critic」の2つの役割を持つネットワークを同時に更新します。このアルゴリズムは、行動選択の方針を改善しつつ、状態の価値を評価することで効率的に最適解に近づきます。ここでは、ActorCritic法の基本的な流れを数式とPythonコードを使いながら説明します。
まず、Criticは状態価値関数 \( V(s; \theta_v) \) を更新し、次の時間ステップで得られた報酬と状態価値の差分(TD誤差)を計算します。TD誤差は以下のように表されます。
\[
\delta_t = r_{t} + \gamma V(s_{t+1}; \theta_v) – V(s_t; \theta_v)
\]
ここで、\( r_t \) は時刻 \( t \) に得られた報酬、\( \gamma \) は割引率です。TD誤差はCriticの評価の誤差を示し、これを最小化するように価値関数のパラメータを更新します。
次に、ActorはこのTD誤差を利用して政策を改善します。具体的には、方策のパラメータ \( \theta_p \) を次のように更新します。
\[
\theta_p \leftarrow \theta_p + \alpha \delta_t \nabla_{\theta_p} \log \pi(a_t|s_t; \theta_p)
\]
ここで、\( \alpha \) は学習率、\( \pi(a_t|s_t; \theta_p) \) は状態 \( s_t \) で行動 \( a_t \) を取る確率(方策)です。TD誤差が正であれば、その行動が良かったことを意味し、方策の確率を増やす方向に更新されます。
これらの更新を繰り返すことで、ActorCritic法は状態価値の評価と行動方針の改善を同時に行い、効率よく最適な行動戦略を学習していきます。
以下に、簡単なPythonコードでの更新例を示します。
import numpy as np
# 学習率
alpha_v = 0.1
alpha_p = 0.01
gamma = 0.99
# 仮のパラメータ(例)
theta_v = 0.5 # Criticの価値関数パラメータ
theta_p = 0.3 # Actorの方策パラメータ
# 状態価値関数 (線形モデルの例)
def value_function(s, theta_v):
return theta_v * s
# 方策の確率(シグモイド関数を利用)
def policy_prob(s, theta_p):
return 1 / (1 + np.exp(-theta_p * s))
# 例の状態と行動、報酬
s_t = 1.0
a_t = 1 # 行動は0か1の二択と仮定
r_t = 1.0
s_tp1 = 1.2
# CriticのTD誤差計算
delta_t = r_t + gamma * value_function(s_tp1, theta_v) - value_function(s_t, theta_v)
# Criticのパラメータ更新
theta_v += alpha_v * delta_t * s_t
# Actorのパラメータ更新
grad_log_pi = a_t - policy_prob(s_t, theta_p) # ログ方策の勾配(ベルヌーイ分布の例)
theta_p += alpha_p * delta_t * grad_log_pi * s_t
このように、ActorCritic法はCriticの評価誤差を用いてActorの方策を改善し、同時にCritic自身も評価を更新することで、安定的かつ効率的な強化学習を実現します。初心者の方は、まずTD誤差の意味を理解し、上記の更新式を追いながら実装してみることをおすすめします。
“`
Pythonでの環境構築方法
ActorCritic法をPythonで実装するには、まず適切な環境を準備する必要があります。初心者の方でもスムーズに始められるよう、基本的な手順と必要なライブラリについて解説します。
ActorCritic法は強化学習の一種で、環境との相互作用を繰り返しながら方策関数(Actor)と価値関数(Critic)を同時に学習します。Pythonで実装するためには、標準的な強化学習ライブラリのほか、数式の計算やニューラルネットワークの構築をサポートするツールが必要です。
1. Pythonと仮想環境の準備
まずはPythonの最新版(推奨は3.8以上)をインストールしましょう。次に、プロジェクトごとに依存関係を管理しやすいように仮想環境を作成します。コマンド例は以下の通りです。
python -m venv actor_critic_env
source actor_critic_env/bin/activate # Windowsの場合は actor_critic_env\Scripts\activate
2. 必須ライブラリのインストール
強化学習の実装には以下のライブラリが基本です。
numpy: 数値計算用gym: 強化学習環境torch(PyTorch): ニューラルネットワーク構築用
インストールはpipを使います。
pip install numpy gym torch
GymはOpenAIが提供する強化学習環境で、ActorCritic法の学習対象となる環境を簡単に用意できます。PyTorchはニューラルネットワークの最適化に用いられ、ActorとCriticのモデルを構築するために必要です。
3. ActorCriticの数式と対応コード例
ActorCritic法では、方策 \(\pi_\theta(a|s)\) のパラメータ \(\theta\) を更新するために、勾配を次のように計算します。
更新式の一部は以下のように表されます。
\[
\nabla_\theta J(\theta) = \mathbb{E}_{s,a}\left[\nabla_\theta \log \pi_\theta(a|s) \cdot A(s,a)\right]
\]
ここで、\(A(s,a)\) はアドバンテージ関数で、価値関数 \(V_\phi(s)\) との差分を示します。この計算をPyTorchで実装する場合の一例がこちらです。
import torch
# 方策の出力log確率とアドバンテージのテンソルを用意
log_prob = torch.tensor(-0.5, requires_grad=True) # 例としての値
advantage = torch.tensor(1.2)
# Actorの損失関数(負の勾配を取るためマイナスをつける)
actor_loss = -log_prob * advantage
actor_loss.backward() # 勾配計算
このように、環境構築が整えば数式の理論に基づいたコードを段階的に組み立てることができ、ActorCritic法の理解が深まります。
OpenAI Gymを使った強化学習環境の準備
強化学習のアルゴリズムを実装・検証する際、環境の準備は非常に重要です。OpenAI Gymは多様なシミュレーション環境を提供しており、ActorCritic法を学ぶ初心者にとっても扱いやすいプラットフォームです。ここでは、Gym環境の基本的なセットアップ方法と、ActorCritic法の基礎である状態価値関数の数式を通じて理解を深めます。
1. OpenAI Gymのインストールと環境の作成
まずはPython環境にOpenAI Gymをインストールします。ターミナルで以下のコマンドを実行してください。
pip install gym
インストール後、代表的な環境「CartPole-v1」を作成するコードは以下の通りです。
import gym
env = gym.make("CartPole-v1")
state = env.reset()
このenvオブジェクトが強化学習における環境を表し、stateは初期状態(観測)を取得しています。
2. 状態価値関数の数式と役割
ActorCritic法では、Critic(評価者)が状態価値関数 \( V(s) \) を推定します。状態価値関数は、状態 \( s \) における将来の累積報酬の期待値を示し、以下のように定義されます。
数式:
\[
V^{\pi}(s) = \mathbb{E}_{\pi} \left[ \sum_{t=0}^{\infty} \gamma^t r_{t+1} \mid s_0 = s \right]
\]
ここで、
- \( \pi \) は方策(policy)
- \( \gamma \) は割引率(0 < \( \gamma \) < 1)
- \( r_{t+1} \) は時刻 \( t+1 \) に得られる報酬
この式は、「現在の状態から始めて、方策に従い行動したときの将来報酬の合計の期待値」を意味します。Criticはこの期待値を推定し、Actorにフィードバックを与えることで方策の改善に貢献します。
3. 簡単な価値推定のPython実装例
以下は、Gymの環境からサンプルを取得し、単純に割引報酬を計算する例です。実際のActorCriticではニューラルネットワークで推定しますが、基礎を理解するためのコードです。
def compute_discounted_rewards(rewards, gamma=0.99):
discounted = 0
discounted_rewards = []
for r in reversed(rewards):
discounted = r + gamma * discounted
discounted_rewards.insert(0, discounted)
return discounted_rewards
# 例: 環境からの報酬リスト
sample_rewards = [1, 0, -1, 2, 3]
discounted = compute_discounted_rewards(sample_rewards)
print(discounted)
このコードは報酬列から割引報酬を計算し、状態価値関数の数式の期待値に近いイメージを掴むのに役立ちます。
以上のように、OpenAI Gymの環境準備と状態価値関数の理解はActorCritic法の理解に欠かせません。次章では実際のActorCriticネットワークの実装に進みます。
ActorネットワークのPython実装
ActorCritic法では、Actorネットワークが方策(policy)を表現し、環境に対してどの行動を取るべきかを決定します。ここでは、Actorネットワークの基本的な実装方法をPythonで具体的に示します。まずは数式から理解を深めましょう。
Actorネットワークの数式
Actorはパラメータ \(\theta\) を持つ方策関数 \(\pi_{\theta}(a|s)\) を学習します。目的は、期待される累積報酬を最大化することです。このとき、方策勾配は以下のように表されます:
\[
\nabla_{\theta} J(\theta) = \mathbb{E}_{s_t,a_t \sim \pi_{\theta}} \left[ \nabla_{\theta} \log \pi_{\theta}(a_t|s_t) \cdot A(s_t,a_t) \right]
\]
ここで、\(A(s_t,a_t)\) はアドバンテージ関数で、「その行動がどれだけ良かったか」を示す指標です。Actorはこの勾配に従ってパラメータを更新し、より良い方策を獲得します。
Pythonでの実装例
以下はPyTorchを用いたシンプルなActorネットワークの例です。状態を入力し、行動の確率分布を出力するモデルを作成します。
import torch
import torch.nn as nn
import torch.nn.functional as F
class ActorNetwork(nn.Module):
def __init__(self, state_dim, action_dim, hidden_dim=128):
super(ActorNetwork, self).__init__()
self.fc1 = nn.Linear(state_dim, hidden_dim)
self.fc2 = nn.Linear(hidden_dim, action_dim)
def forward(self, state):
x = F.relu(self.fc1(state))
action_probs = F.softmax(self.fc2(x), dim=-1)
return action_probs
このネットワークは、入力された状態ベクトルに対して中間層で非線形変換を行い、最後にsoftmax関数で行動確率を計算します。これにより、確率的な方策を表現し、探索性を保ちます。
まとめ
Actorネットワークは方策勾配法に基づく強化学習で重要な役割を果たします。数式から勾配の意味を理解し、Pythonでの実装方法を知ることで、ActorCritic法の基礎をしっかり押さえられます。次はCriticネットワークの実装に進むことで、全体のアルゴリズム理解が深まります。
CriticネットワークのPython実装
ActorCritic法において、Criticネットワークは状態価値関数 \( V(s) \) を近似します。これにより、現在の状態がどれほど良いかを評価し、Actorの方策更新に役立てます。Criticの学習では、TD誤差(Temporal Difference Error)を使い、実際の報酬と予測価値の差を最小化することがポイントです。
Criticの更新に用いる代表的な式は次の通りです。
\[
\delta = r + \gamma V(s’) – V(s)
\]
ここで、
- \( r \) は現在の報酬
- \( \gamma \) は割引率(将来の報酬の価値を調整)
- \( s \) は現在の状態、\( s’ \) は次の状態
- \( V(s) \) と \( V(s’) \) はCriticネットワークが予測する状態価値
このTD誤差 \(\delta\) を最小化するように、Criticネットワークのパラメータを更新します。損失関数は一般的に二乗誤差で表され、
\[
L = \delta^2 = \left( r + \gamma V(s’) – V(s) \right)^2
\]
となります。
以下は、シンプルなCriticネットワークをPyTorchで実装した例です。入力は状態ベクトル、出力はその状態の価値をスカラーで返します。
import torch
import torch.nn as nn
import torch.optim as optim
class CriticNetwork(nn.Module):
def __init__(self, state_dim, hidden_dim=128):
super(CriticNetwork, self).__init__()
self.fc1 = nn.Linear(state_dim, hidden_dim)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_dim, 1)
def forward(self, state):
x = self.fc1(state)
x = self.relu(x)
value = self.fc2(x)
return value
# ハイパーパラメータ例
state_dim = 4 # 状態の次元数(環境に依存)
critic = CriticNetwork(state_dim)
optimizer = optim.Adam(critic.parameters(), lr=1e-3)
mse_loss = nn.MSELoss()
def update_critic(state, reward, next_state, gamma=0.99):
critic.train()
value = critic(state)
next_value = critic(next_state).detach() # next_stateの価値は勾配計算しない
target = reward + gamma * next_value
loss = mse_loss(value, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss.item()
この関数 update_critic は、現在の状態と次の状態の価値を計算し、TD誤差を基にCriticのパラメータを更新します。実際の強化学習実装では、環境から得られた状態や報酬を用いてこの更新を繰り返すことで、Criticがより正確に価値関数を推定できるようになります。
このように、CriticネットワークはActorCritic法の安定した学習を支える重要な役割を担っています。数式の理解を踏まえつつコードで実装を体験することで、ActorCritic全体の流れを掴みやすくなるでしょう。
損失関数の設計と実装
ActorCritic法では、ポリシーネットワーク(Actor)と価値関数ネットワーク(Critic)の両方を同時に学習させます。そのため、損失関数も2つの役割に対応した設計が必要です。ここではそれぞれの損失関数の意味とPythonでの実装例を紹介します。
1. Criticの損失関数
Criticは状態価値関数 \( V(s) \) を予測します。実際の報酬と予測値の差を小さくするために、平均二乗誤差(MSE)を使うのが一般的です。具体的には、TD誤差(Temporal Difference Error)を用いて次の式で表されます。
\[
L_{\text{critic}} = \mathbb{E}_{s_t, r_t, s_{t+1}}\left[\left(r_t + \gamma V(s_{t+1}) – V(s_t)\right)^2\right]
\]
ここで、
・\(r_t\) は時刻 \(t\) の報酬
・\(\gamma\) は割引率(0〜1)
・\(V(s_t)\) は状態価値の予測値
この損失を小さくすることで、Criticはより正確に将来の報酬を予測できるようになります。
2. Actorの損失関数
Actorの目的は、より良い行動を選ぶことです。ポリシー勾配法に基づき、行動の価値を高めるために次のような損失関数を用います。
\[
L_{\text{actor}} = – \mathbb{E}_{s_t, a_t} \left[ \log \pi(a_t|s_t) \cdot A(s_t, a_t) \right]
\]
ここで、
・\(\pi(a_t|s_t)\) は状態 \(s_t\) で行動 \(a_t\) を取る確率
・\(A(s_t, a_t) = r_t + \gamma V(s_{t+1}) – V(s_t)\) はAdvantage(有利度)と呼ばれ、行動の価値が平均よりどれだけ良いか示します。
この損失を最小化すると、良い行動の確率が上がり、悪い行動は減るようにポリシーが更新されます。
3. Pythonによる実装例
以下は、PyTorchを用いた簡単な損失関数計算の例です。CriticのMSE損失とActorのポリシー損失を計算しています。
import torch
import torch.nn.functional as F
# 例の変数(ミニバッチでの状態価値と行動のログ確率、報酬)
value = torch.tensor([1.0, 2.0, 3.0]) # V(s_t)
next_value = torch.tensor([1.5, 2.5, 3.5]) # V(s_{t+1})
reward = torch.tensor([0.5, 0.0, 1.0]) # r_t
log_prob = torch.tensor([-0.2, -0.1, -0.3]) # log π(a_t|s_t)
gamma = 0.99
# TD誤差 = r_t + γV(s_{t+1}) - V(s_t)
td_error = reward + gamma * next_value - value
# Criticの損失(MSE)
critic_loss = td_error.pow(2).mean()
# AdvantageとしてTD誤差を利用
advantage = td_error.detach() # 勾配はCriticに流さない
# Actorの損失(ポリシー勾配)
actor_loss = -(log_prob * advantage).mean()
print(f"Critic Loss: {critic_loss.item():.4f}")
print(f"Actor Loss: {actor_loss.item():.4f}")
この例では、CriticはTD誤差の二乗平均を最小化し、ActorはAdvantageを重みとした行動のログ確率の平均を最大化(損失は負の値で表現)しています。これにより、両者が協調して学習を進めることができます。
まとめると、ActorCritic法の損失関数は「Criticの価値予測誤差」と「Actorのポリシー勾配」を組み合わせて設計されており、これを適切に実装することが強化学習の性能向上につながります。
勾配の計算とパラメータ更新の実装
ActorCritic法では、エージェントの行動方策(Actor)と価値関数(Critic)を同時に学習します。その鍵となるのが「勾配の計算」と「パラメータの更新」です。ここでは、数式とPythonコードを使って、初心者にも分かりやすく解説します。
勾配計算の基本式
まず、Actorのパラメータ \(\theta\) を更新するための勾配はポリシー勾配定理により次のように表されます。
\[
\nabla_\theta J(\theta) = \mathbb{E}_{s,a} \left[ \nabla_\theta \log \pi_\theta(a|s) \cdot A(s,a) \right]
\]
ここで、\(\pi_\theta(a|s)\) は状態 \(s\) における行動 \(a\) の確率、\(A(s,a)\) はAdvantage関数で、実際の報酬と価値関数の差を表します。Criticの役割はこの価値関数を近似し、Advantageを計算することです。
具体的なパラメータ更新の流れ
1. 状態 \(s_t\) から行動 \(a_t\) をサンプリング
2. 報酬 \(r_t\) と次状態 \(s_{t+1}\) を観測
3. Criticが価値関数 \(V(s_t)\) と \(V(s_{t+1})\) を推定
4. Advantageを計算:\(
\[
A_t = r_t + \gamma V(s_{t+1}) – V(s_t)
\]
5. Actorの勾配を計算し、パラメータを更新
6. Criticの損失関数(例えば二乗誤差)を最小化してパラメータを更新
Pythonでの実装例
以下は、PyTorchを用いた簡単な勾配計算とパラメータ更新の例です。
import torch
import torch.nn.functional as F
# 例: Actorの出力は行動確率の対数(logits)、Criticは状態価値を出力
def update(actor, critic, optimizer_actor, optimizer_critic, state, action, reward, next_state, gamma=0.99):
# 状態価値の推定
value = critic(state)
next_value = critic(next_state).detach()
# Advantageの計算
advantage = reward + gamma * next_value - value
# Actorの損失:負の期待値(方策勾配)
log_prob = F.log_softmax(actor(state), dim=-1)
selected_log_prob = log_prob.gather(1, action.unsqueeze(1)).squeeze(1)
actor_loss = -(selected_log_prob * advantage.detach()).mean()
# Criticの損失:二乗誤差
critic_loss = advantage.pow(2).mean()
# パラメータ更新
optimizer_actor.zero_grad()
actor_loss.backward()
optimizer_actor.step()
optimizer_critic.zero_grad()
critic_loss.backward()
optimizer_critic.step()
このコードでは、Advantageを計算し、それを用いてActorのパラメータを勾配降下法で更新しています。同時にCriticも誤差を最小化するよう更新されます。これにより、Actorはよりよい行動方策を学び、Criticは価値関数の精度を高めていきます。
学習ループの作成と動作確認
ActorCritic法では、エージェントが環境からの報酬を最大化するために、ポリシー(Actor)と価値関数(Critic)を同時に学習します。学習ループはこの2つのネットワークを繰り返し更新する中心的な処理です。ここでは、基本的な学習ループの構造と、その動作確認方法を解説します。
まず、学習ループで行う重要な更新は、状態価値の誤差(TD誤差)を用いたCriticの更新と、ポリシーの勾配上昇です。TD誤差は次の式で表されます。
\[
\delta = r + \gamma V(s’) – V(s)
\]
ここで、\(r\)は報酬、\(\gamma\)は割引率、\(V(s)\)は現在の状態価値、\(V(s’)\)は次の状態価値です。TD誤差\(\delta\)は、Criticの価値関数を更新するための誤差信号となります。
この\(\delta\)を使い、Actorのポリシーは以下の勾配方向に更新されます。
\[
\nabla_\theta J(\theta) \propto \delta \nabla_\theta \log \pi_\theta (a|s)
\]
つまり、行動確率の対数の勾配にTD誤差をかけてポリシーを改善します。
これを踏まえて、Pythonでの簡単な学習ループの例を示します。
for episode in range(num_episodes):
state = env.reset()
done = False
while not done:
action = actor.select_action(state)
next_state, reward, done, _ = env.step(action)
value = critic.predict(state)
next_value = critic.predict(next_state)
td_error = reward + gamma * next_value * (1 - done) - value
# Criticの更新
critic.update(state, td_error)
# Actorの更新
actor.update(state, action, td_error)
state = next_state
このループでは、まず環境から現在の状態を取得し、Actorが行動を選択します。次に環境を一歩進めて報酬と次の状態を得て、Criticで状態価値を推定。TD誤差を計算し、それを使ってCriticとActorのパラメータをそれぞれ更新しています。
初心者の方は、まずこの基本形を動かしてみて、報酬が徐々に増加するかを確認しましょう。学習がうまく進むと、エージェントは環境内でより良い行動を選べるようになるはずです。
学習結果の評価方法
ActorCritic法を使った強化学習では、学習がうまく進んでいるかどうかを評価することが重要です。評価の基本は、エージェントがどれだけ効率的に報酬を獲得できているかを確認することにあります。初心者の方にも分かりやすいように、代表的な評価指標とその実装例を紹介します。
1. エピソード報酬の平均
まず最もシンプルな評価指標は、エピソードごとの累積報酬の平均です。エピソードとは、環境の初期状態から終了状態までの一連の動作のことを指します。ActorCritic法では、各エピソードで得られた報酬を合計し、その平均値を計算することで学習の進捗を把握します。
具体的には、エピソード \(i\) の累積報酬を \(R_i\) としたとき、平均報酬 \( \bar{R} \) は以下の式で表されます。
\[
\bar{R} = \frac{1}{N} \sum_{i=1}^{N} R_i
\]
この値が学習を進めるにつれて増加すれば、エージェントが環境に適応し、より良い行動を選択できていることが分かります。
# エピソード報酬の平均を計算する例
rewards = [10, 15, 7, 20, 18] # 各エピソードの累積報酬
average_reward = sum(rewards) / len(rewards)
print("平均報酬:", average_reward)
2. 損失関数の推移の確認
ActorCritic法では、ポリシーネットワークと価値関数ネットワークの損失関数も重要な評価指標です。損失関数は学習の「ズレ」を示し、以下のように定義されます。
価値関数の損失(Criticの更新):
\[
L_{v} = \left( R_t + \gamma V(s_{t+1}) – V(s_t) \right)^2
\]
ポリシーの損失(Actorの更新):
\[
L_{\pi} = -\log \pi(a_t|s_t) A_t
\]
ここで、\(\gamma\) は割引率、\(V(s)\) は状態価値関数、\(\pi(a|s)\) は行動選択確率、\(A_t\) はアドバンテージ関数(行動価値の改善度合い)です。これらの損失の値が学習を重ねるごとに減少しているかを確認することで、モデルの安定性や収束を評価できます。
# 損失の簡単な計算例(数値は仮)
gamma = 0.99
R_t = 1.0
V_next = 0.8
V_current = 0.6
log_prob = -0.2 # -log(π(a|s))
advantage = 0.5
# Criticの損失
loss_v = (R_t + gamma * V_next - V_current) ** 2
# Actorの損失
loss_pi = -log_prob * advantage
print("Criticの損失:", loss_v)
print("Actorの損失:", loss_pi)
3. グラフによる可視化
上記の指標は数値として確認するだけでなく、エピソード報酬や損失の推移をグラフ化することで視覚的に学習状況を把握できます。例えば、エピソード報酬の平均を横軸にエピソード数、縦軸に報酬値を取った折れ線グラフを作成すると、学習曲線の滑らかさや安定性がわかりやすくなります。
まとめると、エピソード報酬の平均値の向上、損失関数の減少傾向、そしてこれらの可視化がActorCritic法の学習結果を評価する基本的な方法です。これらを継続的にモニターしながら学習を進めることで、効果的な強化学習モデルを構築できます。
ActorCritic法のメリットとデメリット
ActorCritic法は強化学習の中でも人気の高いアルゴリズムの一つで、政策(Actor)と価値関数(Critic)を同時に学習する特徴があります。ここでは、そのメリットとデメリットを初心者にもわかりやすく解説します。
メリット
- 安定した学習が可能
Actor(政策)とCritic(価値関数)を分けて学習することで、単一の価値関数のみを用いる手法よりも学習の安定性が向上します。特に、Actorが環境への行動選択を担い、Criticがその評価を行うため、効率的に政策の改善が進みます。 - 連続空間や大規模な状態空間に対応しやすい
行動や状態が連続的だったり、非常に多くの状態が存在する環境でも、関数近似器(例:ニューラルネットワーク)を用いて柔軟に対応できます。 - オンポリシーとオフポリシーの両方に応用可能
基本的なActorCritic法はオンポリシーですが、近年はオフポリシー型の拡張もあり、より幅広い問題に適用可能です。
デメリット
- 実装が複雑
ActorとCriticの2つのネットワークを設計・調整する必要があり、パラメータのチューニングも難しいため初心者にはややハードルが高いです。 - 収束の保証が難しい場合がある
特に非線形な関数近似器を用いると、学習が不安定になったり局所解に陥りやすい問題があります。 - 計算コストが高い
ActorとCriticの両方を毎ステップで更新するため、単純な手法と比べて計算負荷が大きくなりがちです。
数式による理解
ActorCritic法では、政策をパラメータ \(\theta\)、価値関数をパラメータ \(\phi\) としてモデル化します。Criticは状態価値関数 \(V^\pi(s; \phi)\) を推定し、Actorは政策 \(\pi(a|s; \theta)\) を更新します。
Criticの更新はTD誤差を用いて行い、TD誤差 \(\delta_t\) は以下のように定義されます:
\[
\delta_t = r_t + \gamma V^\pi(s_{t+1}; \phi) – V^\pi(s_t; \phi)
\]
ここで、\(\gamma\) は割引率、\(r_t\) は時刻 \(t\) の報酬を表します。Criticのパラメータ更新は勾配降下法で行います:
\[
\phi \leftarrow \phi + \alpha_c \delta_t \nabla_\phi V^\pi(s_t; \phi)
\]
一方、Actorの更新は政策勾配に基づき、以下のように行います:
\[
\theta \leftarrow \theta + \alpha_a \delta_t \nabla_\theta \log \pi(a_t|s_t; \theta)
\]
ここで、\(\alpha_c\) と \(\alpha_a\) はそれぞれCriticとActorの学習率です。Actorの更新は、TD誤差 \(\delta_t\) を使って、より良い行動を選択するよう政策を改善します。
Pythonでの簡単な更新例
# TD誤差の計算
delta = reward + gamma * critic(next_state) - critic(state)
# Criticのパラメータ更新(勾配降下)
critic_loss = delta**2
critic_optimizer.zero_grad()
critic_loss.backward()
critic_optimizer.step()
# Actorのパラメータ更新(政策勾配)
log_prob = actor.get_log_prob(state, action)
actor_loss = -log_prob * delta.detach()
actor_optimizer.zero_grad()
actor_loss.backward()
actor_optimizer.step()
このように、ActorCritic法は政策と価値関数を同時に学習し、それぞれの役割を明確に分けているため、強化学習の多様な課題に適応しやすい反面、実装や調整の難しさがあることを理解しておきましょう。
他の強化学習手法との比較
ActorCritic法は強化学習の中でも特に「方策勾配法」と「値ベース法」の良いところを組み合わせた手法です。ここでは、代表的な強化学習手法との違いを初心者向けにわかりやすく整理します。
- Q学習(値ベース法)
Q学習は環境の状態ごとに「最適な行動の価値(Q値)」を更新しながら学習します。方策はQ値から導出されますが、直接的に方策をパラメータ化しないため、連続値の行動空間や大規模な状態空間では扱いにくい特徴があります。 - 方策勾配法(Policy Gradient)
方策勾配法は方策を直接パラメータ化し、確率的に行動を選びながら学習します。これにより連続空間や複雑な方策の表現が可能ですが、報酬の分散が大きく学習が不安定になりやすいです。 - ActorCritic法
ActorCritic法は「Actor(行動方策)」と「Critic(価値関数)」の2つのネットワークを使い、Actorが方策を更新し、Criticが価値関数を評価します。Criticの評価を活用するため、方策勾配法よりも学習が安定しやすい点が特徴です。
ActorCritic法の中心となる数式は、方策のパラメータ \(\theta\) を更新するための勾配です。ここで、状態 \(s\) と行動 \(a\) のペアに対して、価値関数の誤差(TD誤差)を用います。
まず、TD誤差 \(\delta\) は次のように定義されます。
\[
\delta = r + \gamma V(s’) – V(s)
\]
ここで、\(r\) は報酬、\(\gamma\) は割引率、\(V(s)\) はCriticが推定する状態価値です。これを用いて、Actorのパラメータ更新は以下の勾配上昇法に従います。
\[
\theta \leftarrow \theta + \alpha \delta \nabla_\theta \log \pi_\theta(a|s)
\]
この式の意味は、「Criticの評価した価値の改善方向に沿って、Actorの方策を改善する」ということです。
これをPythonのコードで表すと、簡単な更新ステップは以下のようになります。
# delta: TD誤差、log_prob: 行動の対数確率、actor_optimizer: Actorの最適化器
loss = -log_prob * delta
actor_optimizer.zero_grad()
loss.backward()
actor_optimizer.step()
このように、ActorCritic法はCriticの価値評価を利用することで、方策勾配法の不安定さを抑えつつ、Q学習のような値ベース法の制約も克服しています。初心者の方には、単独の方策勾配法やQ学習よりも学習が安定し、実践的な応用範囲が広い点が魅力と言えるでしょう。
実装時の注意点とよくある問題
ActorCritic法は強化学習の中でも効果的な手法ですが、実装時にはいくつかの注意点があります。特に初心者の方がつまずきやすいポイントを理解しておくことで、スムーズに開発を進めやすくなります。
まず、ActorCritic法では「方策(Actor)」と「価値関数(Critic)」の二つのネットワークが同時に学習されます。Criticが状態価値関数 \( V(s) \) を推定し、Actorが最適方策 \( \pi(a|s) \) を更新します。更新の核となるのが「TD誤差(Temporal Difference error)」で、これは以下の式で表されます。
式:
\[
\delta_t = r_t + \gamma V(s_{t+1}) – V(s_t)
\]
ここで、\( r_t \) は報酬、\( \gamma \) は割引率、\( V(s_t) \) は現在の状態の価値推定です。この誤差を利用してCriticは価値関数を更新し、Actorはこの誤差を利用して方策のパラメータを改善します。
このときよくある問題は、以下の通りです。
- 学習の発散や不安定化: TD誤差の計算やネットワークの更新が適切でないと、値関数や方策のパラメータが発散することがあります。特に学習率が大きすぎる場合に起こりやすいです。
- バッチサイズや経験の取り扱い: ミニバッチ学習を行う際、TD誤差の計算がサンプル間で独立していないことに注意が必要です。これを無視すると誤差の分散が大きくなり安定性が下がります。
- 割引率の設定: 割引率 \( \gamma \) は将来の報酬の重要度を調整しますが、1に近すぎると学習が遅くなり、低すぎると短期的な報酬に偏りすぎます。
以下はPythonでのTD誤差計算の例です。シンプルですが、誤差の基本を押さえることが重要です。
def compute_td_error(reward, gamma, value_next, value_current):
# TD誤差の計算
td_error = reward + gamma * value_next - value_current
return td_error
この関数を用いる際は、value_next と value_current がネットワークからの予測値であることを確認してください。また、実際の学習ループではこの誤差を使って勾配を計算し、ActorとCriticのパラメータを更新します。
まとめると、ActorCritic法の実装では数式の理解と細かなハイパーパラメータ調整が鍵となります。適切な学習率の設定やTD誤差の安定した計算を心がけることで、学習の発散リスクを減らし、より良い方策を獲得しやすくなります。
まとめと今後の学習ステップ
ActorCritic法は、強化学習において「方策(Policy)」と「価値関数(Value Function)」を同時に学習することで、効率的かつ安定した学習を実現するアルゴリズムです。今回の記事では、基本的な数式からPythonによる実装例までを通じて、ActorCritic法の仕組みを初心者の方にもわかりやすく解説しました。
最後に、ActorCritic法の核心をなす更新式の一例を紹介します。状態価値関数の差分(TD誤差)を用いて、方策パラメータと価値関数パラメータを同時に更新する形です。
まずは、TD誤差(Temporal Difference error)を以下のように定義します:
\[
\delta_t = r_{t+1} + \gamma V(s_{t+1}; \theta_v) – V(s_t; \theta_v)
\]
ここで、\(r_{t+1}\)は時刻\(t+1\)の報酬、\(\gamma\)は割引率、\(V(s; \theta_v)\)は状態価値関数のパラメータ化された推定値です。
この誤差を使って、方策パラメータ\(\theta_p\)は以下のように更新されます:
\[
\theta_p \leftarrow \theta_p + \alpha_p \delta_t \nabla_{\theta_p} \log \pi(a_t|s_t; \theta_p)
\]
同様に、価値関数のパラメータは誤差に基づいて更新されます:
\[
\theta_v \leftarrow \theta_v + \alpha_v \delta_t \nabla_{\theta_v} V(s_t; \theta_v)
\]
これらの式の意味は、価値のズレ(TD誤差)を使って「方策を良くする方向」と「価値関数の精度を高める方向」にパラメータを調整することです。
以下は簡単なPythonコード例です。状態価値関数を線形近似し、方策の勾配を使ってパラメータを更新しています。
import numpy as np
def update_parameters(theta_p, theta_v, s_t, a_t, r_tp1, s_tp1, gamma, alpha_p, alpha_v, pi, V):
# TD誤差の計算
delta = r_tp1 + gamma * V(s_tp1, theta_v) - V(s_t, theta_v)
# 方策の勾配(例としてlog確率の勾配が返る関数を想定)
grad_log_pi = np.gradient(np.log(pi(a_t, s_t, theta_p)))
# パラメータの更新
theta_p += alpha_p * delta * grad_log_pi
theta_v += alpha_v * delta * np.gradient(V(s_t, theta_v))
return theta_p, theta_v
今後の学習ステップとしては、以下をおすすめします:
- 実際にOpenAI Gymなどの環境でActorCriticアルゴリズムを実装し、動作を確認する
- Advantage ActorCritic (A2C)、Proximal Policy Optimization (PPO)などの発展手法に挑戦してみる
- ニューラルネットワークを用いた関数近似へと理解を深め、深層強化学習へとステップアップする
- 報酬設計や探索戦略の工夫に注目し、より実用的な問題に応用する
ActorCritic法は理論的な理解と実装スキルを両立させることで、強化学習の幅広い分野で応用可能な強力なツールとなります。引き続き数式とコードを通して学習を進め、ぜひ実践的なスキルを身につけてください。