ブロック崩し(breakout)を強化学習A2Cで攻略していきます。
まずOpenAI Gymの環境を並列で動かすために必要なパッケージをインストールします。
1 | pip install tqdm |
使用するパッケージをインポートします。
1 | # パッケージのimport |
ブロック崩し(breakout)の学習には4つの工夫をします。
- No-Operation
実行環境をリセットするときに0~30ステップのいずれかの間何もしない行動を実施します。
=> ゲーム開始の初期状態を様々にし、特定の開始情報に特化しないようにするためです。 - Episodic Life
5機ライフがありますが、1回失敗したときにゲーム終了とします。
ただし崩したブロックはそのままの状態で次の試行を開始するようにします。
=> 多様な状態に対して学習ができるようにするためです。 - Max and Skip
4フレームごとに行動を判断させ、4フレーム連続で同じ行動をするようにします。
=> 60Hzでゲームが進行すると早すぎるためエージェントの行動を15Hzにするためです。 - Warp frame
縦210ピクセル、横160ピクセルのRGB値を縦横84ピクセルずつのグレースケール画像へと変換します。
=> 学習しやすくするためです。
また上記の4工夫とPyTorch環境に合わせるためのクラスWrapPyTorchを定義します。
1 | # 実行環境の設定 |
マルチプロセルでBreakoutを並列実行する環境を生成する関数make_envを定義します。
OpenAIが用意しているマルチプロセス環境であるクラスSubprocVecEnvを使用します。
1 | # 実行環境生成関数の定義 |
定数を設定します。
Breakout-v0ですとフレームが自動的に2~4のランダムにskipされるため、今回はフレームスキップはさせないBreakoutNoFrameskip-v4を使用します。
1 | # 定数の設定 |
GPU使用の設定を行います。
GPU環境があれば cuda が出力されますが、そうでない場合は cpu が出力されます。
1 | # GPUの使用の設定 |
Advantage学習するためのメモリクラスを定義します。
.to(device)を使用して、GPU環境がある場合には自動的にGPUを使えるようにしています。
PyTorchではCPU環境とGPU環境を意識せずに同じプログラムをどちらの環境でも実行できるのが便利です。
1 | # メモリオブジェクトの定義 |
A2Cのディープ・ニューラルネットワークの構築を実装します。
コンボリューション層の定義のNUM_STACK_FRAME(=4)は、過去4フレーム分の画像を使って1つの状態として扱いニューラルネットワーク入力とすることを意味します。
1つのフレームではボールの位置しか分かりませんが、2フレームあれば速度が分かり、3フレームあれば加速度が分かるようになります。
今回はDQNのNature論文に合わせて4フレームとしています。
1 | # A2Cのディープ・ニューラルネットワークの構築 |
Brainクラスを定義します。
勾配降下法にはRMSpropを使用します。
1 | # エージェントが持つ頭脳となるクラスを定義、全エージェントで共有する |
実行環境のクラス Environment を定義します。
- 入力データは画像となります。4フレームで1つの状態を表します。
- マルチプロセル環境 SuvprocVecEnv を使用しているのでエージェントごとのforループ処理は必要ありません。
- 実行ループ100回ごとに得点を出力します。この出力で学習状態を確認します。
- 定期的に結合パラメータを保存します。
1 | # Breakoutを実行する環境のクラス |
最後に実行します。
1 | # 実行 |
学習が完了すると学習データ weight_end.pth ファイルが出力されます。
次回はこの学習データを使ってBreakoutをプレイします。
参考 > つくりながら学ぶ!深層強化学習 サポートページ