HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

最適制御からの強化学習

 

 

follow us in feedly

f:id:s0sem0y:20171028163649p:plain

 

はじめに

強化学習といえば、最強の囲碁ソフトAlphaGo に搭載されているアルゴリズムで一躍有名となった分野です。今回は強化学習の特殊な問題設定がどういうものであるかを強調するため、最適制御としての立場から発展させた強化学習を見てみたいと思います。

 

     

最適制御

そもそも制御問題とは?

例えば、自動車の速度を調整する場合、タイヤの回転を調整する必要がありますが、私達が実際にやっているのはアクセルやブレーキを踏み込むことだけです。達成したい「速度」を魔法のように直接操作しているのではないのです。加速したい場合は、タイヤの回転を速める必要があり、そのためにピストンの上下運動を速める必要があり、そのために燃焼を強める必要があり…、と通常は望みの出力と実際に調整できる入力の間には何らかのシステムが入り込んでいます。

 

そこで制御というのは、対象のシステムに思い通りの出力を行わせるための「入力」を決定する問題のことです。

 

今回の自動車のケースでは、タイヤの回転速度(あるいは自動車の速度)を思い通りに出力するための、アクセルあるいはブレーキを踏み込む量を決定することを制御問題と捉えることができます。

 

 

自動制御

今回は人間が何かを制御する例を考えましたが、通常の制御問題は、それらを自動で調整する「自動制御」が行いたいはずです。したがって「制御対象のシステムの出力」を思い通りにするための「入力を自動で決定するシステム」を構築することが目標になります。制御したいシステムと、自動で制御してくれるシステム両方を合わせて制御システムと呼びます。

 

一度上手く制御システムを構築できると、外部の人間から見れば、「自分の望みである目標値」を与えると、「制御システムが望み通りの出力」を出してくれるようになります。

f:id:s0sem0y:20171028163002p:plain

例えば、自動制御システムではないガスコンロの場合は、つまみを捻って火を調節し、フライパンが望み通りの温度になっているかは感覚に頼る必要があります。しかし自動制御システムでのガスコンロは、望みの温度を与えてあげれば、その通りの温度を出力してくれます(ガスでこれをやるのは難しいが、電気ならできていますね)。

 

もちろんそのような制御システムの内部には、自動制御が行われるようなシステムが更に入っているわけです。「システム」という言葉が連発するため、制御対象であるシステムのことを「プラント」と呼び、入力を調整するシステムのことを「コントローラ」と呼びます(そして、それら全体を制御システムと呼びます)。

 

フィードバック制御

制御は本当にたくさんの種類がありますが、ここでは最も重要な概念であると言えるフィードバック制御について着目しましょう(これが極めて強化学習に近いものであることが分かります)。

 

フィードバック制御というのは、コントローラがプラントの出力を見張り、その目標値と出力の差異を考慮して自動で入力を調整する手法です。つまり制御システムの中身は例えば以下のようになっています。

f:id:s0sem0y:20171028163649p:plain

制御システムの利用者には目標値を入れたらそのとおりの出力が出てくるように見えても、内部では「プラント」の動作を調整してくれる「コントローラ」が上手く動作しているというわけです。

 

コントローラは現在のプラントの出力と現在の目標値を比較し、自分自身の出力を決定します。そして、コントローラの出力がプラントの入力になっており、その入力に応じてプラントは新たな出力を行うというわけです。

 

理想的には目標値を設定した瞬間にその通りの出力が得られることです。しかしそれは事実上不可能なことです。さっきまで40度だったフライパンが瞬間的に100度になるような調整は物理的に不可能だからです。そこに達するまでには時間を要します。すなわち、時間的にジワジワと50度…60度…70度…と近づいていくはずです。

 

あまりに遅すぎるのは嫌なので、一気に温度を上げるようにコントローラが働くかもしれません。そうしたら温度を上げすぎて105度くらいになってしまうことも考えられるでしょう。そのときにはコントローラは温度を低くするように働きかけ、98度まで下げてしまうかもしれません。結果的に振動的に100度に近づいていくということも考えられます。

 

