テクノロジー

強化学習を勉強するなら必須!「Q学習」の基礎〜実装まで完全ガイド

強化学習を勉強するなら必須!「Q学習」の基礎〜実装まで完全ガイド

機械学習を語る上で最も有名なのが、囲碁の世界チャンピオンに勝利したGoogle社のAlphaGoの例ですよね。実はこのAlphaGoでは強化学習という方法を採用し、Q学習を行うことで人間の能力を凌駕しました。

なお、この強化学習とは他の学習方法である教師あり学習、教師なし学習のようにデータを用意して機械学習するものではありません。わかりやすいイメージとしては犬にお座りを教える際に正しく行動した際にはおやつを与え、そうでないときには与えないようにして調教する様子が当てはまるでしょう。その中でも、Q学習が必要になります。

そこで今回は、強化学習を理解していく上で必須の知識であるQ学習の基礎から実装までを詳しくお伝えします。ぜひ、AI(人工知能)開発において画期的な強化学習、およびQ学習の内容をしっかりと把握し、みなさんで扱ってみましょう。

まずは強化学習について知っておこう

強化学習のイメージ
強化学習について学ぶ前に、以下の機械学習の方法について説明します。

  1. 教師あり学習
  2. 教師なし学習

まず、1の教師あり学習とはデータに正解というラベルを付けて学習を行う方法です。例えば、猫の画像を読み取らせたい場合には正解データである猫の画像と不正解データの画像を用意して、両者を学習させていくことで入力と出力の関係を学習します。これによってデータを分類したり、予測することが可能です。

一方で、2の教師なし学習ではラベル付けを行わずに学習させます。例えば、犬と猫と鳥の画像データを用意して教師なし学習を行わせると、それぞれにどのような特徴があるのかを読み取って、そこからこの場合は犬、または猫に近いものだとグループ分けを行います。このようにしてデータをクラスタリングしていくのが教師なし学習です。

以上のようにデータをラベル付けをする、しないのかで学習を行うのが両者の方法でした。これらに対して強化学習では報酬を与えることで学習を行うため、上の2つとは学習のスタンスが大きく異なります。

具体的には以下を用意して学習を行わせます。

  • エージェント:学習を行う対象
  • 環境:学習環境
  • 状態:エージェントの状態を示す
  • 行動:エージェントが取れる行動
  • 報酬:行動に対する報酬

わかりやすい例として犬にお座りを教える様子で上を説明します。この場合では学習を行うエージェントは犬であり、状態は目の前で立っています。そして、取りうる行動としては「おすわり」という言葉で座る、もしくは無視するなどの行動を取るとしましょう。

この状況で上手く座れた場合のみおやつ(報酬)を与えるようにして、犬に命令を繰り返す一連の流れを行うのが強化学習です。実際にこのような調教を施した場合では「おすわり」という言葉で座れれば、指示に従えばおやつがもらえると理解できるため、指示に沿うでしょう。

つまり、強化学習とは報酬を最大化するように学習を行うことを指します。そして、この強化学習の最もオーソドックスな方法が今回お伝えするQ学習です。

それでは、次の章からQ学習の基礎とアルゴリズムなどを詳しく解説します。

Q学習とは

Q学習のイメージ
先ほど説明した犬におすわりを教える例では、おやつを報酬として与えることで学習させました。この場合相手は動物なのですぐにおやつをもらう行動をするとは限らないため、何度も繰り返すことで調教を行います。

なお、強化学習では学習過程の状態と行動、報酬をひとまとめにして1ステップとし、全ステップをエピソードと呼びます。したがって、報酬を最大化する場合では短期的な報酬、犬の場合ではあるタイミングでおやつをもらえた場合だけをみても意味はありません。

この場合はエピソードの中で長期的にどのような報酬をもらえるのか考え、学習を進めていくことが大切になります。ですから、強化学習では状態行動価値(Q値)によって学習を進めます。

こちらについてはある状態における行動の価値をみていくもので、以下のように表現可能です。

  • 状態:s
  • 行動:a
  • 状態行動価値(Q値):Q(s,a)

ただし、実際にこのQ値を最大化にはいくつかのアプローチがあり、今回紹介するQ学習は現時点でのQ値を更新して最大化します。例えば、ある時点でのQ値がQ1とした場合に次に予想されるQ値をQ2としましょう。

