Pythonによる強化学習入門

強化学習は、AIの中で最も活発で刺激的な研究分野の一つであることは間違いない。

この分野への関心は、DeepMindのAlphaGoが囲碁の世界チャンピオンを倒したり、OpenAIのAIモデルがプロのDOTAプレイヤーを倒したりといった大きな(そして大きく取り上げられた)進展を受けて、ここ数年で飛躍的に高まっている。

これらの進歩のおかげで、強化学習は現在、医療から金融、化学から資源管理まで、様々な異なる分野で応用されています。

今回は、強化学習の基本的な概念や用語を紹介し、実際の例で応用していきます。

強化学習とは?

強化学習(Reinforcement Learning, RL)は機械学習の一分野であり、ある種の環境において、行動者(エージェント)がその過程で得られる何らかの報酬を最大化するために行動を起こすことに関するものである。

これは意図的に非常に緩い定義で、だからこそ強化学習の技術は実世界の非常に広い範囲の問題に適用できるのです。

ビデオゲームをプレイしている人を想像してみてください。プレイヤーはエージェントであり、ゲームは環境である。プレイヤーが得た報酬(敵を倒した、レベルをクリアしたなど)、あるいは得られなかった報酬(罠にはまった、戦いに負けたなど)から、より良いプレイヤーになるための方法を学びます。

お気づきのように、強化学習は教師あり学習、教師なし学習、半教師あり学習のカテゴリーに当てはまらない。

例えば教師あり学習では、モデルが行う各決定は独立したものであり、私たちが将来見るものに影響を与えることはない。

強化学習では、その代わりに、エージェントの長期的な戦略に興味があります。この戦略には、中間段階での最適でない決定や、(未知のパスの)探索と環境について既に知っていることの利用との間のトレードオフが含まれるかもしれません。

強化学習の歴史

数十年間(1950年代から!),強化学習は試行錯誤的アプローチに焦点を当てた研究と,最適制御に基づいた研究の2つの別々のスレッドに従った.

最適制御法は、動的システムの振る舞いの時間的尺度を最小化するように制御器を設計することを目的としている。そのために、現代の強化学習技術の基礎となっている動的計画法のアルゴリズムが主に用いられている。

試行錯誤的なアプローチは、動物学習の心理学や神経科学に深く根ざしており、強化という言葉はここから来ている。良い結果や悪い結果に続く(強化された)行動は、それに応じて再選択される傾向がある。

この2つの分野の学際的な研究から、時間差学習(Temporal Difference: TD)分野と呼ばれるものが生まれた。

現代の機械学習によるRLは主にTD学習に基づいており、報酬信号と価値関数(これらが何であるかは次の段落で詳しく説明する)を扱う。

用語解説

強化学習の主な概念と用語について説明する。

代理店

環境に組み込まれ、環境の状態を変化させるために行動を起こすシステム。例えば、移動ロボット、ソフトウェアエージェント、産業用コントローラなど。

環境

エージェントが「知覚」し、行動することができる外部システム。

RLにおける環境は、マルコフ決定過程(MDP)として定義される。MDPはタプルである。

(S,A,P,R,γ)(S,A,P,R,γ)
(S,A,P,R,γ) (S,A,P,R,γ)

ここで

  • Sは有限の状態集合
  • A は有限の行動集合
  • P は状態遷移確率行列

Pass′=P[St+1=s′|St=s,At=a]Pss′a=P[St+1=s′|St=s,At=a]
P_{ss’}^{a} = mathbb{P}[S_{t+1} = s’|S_t = s, A_t = a].

  • Rは報酬関数

Ras=E[Rt+1|St=s,At=a]Rsa=E[Rt+1|St=s,At=a]
R_s^a = mathbb{E}[R_{t+1}|Spt_t=s, Apt_t = a] ※ γは割引係数である。

  • γは割引係数、γ∈[0,1]である。

実世界のシナリオは、単純なチェス盤からより複雑なビデオゲームまで、多くのマルコフ決定過程を表現することができる。

チェスの場合、状態は盤面のすべての可能な構成である(たくさんある)。アクションとは、駒を動かす、降参する、などのことです。

報酬はゲームの勝ち負けに基づいており、勝ちのアクションは負けのアクションよりも高いリターンを得ることができる。

