E試験 2024#2 シラバスメモ④-4 深層学習の応用 深層強化学習

E試験のシラバスとその概要をメモしたものです。
書籍、各サイトや生成AIに聞いたものを自分なりに解釈したツギハギです。

シラバスは2024#2に準拠しています

https://www.jdla.org/certificate/engineer/

本記事は4．深層学習の応用 のうち
- 深層強化学習

についてとなります。
試験範囲外部分は割愛しています。

# 強化学習
強化学習 (Reinforcement Learning) は、エージェントが環境内でアクションを実行して報酬を最大化するように学習する一般的なフレームワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/46119584-1e62-4c5c-3117-586a2b520b50.png)
https://www.tensorflow.org/agents/tutorials/0_intro_rl

### カートポール環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/b4c6bd87-d767-6b1e-dcdc-2d00e9357000.png)
出所：https://developers.agirobots.com/jp/weekly-rl-with-code-cartpole-dqn/

CartPole環境は、最もよく知られている古典的な強化学習の問題の 1 つです（強化学習の"Hello, World!"）。台車の上に立てられた棒が倒れないように台車を制御するのが課題です。台車は摩擦のない軌道上を移動します。

- 状態:$S_t$
環境の状態$S_t$からの観測は、台車の位置と速度、および棒の角度と角速度を表す 4D ベクトルです。
- アクション:$a_t$
エージェントは2つのアクションのいずれかを実行してシステムを制御できます。$a_t$: カートを右 (+1) または左 (-1) に押します。
- 報酬$r_{t+1}$
ポールが直立している時間ステップごとに$r_{t+1} = 1$提供されます。
- エピソードは、次のいずれかが当てはまる場合に終了します。
  - ポールが角度の限界を超えて傾く
  - カートが指定された枠外に出た場合
  - 時間ステップが 200 を経過した場合

エージェントの目標は、エピソードの報酬の合計 $\sum_{t=0}^{T} \gamma^t r_t$ を最大化するポリシー $\pi(a_t|s_t)$を学ぶことです。ここでは、$\gamma$は[0, 1] の割引係数であり、即時の報酬に対して将来の報酬を割引します。このパラメータは、報酬を迅速に取得することを重視するポリシーを作成することに役立ちます。

### 強化学習の価値関数
状態価値関数(V)：ある状態(𝑠)にいることの価値。
状態$S_t$を起点に、方策𝜋に従って行動をとり続けてエピソードを完了した際の報酬の合計
行動価値関数(Q)：ある状態(𝑠)にいてある行動(a)を取る価値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/d3b5a494-74a8-5a9f-495f-89dc27ddd9ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/2c7f3178-96b2-a85c-9ccb-7413286634b6.png)
出所：https://zero2one.jp/ai-word/state-value-function/

## 価値関数ベースの強化学習
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/dae4ef0a-5059-145a-7d36-ab3b072c254e.png)
https://qiita.com/MENDY/items/e343ed480a9d98baf351
###  モンテカルロ法
**モンテカルロ法**は、エピソード（ゲームやタスクの1回の完了まで）を最後まで実行し、その結果に基づいて学習を行います。

#### 基本の流れ
1. **状態 $s_t$**：システムがある特定の状態にある瞬間。
2. **アクション $a_t$**：ある状態 $s_t$ でエージェントが選択する行動。
3. **方策 $\pi$**：エージェントがどのアクションを選ぶかを決めるルールや確率分布。
4. **報酬 $r$**：エージェントが行動 $a_t$ を選んだ結果として受け取る即時のフィードバック。

モンテカルロ法では、エージェントは方策 $\pi$ に基づいて状態 $s_t$ でアクション $a_t$ を選び、次の状態に移動します。この方策にはランダム性が含まれることが多く、例えばエージェントは確率に従ってアクションを選びます。
これをエピソードの最後まで続け、最終的に各エピソード全体で得られた報酬の合計（累積報酬、または「リターン」）を計算します。そして、そのリターンに基づいて各状態 $s_t$ での価値を更新します。

- **長所**：学習が安定し、長期的な結果を正確に反映しやすい。
- **短所**：エピソードが完了しないと学習できないため、計算コストが高くなることがあります。

### TD法（時間差分法）
**TD法**は、エピソード全体を待たずに部分的な情報に基づいて学習を進める手法です。次の状態や報酬が観測されるたびに、現在の価値推定を更新します。

#### 基本の流れ
1. エージェントは状態 $s_t$ でアクション $a_t$ を選択します。
2. アクションの結果、次の状態 $s_{t+1}$ に移り、報酬 $r_t$ を受け取ります。
3. TD法では、次の状態 $s_{t+1}$ の価値推定に基づいて、現在の状態 $s_t$ の価値を更新します。これをTDターゲットと呼びます。

