社会人からAI・ロボットの研究を始めました

大学数学のまとめや研究活動に関することを書いています

学習とロボティクス(4) 強化学習

f:id:kanichan_robot:20210821080651p:plain

はじめに

本シリーズは学習とロボティクスと題して、一般には制御モデルを立てるのが難しかったり時々刻々と変化する環境におけるロボットの制御問題を取り扱う学術分野について、大雑把にまとめていく。

強化学習(Reinforcement Learning)とは

制御目的が不明確(抽象的)で、モデル化も困難な時*1にロボットが試行錯誤をしながらより良い制御則を見つけていく手法。

ロボットだけでなくゲームAIにも(むしろこちらのほうが主流か)よく使われる。

最近は深層学習を活用した手法がバンバン出てきていて注目度も非常に高い。(特にUC Berkeleyの研究室がすごい)

特徴的なのは、ロボットに直接的な教示や評価を与えるのではなく、各行動に対して報酬を上げる点。
そしてロボットは長期的にたくさんの報酬がもらえるように動き方を学習する。

それはまるで犬が餌をもらうために芸を覚えるかのような手法なのだ。

数学的な考え方

問題設定

強化学習は一般に次のような問題設定を考える。

離散時刻 tにおけるロボットの状態 s_t、その時取った行動 a_tと置く。
このとき、時刻 t+1でロボットがある状態 s_{t+1}を取る確率が、何かしらの確率分布 P(s_{t+1} | s_t, a_t)によって定まっていると仮定する。
この確率分布 P状態遷移確率と言う。

また、状態 s_tにおいて行動 a_tを取った時にもらえる報酬が関数 r(s_t, a_t)で定義されているとする。
この r報酬関数と言う。

このような条件下で次式で表される評価値 Jを最大化するような関数 a_t = \pi (s_t)を求めるのが、強化学習の目標になる。

 J = \sum_{t=0}^{T}\gamma^{t} r(s_t, a_t) \tag{1}

ここで \gamma *2は割引率と呼ばれ、どれだけ長期的な視点を持つかを定めるパラメータである。
また関数 \pi方策(policy)と呼ばれる。 上では1つの状態に対して1つの行動を返す関数(決定的方策)で記述したが、より一般には1つの状態に対して取りうる行動の確率分布(確率的方策: \pi(a|s))で表される。

方策学習の考え方

「(1)式で与えられる評価値 Jを最大化する方策 \pi」とは、すなわち「今後得られる累計報酬が最も大きい行動を取る方策」と言えるだろう。

しかしながら「今後得られる報酬」は「これからロボットがどのように動くか」という確率的な要素によって決まる。 そのため、これをひとつの値として得るのは不可能である。
そこで、「今後得られる報酬の期待値」をとることにしよう。

 
\begin{align}
V_{\pi}(s) &= \mathbb{E}_{\pi} [\sum_{k=t}^{T}\gamma^{t-k+1} r(s_k, a_k) | s_t = s] \\
Q_{\pi}(s,a) &= \mathbb{E}_{\pi} [\sum_{k=t}^{T}\gamma^{t-k+1} r(s_k, a_k) | s_t = s, a_t = a]
\end{align}

これらを強化学習では価値と呼ぶ。
 V_{\pi}は「方策 \piに従ったときに、今の状態でいることで今後どれだけの報酬が期待されるか」を表し、状態価値と呼ばれる。
一方、 Q_{\pi}は「方策 \piに従ったときに、今の状態で次にこの行動をとることで今後どれだけ報酬がもらえるか」を表し、状態行動価値と呼ばれる。

また、状態価値関数 V_{\pi}と行動価値関数 Q_{\pi}の間には次の関係がある。

 
\begin{align}
V_{\pi}(s) = \mathbb{E}_{a \sim \pi(a|s)} Q_{\pi}(s,a)
\end{align}

以上を踏まえると、本節の初めに述べた最適方策とは、「最適方策に従って行動し続けた場合の行動価値関数の値が最も大きい行動を取る方策」と言える。
したがって、この行動価値関数を正しく予測出来るようになれば良いことが分かるだろう。

価値関数の学習

前節の最後で述べた最適方策を数式で表すと

 
\begin{align}
\pi^{\ast}(s) = \mathrm{arg} \max_{a} Q^{\ast}(s,a) \tag{2}
\end{align}

となる。
ただし、 Q^{\ast}とは最適方策 \pi^{\ast}に従った時の行動価値関数 Q_{\pi^{\ast}}のことで、最適行動価値関数とも呼ばれる。

最適方策 \pi^{\ast}を定義するために \pi^{\ast}を使っているように見えて気持ち悪いかもしれないが、これであっている。

最適方策の定義とは「(1)式で表される評価値を最大化する方策」のことであり、(2)式はむしろ、最適方策について成り立つ定理と考えたほうがよいだろう。

