CNN(畳み込みニューラルネットワーク)を実装してみます。おなじみの手書き数字の判定です。(MNIST)
CNNは強化学習にとって「画面入力による行動獲得」を可能にしたという点でとても重要な手法となります。
1 | import numpy as np |
結果は次の通りです。
正解率は93.43%とまずまずの結果となりました。
出力結果の見方は下記の用語集を参照してください。
機械学習に関する用語集 精度に関する用語
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
CNN(畳み込みニューラルネットワーク)を実装してみます。おなじみの手書き数字の判定です。(MNIST)
CNNは強化学習にとって「画面入力による行動獲得」を可能にしたという点でとても重要な手法となります。
1 | import numpy as np |
結果は次の通りです。
正解率は93.43%とまずまずの結果となりました。
出力結果の見方は下記の用語集を参照してください。
機械学習に関する用語集 精度に関する用語
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
ボストン市の住宅価格をニューラルネットワークで予想してみます。
住宅価格のデータセットは13の特徴量(入力)と住宅価格(出力)のセットとなっています。
ニューラルネットワークは13の変数 x から1つの値 y を出力することになります。
学習は予測した価格と実際の住宅価格の差異が小さくなるようにパラメータを調整することで行います。
1 | import numpy as np |

8回の学習で誤差が 165.8451 から 18.0005 まで減っていることがわかります。
次に予測結果をグラフで確認します。
横軸 x が実際の住宅価格で、縦軸 y が予測した住宅価格となります。
完全に一致していれば対角線上にプロットされることになります。今回の予測はだいたいあっているようです。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
TensorFlowで2層のニューラルネットワークを実装してみます。
np.random.rand(3, 2)で3件の座標データbatchを作成しています。
また1層目から2層目にデータを送るときには、活性化関数(シグモイド)を適用しています。
1 | import numpy as np |

入力データbatchが3行2列(3件の座標データ)となり、出力データが3行4列(3件の4次元データ)となっていることがわかります。
このようにしてみると1行目に1件目の入力データと1件目の出力データが表示され、2行目に次の入力とその出力がされていて対応がわかりやすくなってます。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
これまではQ[s][a]というテーブル内の値を更新することで学習していましたが、今回からは関数のパラメータを調整することで学習していきます。
まずはTensorFlowで1層のニューラルネットワークを実装してみます。
入力(x)は2行1列の座標、出力(y)は行動価値4行1列を想定しています。
対応する重み(weight)は4行2列でバイアス(bias)は4行1列となります。
1 | import numpy as np |