状態遷移確率はゲームルールを強制する。例えば、不正な行動(ルークを斜めに動かす)は確率がゼロとなる。

リワード機能

報酬関数は、状態とその報酬を対応付ける。これはエージェントが環境をナビゲートする方法を学習するために使う情報である。

多くの研究は、良い報酬関数を設計することと、環境中の報酬がしばしばまばらであるためにエージェントが適切に学習できない場合に、まばらな報酬の問題を克服することに費やされる。

報酬Gtはタイムステップtからの報酬の割引和として定義される。

Gt=∞∑k=0γkRt+k+1Gt=∑k=0∞γkRt+k+1
G_t=sum_{k=0}^{infty} γ R_{t+k+1} γは割引係数と呼ばれる。

γは割引係数と呼ばれ、将来に向かうにつれて報酬の額を減らしていく働きをする。

報酬を割り引くことで、将来の不確実性を表現することができますが、人間・動物が即時の報酬を好むことが分かっているので、人間の行動をよりよくモデル化することができます。

バリュー機能

価値関数は,おそらくRL問題に関して持つ最も重要な情報である.

形式的には,価値関数は状態sから始まる期待収益である. 実際には,価値関数はエージェントがある状態にあることがどれだけ良いことかを教えてくれる.ある状態の価値が高ければ高いほど、期待できる報酬の量も多くなる。

