Pythonで学ぶ強化学習 -入門から実践まで-を書きました

piqcy
programming-soda
Published in
8 min readJan 17, 2019

--

約1年半ほどかかりましたが、「Pythonで学ぶ強化学習 入門から実践まで」を書き上げました。本記事ではAsian Kung-Fu Generationさんがアルバム発売の度に行っている全曲解説にのっとり、各章の見所や苦労した点を紹介したいと思います。

2019年1月時点で、私がアウトプット可能な強化学習についての知識は全てこの中に込めています。もう残っているのは誠意と買っていただいた感謝しかないため、もし誤記やエラー等ありましたら以下リポジトリのIssueにてご連絡をお願いいたします。

特に深層学習の領域は、もう発売された瞬間から情報が古くなっていきます。この点については、本書が再版の機会に恵まれるうちはキャッチアップしていきたいと思います。

Day1: 強化学習の位置づけを知る

この章については、なるべく「ワクワク」してもらうことを意識しました。情報を収集する中で海外の講義スライドを見る機会が結構あったのですが、いずれも最初はインパクトのある画像などをバンバン出して、興味を引く構成になっていることが多かったんですね。

これから新しいことを学ぶ際には、まずモチベーションを高めるのが重要なのかなと。そのため、強化学習だけでなく教師あり/教師なしについても面白そうな事例を取り上げています。

強化学習の事例で取り上げられているMetacar

Day2: 強化学習の解法(1): 環境から計画を立てる

Day2最大のポイントは、Bellman Equationの導出でした。Bellman Equationは強化学習の手法全般の基礎となっているため、ここをいかに納得感をもって学んでもらうかにかなり気を使いました。そのため、WhatよりもWhyの説明に重点を置いています(この式がどんな意味なのか、というよりなんでそんな式になるのか、という点)。

Day2の実装はDay1の「ワクワクしてもらう」流れを組んでおり、簡単なシミュレーターで実行結果を眺められるようにしています。

Day2で使用しているシミュレーター

Day3: 強化学習の解法(2): 経験から計画を立てる

Day3は巷でも解説の多いモデルフリーの手法の解説となっています。そのため解説の中身を書くのは割とスムーズだったのですが、解説の筋立ては結構最後まで変更がありました。この段階で手法をどう整理するかがDay4以後(つまりDay3の手法をDeepにした手法)の解説に大きな影響を与えるためです。

なので、後半の章を書いてはDay3に戻り、というのを繰り返していた記憶があります。心残りとしては、Day2までの状態価値(V)からDay3で行動価値(Q)に変わる、という点を明確に解説できなかったところです。ここは、再版の機会があれば追記したいと思っています。

Day4: 強化学習に対するニューラルネットワークの適用

Day4、深層強化学習についても解説は巷によくあるため(自分でも書いたことがありますし)、解説はあまり苦労しませんでした。苦労したのは実装ですね。Kerasをtf.kerasに変えたら学習しなくなったり、TensorFlowのバージョンを上げたら学習しなくなったりなど。。。

ここで苦労した分、Day5の内容がかなり実感を伴ったものになったのでその点は良かったかもしれません。

心残りとしては、連続値コントロールの簡単なサンプルを提供できなかったところです。ここは実装にチャレンジはしたのですが(こちらに名残があります)、学習がうまくいかず最終的には外部(keras-rl)の実装を使いました(一応外部の参照実装をうまく使うべし、というセクションがあったので本の構成的には問題なかったのですが)。Gymに収録されているMountain-Carは報酬が疎すぎる、Pendulum-v0はちょっと難しいということで難航しました。最近Pure Pythonでゲームが作れるpyxelが公開されたので、これでCartPoleのような練習問題としての連続値コントロールのゲームを作ってみたいです。

Day5: 強化学習の弱点

Day5/Day6は、実は当初執筆の範囲に入っていませんでした。端的には、初期はDeep Q-Networkまでで終わりというよくある構成だったということです。Day5/Day6が加わったのは、以下の記事の影響が大きいです。

この記事の後に出す強化学習の本で、弱点に触れないのは誠実さにかけるなと思いました。そこで、Day5の弱点の章が加わりました。弱点を書いて対策を書かないというわけにはいかないので、Day6も生まれたという流れになります。

Day6: 強化学習の弱点を克服するための手法

Day6は正直一番大変でした。大変だったのは、弱点を克服する方法の整理と実装です。特に逆強化学習については実装が大変で正直諦めようかと思ってた時期もありました。

弱点を克服する手法は、本当に色々あります(内発的報酬やら表現学習やらメタラーニングやらと・・・)。どの研究を乗せてどの研究を乗せないかを判断するには、一旦手法を整理して「その中の代表的な手法はこれ」という形にする必要があるなと考えました。以下の表は、作るのにだいぶ試行錯誤しました。

対策方法をまとめた表

各研究の紹介にあたっては、「原点」と「キーポイントとなる研究」の2つを紹介することを意識しました。そもそも発端はどんな研究なのか、今どういう風になっているのか、というのを追えるようにしているイメージです。

模倣学習は解説の記事があまりなく、解説を書くのに苦労しました(特にSMILe)。GAILは当初入っていなかったのですが、GAILをベースにした研究も多くなっている現状を鑑みて終盤に差し込みました。

逆強化学習については解説も実装も資料があまりなく、執筆に苦労しました。特にベイジアンの逆強化学習の実装は以下のリポジトリがなければ多分本書には乗ってなかったと思います。感謝です。

Day7: 強化学習の活用領域

Day7は強化学習を実際どう使えば良いかのガイドにすることを意識して書きました。「強化学習って結局ゲームにしか使えないんでしょ?」というところを超えたいなと。そのため、Day6と同様単に事例を列挙するのでなく実用化する方法を体系的に整理し、その体系に沿い事例を紹介するという形にしています。

以上が各章の紹介となります。本書をきっかけに強化学習を学ぶ人が増える、そしてなにより学んだ方が力を活かせるような応用が始まるきっかけとなれば幸いです。

--

--

piqcy
programming-soda

All change is not growth, as all movement is not forward. Ellen Glasgow