一般にこのような目標値に達するまでの時間的な振る舞いを応答性と言い、制御システムがどのような応答性を示すかは、プラントに対してどのようなコントローラを設計するかによって決まってきます。

 

 

制御問題の例

仮にプラントの物理的な振る舞いを完全に把握していたとしましょう。物理的な振る舞いを知っているというのは、どのような入力uを与えたらどのような出力xが得られるのか、それを表す以下の方程式を知っているということです。

 

プラント:x = f(u)

 

そうなれば私達が設計したいコントローラは、目標値rをプラントの出力xに代入して必要な入力を求めてくれる単純な計算ということになります。

 

コントローラ:u = f^{(-1)}(r)

 

つまりプラントの方程式を解いて得られるuがそのまま答えになるのです。そうすれば当然のように目標値rに対してすぐさまプラントの出力x

 

x=f(u)=f(f^{(-1)}(r))=r

 

と求まるわけですが、通常、プラントの方程式はこのようにはなっていません(そもそも、こうなっていたら仰々しく制御問題なんて言わない)。

 

通常の制御問題のプラントは、時間的に変化する係数a,b,cを持って例えば

 

\displaystyle x(t) = f(t,a(t),b(t),c(t),\frac{dx(t)}{dt},u(t))

 

というようになっています。先ほど述べた温度調整の話の通り、xrに近づくには時間がかかりますし、xが時間的にrに近づくにつれてuも時間的に変化させなければなりません(だから時間の関数になる)。また、xの時間微分については、現在温度がどれくらいの勢いで上昇しているか(あるいは下降しているか)を表す量であり、当然これに応じてプラントの振る舞いも変わっているはずです(もしかしたら2階微分が入るかもしれないし、もっと高階の微分が入るかもしれない)。

 

ちなみに普通は微分方程式は、

 

\displaystyle \frac{dx}{dt} = f(x,u,t)

 

って書きます。

 

 

つまり制御問題におけるプラントは微分方程式の形をしており、制御設計とはプラントの微分方程式に対して適切なコントローラによってu(t)を与えてやることで、x(t)の振る舞いを調整するということなのです。

 

今、プラントの方程式が既知ならば手立てはあります。結局は微分方程式を解いて、解の振る舞いを上手に調整してやることが目的なわけです。ここで「上手に」というのがどういうことであるかを次に見ていきます。

 

特に微分方程式のことを知っている必要はありません。何をしようとしているのかということだけを説明します。

 

最適制御問題

プラントの方程式が既知ならば、どうにかこうにか数学のテクニックを駆使して、方程式を解くことができるでしょう。その方程式の解x(t)はコントローラがプラントに与える入力u(t)に依存するわけですから、解x(t)が分かればそれが好きな動きをするようにu(t)を決めてやればいいのです。

 

ここで、IHの温度の問題を思い出しましょう。ある時刻tに温度x(t)であるプラントの出力をu(t)によって好きなように調整できることが分かっているとします。つまり

 

x(u(t))

 

の式の形を完全に知っているということです。さて、定数である目標値T_rx(u(t))を収束させるためのu(t)は一意に決まるでしょうか?小難しく聞こえますが、簡単に言えば

 

IHクッキングヒータの今の温度が40度、目標値が100度、入力が電圧だとして、電圧を上げれば温度が上がるだろうし、その関係性も完全に理解できているとして、どれくらい電圧を上げて調整するのかはどうやって決めますか?

 

ということです。上げすぎれば目標値を超えるだろうけども、徐々に電圧を上げるだけでは到達するのに時間が掛かり過ぎるし、電圧の上げ方も時間的にどのように変えていこうかというのは、結構面倒な話です。

 

このような問題に対して、例えば利用する電圧の総和は少ないほうがいいとか、なるべく早く目標値に達する方が良いとか、このような要望を適当な評価関数で表現し、それを最小化するようなu(t)を使うという方法を最適制御と言います。

 

u^2(t)は今の場合電力に相当するので、現在の時刻をt_i、目標値に到達する時刻をt_fとして

 

\displaystyle \int_{t_i}^{t_f} u^2(t)dt

 

はなるべく小さいほうが嬉しいわけですね。当然、目標値に到達する時間t_f-t_iも小さいほうが良いわけですが、これは

 

