「倒立振子の作り方 ゼロから学ぶ強化学習 ~物理シミュレーション×機械学習~」出版決定(発売日:2019年2月10日)
倒立振子の作り方 ゼロから学ぶ強化学習
~物理シミュレーション×機械学習~
著者 遠藤 理平
出版社 株式会社カットシステム
判型 B5変型、160頁
本体価格 2,400円(税込 2,592円)
ISBN 978-4-87783-440-1
はじめに
小学生の時分、雨上がりの学校からの帰り道で、「手のひらに乗せた傘」を倒さないように歩いた経験は誰にでもあると思います。「傘の角度」や手に感じる「傘から受ける力」などの情報をもとに、状況を瞬間的に判断して最適な行動を取ることで傘の状態を維持しますが、誰に教わるでもなく、練習を重ねることで誰でも出来るようになります。反対に、行動指針を言葉で説明しようとすると、冗長でわかりにくい表現にならざるを得ません。
このように言葉で説明するのは難しいが、練習により失敗と成功を繰り返すことで習得できる認知のことを暗黙知と呼びます。自転車に乗る、ブランコを漕ぐ、などの動作が、その代表例となります。反対に、言葉や図表、法則などで表現できる知識は形式知と呼ばれ、科学・技術と高い親和性がある領域となります。
昨今の人工知能と評される機械学習は、人間が設定した目的に対して「試行錯誤の反復訓練」を行うことで、期待値が高い行動を学習できるものです。つまり、コンピュータには苦手な領域とされていた暗黙知を従来の技術基盤に取り込むという、全く新しい価値創造の可能性を意味しています。
本書は、コンピュータを用いて物理現象を再現する「物理シミュレーション」と、与えられた環境内で目的に応じて最適な行動を決定する「強化学習」を組み合わせて解説する書籍です。先ほど例として紹介した「手のひらに乗せた傘」をモデル化した倒立振子を対象に強化学習の方法を解説していきます。
本書は大きく分けて、前半4章と後半6章の2 部構成になっています。前半は、3 ×3のマス目に○(先手)と×( 後手)のマークを交互に埋めていき、「縦・横・斜めのいずれかで同じマークが3 つ並ぶと勝ち」という2 人対決ゲーム( 三目並べ)を題材にして強化学習の基本を解説します。その結果を踏まえて、コンピュータ対戦型の三目並べ(Web ブラウザゲーム)を開発します。実行環境にWeb ブラウザを利用するため、HTML5(JavaScript)を使ってゲームを開発します。
後半は、振り子運動のシミュレーションの実装方法を解説し、その後、倒立振子を強化学習と組み合わせて実現するために必要な要素を順番に解説していきます。物理シミュレーションは計算量が多いため、プログラミング言語としてC++を利用します。
最後に、本書の執筆の機会を頂きました株式会社カットシステムの石塚勝敏さん、非常に丁寧な編集を行なって頂きました阿久澤裕樹さん、また、日常的に議論に付き合って頂いている特定非営利活動法人natural scienceの皆さんに深く感謝申し上げます。
2019年1月
遠藤理平
目次
- 第1章 強化学習で三目並べを学習させよう!
- 1.1 強化学習の概念
- 1.2 環境・エージェント・状態・行動の定義
- 1.3 状態と行動の三目並べにおける具体例
- 1.4 報酬の定義
- 1.5 行動評価関数の定義とQ学習のアルゴリズム
- 1.6 Q学習アルゴリズムの導出
- 1.7 行動選択の方法
- 第2章 三目並べ全状態の列挙方法
- 2.1 対称性の確認
- 2.2 対称操作の方法
- 2.3 状態の定義と重複チェックの方法
- 2.4 対称性を考慮した全状態を列挙
- 2.5 勝敗決定時に終了する場合の全状態
- 第3章 三目並べの強化学習
- 3.1 三目並べにおける行動評価関数の更新方法
- 3.2 三目並べ強化学習の環境を表現するEnvironmentクラス
- 3.2.1 Environmentクラスのメンバ変数とメンバ関数
- 3.2.2 Environmentクラスのコンストラクタ
- 3.2.3 Environmentクラスのlearn関数
- 3.2.4 EnvironmentクラスのcheckLine関数
- 3.3 三目並べ強化学習のエージェントを表現するAgentクラス
- 3.3.1 Agentクラスのメンバ変数とメンバ関数
- 3.3.2 AgentクラスのselectNextMove関数
- 3.3.3 AgentクラスのselectNextMoveUseEpsilon関数
- 3.3.4 AgentクラスのselectNextMoveUseBoltzman関数
- 3.3.5 AgentクラスのupdateQfunction関数
- 3.3.6 AgentクラスのgivePenalty関数
- 3.4 三目並べゲームの開発
- 第4章 強化学習成果のパラメータ依存性
- 4.1 強化学習の実行方法
- 4.2 学習成果の検証方法
- 4.3 ランダム法の成果
- 4.4 Epsilon-Greedy法を用いた学習
- 4.5 Epsilon-Greedy法の$\epsilon$依存性
- 4.6 ボルツマン法を用いた学習
- 4.7 ボルツマン法の$beta$依存性
- 4.8 学習回数ごとにパラメータを変化させる学習法
- 4.8 ペナルティ値の依存性
- 4.9 割引率依存性
- 4.10 最適パラメータによる学習成果
- 4.11 コンピュータ対戦型三目並べゲーム
- 第5章 振子運動のシミュレーション方法
- 5.1 倒立振子の数理モデル
- 5.2 張力の導出
- 5.3 ルンゲ・クッタ法を用いたプログラミングの方法
- 5.4 Vector3クラスのヘッダーファイル
- 5.5 RK4_Nbodyクラスのヘッダーファイル
- 第6章 振子運動シミュレーション
- 6.1 動作確認1:おもりに初速度を与えた場合
- 6.2 動作確認2:滑車に周期的な力を与えた場合
- 6.3 単振子運動シミュレーション
- 6.4 強制振動運動シミュレーション
- 第7章 強化学習で倒立振子シミュレーション
- 7.1 倒立振子運動に対する強化学習の実装
- 7.1.1 強化学習の状態と行動の定義
- 7.1.2 振り子の角度と角速度の計算方法
- 7.1.3 メイン関数での実行内容
- 7.1.4 環境(Environmentクラス)のメンバ
- 7.1.5 エージェント(Agentクラス)のメンバ
- 7.2 環境(Agentクラス)の実装
- 7.2.1 learn関数
- 7.2.2 learnOneTerm関数
- 7.2.3 createRanking関数
- 7.2.4 learnOneEpisode関数
- 7.2.5 ouputProbabilityOfSuccess関数
- 7.2.6 outputBestLocus関数
- 7.3 エージェント(Agentクラス)の実装
- 7.3.1 setInitialCondition関数
- 7.3.2 getXIndex関数
- 7.3.3 checkState関数
- 7.3.4 updateQvalue関数
- 7.3.5 selectNextAction関数
- 7.3.6 giveReword関数
- 7.1 倒立振子運動に対する強化学習の実装
- 第8章 倒立状態維持の強化学習
- 8.1 学習対象と報酬の定義
- 8.2 基本パラメータによる学習結果
- 8.3 原点近傍近くに縛る報酬の与え方
- 8.4 最適な割引率について
- 第9章 最下点から強制振動運動の強化学習
- 9.1 学習対象の報酬の定義
- 9.2 成功と失敗の設定
- 9.3 学習結果
- 第10章 最下点から倒立状態維持の強化学習
- 10.1 学習対象の報酬の定義
- 10.2 成功と失敗の設定
- 10.3 学習結果
- 10.4 最適な$A_p$の探索
- 10.5 最適なパラメータの探索時のメモ