この際にQ1よりもQ2の値が高くなるように学習を進めていくのがQ学習です。これによって学習を深めていけば最適解を導き出すことが可能になります。より詳しいQ学習のアルゴリズムについては次で解説しましょう。

また、Q学習ではQ値を導き出す際には報酬を設定した上で要素である状態と行動を把握する必要があります。例として以下のような2×3のマス目を用意して、任意の地点をスタートにしてF地点をゴールにして移動する(その場で停止することもOK)ゲームを考えましょう。

マス目
A B C
D E F

そして、ゴール地点であるFに移動した場合に報酬100が発生すると、現時点での状態と行動によってとれる選択と得られる利益が異なります。例えば、A地点からではB、Dにしか移動できず、この場合には報酬はもらえません。

一方でC、E地点ではゴールのF地点に隣接しているため、Fに移動すれば報酬がもらえます。したがって、これらの情報を表にまとめ、アルゴリズムの計算式に当てはめていくことでAからBに移動したQ(A,B)、CからFに移動したQ(C,F)が求められます。

このようなQ値が計算できれば以下のような表にまとめ、ステップを重ねていくとどのような行動をとるのが適切か、数値で判別できます。これがQ学習という手法での強化学習です。

A B C D E F ←行動
A X X X X X X
B X X X X X X
C X X X X X X
D X X X X X X
E X X X X X X
F X X X X X X

状態

Q学習のアルゴリズム

アルゴリズムのイメージ
Q学習のアルゴリズムは以下のよう簡単な式で表現可能です。

Q(st,at)←(1−α)Q(st,at)+α(rt+1+γmaxat+1Q(st+1,at+1))

各所を説明していくとQ(st,at)はある時点tにおける状態s、行動aによるQ値です。そして、αはQ学習の学習率を示すもので0~1の値を取り、これによって新たなQ値を更新します。

なお、αが0に近づくほど式の2項目が意味をなくしQ値の更新がなされなくなり、1に近づくほど式の1項目が意味をなくし高い頻度で更新される仕組みです。続いてrは報酬を意味し、rt+1は次の状態での報酬がどうなっているのかを意味します。

また、γは割引率と呼ばれ0~1の値を取り、0に近くなるほどその場の報酬を重視し、逆に1に近づくと将来の報酬を重視するようになります。ちなみにQ学習では長期的な報酬をみていくので、1に近づくようなγを設定して強化学習を行っていくことが多いです。

最後にmaxat+1Q(st+1,at+1)とは次に取りうる状態と行動の内、最も大きなQ値を選んでいます。以上がQ学習のアルゴリズムについてですが、より簡単に表すと以下のようになります。

Q(更新された値)←(1-α)Q(現在の値)+αQ(予測される値)

仮にα=0.9と仮定すると以下のようになります。

Q(更新された値)=0.1Q(現在の値)+0.9Q(新しい値)

つまり、更新されたQ値は予測される値を強く反映して計算されます。このように現在のQ値を予測されるQ値に更新していくのがQ学習のアルゴリズムです。

Q学習が使われた例

例のイメージ

それでは、実際にQ学習が使われた例を紹介しましょう。Q学習が大きな注目を浴びることになった最も大きなニュースといえばGoogle社のAlphaGoの例です。なお、このAlphaGoとは囲碁を指すAI(人工知能)であり、対戦した世界チャンピオンを圧倒するという大きな衝撃を世界に与えました。

AlphaGoでは強化学習を以下の方法で行いました。

  • 複数のアルゴリズムとAI(人工知能)を採用
  • ニューラルネットワークを利用

最初にAlphaGoでは複数のアルゴリズムを採用し、3つのAI(人工知能)によって囲碁を打たせました。具体的には囲碁の手を読んでいく上で必要な有利な手を探すAI(人工知能)、盤面がどうなっているのか評価するAI(人工知能)、相手がどのように対応するのか予測するAI(人工知能)を作成しました。

アルゴリズムについてはQ学習やモンテカルロ法などが採用され、強化学習が行われていったのです。そして、学習はニューラルネットワークを利用して進められました。これは囲碁というゲーム制を考えた場合に、既存のQ学習では打てる手が多いため対処ができないからです。