想定した行列とは全て逆の結果となりました。
これは座標を1行2列で入力したためです。=> np.random.rand(1, 2)
このため重み、バイアス、出力の全てが行列が反対になってしまっていますが、本質的な結果は変わりません。
多くの深層学習フレームワークでは行をデータ数(バッチサイズ)を表すのに使うため、このような仕様となっていますので慣れてしまいましょう。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
これまで試してきた4手法(モンテカルロ法 / TD法 / SARSA / Actor Critic法)の結果一覧をまとめました。
まずおさらいとして検証モデルとして使用したのはOpenAI GymのFrozenLakeです。
4 x 4 マスの迷路でところどころに穴があいていて穴に落ちるとゲーム終了となります。
穴に落ちずにゴールに到着すると報酬が得られます。
次に各手法ごとの「各行動の評価」と「獲得報酬平均」の結果一覧です。
| 各行動の評価 | 獲得報酬平均 |
|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
簡単に各手法を説明します。
モンテカルロ法
エピソードが終了してから評価を行う。Valueベース。
TD法(Q-learning)
1ステップごとに評価を行う。Valueベース。
SARSA
戦略に戻づいて行動を決定する。Policyベース。
Actor Critic法
戦略と価値評価を相互に更新して学習する。ValueベースかつPolicyベース。
それぞれ特徴がありますが、学習までに時間がかかるものの最終的には一番獲得報酬が安定しているActor Critic法が個人的には好みです。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
Actor Critic法による学習を試してみます。
Actor Critic法は、戦略担当(Actor)と価値評価担当(Critic)を相互に更新して学習する手法です。
まずはエージェントのベースになるクラスを実装します。(強化学習5・6 (モンテカルロ法・TD法)と同様です。)
1 | import numpy as np |
次に環境を扱うためのクラスを実装します。
(強化学習5・6 (モンテカルロ法・TD法)と同様です。)
1 | import numpy as np |
Actor Critic法での学習を実行します。
53行目で行動評価(Q値)の更新を行い、54行目で状態価値の更新を行っています。
ValueベースとPolicyベース両方の特性を持っていることになります。
1 | import numpy as np |
| FrozenLake | 各行動の評価 |
|---|---|
![]() |
![]() |
エピソード実行回数と獲得報酬平均の推移は次のようになります。
今まで試してきた手法より学習にかかるエピソード数は長くなっていますが、安定した報酬が得られるようになっています。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
モンテカルロ法・TD法に続いてSARSAによる学習を試してみます。
Q-learning(TD法)は価値が最大となる状態に遷移する行動をとることを前提としますが、SARSAでは次の行動はself.Qに基づく戦略(self.Q)で決められることを前提とします。
まずはエージェントのベースになるクラスを実装します。(強化学習5・6 (モンテカルロ法・TD法)と同様です。)
1 | import numpy as np |
次に環境を扱うためのクラスを実装します。
(強化学習5・6 (モンテカルロ法・TD法)と同様です。)
1 | import numpy as np |
SARSAでの学習を実行します。
TD法とほとんど同じですが、gainを算出する箇所のみが違います。コメントをご参照ください。
1 | from collections import defaultdict |
| FrozenLake | 各行動の評価 |
|---|---|
![]() |
![]() |
モンテカルロ法、TD法とは違う経路が高く評価されていますが、全体的にゴール向かう行動が高く評価されています。
エピソード実行回数と獲得報酬平均の推移は次のようになります。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
前回は1エピソードをプレイした実績に基づく更新を行うモンテカルロ法による学習を試してみました。
今回は1回の行動ごとに更新を行うTD法と試してみます。
モンテカルロ法に比べて行動修正のスピードが早いため学習が効率的です。
ただ更新は見積りベースになるためモンテカルロ法より適切な行動をとれるかどうか不確実になります。
まずはエージェントのベースになるクラスを実装します。(強化学習5 (モンテカルロ法)と同様です。)
1 | import numpy as np |
次に環境を扱うためのクラスを実装します。
FrozenLakeEasy-v0は、強化学習を行うための環境を提供するライブラリOpenAI Gymの環境の1つです。
4 x 4 マスの迷路でところどころに穴があいていて穴に落ちるとゲーム終了となります。
穴に落ちずにゴールに到着すると報酬が得られます。(強化学習5 (モンテカルロ法)と同様です。)
1 | import numpy as np |
TD法での学習を実行します。
(このファイルだけ強化学習5 (モンテカルロ法)と異なります。)
1 | from collections import defaultdict |
| FrozenLake | 各行動の評価 |
|---|---|
![]() |
![]() |
全体的にゴール向かう行動が高く評価されていることがわかります。
エピソード実行回数と獲得報酬平均の推移は次のようになります。
モンテカルロ法と同様にうまく学習できています。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
モンテカルロ法は行動の修正を実績に基づき行う方法です。
エピソードが終了した後で、獲得できた報酬の総和をもとに修正を行うシンプルな方法です。
まずはエージェントのベースになるクラスを実装します。
1 | import numpy as np |
次に環境を扱うためのクラスを実装します。
FrozenLakeEasy-v0は、強化学習を行うための環境を提供するライブラリOpenAI Gymの環境の1つです。
4 x 4 マスの迷路でところどころに穴があいていて穴に落ちるとゲーム終了となります。
穴に落ちずにゴールに到着すると報酬が得られます。
1 | import numpy as np |
モンテカルロ法での学習を実行します。
1 | import math |
FrozenLakeの設定と各行動の評価結果は下記のようになります。
緑色が濃いほど評価が高いことを意味します。
| FrozenLake | 各行動の評価 |
|---|---|
![]() |
![]() |
全体的にゴール向かう行動が高く評価されていることがわかります。
エピソード実行回数と獲得報酬平均の推移は次のようになります。
エピソード実行が50回付近で報酬が1近くに達していて学習がだいたい完了していることがわかります。
参考
Pythonで学ぶ強化学習 -入門から実践まで- サンプルコード
遷移関数や報酬関数が分からない場合は、行動してみて状態の遷移や得られる報酬を調べていくことになります。
今回は、Epsilon-Greedy法で探索(経験を蓄積する)と活用(行動する)の割合によって報酬がどのように変わっていくかを調査します。
何枚かのコインから1枚を選んで、投げた時に表がでれば報酬が得られるゲームで実装しています。
以下がコードになります。(コメントにて処理を確認して頂ければ幸いです)
1 | import random |

epsilonが0.0の場合はコイントスの回数を増やしても報酬がぜんぜん増えていません。
epsilonが0.1か0.2くらいだといい結果がでています。
一般的にepsilonは0.1に設定することが多いようですが、今回の結果はそれを裏付けることとなりました。