フューチャー技術ブログ

強化学習を学びたい人が最初に読む本 を読んだ感想

はじめに

2022年12月キャリア入社の大村俊輔です。

強化学習を学びたい人が最初に読む本の感想です。本記事で2本目の投稿となります。

本書を読んだ背景

本書を読む前の、わたしの強化学習の理解状況を最初にお伝えします。

  • 機械学習を3つに分類する際の1分野であること
    • 教師あり学習(回帰や分類等)
    • 教師なし学習(分類等)
    • 強化学習(ゲーム等)
  • 取り得る状態の数が小さければ全ての状態に対し
    • 全探索により厳密解を求める
    • ランダムな試行を繰り返し、良さそうな解を求める

…等で対応できるが、取り得る状態の数が大きい(一説では囲碁の取り得る盤面は10の200乗を超える!)ととても対応できないことが問題であった。

  • そのようなケースで、状態をニューラルネットワークの形で持つことで、上記問題に上手く対応する手法である
  • 私としては、簡単なニューラルネットワークは実装できるので、理論を理解できれば強化学習で遊ぶことくらいはできそう
  • ただ、強化学習の理論は難しく、私に合った入門教材も見当たらないので手を出せない

…程度の認識でした。

なお、本書は業務に役立てる知識を得るためではなく、単純に面白そうなので学びました。

本書の特徴

本書は読んで学ぶ本ではなく、次の様な流れで学ぶスタイルであることが特徴です。

  1. まず人間が簡単なゲームを体験してみる
  2. サンプルプログラムを使用してプログラムにゲームをさせる
  3. サンプルプログラムのコードの丁寧な解説を読みながら、自分でもコードを書き替えて理解する

教師あり学習のゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装が合う方と相性が良いと思います。

目次

章立ては下記の通りです。

第1章 強化学習の位置づけ
1.1 この本の概要
1.2 AI
1.3 教師あり学習
1.4 教師なし学習
1.5 強化学習
1.6 ニューラルネットワーク・ディープラーニング
第2章 Pyhtonの環境構築
2.1 Pythonのインストール
2.2 仮想環境の構築とライブラリのインストール
2.3 iRLのダウンロードと展開
第3章 教師あり学習
3.1 1次元入力の線形回帰モデル
3.1.1 データの準備
3.1.2 予想をすることは線を引くこと
3.1.3 線形回帰モデル(直線モデル)
3.1.4 平均二乗誤差(MSE)
3.1.5 勾配法
3.1.6 解析解
3.2 1次元入力のニューラルネットワークモデル
3.2.1 神経細胞(ニューロン)
3.2.2 ニューロンモデル
3.2.3 ニューラルネットワークモデル
3.2.4 ReLU活性化関数
3.2.5 オーバーフィッティング
3.3 一般的なニューラルネットワークモデル
第4章 強化学習の問題設定
4.1 強化学習を体験
4.1.1 タスクをあなたがプレイ
4.1.2 タスクを強化学習アルゴリズムがプレイ
4.2 環境
4.2.1 状態
4.2.2 観測
4.2.3 報酬
4.2.4 時系列で見た情報のやり取り
4.3 強化学習の目的
4.3.1 期待値
4.3.2 報酬和
第5章 基本のQ学習:tableQ
5.1 理論
5.1.1 平均の更新則
5.1.2 動的計画法
5.1.3 Q学習のアルゴリズム
5.2 実装
5.2.1 全体のプログラム構成
5.2.2 インターフェース(抽象クラス)
5.2.3 コリドータスク(環境クラス)
5.2.4 Q学習(エージェントクラス)
第6章 ニューラルネットQ学習:netQ
6.1 フィールドタスクを体験
6.1.1 壁なしフィールドタスク:no_wall
6.1.2 固定迷路のタスク:fixed_wall
6.1.3 ランダムな迷路のタスク:random_wall
6.2 ニューラルネットQ学習
6.2.1 netQの仕組み
6.2.2 netQの実装
6.2.3 netQのQ値の確認
6.3 netQ以外のプログラムの実装
6.3.1 フィールドタスク
6.3.2 トレーナー
6.3.3 実行ファイル
第7章 経験再生を取り入れたQ学習:replayQ、targetQ
7.1 経験再生:replayQ
7.1.1 経験再生Q学習のテスト
7.1.2 経験再生の仕組み
7.1.3 経験再生Q学習の実装
7.2 ターゲットネットワークの利用:targetQ
7.2.1 ターゲットネットワークQ学習のテスト
7.2.2 ターゲットネットワークの仕組み
7.2.3 ターゲットネットワークQ学習の実装
第8章 改良と工夫
8.1 新しい環境とエージェントの作り方
8.1.1 フィールドタスクにタスクタイプを追加する
8.1.2 新しい環境を実装する
8.1.3 新しいエージェントを実装する
8.2 ハイパーパラメータの決め方
8.3 強化学習の改良と工夫
8.3.1 環境の発展性
8.3.2 Qネットワークの多層化
8.3.3 画像入力対応:CNN
8.3.4 さらなる安定化:Double DQN
8.3.5 連続行動への対応:方策分配法
8.3.6 POMDP 対策1:連続した観測をひとまとめ
8.3.7 POMDP 対策2:LSTM
講座A Visual Studio Codeのインストールと使い方
A-1 Visual Studio Codeのインストール
A-2 設定
A-3 Visual Studio Codeの使い方
講座B Pythonの基本
B-1 変数を使う:対話モード
B-2 制御文と関数を使う:Jupyter Notebook
B-3 Numpyでベクトルと行列を扱う:Jupyter Notebook
B-4 Matplotlibでグラフを描く:Jupyter Notebook