そのため、ニューラルネットワークを活用して、特徴量によりQ値を予測する手法を採用しました。これによって飛躍的に能力は攻城し、結果として機械が人間に勝ったのです。ちなみにその後Google社では後継となるAlphaZeroを作成し、AlphaGoに完勝しています。

このGoogle社のAlphaGoの例によって、現在ではさまざまな業種でQ学習は扱われるようになってきました。例えば、車の自動運転技術の開発でもQ学習は使われています。この場合では車にさまざまなセンサーを取り付けることで、周囲の状況や環境がどうなっているのかなどの情報を手に入れます。

そして、それらの情報データからQ値を学習させることで、走行時の状況に合わせて適切な運転ができるようにしているのです。このケースでもニューラルネットワークを活用したQ学習が行われており、より複雑なものを扱う場合では同様の手法を採用する傾向があります。

Q学習をPythonで実装する方法

実装のイメージ
それでは、これまで解説したQ学習をプログラミング言語Pythonを利用して、ライブラリnumpyを使いながら実装しましょう。今回はかなり簡単な迷路の最短ルートをQ学習でみつけます。

まず、扱う迷路は以下のものを使用しましょう。ここでは数字の0からスタートし、ゴールの8に向かって進みます。

・迷路
XXXXXXXXXXXXX
X 0  1  2 X
X _   _ X
X 3 4 5 X
X  _ X
X 6 7 8 X
XXXXXXXXXXXXX

上をみればわかるようにこの場合には0→1→4→5→8の順が最短ルートです。そして、それぞれの状態から取れる行動は以下のようになっています。

  • 0の場合:移動できるのは1
  • 1の場合:移動できるのは0、2、4
  • 2の場合:移動できるのは1
  • 3の場合:移動できるのは4、6
  • 4の場合:移動できるのは3、5
  • 5の場合:移動できるのは4、8
  • 6の場合:移動できるのは3、7
  • 7の場合:移動できるのは6、8
  • 8の場合:移動できるのは5、7

これを踏まえて、Pythonを起動した状態で以下のコードを打ち込みましょう。

import numpy as np
gamma = 0.9
alpha = 0.1

以上によってnumpyがインポートされて使えるようになり、Q学習のアルゴリズムで解説したγとαが決定しました。次に、経路と報酬を以下のように定めます。

reward = np.array([[1,0,0,0,0,0,0,0,0],
[1,0,1,0,1,0,0,0,0],
[1,0,0,0,0,0,0,0,0],
[0,0,0,0,1,0,1,0,0],
[0,0,0,1,0,1,0,0,0],
[0,0,0,0,1,0,0,0,10000],
[0,0,0,1,0,0,0,1,0],
[0,0,0,0,0,0,1,0,10000],
[0,0,0,0,0,1,0,1,0]])

これによって先ほど記述したそれぞれの状態から取れる行動を配列で表現し、ゴールの8に移動できる場所に報酬10000を与えるように設定できました。それでは、Q学習を行っていくコードを記入しましょう。

Q = np.array(np.zeros([9,9])) ※1
for i in range(10000) ※2
a_state = np.random.randint(0,9)
b_actions = [] ※3
for j in range(9):
if reward[a_state,j] >= 1 ※4
b_actions.append(j) ※5
a_state = np.random.choice(b_actions) ※6
Q[a_state,b_state] = (1-alpha)*Q[a_state,b_state]+alpha*(reward[a_state,b_state]+gamma*Q[b_state,np.argmax(Q[b_state,])]) ※7

なお、a_stateは現在の状態、b_state,b_actionsは次の状態と行動を表します。それぞれを解説すると最初の※1ではQ値をゼロに初期化します。※2では学習を1万回繰り返すことを設定し、※3で次回の行動を入れる場所を作成。

そして、※4、5ではrewardの各行が1以上の場合にa_stateの状態で移動できる場所を取得し、移動可能な場所にランダムに移動するように定めています。最後の※7ではアルゴリズムの章でも解説した数式を定義して、Q値を学習させます。

それでは、今度は最短ルートを示せるように以下のように関数を定義しましょう。

