LoginSignup
0
0

More than 3 years have passed since last update.

深層強化学習3 実践編:ブロック崩し

Posted at

Aidemy 2020/11/22

はじめに

 こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
 今回は、深層強化学習の3つ目の投稿になります。どうぞよろしくお願いします。

*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと

ブロック崩しによる強化学習実践

環境の作成

・Chapter2と同じ方法(gym.make())で環境を作成する。ブロック崩しの場合、引数には「BreakoutDeterministic-v4」を指定する。
・行動数は「env.action_space.n」で確認できる。

・コード
スクリーンショット 2020-11-20 14.52.49.png

モデルの構築

・ここでは多層ニューラルネットワークを構築する。入力は「ブロック崩しの画面4フレーム分」とする。また、計算量を少なくするために、画像はグレースケールの84×84画素にリサイズする。
・モデルはSequential()を使用する。Chapter2と同様にFlatten()で入力を平滑化し、全結合層はDense、活性化関数はActivationで追加する。
・今回は画像(二次元)の入力なので、二次元の畳み込み層である「Convolution2D()」を使用する。第一引数は「filter」で、出力空間の次元数を指定し、第二引数は「kernel_size」で、畳み込んだウィンドウの幅と高さを指定する。「strides」は歩幅、つまりウィンドウの一度に動く幅と高さを指定する。

・コード
スクリーンショット 2020-11-20 15.21.21.png

履歴と方策の設定

・ここもChapter2と同様に、エージェントの作成に必要な履歴方策を設定する。
・履歴は「SequentialMemory()」を使う。引数にはlimitwindow_lengthを指定する。
・方策は、ボルツマン方策をとる場合は「BoltzmannQPolicy()」、ε-greedy手法をとる場合は「EpsGreedyQPolicy()」を使う。
・また、パラメータεを線形に変化させるときは、「LinearAnnealedPolicy()」を使用する。引数は、以下のコードのように指定すると、トレーニングの際にパラメータεを10ステップで最大1.0最小0.1の線形に変形し、テストの時は0.05で固定するという意味を表す。

・コード
スクリーンショット 2020-11-20 15.59.01.png

エージェントの設定

・エージェントは「DQNAgent()」の引数にmodel,memory,policy,nb_actions,nb_steps_warmupを渡すことで作成できる。あとは「dqn.compile()」で学習方法を指定すれば良い。第一引数には最適化アルゴリズムを指定し、第二引数には評価関数を指定する。

・コードスクリーンショット 2020-11-20 16.08.36.png

学習の実施

・前項の設定まで終わったら、次にDQNアルゴリズムを使って学習を行う。「dqn.fit()」で行い、第一引数には環境、第二引数には「nb_steps」で何ステップ学習するかを指定する。
・また、学習結果は「dqn.save_weights()」でhdf5の形式で保存できる。第一引数にはファイル名、第二引数には「overwrite」で上書き可能にするかを指定する。

・コード
スクリーンショット 2020-11-21 11.15.16.png

テストの実施

・学習させたエージェントでテストを行う。「dqn.test()」で行う。引数はfitと同じで、ステップ数nb_stepsの代わりにエピソード数「nb_episodes」を指定する。
・ちなみに、今回のブロック崩しでは、ボールを落とすまでが1エピソードである。

Dueling DQN

Dueling DQNとは

Dueling DQN(DDQN)はDQNの発展版で、DQNのネットワーク層の最後を変更したものである。
・DQNでは、最初に「convolution層」が3つの後に、全結合層を経てQ値を出力していたが、DDQNはこの全結合層を2つにわけ、一方では状態価値Vを出力し、もう一方では行動Aを出力する。この2つを入力とした最後の全結合層からQ値を求めることで、DQNよりも性能が上がる。

・図スクリーンショット 2020-11-21 11.32.40.png

Dueling DQNの実装

・Dueling DQNの実装は、層の追加まではDQNと同じである。エージェントの設定時(DQNAgent())に、引数で「enable_dueling_network=True」とし、Q値の求め方「dueling_type」を指定することで実装できる。dueling_typeには「'avg','max','naive'」を指定できる。

・コードスクリーンショット 2020-11-21 12.12.37.png

・結果スクリーンショット 2020-11-21 12.13.16.png

まとめ

・ブロック崩しでも、Chapter2の時のように環境などを定義できる。
・モデルの構築については、今回は二次元の画像認識であるので、畳み込みを使用する。「Convolution2D」層を使用する。
・今回の方策ではε-greedy手法を使うのだが、パラメータεは線形に変化させる必要がある。このような時は、「LinearAnnealedPolicy()」を使って線形に変化させる。
・学習まで行ったモデルは「dqn.save_weights()」を使うことでhdf5の形式で保存できる。
DuelingDQN全結合を2つに分け、それぞれ状態価値Vと行動Aを算出し、最後の層で、その二つからQ値を求めるDQNである。実装はDQNAgent()「enable_dueling_network」「dueling_type」を指定すれば良い。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0