強化学習の基礎解説からPythonで実装まで
本記事では強化学習について、初学者向けにわかりやすく解説していきたいと思います。
強化学習を学ぶ上で、以下の2点をこの記事内の目標とします。
・強化学習(Q学習)の基礎理解
・簡単な強化学習エージェントをPythonで実装・検証
強化学習を学習中の方は是非参考にしてみてください!
強化学習とは
機械学習は大きく3つの手法に分けられます。
・教師あり学習
・教師なし学習
・強化学習
![](https://lamasami.tech/wp-content/uploads/2022/05/西部電機株式会社御中_ご提案資料20220525-1.png)
強化学習以外の学習手法については詳しく触れませんが、簡潔に言うと、
・教師あり学習は、教師データと呼ばれるデータから、未知のデータを予測する学習手法
・教師なし学習は、データから法則を見つけたり、グループ分けができる学習手法
このような学習手法となります。
では強化学習についてです。
強化学習とは、
とある環境で設定した目標に向けて、行動とその行動に対する報酬(評価値)により、
適応的に行動を学習する学習制御手法です。
自動で荷物を搬送してくれるロボットを例にすると、
・目標 … 搬送する棚までの最短ルート
・環境 … 搬送する倉庫内
・行動 … 1歩、1歩、とある方向へ進むこと
・報酬 … 行動の結果に対する評価値
これを繰り返し、最も良い行動を目指して適応していくようなイメージです。
ここで、強化学習で使用するの用語について定義しておきます。
用語 | 意味 | 例(搬送ロボットとして) |
エージェント(学習器) | 行動を行う本体 | 搬送ロボット本体 |
環境 | エージェントが動く空間 | 作業する倉庫自体 |
状態 | エージェントや環境の情報 | エージェントの向き、そのマスの周りに何があるか |
行動 | エージェントが行う行動 | 1マス進む(右、左、前、後ろ…) |
報酬 | その行動に対する評価 | 壁、障害物に当たらずに前に進んだか |
Q値 | 行動に対する将来的な価値 | 目標地に近づいているか |
搬送ロボットの例と各用語をイメージ図に落とし込んでみると以下のようになります。
![](https://lamasami.tech/wp-content/uploads/2022/06/強化学習サンプルスライド-3.png)
Q値については以下で解説します。
Q-Learning(Q学習)
強化学習にはQ -Learning(Q学習)をはじめ、モンテカルロ法などいくつかありますが、今回はその中でも代表的な手法であるQ学習についてまとめていきます。
まず、強化学習の理論として、上でも説明したように、
状態s で 行動aを行った時の報酬rをエージェントに返す…これを一連の動きとします。
エージェントは各行動によって更新された状態sに対して次の行動aを行っていく…
そして得られる報酬を最大にすることが強化学習の理論となります。
Q学習では、その各行動の価値をQ値として評価し、行動価値関数Q(Qテーブル)に各行動におけるQ値を保存していきます。
![](https://lamasami.tech/wp-content/uploads/2022/06/強化学習サンプルスライド-4.png)
Q値の更新式は以下の式です。
![](https://lamasami.tech/wp-content/uploads/2022/05/強化学習サンプルスライド-2.png)
赤線部分では、遷移した状態で一番期待値の高い部分を抽出しております。
そこにγ(割引率)をかけます。
割引率はどれほど遷移先のQ値を利用するのか決めるパラメータです。
0〜1の範囲で、0に近いほど目先の報酬を重視する傾向となります。
学習率は更新の大きさを決めるパラメータです。
こちらも0〜1の範囲で設定します。
ちなみに、学習率から右側の括弧内をTD誤差と呼びます。
Q学習では学習が進むにつれてこの誤差を小さくするように学習されていきます。
学習の流れ
まずはスタートの状態sからエージェントが行動aを選択します。
この行動に対して環境から、報酬r と 遷移先の状態s’が返ってきます。
その値を先ほどの数式でQ値を更新します。
ここでは、遷移された状態s’の一番高いQ値を使ってQ値を更新し、次の行動aを選択します。
この一連の学習を繰り返していく事がQ学習の進み方となります。
Q値、報酬の違い
ここまでくると、報酬rとQ値って一緒じゃない?
と感じてくる人も多いと思います。
ややこしいのですが、これらは別物です。
それぞれをわかりやすく言うと
名称 | 別の言い方 | 意味 |
報酬r | 即時報酬 | 1つの行動に対する評価として受け取る評価値 |
Q値 | 状態行動価値 | 将来的な行動・状態の価値を表す評価値 |
テトリスやぷよぷよみたいなブロックゲームの1つのアクションを行動aとして例えると、
- 1つの塊でブロックを消してポイントを稼ぐ
- → その時にもらえる報酬rが高い
- まとめてブロックを消すと高ポイントのため、ブロックを貯める
- → 即時報酬はなくても、将来的なポイントが期待できる(Q値が高い)
僕はこのような解釈で区別についてイメージができました。
テトリスとかぷよぷよを知らない方は、パズドラのようなブロックゲームのイメージが近いかもしれません…m(__)m
Pythonで強化学習を実装
それでは、早速Q学習をやってみましょう。
問題定義としては先ほど例にした搬送ロボットを実装してみます。
![](https://lamasami.tech/wp-content/uploads/2022/06/強化学習サンプルスライド-5.png)
このような環境で左下の搬送ロボットに荷物を運んでもらいます。
目的としては、右上の目的地まで最短で荷物を運んでもらうことにします。
状態は各マスのことを表し、行動は各マスを上下左右に移動することを言います。
各マスの報酬は以下のとおりとします。
![](https://lamasami.tech/wp-content/uploads/2022/06/強化学習サンプルスライド-6.png)
学習サイクルとして、1つのエピソード(エポック)という単位でこの学習を行います。
空白のマスなら報酬は0、棚のあるマスや、このフィールド外に出ようとした場合は、−1の報酬を与えます。
エピソードの終わりとしては、
・目的地に到達
・障害物のマスを通る
どちらかで1つのエピソードが終了
そうすると、左下のスタート位置に戻って次のエピソードを開始するサイクルです。
このエピソードを繰り返すことで、最終的には最短ルートで目的地まで進んでくれるエージェントになってくれるはずです。
Pythonコードと実装結果
以下がpythonのコードです。JupyterNotebookなどにコピーして実行してもらえれば、そのまま動きますので実際に動かしてみてください。
コードの中身は以下で簡単に解説します。
1~4行目までは使うライブラリ、そこから下は実際に動く強化学習エージェントを定義してます。
エージェントの各メソッドについては、
22~36行まででまず状態とQテーブルを初期化しています。
38~48行のactでは、エージェントが次に行動する向きを選択します。
50~63行のobserveでは、その行動で報酬を観測した場合の学習について、
65~74行のlearnでは報酬を渡してQ値を更新する処理を定義しています。
GridEnvクラスでは、実際にエージェントが動く環境を定義しています。
コンストラクタとして、各マスの情報、行動する方向、環境のMAP情報、スタート位置これらを定義しています。
30~52行のstepメソッドに、動く方向を渡して行動します。
このメソッドの戻り値として、変化した状態、報酬、ゴールかどうかを受け取ります。
54行目以降は、それぞれのマスの状態を判定するためのメソッドです。
それでは、ここまでで定義したエージェントと環境を使って、強化学習エージェントに荷物を運ぶ学習をしてもらいます。
今回の検証で以下のパラメータを設定します。
・エピソード:100回
・探索率:0.1
・学習率:0.1
・割引率:0.90
100回エピソードを繰り返すことで、どのようになるのか検証していきます。
実行結果
先ほどまでのコードを実行すると以下のようにプロットされます。
※実行ごとに多少誤差があるのでうまく学習が進まない方は何度か実行してみてください。
最初の数回のエピソードでは報酬にバラつきがありますが、以降は100あたりの報酬で安定してます。
19~21行のリストで各行動や報酬を保存しているのでみてみましょう。
### 実行結果
# 最初のエピソードの行動・報酬30回分行動の履歴:[0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0]
報酬の履歴:[0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
最初のエピソードの行動と報酬は、適当に30回分表示してみました。
最初の4回は0の方向(上)に進み、5回目の行動で2の方向(左)に進んでおり、枠外なのでマイナスの報酬が計上されています。
そして以降もなかなか思うように学習が進んでおらず、目的地、障害物どちらにも達していません。
次に、学習を進めた後の最後のエピソードについて見てみましょう。
![](https://lamasami.tech/wp-content/uploads/2022/06/強化学習サンプルスライド-7.png)
この課題の最適ルートは、0の方向へ6マス、3の方向へ3マス進むことであるため、
最後のエピソードの行動と報酬は9回分を表示してみます。
### 実行結果
# 最後のエピソードの行動・報酬9回分
行動の履歴:[0, 0, 0, 0, 0, 0, 3, 3, 3]
報酬の履歴:[0, 0, 0, 0, 0, 0, 0, 0, 100]
期待通り、0方向へ6回、3方向へ3回進んでおり、最後の行動で報酬100を得ているので、
無事に良い学習ができていることが確認できました。
まとめ
今回は強化学習の中でも代表的な手法であるQ学習を学んでいきました。
個人的には、かなりシンプルな問題として考えてみると、イメージがしやすい印象がありました。
Q学習は、今回の例にも挙げたような自動倉庫の搬送ロボットだけでなく、ゲームや自動運転技術など様々な分野で活用されています。
強化学習は今後も色々な業界に参入する可能性が高いので、今後も色々と情報収集していきたいと思います。
また、強化学習とあわせて使う事の多い数理最適化問題について、Pythonを使った解説記事がありますので、よろしければご覧ください。
あとがき
今回の学習にあたって、こちらのブログ記事が非常に参考になりましたので、僕の記事で分かりにくかった方は、是非ご覧になってみてください!
![](https://lamasami.tech/wp-content/uploads/cocoon-resources/blog-card-cache/e6e1ebaefb279c7315bbbaf29499ee5e.gif)