vπ(s)=Eπ[Gt|St=s]vπ(s)=Eπ[Gt|St=s] となる。
vπ(s) =Eπ[Gt|St=s]vπ(s) =Eπ[Gt|St=s]↵Eπ[Gt|St=s]↵Eπ[Gt|St=s

この関数の正式名称は state-value function であり、RLのもう一つの重要な要素である action-value function と区別している。

行動価値関数とは、ある状態sで行動aを行ったときの価値、すなわち期待利回りを与える関数である。

qπ(s,a)=Eπ[Gt|St=s,At=a]qπ(s,a)=Eπ[Gt|St=s,At=a] となる。
qπ (s, a) = mathbb{E} ╱╱[Gt|So_2571↩s, A╱t = a].

ポリシー

ポリシーは,MDPにおけるエージェントの振る舞いを定義する.

形式的には,ポリシーは状態が与えられたときの行動に関する分布である.ポリシーは、状態を、その状態から各行動をとる確率に対応付ける。

π(a|s)=P[At=a|St=s]π(a|s)=P[At=a|St=s] となる.
π (a|s) = mathbb{P}[A_t = a|S_t=s] となります。

RLの究極の目標は、エージェントにとって最適な(あるいは十分な)方針を見つけることである。ビデオゲームの例では、ポリシーはプレイヤーが従う戦略、すなわち、あるシナリオが提示されたときにプレイヤーが取る行動と考えることができる。

主な取り組み

RL問題には、様々なモデルやアルゴリズムが適用されている。

本当にたくさん。

しかし、それらはすべて多かれ少なかれ同じ2つのカテゴリに分類される: ポリシーベースとバリューベースである。

政策的アプローチ

RLのポリシーベースのアプローチでは、我々のゴールは可能な限り最良のポリシーを学習することである。ポリシーモデルは、現在の状態から可能な限り最善の手を直接出力するか、可能な行動に対する分布を出力する。

バリューベース・アプローチ

価値ベースアプローチでは,最適な価値関数(すべてのポリシーに対する最大の価値関数)を求めたい.

そして,モデルから得られる値に基づいて,どの行動をとるか(つまり,どの政策をとるか)を選択することができる.

探検と探査

探索と探査のトレードオフはRLの文献で広く研究されている。

探索とは、環境中のまだ訪れていない状態、あるいはまだあまり情報がない状態を訪れ、情報を収集することである。MDPを探索することで、将来のより良い意思決定につながるかもしれないという考え方です。

一方、探索とは、現在の知識から最適な判断を行うことであり、既知の情報の中で快適に過ごすことです。

以下の例で、これらの概念が実際の問題にどのように適用されるかを見てみましょう。

多腕の盗賊

強化学習(Reinforcement Learning)の問題の例として、多腕バンディット問題(Multi-armed bandit problem)を見てみましょう。

多腕バンディットは、強化学習で最もよく使われる問題の一つです。

という問題です。
k個の異なる選択肢(行動)の中から、繰り返し選択を迫られます。各選択の後、あなたは選んだ行動に依存する定常的な確率分布から選ばれた数値報酬を受け取ります。あなたの目的は、ある期間、例えば1000回の行動選択(タイムステップ)にわたって、期待される総報酬を最大化することである。

スロットマシン(片腕の盗賊)になぞらえて考えることができます。各行動選択は、スロットマシンのレバーの1つを操作するようなもので、報酬は、大当たりしたときのペイオフです。

この問題を解くと,最適な政策,つまり,各時間ステップで最適な行動(期待収益が最も高い行動)を選択できる戦略を思いつくことができる.

Action-Value Methods

非常にシンプルな解決策は、行動価値関数に基づくものである。行動値とは、その行動が選択されたときの報酬の平均値であることを忘れないように。

q(a)=E[Rt∣A=a]q(a)=E[Rt∣A=a] となる。
q(a) = E[R_t mid A=a] となる。

qは標本平均を用いれば簡単に推定できる。

Qt(a)=sum of reward when “a” taken prior to “t” number of times “a” taken prior to “t” Qt(a)=sum of reward when “a” taken prior to “t” number of times “a” taken prior to “t “サンプル平均を用いることで簡単に推定できる。
Q_t(a) = frac{text{sum of rewards when “a” taken prior to “t”}}{text{number of times “a” taken prior to “t”}}となる。

十分な観測値を集めれば、推定値は実関数に十分近くなる。そして、各タイムステップで貪欲に行動する、すなわち、最も高い値を持つ行動を選択し、可能な限り高い報酬を収集することができる。

♪♪~ 欲張りすぎないように

探索と開発のトレードオフについて話したのを覚えていますか?これは、なぜ私たちがそれを気にかけるべきかの一例である。

実際、前の段落で提案したように常に貪欲に行動していると、最終的に良い結果をもたらすかもしれない最適でない行動を試すことができなくなる。

つまり、ほとんどの時間は貪欲に行動を選択するが、時々、確率εで、行動の値に関係なく、ランダムな行動を選択するのである。

この単純な探索方法は非常にうまく機能し、得られる報酬を大幅に増加させることができることが判明した。

最後の注意点として、計算量が多くなりすぎないように、この式に従って平均を漸増的に計算する。

Qn+1=Qn+1n[Rn−Qn]Qn+1=Qn+1n[Rn−Qn]
Q_{n+1} = Q_n + frac{1}{n}[Rn_n – Q</n]

Pythonソリューションのウォークスルー

import numpy as np


# Number of bandits
k = 3


# Our action values
Q = [0 for _ in range(k)]


# This is to keep track of the number of times we take each action
N = [0 for _ in range(k)]


# Epsilon value for exploration
eps = 0.1


# True probability of winning for each bandit
p_bandits = [0.45, 0.40, 0.80]


def pull(a):
    """Pull arm of bandit with index `i` and return 1 if win, 
    else return 0."""
    if np.random.rand() &lt; p_bandits[a]:
        return 1
    else:
        return 0


while True:
    if np.random.rand() &gt; eps:
        # Take greedy action most of the time
        a = np.argmax(Q)
    else:
        # Take random action with probability eps
        a = np.random.randint(0, k)

    # Collect reward
    reward = pull(a)

    # Incremental average
    N[a] += 1
    Q[a] += 1/N[a] * (reward - Q[a])


さて、どうでしょう。このスクリプトを数秒実行すると、行動値が山賊の大当たり確率に比例していることが既にわかります。

0.4406301434281669, 
0.39131455399060977, 
0.8008844354479673


つまり、この貪欲な方針は、より高い報酬を期待できる行動を正しく選ぶということである。

結論

強化学習は成長分野であり、まだまだカバーすべきことがたくさんあります。実際、汎用的なアルゴリズムやモデル(動的計画法、モンテカルロ法、時間差分法など)についてはまだ見ていない。

今、最も重要なことは、価値関数、政策、MDPなどの概念に精通することである。この記事の「リソース」セクションには、この種の材料の理解を深めるための素晴らしいリソースがいくつか紹介されています。

リソース

  • RLに関するDavid Silverのクラス
  • サットンとバルト – 強化学習。入門編
タイトルとURLをコピーしました