\displaystyle \int_{t_i}^{t_f} dt

 

と書くことができますので、これも小さいほうが良いです。

忘れちゃいけないのが、x(t)は目標値rに近くなければならないので、r-x(t)も小さいほうが良いでしょう。x(t)rよりも小さかったり大きかったりすることを考えれば(r-x(t))^2を小さくしたいはずであり、これが到達するまでの時間の総和を考えることで

 

\displaystyle \int_{t_i}^{t_f}(r-x(t))^2 dt

 

を小さくしたいというのが要望になります。どの指標をどれだけ優先するかは自分たちで決めるのですが、どれも均等に同じくらい重要とすれば全体としては

 

\displaystyle J = \int_{t_i}^{t_f} \{1+u^2(t)+(r-x(t))^2\}dt

 

が評価関数になったりします。実際にはx(t)u(t)によって制御されるという設定ですから、式は以下のようになっているはずであり

 

\displaystyle J = \int_{t_i}^{t_f} \{1+u^2(t)+(r-x(u(t)))^2\}dt

 

これを最小化するようなu(t)を求めてやりたいということです。もっと一般的に書けば

 

\displaystyle J = \int_{t_i}^{t_f} L(x,u,t) dt

 

という形式に落ち着きます。入力、出力、時間、これらに対する適当な要望を表した損失のようなものLを作っておき、t_i〜t_fの時間の総和を考えてJとし、最小化するようなuを求めるのが最適制御です。(このときのuを最適制御則と言います)

 

 

最適制御のまとめ

最適制御の問題とは概ね、

 

プラント:\dot x = f(t,x,u)

 

に対して、

 

コントローラの最適制御則:u(t)

 

を以下の

 

評価関数:\displaystyle J = \int L(t,x,u)dt

 

の最小化によって決定する問題ということで表すことができます。最適化問題に馴染みがあれば、これはプラントの方程式を等式制約条件と見てラグランジュ乗数を入れて解くということが思い浮かぶでしょう(u(t)は関数であり、Jは汎関数なので変分法で解く)。

 

f:id:s0sem0y:20171028181029p:plain

 

 

今回は説明のため簡略化しましたが、評価関数には他にも種類がありますし、目標値それ自体が定数ではない場合もあります。

 

最適制御から強化学習へ

最適制御の困難 

最適制御問題は、最終的には以下の最適化問題に帰着されることを見ました。 

 

\displaystyle \min_u \int L(t,x,u)dt

 

s.t. \dot x - f(t,x,u) = 0

 

最適制御論は、問題をこの最適化という段階まで落とし込めた場合においては、それを解くツールをかなり取り揃えています。しかし、現実の問題が上手くここまで落とし込めるとは限らないのです。

 

 

非常に多くの場合、プラントの方程式(ここでは制約条件)を厳密に知ることは難しいです。自分たちで作ったものであれば設計段階で物理的振る舞いを知っているはずですから、かなり正確な仕様を知ることができるかもしれません。しかし、プラントが複雑になると厳密な方程式は分かりませんし、対象のプラントが経年劣化やノイズに晒されている可能性もあります。

 

また、評価関数が本当にやろうとしている制御に取って最高品質であるかは分かりません。ある評価関数は人間の意志が盛り込まれるわけですから、その意志の下で最適であるということしか言えないのです(まあコレは、屁理屈かもしれないが)。

 

制御は理論としては面白かったのですが、当初は実用に耐えられる形式にはなっていませんでした(もちろん、適応制御やロバスト制御など、プラントに関することを完全に知らなくても良い方法もある)。

 

 

強化学習の形式と最適制御との比較

一方で強化学習は、これから制御しようと考えるプラントに対して事前知識を有さない場合の最適制御則を決定する方法を与えると見ることができます。

 

以下は、限りなく最適制御に寄せて描いた強化学習の図です。使う文字も最適制御に寄せました。矢印の行き先が外に行く必要は本当は強化学習の枠組みでは無いのですが、別に外に出て行ったものを観客が見ていても良いわけですから、これでもとりあえず問題はありません。

f:id:s0sem0y:20171028190345p:plain

 

