はじめに
AIの進化が著しい昨今ですが、その技術や実装がどのようなものか、恥ずかしながら僕には見当がつきません。
今更ながら「機械学習はどのような作りになっているのか」、「AIを自作することは可能なのか」と気になり、軽い気持ちで本記事を書いてみました。
今回はQ学習について概要までにとどめ、次回でC++による実装とともに詳細に触れていきたいと思います。
素人の初学者のため、記事に誤りがあるかもしれません。
もし、間違いに気づかれた方がおりましたら、お手数ですがご指摘いただけますと幸いです。
強化学習
機械学習の実装について興味を持った理由をもう少し話しますと、僕は将棋が好きなのですね。
将棋をよく観る方はご存知でしょうが、AIが盤面状態から形勢を判断し、次の一手の候補手を提示し、その手を指すと形勢がどう変動するかまで表示してくれます。
それを見て「AIを自作できれば、常に自分と互角の手を指す将棋相手ができるんじゃね?」と思ったのです(既にそのようなAI将棋ソフトは出ているようですね)。
そして、「将棋に適した機械学習は何だろう?」と思い、最初に目を付けたのが強化学習です
(実際には様々な学習を組み合わせているのでしょうが、いきなりそこまでは踏み込めません)。
強化学習とは何か。その概念は昔からあるようです。
スキナー箱の実験が有名でしょうか。
レバーを押すと餌が出る仕掛けを用意した箱の中にネズミを入れます。
やがてその仕掛けに気づいたネズミは頻繁にレバーを押すようになっていきます。
最終的には餌が出なくなっても、レバーを押し続けるという。
近代的な例としては。
とある男が「有償ガチャ」ボタンを押すとSSR「俺の嫁」をゲットできることに気が付きます。
男は延々とガチャボタンを押し続けたという、、、血の涙を流しながら...。
上記の例のように「行動の結果に報酬を付与し、特定の行動を強化する」、この仕組みを強化学習と呼びます。
Q学習
Q学習は強化学習の手法の一つです。
Q学習のアルゴリズムをC++に書き起こしていく前に、予備知識として用語や学習手順の理解から入りたいと思います。
用語
環境:Q学習を行う世界です。前述の「スキナー箱」が環境に該当します。
状態:環境の現在の状況です。将棋でいえば、盤上の駒配置や持ち駒はどのようなものか、を指します。
行動:状態に対してどのように振る舞うかです。例えば、株価の高騰状態で買増/売却/静観などを選択することです。
エージェント:行動を選択し、学習する人(※1)を指します。
報酬:行動によって得られる数値です。適切な行動を選択すれば+100点、致命的な行動であれば-100点など。
政策(ポリシー):行動を選択するためのルールです。ランダムに行動し学習の幅を拡げたり、現在の学習状態から最適な行動を選択し強化する、などの方針です。
学習率:学習の速度です。数値が高ければ新しい学習を高く評価し、低ければ長期間で安定的に学習を進めていきます(※2)。
Q値:強化された行動、価値の高い行動の指標となります。状態に対して行動を選択する度に、長期的・将来的に最も価値が高い行動に結びつくよう更新されます。
※1:「人」と表現しましたが、人間(や動物)とは限りません。次回の例で取り扱う予定ですが、行動を選択するのはプログラムです。この場合、エージェントは「プログラム」ということになります。
※2:人はギャンブルで負けているにも関わらず、なぜ依存してしまうのか。勝ったときの学習率が高く、負けたときの学習率が低いからなのですね、きっと。
学習手順
用語の列挙により、Q学習に登場する要素が分かりました。
次はこれらの要素をどのように扱い、学習を進めていけばいいのか。
学習手順は下記の2つのサイトを参考にしております。
はじめての強化学習〜Q-learningで迷路を解く〜
強化学習手法の一つ「Q学習」をなるべくわかりやすく解説してみた
両者ともに下記の手順で学習を進めています。
両サイトの記述を見比べていたところ、手順としてはほぼ差がないのですが、実際の処理レベルでは微妙な差(詳細は次回に触れます)がありました。
- 報酬の設定
- Q値を初期化
- 状態を初期状態にセット
- エージェントの行動を選択
- Q値を更新
- ゴール到達まで4と5を繰り返す
- Q値がいい感じになるまで3に戻る
ここまでの予備知識を頭に入れた段階で、ようやく「無限のリソースがなければ将棋の学習は無理だ」となりました。
9x9の盤面に40の駒の配置パターンすべてを状態として網羅し、さらに、すべての次の一手を行動として評価する必要があります。
個人のPCのリソースで実装できる範疇を余裕で振り切っていますね。
準備
言葉だけの説明ではピンと来ませんし、学習の手順を実装したとしても、その経過や結果が目に見えなければ体感につながりません。
前述の学習手順を参考にしたサイトは、奇しくも両方が迷路探索を取り扱っていました。
「迷路は初学者でも理解しやすい」とのことですので、それに倣いまして、ここでも迷路探索を扱おうと思います。
迷路の生成
Q学習の環境となる迷路は「棒倒し法」で生成します。
この手法では最短経路が一意となりますが、複数ある場合の学習も気になりますので、少しアレンジを加えたパターンも用意します。
学習の可視化
一つの迷路に対して、二つのQ学習手順によるQ値を可視化します。
また、学習の結果として、Q値に従うとどのような経路をたどるかも可視化します。
次回予告
環境(迷路)を生成し、Q値を可視化し、学習結果で得られた経路も可視化され、これで準備が整いました。
次回はQ学習の学習手順と、そのサンプルコード、Q値を並べ、詳細に触れていきたいと思います。