具体的には、TDターゲットは「報酬 $r_t$ と次の状態の価値の和」であり、この値を現在の推定値に近づけるように学習を行います。この更新はエピソードの途中でも行われるため、エピソードの最後まで待つ必要がありません。

- **長所**：エピソードの途中でも学習が進むため、計算効率が高い。
- **短所**：部分的な情報で価値を更新するため、学習が不安定になる可能性があります。

### 比較
- **モンテカルロ法**はエピソード終了後に全体のリターンに基づいて学習を行うのに対し、**TD法**はエピソード中に観測される報酬と次の状態の価値を使って段階的に学習します。
- モンテカルロ法はより正確な価値推定ができる一方、TD法は素早く学習が進む点が利点です。

どちらの方法も、最適な方策 $\pi^*$ を見つけることを目的としていますが、学習するアプローチや計算効率が異なるため、用途やシチュエーションによって使い分けられます。
### Q学習
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/0e17c20b-f4ec-d2a7-aa58-523518f14470.png)
出所：https://zero2one.jp/ai-word/q-learning/

**Q学習**は、強化学習における代表的なアルゴリズムで、方策 $\pi$ を明示的に学習せず、状態とアクションの組み合わせごとの価値（Q値）を直接学習します。これにより、エージェントは最適な行動選択ができるように、各状態でのアクションの価値を更新していきます。この価値は **Qテーブル** という形で保存され、状態とアクションの組み合わせに対応するQ値を格納します。

#### 基本概念
- **状態 $s_t$**：システムが現在置かれている状況。
- **アクション $a_t$**：エージェントが状態 $s_t$ で選択できる行動。
- **報酬 $r_t$**：アクションの結果として得られるフィードバック。
- **Q値 $Q(s_t, a_t)$**：特定の状態 $s_t$ でアクション $a_t$ を取った際の期待される累積報酬の推定値。
- **Qテーブル**：すべての状態とアクションの組み合わせに対応するQ値を格納するテーブル。

#### Q学習の流れ
1. エージェントは現在の状態 $s_t$ でアクション $a_t$ を選びます（方策 $\pi$ に従う、もしくは探索戦略を用いる）。
2. その結果、次の状態 $s_{t+1}$ に移動し、報酬 $r_t$ を受け取ります。
3. **Qテーブル** 内の該当するQ値を以下のように更新します：
$$
   Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[ r_t + \gamma \max_{a'} Q(s_{t+1}, a') - Q(s_t, a_t) \right]
$$
   - $\alpha$：学習率。新しい情報をどれくらい反映するかのパラメータ。
   - $\gamma$：割引率。未来の報酬をどれだけ重要視するかのパラメータ。
   - $\max_{a'} Q(s_{t+1}, a')$：次の状態 $s_{t+1}$ で最適なアクションのQ値。

このQ値の更新により、**Qテーブル**がどんどん最適化されていき、各状態での最適なアクションが明確になっていきます。

#### 特徴
- **オフポリシー法**：Q学習は、最適な方策に従わなくても学習が可能です。たとえば、探索方策としてランダムに行動を選んだとしても、将来的には最適な方策が得られることが保証されています。
- **最適な行動選択**：各状態において最適なアクションを選択するため、**Qテーブル** に保存されたQ値が最大となるアクションを選ぶことが基本です。

#### Q学習の長所と短所
- **長所**：エピソード全体を待たずに学習を行えるため、効率的に学習が進む。オフポリシーなので、探索戦略の自由度が高い。
- **短所**：高次元の状態空間や連続的な状態空間に対しては、**Qテーブル** が巨大になり、学習が難しくなる。この問題はディープQネットワーク（DQN）などの深層学習と組み合わせて対処されます。

#### まとめ
Q学習は、状態とアクションの組み合わせごとの価値（Q値）を **Qテーブル** で管理し、報酬と次の状態での最大のQ値を基にしてそのQ値を更新していきます。最終的に、エージェントは **Qテーブル** を活用し、各状態で最適なアクションを選べるようになります。
## 深層強化学習のモデル
### DQN
Q学習のQテーブルをDNNで近似したもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/ef086be2-c6f6-059d-35f6-67750ebd743f.png)
1. 現在の状態sをTarget Network$Q(s’, a|\theta^{-})$に入力
現在の状態sをTarget Network$Q(s’, a|\theta^{-})$に入力し、Q値$Q(s’, a|\theta^{-})$を得ます。