def shortest_path(start): ※8
path = [start]※9
a_pos = start※10
b_pos = a_pos※1
while(b_pos != 8):※12
b_pos = np.argmax(Q[a_pos,]) ※13
path.append(b_pos) ※14
a_pos = b_pos ※15
return path

なお、a_posは現在位置を示し、b_posは次の位置を示すものです。それぞれを解説すると※8によってshortest_path(start)がどのようなものであるか宣言し、※9でpathにstartする場所を追加し、※10、11で現在地と次の移動先を設定します。

ただし、よくみると現在地と次の移動先がイコールで結ばれているのがわかるでしょう。これは一時的なものであり、※12以降でゴール地点である8になるまで繰り返しを行うことで、最短ルートの場所へ移動させる仕組みです。

具体的には※13では移動先の候補の中で最もQ値の高い場所をb_posにして、※14でpathにその場所を書き込んでいます。そして、※15によってQ値の高いb_posを新たなa_posに設定することで、Q学習の結果から得られたQ値から最短のルートを割り出し、ゴール地点まで移動できます。

最後に以下のコードを入力すればスタート地点を「0」に設定して、最短ルートを表示可能です。

print(shortest_path(0)) ※16

そうすると以下が表示され最短ルートを確認できます。

[0,1,4,5,8]

ちなみに※16内の数字を変えるとスタート位置が変化するため、別の結果が表示されるので試してみましょう。

Q学習を実装する際の注意点

注意点のイメージ
AI(人工知能)の凄さを周知するきっかけになったQ学習ですが、実装の際には以下に注意が必要です。

実装する対象によって「状態行動空間の爆発」が発生する

この状態行動空間の爆発とは状態と行動の数があまりにも多い場合に、Q値の計算が困難になってしまうことです。例えば、上の迷路の最短ルートをみつける場合では状態の数は9、行動も各状態で最大3だったので、Q値の計算を行うことには何の問題もありませんでした。

しかし、これがより複雑なゲーム性を持っていた場合にはどうなるのでしょうか。Google社のAlphaGoでは囲碁を対象としていましたが、こちらは19×19の場所に石を置くことが可能です。

そのため、仮にある定石に沿っていった場合でも局面によって打てる場所は複数あり、それらのQ値すべてをQ学習で計算していくことは事実上不可能です。これは他のチェスや将棋などでも同じであり、Q学習を実装する上では大きな問題でした。

そこで、Google社ではQ値を計算するのではなく、ニューラルネットワークを利用してQ値を推測することでこの問題をクリアしたのです。これがQ学習を発展させたDQN(deep Q-network)と呼ばれる手法であり、現在ではこちらが広く活用されています。

したがって、より複雑なものを実装する場合ではオーソドックスなQ学習ではなく、DQNなどの発展的な手法で実装しなければ上手くいきません。ですから、この状態行動空間の爆発が発生しないようにQ学習を実装しましょう。

まとめ
さて、今回は強化学習を理解していく上で必須の知識である、Q学習の基礎から実装までと以下の内容についてお伝えしました。

  1. 教師あり、なしの学習ではラベル付けの有無がカギになるが、強化学習では報酬を与えることで学習を行う違いがある
  2. 強化学習ではある状態における行動の価値、状態行動価値(Q値)によって学習を進めていく
  3. アルゴリズムを簡単に示すと「Q(更新された値)←(1-α)Q(現在の値)+αQ(予測される値)」で表現できる
  4. Q学習はGoogle社のAlphaGoの例が有名であり、これを皮切りに多くの業種で活用されるようになった
  5. 実装の際には状態と行動の設定、報酬などを定めた上で適切にプログラミングしていく
  6. ゲーム性の複雑なものなどを実装しようとすると「状態行動空間の爆発」が発生するので注意する

強化学習を学ぶ上ではQ学習はわかりやすいので、簡単なゲームなどで実装しましょう。そして、他のアルゴリズムについても触れながら、より発展的なニューラルネットワークを活用する手法にも手を伸ばしてください。

そうしていけば単に強化学習とQ学習などについての知識を増やすだけでなく、企業でシステム開発に着手することも夢ではないでしょう。将来を見据えて行動していくならば、今からQ学習を学んでいくのが最善に違いありません。

【お知らせ】

当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。

御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。

お多福ラボコーポレートサイトへのバナー

トップへ戻る
タイトルとURLをコピーしました