強化学習ではある環境の状態x(t)が刻一刻と変化していきます。その変化はエージェントの行動u(t)にある程度依存していることが分かっており、これを上手く決めることができれば環境をコントロールできると想定しているわけです。

 

しかし、環境がエージェントの行動に対してどのように振る舞うのかは完全に未知です。しかし、エージェントがある行動を選択して、環境がある状態になった場合に、報酬rをエージェントに与えることはできます(もしかしたら罰則かもしれない)。

 

エージェントは価値関数なる概念を持ちあわせており、これは報酬を反映しており、価値関数を最大化するような方策πを作り上げるのが目標です。エージェントは方策に基づいて行動を取るので、行動と方策というのは密につながっています(イコールとは言わなくとも、方策を体現化したものが行動である)。

 

一応、最適制御と見比べてみましょう。以下が最適制御の図でした。

f:id:s0sem0y:20171028181029p:plain

最適制御ではあるプラントの出力x(t)が刻一刻と変化していきます。その変化はコントローラの出力u(t)(プラントへの入力)に依存していることが分かっており、これを上手く決めることができればプラントをコントロールできると想定しているわけです。

 

プラントがコントローラから受け取るu(t)に対してどのように振る舞うのかはある程度既知です。そこで、目標値rをコントローラに指定してやることで、プラントの振る舞いを調節してもらうことを考えます。

 

コントローラには評価関数なる概念を与え、これは目標値や目標値に達する時間、x(t)の応答やコントローラの振る舞いu(t)に関することを反映しており、評価関数を最小化するような最適制御則u(t)を作り上げるのが目標です。

 

これらの対応表は以下のように書けます。

 

f:id:s0sem0y:20171028192439p:plain

 

最適制御では、目標値が評価関数に反映されており、それに基づいてコントローラはプラントに対する最適制御則を決めます。プラントの情報が分かっているため、評価関数にあれこれ要望を詰め込むことができます(それが良い評価指標かは知りませんが)。

 

強化学習では、報酬の与え方が価値関数に反映されており、それに基づいてエージェントは方策を作ることになります。環境の情報が無く、与えることができるのは報酬だけであり、それ以外に外部から意志を伝える手段はありません(故に報酬は極めて重要)。

 

 

制御の言葉を使えば、強化学習というのはプラントの振る舞いがよく分からんときに、適当な制御則を与えたコントローラから開始し、プラントの出力を観測しつつ、制御則が良かったか良くなかったかを報酬によって判断しながら、オンラインで最適制御則を見つけ出す手法だと言えます。

 

 

 

環境の振る舞いを知る方法は無いのか

次に通常の機械学習との関連を見るべく、環境の振る舞いを知ることができないのかについて考えてみます。

 

強化学習では環境に関する情報が一切ないという仮定がなされているのを見ました。そこで適当な方策を使った行動を取って、それに対する環境の状態だけを見て最適方策を見つけ出すことを考えていくことになるわけです。ここで一旦立ち止まってみましょう。

 

環境に対して何か適当な入力を与えると、何か適当な状態を観測できるならば、とりあえず大量に適当な行動を与えてみて、それに対する状態を大量に観測し、環境がどうなっているのかを求めてしまうことはできないのか?ということが考えられます。

 

すなわち、

 

x = f(u)

 

を大量に観測して、fを求めるという「教師あり学習」ができないのか?という話です。強化学習の全体像を一旦忘れてしまい、

 

f:id:s0sem0y:20171028212720p:plain

 

の部分だけ見れば、これは普通の機械学習の問題に見えなくもありません。ただちょっと注意が必要です。u(t)は何らかの時系列データであって、x(t)はそれに対応する時系列データというわけですから、単にサポートベクターマシンやニューラルネットワークを使ったのでは上手くいかないかもしれません。

 

環境はもしかしたら1つ前の入力や、1つ前の自身の出力にも依存しているかもしれません。

 

サポートベクターマシンやニューラルネットワークは、とある定数の入力を何度入力しても、毎回同じ出力が得られます(確率的な挙動を入れない限りは)。しかし、例えば環境の状態が「お風呂の温度」で、入力が「水の量」ならば、同じ水の量を加えても、お風呂の温度はその前の温度に明らかに依存して変化します。こういうのを動的システムと言います。

 