2. Target Networkから出力されたQ値を元に行動選択
Q値$Q(s’, a|\theta^{-})$を元にε-greedy選択などで行動aを選択します。

3. 行動したことによって変化した状態 s′ と報酬rの観測
環境から遷移先状態s′ 及び報酬rを観測します。

4. 経験e=⟨s,a,s′,r⟩をExperience Bufferに保存
「現在の状態sで行動aによって状態s′に遷移し、報酬rを得た」という経験e=⟨s,a,s′,r⟩をExperience Bufferに保存（記憶）します。
ここで、報酬値rを-1〜1の範囲にクリップします。
単純な方法としては1以上であれば1に。
-1以下であれば-1に報酬をクリップします。
これは外れ値等に過剰に反応しすぎないために行います。
この処理をReward Clippingと言います。
5. Experience Bufferから任意の経験を取り出し、Q Networkをミニバッチ学習(Experience Replay)
定期的にQ Networkの学習を行います。
Experience Bufferからバッチサイズ分経験をサンプリング($B={e_0, e_1, …, e_{|B|} }$)し、
以下のTD誤差L(θ)を最小化するようにQ Networkのパラメータθを更新します。
$\begin{eqnarray} 
\mathcal{L}(\theta) = \frac{1}{|B|}\sum_{e \in B} (r + \gamma \max_a Q(s’, a|\theta^{-}) – Q(s, a|\theta))^2 
\end{eqnarray}$
この処理を **Experience Replay** と言います。
6. Target Networkの更新
任意のインターバルで、Q NetworkのパラメータをTarget Networkに反映していきます。
これは、Q Learningの過大評価という課題を緩和するために重要なります。

Q Networkのパラメータの反映方法には大きくわけて２つあって、
1つはHard Update、もう1つはSoft Update になります。

Hard Updateでは、定期的にQ NetworkのパラメータをTarget Networkにコピーします。
Soft Update では、Q Networkを更新する度に少しずつQ Networkのパラメータを反映させていきます。
![0GjZp7Jw7WYP4q8sp7Ns1724747477-1724748851.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8052d50f-5f13-9591-3579-3b9b6f017b29.gif)

出所：https://www.tcom242242.net/entry/ai-2/%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92/%E6%B7%B1%E5%B1%A4%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92/%E3%80%90%E6%B7%B1%E5%B1%A4%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92%E3%80%91deep_q_network_%E3%82%92tensorflow%E3%81%A7%E5%AE%9F%E8%A3%85/ より編集して作成


### A3C:Asynchronous Advantage Actor-Critic
- Asynchronous
複数のエージェントを並列に処理し非同期にパラメータ更新。
分散学習により学習が高速化でき、
非同期並列にすることで経験の自己相関を低減でき、学習を安定化できる
- Advantage
1step先ではなく、2step以上先までactionしてから更新
- Actor-Critic
エージェントの振る舞いを表すactorと、actorの期待収益を予測するcriticの2つのモデルを個別に学習するアルゴリズムの総称
価値関数とは別に確率的なポリシーを学習できる
離散のアクションも連続のアクションも扱える

#### Asynchronous 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/2ff9b1ea-d6b1-001c-2029-c7c1c7bf6829.png)
出所：https://pylessons.com/A3C-reinforcement-learning
マルチスレッドで複数の学習環境(Worker)を用意。
Agentはそれぞれ経験を積み、重み更新のための勾配を計算、勾配は全スレッドで共有したAdvantage-Actor-Criticのネットワーク(Global Net)に共有し、更新する。

#### Actor-Critic
行動を決めるActorを直接改善しながらPolicyを評価するCriticも同時に学習させるアプローチ。
一つのネットワークが方策と価値を出力する分岐型のネットワークを実装し、ネットワークを更新する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8946c525-ad74-16e9-196a-83a68d9c9c20.png)

- Step1
t時点の状態$S_t$をEnvironmentから取得
- Step2
Policyが状態を受け取りActorが$A_t$を出力
- Step3
Criticが$S_t$と$A_t$を入力として、Q値を計算する
- Step4
$A_t$を受け取ったEnvironmentが新しい状態$S_{t+1}$と報酬$R_{t+1}$を出力する
- Step5
Q値を使ってActorのPolicyを更新する
- Step6
Policyが更新されたのでActorは新しい状態$S_{t+1}$を元に次にとるべきアクション$A_{t+1}$を生成する。その後、Criticはそのパラメータを更新する。
![a3c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/30223cb8-70b8-608b-9075-e4490320244d.gif)
出所：https://huggingface.co/blog/deep-rl-a2c より編集して作成