ファジイ制御で倒立振子が出来なかったという話

2014/6/9 @z_kro

ファジィ制御で倒立振子を立たせようとして失敗した記録です。

事の発端

 AIの事始めとして、一時期話題になっていた「ファジィ」を用いた何かを作ろうとしていました。 当初はファジィ論理を利用したPrologを作ろうとしていたのですが、Prologの理解も浅く、そもそも苦労して作っても実用性もなさそうなので諦めました。

  そこでJavaScriptでファジィライブラリを作り、HTML5のCanvasでファジィ制御を用いたシミュレーションでもやってみようということになりました。シミュレーションの題材としては「倒立振子」を選びました。倒立振子は棒を上に立たせて安定させるやつです(詳しくはググってください)。今回は「棒を直立安定させx=0のいちで安定させる」ことを目標にしました。

 最初にPID制御で組んだところ、収束は遅いものの一応立たせることに成功しました。そこで、今度はファジイ制御でやってみようとしたところ、できませんでした(完)。

そもそも「ファジイ制御」とは何か

技術的な説明は他に譲るとして、ここではファジイ制御の概論を述べたいと思います。

ファジイ制御はNつのプロセスを経て出力を得ます。

1.ファジイ化

 数値として表させる量を、日常の言語表現(あつい、さむい、はやい、遠い…などの形容詞)に変換する過程をファジイ化(fuzzify)と言います。  メンバシップ関数と呼ばれる値域が[0,1]である関数を用いて、その度合いを表します。(完全に偽である場合は0、完全に真である場合は1です)

2.ファジイ推論

 まず、ファジィ化された言語表現で「もし○○ならば××する」といったルール(IF-THENルール)を作ります。 ファジイ推論では、そのIF-THENルールをもとに、出力するファジィ表現=結論を得ます。
(例)IF はやい AND 少し遠い THEN 少し減速する

3.非ファジィ化

 得られたファジィ表現での結論を数値に変換します。結果としてこれが出力となります。

 ファジィ制御の鍵は、メンバシップ関数の作成とルールベースの作成にあります。ルールベースを経験則に基づいて構成することによって、いわゆる「職人技」をコンピュータ上で再現できるようになります。エレベータ・電車の制御やエアコン・炊飯器などの電化製品でファジィが導入され、一大ブームとなりました(バブルの頃)。

結果

  • 角度と位置の安定→×
  • 角度の安定→×(発散)
  • 位置の安定→△(早くは収束しない)

まず、位置xと角度θを入力として5x5=25ルールを作成したが成功しませんでした。
そこで入力を位置x, 速度 v, 角度 θ, 角速度 ωの4つに増やし5^5 = 625ルールを作成したがルール設定が複雑になり失敗しました。
メンバシップ関数の形状や値を試行錯誤で調整しましたが、組み合わせの数が多すぎて安定しませんでした。

何がいけなかったのか

経験則が適用できない

「右に傾いたら右に行く」「左に傾いたら左に行く」。この程度なら経験によるものでカバーできるのですが、「基準より左に位置していて少し右に傾いてて左に少し速めに移動していて角速度は小さい」と言った状況においてどの方向に傾けるのか、と言った問題は経験則では難しい部分がありました。

ルールは多いと良いというわけではない

入力が少ない状況で制御するのは難しい場合、入力の数を増やすという解決策が浮かびます。しかしながら、入力の数を増やすと、それに従ってルールも指数的に増大します。また、先の例で言ったように複雑な状況においては直感が効かないことがあり、非常に厳しいです。

細かい調整ができない

目標値付近において精度高く安定させることがファジィ制御では困難です。殊に倒立振子では、微妙なズレ(棒の角度)が後々大きな影響をもたらしてくるので、ファジィ制御を純粋に適用することは困難でないかと考えます。

今後

未定ですが、

  1. JavaScriptを用いた各種AIを実装する
  2. AIの可能性について様々な観点(哲学的/数理的)から考えていく
  3. AIから一旦離れてプログラミング言語に関して色々する

といったようなことを考えています……


// ファジィはもうこりごりだ〜

ą
kzhr95,
2014/06/09 3:10
Comments