方策勾配法コード結果まとめ概要まずは、今回挑戦した内容についてざっと説明しする。Gradient)を使ってゲームを攻略してみようとした。Gymのatariに含まれているテニスゲームを題材として扱うことにした。大学の授業で強化学習のプログラムを実装することになったので、何かよいものはないかとOpenAiGymの公式サイトを眺めててたら、丁度目に留まったのがテニスゲームだった。他のインベーダゲームやブロック崩しのようにやっている人がざっと検索したところ見当たらなかったので挑戦することに決めた。https://gym.openai.com/envs/Tennis-v0/ゲーム画面は以下の通り。CPUが青色で、プレイヤーがオレンジ色だ。このゲーム画面が入力として使われる。チェンジコートありという感じ。するにあたって使ったのはDQNと方策勾配法の2つである。使われるモデル自体は変わらないのだが、パラメータの更新の仕方(というより出力結果のとらえ方)が異なる。DQNDQNは強化学習で有名なQ学習を深層学習でも適用できるよう拡張されたものだ。詳しい解説はほかのサイトを見てほしいが、与えられた状態から次のアクション(行動)を行った場合の価値を計算するというもの。Gymで実装する変更したのはニューラルネットワークの層の数やプーリング層の構造。最終的には以下のような構造になった。1回1回の行動ごとに報酬(もしくは損失)が与えられ、それが複数行動にわたって減衰率を伴って伝播される。出力される値がそれぞれの状態でとる行動の確率だとみなしているため、実際に取った行動における算出した確率と報酬の値を元に報酬を与える。学習の目的としてはこの算出された報酬を最大化するというもの。報酬は減衰率γを0.99としてポイント中のtステップ目の報酬$R_t$を以下のようにする。\\end{cases}$$と設定している。この報酬をゲームごとに正規化を行い、報酬の値が最大化するようにパラメータを更新させていく。サーブをせずにエピソードが終了することがあったので、そのときの損失を一番大きくした。使用したネットワークはDQNのものと同一である。簡単な概要を書いたところでコードを一気に張り付けていく。様々な紆余曲折があった結果であまりきれいではないがとりあえず記録として張っていく。ベンチマークのスコアとして使ったのは直近500ポイント分の平均スコア。inline強化学習の環境を立ち上げる。taken18通りのアクション(行動)がとれることが分かる。次にゲーム画面をモノクロにして縮小する部分の実装。np.reshape(processed_observation,(1,FRAME_WIDTH,FRAME_HEIGHT))Agentクラスを定義する。このクラス内でニューラルネットワークの構築と学習、学習パターンの蓄積も行う。学習する際は最近のいくつかのフレーム分の画像を3万パターンほど蓄積しておき、そこからランダムにいくつかのパターンを選んで学習するというもの。lossここで骨子の部分は完成。1000ポイント分データを取ったらいったんbreakする。/>平均スコアは0.03を上回ることがほとんどなかった。この段階だとランダム性の行動をとっている段階ではあったのでそれが功を奏してたまたまポイントをとれていた可能性が高い。ラリーを続けている感じが出てはいたがポイントにつながる気配は全くなかった。こちらはDQNのコードを参考にして自分で組み立てた。(少しだけここのコードを参考にはした)コードまずは必要モジュールのインポート。(バッチ数,縦、横、状態数)次にモデルを構築し、モデルを学習させるクラスを作成する。ネットワークを学習させる関数を定義する。十分にサンプル数がたまっている場合は全部押し出して良い。save_weights(self,model_path):self.model.save_weights(model_path)最後は学習を実行させるところ。報酬を後ろの分にまで伝播させる。偶然の産物でポイントをとるものばかりで得点率が伸びる気配はなかった。設定した損失(報酬の負の値)は徐々に減ってはいるもののこの時点ですでに24時間以上学習させていたのでいったん中断することにした。勾配がなくならないよう、損失関数の値をあらかじめ2,3ほど足し合わせておくなどはした。まとめ今回は深層強化学習を使ってatariのテニスゲームに挑戦してみたが、DQN、方策勾配法のどちらでもうまくいかなかった。ゲームの複雑さととりうる行動の多さから学習は困難と最初から予想してはいたが、失点を防ぐ動作を入れるのにもかなり苦労した。失点を防ぐように失点の際の損失を大きくするとずっとサーブを打たないという選択肢を取ることができてしまったので、そのような場合についても損失を加えるようなことはしていたがその分失点を防ぐようなラリーを学習できなかったのが残念。パラメータチューニングがうまくいってない可能性もあるので、強化学習に関する本を読むなどして勉強してから再び挑戦できたらと思う。ubuntu著者プロフィール。