動的システムを多数の入出力関係から見極めようと言うのが「システム同定」であり、これは制御の分野で盛んに研究されている大変重要な話題です。

 

制御の問題では環境(プラント)は微分方程式で表されましたが、微分方程式というのは動的システムの一種です。強化学習では微分方程式が全く想定できない複雑なものを扱おうとしているんですから、システム同定をしようというのはかなり難しそうです。

 

とは言っても、やはり動的システムを見極められるならば、有用であることは間違いありません。そのような研究も実際にはあります(同定が上手く行けば、より精密な仕様設計ができる制御問題に持ち込める可能性を見いだせる)。

 

以下はシステム同定に機械学習がどのように関わっていけるかを解説した動画です。

 

 

強化学習の大まかな流れ

強化学習では環境に関することを把握しようということは諦めます。もはや手のつけようが無い部分です。環境はエージェントの行動によって状態を変えていき、その状態を観測したエージェントは行動指針である方策を価値関数に基づいてより良い物に変えていきます。ここで一度強化学習の話を一旦おさらいしましょう。

 

f:id:s0sem0y:20171028192439p:plain

 

最適制御ではプラントが既知(あるいはシステム同定する)という状況で、評価関数を勝手に決め、コントローラの制御則を最適化することを考えます。強化学習では環境が未知であり、未知の価値関数に基づいて、エージェントの方策を最適化していきます。

 

これから最適化していきたい方策についての手がかりは、環境の振る舞いと価値関数であるにも関わらず、それ自体も実は未知なのです(最適制御では明確に評価関数を与え、その中にはプラントの振る舞いがどうなるべきかが明示的に組み込まれています)。 

 

 

極めて困難な問題に見えるでしょう。

 

とりあえず話を簡単にするため、以下のように扱います。

 

「環境の状態遷移は有限マルコフ決定過程である」という仮定をおきます。

 

最適制御の問題では基本的に制御則も連続量(無限の選択肢)であり、プラントの出力も連続量であり、時間も連続的です。強化学習では、ほとんどの問題に対して方策は有限の選択肢を持つ行動指針を表し、環境の取りうる状態も有限であり、時間も離散的(すなわち、1、2、3、と数えられる)として扱うことにします。

 

報酬rを離散的な時間で随時与えていくことにすれば、環境の状態遷移は何らかの確率的挙動なので、将来的にもらえる報酬の期待値を定式化できます。エージェントがある方策を取っているときに、環境がとある状態になっているとして、エージェントが得られる報酬の期待値を状態価値関数として扱うことになります。更に、エージェントがある方策を取っているときに、環境がとある状態になっているとして、エージェントが何らかの行動を実際に取り、なおもその方策を維持し続けた場合の報酬の期待値を行動価値関数として扱うことになります。

 

(いずれにしてもポイントは報酬の与え方です。方策は価値関数を高めるようなものにすべきですが、価値関数が報酬の期待値によって定義されるならば、事実上、報酬によって方策は決まるということです。)

 

価値関数が報酬の期待値によって定義されるため、実際にとある方策のもとでエージェントに行動を取らせることを繰り返す内に、価値関数を見積もることが可能になりました。これが良いことなのかは分かりません。最も良い報酬の与え方を知らないのですから、報酬の期待値を高めることが正義であるとした学習が良い結果を及ぼすかもわからないのです(評価関数を人間が勝手に与えている最適制御と、そこは変わらない)。

 

仮に有限マルコフ決定過程が既知であれば動的計画法によって解く事ができます。しかし有限マルコフ決定過程が既知であるというのは、言わば環境のシステム同定が完了しているということです。すなわち動的計画法で解くというのは、限りなく最適制御の問題に近い問題になります。

 

そして普通はシステム同定が上手くできることはほとんどありません(強化学習を考えるような環境に対しては)。

 

そこで強化学習では、上手く報酬を与えることで価値関数を見積もりながら、見積もった価値関数に基づいて方策を最適化していく同時発見的な方法が必要になります。

 

モンテカルロ法

 