本書の良かった点と注意事項

1章

まずは機械学習における強化学習の立ち位置と、強化学習の歴史について広く浅く簡単に復習できます。

2章

以降のPythonプログラムを実行するための環境構築です。AnacondaではなくMinicondaであったり、少々古めのバージョンのライブラリが指定されていたりと少々変わった環境を求められますが、基本的に書かれた通りに実行すれば良いです。ただ、古いPCで、CPUがAVXに対応していない場合、TensorFlowはこちらのAVX非対応のTensorFlowを使用する等の対応が必要です。

3章

ここから本書の良さが実感できると思います。

内容はまだこの後の章で使用するための教師あり学習で、直線の線形回帰モデルから平均二乗誤差(MSE)、勾配法、ニューラルネットワークを扱います。それぞれ丁寧な解説付きのコードと共に解説があり、結果のグラフ表示と併せて学ぶことで理解が深まります。

特に、パラメータとMSEの関係を等高線グラフや3Dグラフでイメージを持つ工程は習慣化したいですね。

4章

ここから強化学習に入ります。

まずは簡単なゲームを行い、ゲームのイメージを持ちます。

  • 横4マスの盤面があり、一番左にロボットがいて、右から1番、もしくは2番目(ゲーム開始時にランダムに決定されます)にクリスタルがあります。
  • ロボットは「進む」、「拾う」の2種類の動作が可能で、「拾う」は1回のみ実行可能です。
     (つまり、クリスタルの上で「拾う」ができれば成功、そうでなければ失敗)
コリ.jpg

5章

4章の簡単なゲームを解くプログラムを作成します。

各状態からの行動に対する価値(Q値)をまとめたQテーブルを作成します。

また、「ゲーム」そのもののコードについても解説してありますので、ゲームを少し改編して試してみるのも良いかと思います。

6章

ゲームがこれまでより難しくなりました。

  1. 盤面は2次元でロボットは中央、クリスタルは1つで配置はランダム-状態数81

    no.jpg
  2. 盤面は2次元でロボットの位置はランダム、クリスタルは1つで配置は固定だが壁もある-状態数約150(ロボットから縦横2マス以内は明るく表示、この領域を見えている領域とみなしてプレイ)

    fix.jpg
  3. 盤面は2次元でロボットの位置は中央、クリスタルと壁は4つずつで配置もランダム-状態数5千万以上(全クリスタルを回収できない盤面は現れない)

    rand.jpg

1, 2のように状態数が81や約150であればあ5章と同様にQテーブルを作成すれば良いですが、3.のように状態数が5千万を超えてくると、Qテーブルの作成は現実的ではありません。

そこで状態をニューラルネットの形で持つことにします。ここからは、本で内容を理解するというより、プログラムを動かしながら理解することになります。

これだけでも私がゲームをする場合と比べてもあまり遜色ないような気がします・・

7章

6章の3.ですでにそこそこの性能が出ていましたが、ときどきロボットがウロウロしてクリスタルを探しにいけないこともありました。

それを改善するために、なぜそれでプログラムの性能が向上するのかの解説と共に以下の2点を組み込みます。

  • 経験再生(Experience Replay)
  • ターゲットネットワーク(Target Network)

この時点で、もう私ではプログラムに勝てる気がしません。

高性能な強化学習プログラムが、囲碁や将棋で人間より強くなることを理解できた気がします。

8章

これまでのゲームをより複雑にしたり、組み込んだニューラルネットワークを変更したりと、これまでの学習内容を他のタスクに応用するためのヒントで締めくくられています。

本書では扱わない点

本書一冊で強化学習を何かに応用することは難しいと思います。あくまで強化学習に入門するための本で、応用が目的であれば他の教材で学ぶ必要があると思います。

最後に

強化学習を学びたい人が最初に読む本により、実際にプログラムを動かしながら強化学習の基礎を学ぶことができました。これで他の強化学習の教材で学ぶこともできるようになったと思いますので、これまで手を出せなかった少し難しい本にも挑戦したいと思います。

強化学習以外にも、常に新たな学びにつながる本を探し、その内容を記事にしていきたいと思いますので、その際もお読みいただければ幸いです。