Aidemy 2020/11/22
#はじめに
こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
今回は、深層強化学習の2つ目の投稿になります。どうぞよろしくお願いします。
*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。
今回学ぶこと
・強化学習の実装
#強化学習の実装
##環境作成
・「強化学習」のChapterでは、環境などを自分で定義していたが、今回は強化学習用のさまざまな環境を用意しているライブラリを使用して環境などを作成していく。
・使用するライブラリは__「keras-rl」__というもので、これは__Keras__と__OpenAIGym(Gym)__というライブラリで構成される。今回はこれを使って__カートポールのデモ__を__DQN__で学習する。
・まずは__環境__を作成する。方法は__「env=gym.make()」とするだけで良い。引数には環境の種類を指定する。カートポールの環境は「"CartPole-v0"」と指定する。以降はenvインスタンスにアクセスすることで操作できる。
・今回のカートポールでは、行動は「カートを右に移動させる」「カートを左に移動させる」の2つであり、これを取得するには「env.action_space.n」__とすれば良い。
##モデルの構築
・環境を作成したら、Kerasの関数を使って__多層ニューラルネットワークを構築する__。モデルはSequentialモデルで構築する。次に、__Flatten()で多次元の入力を一次元に変換する。入力の形「input_shape」には、カートポールの現在の状態を指定するため、「env.observation_space.shape」を使う。
・層の追加は「model.add()」__で行えば良い。全結合層はDense、活性化関数の指定はActivation()で行う。引数には「relu」「linear」などを指定する。
##エージェントの設定1 履歴と方策
・ここでは強化学習の本体である__エージェントの設定__を行う。まずは、この設定に必要な__履歴__と__方策__を設定する。(履歴はそのまま「過去にどのような行動をしたかの履歴」)
・履歴__は「SequentialMemory(limit,window_length)」__で設定できる。__limit__は記憶しておくメモリの数である。
・方策__については、ボルツマン方策をとる時には「BoltzmannQPolicy()」を使い、ε-greedy手法をとる時には「EpsGreedyQPolicy()」__を使う。
##エージェントの設定2
・前項の履歴と方策を使って、エージェントを設定する。DQNアルゴリズムが実装されている__「DQNAgent()」を呼び出し、以下の引数を与えれば良い。
・引数には、モデル「model」、履歴「memory」、方策「policy」、行動数「nb_actions」、初めの何ステップを強化学習に使わないのかを指定する「nb_steps_warmup」を設定する。
・上記を「dqn」という変数に入れたとすると、「dqn.compile()」__でエージェントの学習方法を指定する。第一引数としては__最適化関数__を指定し、第二引数としては__metrics__で表される評価関数を指定できる。
##テストの実施
・前項のdqnエージェントを学習させるには__「dqn.fit()」を使えば良い。引数としては、環境(コード上ではenv)、エピソード数「nb_steps」、可視化するかどうか「visualize」、ログを出力するかどうか「verbose」がある。
・エージェントに学習させたら、これを__テスト__する。テストは、エージェントを実行し、実際どのぐらいの報酬が得られるかを評価する。これは「dqn.test()」で行える。引数は「dqn.fit()」と同じだが、エピソード数のみ「nb_episodes」__とする。
#まとめ
・ライブラリを使用して強化学習を行うときは、keras-rl__を使う。
・「gym.make()」__で環境を作成したら、モデルを作成して層を追加していく。また、履歴__と__方策__を設定し、これらを使ってエージェントも作成する。
・作成したdqnエージェントを「dqn.fit()」で学習させ、「dqn.test()」__でテストする。
今回は以上です。ここまで読んでくださり、ありがとうございました。