適当な方策の元で行動を取り、環境のマルコフ決定過程を知ること無く状態遷移をただ観測し、それによって得られた実際の報酬を使って期待値を見積もることで価値関数を推定します。価値関数の姿が見えてこれば、それに応じてもっと良い方策が探せるというのが大枠になります。

環境のマルコフ決定過程を完全に把握することはやめ、具体的に行動を取り、状態を観測するというサンプリングによって学習を進めます。

 

TD法

モンテカルロ法ではある適当な方策において価値関数の見積もりをするためにサンプリングを行いますが、時間経過をシミュレートしていくためにかなりの数こなす必要があります。価値関数が見積もられるのは一定時間待たなければ次に進めません。TD法はそこを上手く、時間経過をかなり待つ必要なく価値関数を更新していく枠組みを与えます。

 

関数近似

深層強化学習へと繋がる重要な方法が関数近似による学習です。TD法やサンプリング法を駆使していくと、行動と状態の観測対は有限であり、観測していない観測対での価値関数を如何に補間するか、すなわち関数近似の問題になります。関数近似においては一時的な仮の教師信号を使った教師あり学習という形に帰着されます。この関数近似に深いニューラルネットワークを入れ、かつ深いニューラルネット自体の学習困難を回避したのが深層強化学習の始まりというわけです。

 


 

強化学習の基礎よりもこの辺りの解説は非常に充実しているため、むしろ理解しやすいかもしれません。

 

最後に

制御の分野と強化学習

こうも最適制御の問題と似ており、かつ適用範囲が広がっていると見なせる強化学習が、なぜに制御の分野で応用が広がらなかったのかについて、個人的見解を述べます。

 

基本的思想の違い

基本的に制御というのは機械であるとか電気であるとか、物理的実態がある分野において盛んに応用されています。そのような場面においては、物理法則が成り立っていることは(それを完璧に知ることができるかは別として)明らかであり、その物理法則に基づいて制御することが基本的な考えであったからと考えられます(モデルベース)

 

大まかなプラントの振る舞いを何とか掴み(システム同定)、ある程度不確定要素があったとしても上手く制御できるような方法の研究へと進んでいきました(ロバスト制御、適応制御)。

 

また、主な応用の場においては、「応答性」や「安定性」を議論できることは非常に重要であり、なんだかよくわからないけど動くということが極めて危険である場合が多いことも要因の1つだと思われます(エアコンの温度がちょっとくらいずれるのは良いが、化学プラント・ロケットならどうだろうか?ちなみにエアコンでは一時期、「ファジ制御」に「人工知能」という名前を冠して売られていたことがある)。

 

モデルがハッキリ分かれば、そこから更に良い仕様を追求することができるのです。今回はプラントに対する入出力関係のみに着目しましたが、現代制御の枠組みでは、プラントをさらに細分化し、最終出力ではない途中段階もフィードバックしてしまう状態フィードバック制御が生み出されました。

 


 

 

実用的問題

更にオンライン学習であるというのも応用に対する障壁になったと考えられます。オンライン学習であるというのは、実際に制御システムを動かしていき、コントローラを学習させていくということです。そして大抵学習の初期段階では極めてでたらめな制御が行われるはずです。

 

そのような事が実体のある工業製品で可能かと言われれば、かなり難しい話でしょう。もちろんシミュレーションによって強化学習は可能です。そうなると、そもそもシミュレータが現実とどれだけ合致しているのか(プラントの動作をそもそもどうやって再現するのか)が問題であり、完全に合致できるというのことはプラントの振る舞いを知っているということのはずです。そうなれば、普通に制御則を構築したほうが良いということになるわけです。

 

そもそも数多くの失敗が許される制御問題においてのみ、強化学習の適用が許されたのです。

 

PID制御という巨人

制御にもモデルフリーという考え方はあります。

 

プラントのことが正確に分からなくても、目標値と現在の出力を正しく評価できれば、「どれくらい制御するべきか」は正確に分からなくとも、「どの方向に制御すればいいか」は分かるので、上手いこと出力フィードバックのみで上手く調整できるという考えです。

 

これは割とかなり広範囲で使われています。

 それどころか、産業応用において最も使われている制御則はPID制御でしょう。

(という点においては、モデルベースで厳密にやるのも実情ではかなり難しい)