ここで、価値関数に関する重要な方程式を示そう。

 
\begin{align}
Q_{\pi}(s, a) &= \mathbb{E}_{s' \sim P(s'|s, a)} [ r(s, a) + \gamma V_{\pi}(s') ]
\end{align}

この式はベルマン方程式と呼ばれ、強化学習において最重要な式と言って過言でないものである。

さらに、方策 \piが最適方策 \pi^{\ast}であるとき、ベルマン方程式は次のように修正される。

 
\begin{align}
Q^{\ast}(s, a) &= \mathbb{E}_{s' \sim P(s'|s, a)} [ r(s, a) + \gamma \max_{a} Q^{\ast}(s', a) ] \tag{3}
\end{align}

ようやく準備が整った。

前節で述べたように、最適方策を得るためには最適行動価値を正しく予測できるように学習すれば良い。
そして、最適行動価値の学習とは、(3)式を満たすような関数 Q^{\ast}を見つけることに他ならない*3のである。

すなわち

 
\begin{align}
\mathrm{minimize} \, \mathbb{E}_{s, a} \left[ \|\mathbb{E}_{s' \sim P(s'|s, a)} [ r(s, a) + \gamma \max_{a} Q(s', a) ] - Q(s, a) \| \right]
\end{align}

「なるほど!(3)式を満たすような関数を見つけるんだな!」待て待て。事はそう簡単ではない。
これには2つ重要な問題がある。

  1. そもそも関数を見つけるとは?
  2. (3)式に状態遷移確率 P(s'|s, a)(=制御モデル)が入ってるけど、制御モデルは使えないんじゃないの?

1について、もし状態・行動の数が有限で少なければ、表のようにしてしまうのが一つの手だ。
つまり各状態 sと行動 aに対して値を一つ設定し、その値を調整していくのだ。

もし状態・行動の数が膨大だったり無限にあるような場合(例えば連続値で表現されるなど)には、ニューラルネットワークのようにパラメータ表現してやるのも良い手だろう。

次に2について。 これは強化学習の「すなわちモデル化の難しい対象を制御したい」という目的自体を揺るがしかねない問題だ。
しかし安心してほしい。もちろん制御モデル(状態遷移確率)は使わない。

その代わりに使うのは、「実際に動いた経験」だ。
つまるところ、沢山動き回ったときの平均を(3)式の右辺の代わりにするのだ。

というわけで、ざっくりと学習の手順を示そう。

学習アルゴリズムの概要

  1. 行動価値関数 Qを表形式やニューラルネットワークなどで初期化する。
  2. 方策 \pi(s)=\mathrm{arg}\max_{a}Q(s,a) *4に従ってロボットを動かし、状態 s、行動 a、次の状態 s'の組をたくさん集める。
  3. 次式を小さくするように Qを更新する。2. に戻る。
 
\| \sum_{(s,a,s')}  r(s, a) + \gamma \max_{a} Q(s', a) - Q(s, a) \|

強化学習の問題点

最後に強化学習の問題点を示そう。
一般によく言われるのは以下3つほどだろう。

  1. 学習のために膨大な量の試行が必要
  2. 初期はロボットがランダムに近い動きをするので危険
  3. 報酬関数の設計が非常に難しい

1について。 強化学習はロボットをとにかく沢山動かすことで行動価値および方策を学習するが、その量がとにかく多く、1万回(1回の試行を10秒とすると丸1日以上)とかがざらにある。 もちろん状態 sがロボットの関節角など低次元な値なのか画像などの高次元な入力なのかにも依存するのだが。

また2について。 初期はロボットが正しい動き方をまだ学習出来ていないことに加え、なるべく色々な状態を探索するためにランダムな方策を取る。
もし現実にデタラメな動きをするロボットがいたら、物や人にぶつかるんじゃないかとヒヤヒヤするだろう。

1と2へのひとつの解決策としては、シミュレーション上で学習することである。
シミュレーションであれば実時間より速く動かせるし、いくら物にぶつけても問題ない。
しかし実際にはシミュレーションで学習したものを現実世界で試すと中々上手くいかず、これ自体も強化学習の主要な研究テーマの1つになっている。

続いて3について。 強化学習では報酬関数を人間が設計する必要があるが、これが非常に難しい。

例えば移動ロボットであれば、目的地に到達したらプラス報酬、それ以外は報酬なし、のような単純な報酬関数が考えられる。
しかしこれでは、1回でも目的地に到達できない限り、どう行動しても報酬が得られないので中々学習が進まない。

かと言って、目的地に近づく方向に動いたらプラス報酬、ぶつかったらマイナス報酬、のように付け加えても、プラスとマイナスのバランスなどを上手く取らないとロボットは奇想天外な方策を学習してしまう。

報酬設計についても当然多く研究されているが、決定打となる手法は未だ見つかっていない(私は知らない)。

おわりに

今回紹介したのはQ学習と呼ばれる強化学習の最も基礎的な手法の考え方である。
厳密には違う部分があったり説明を省略した部分もあるが、だいたいの考え方はこんなものである。

最後には強化学習の問題点も挙げたが、とはいえ非常に注目度の高い技術であるのは間違いなく、DQN, DDPG, PPO, TRPO, SAC, ...など本当にたくさんの手法が提案されている。
また、Stable Baselinesなど比較的簡単に試せるものもあるので、興味がある人はぜひトライしてほしい。

参考

*1:ただしモデルベース強化学習というのもある

*2:一般には0.99など1より少しだけ小さい値が用いられる

*3: (3)式は最適方策 \pi^{\ast}に関する必要条件に過ぎないので、これを満たしたから最適とは言えないじゃないか!と思わないでもないが、実際この戦法でうまくいっているから受け入れざるを得ない・・・

*4:色々な状態を経験するために一定の確率でランダムな行動を取る方策にすることも多い。