![images](../img/imgtop_sub_y.png)
物理ベースのキャラを<歩かせる>ために、強化学習の手法を使うことができます。
関連
- ◯
- 仮想環境でドールハウス:3Dのキャラクタを動かす:物理演算
- ◯
- 仮想環境でドールハウス:3Dのキャラクタを動かす:物理演算+自律制御
物理ベースのキャラを、倒れないように歩かせる
アニメーションをコピーすることで、物理ベースのキャラも動かせるようになります。これでアニメーションで動いているキャラクタも、<押したり・掴んだり>が可能になります。たしかに十分、実在感はありますが……
ただ実在感が増したぶん、反応のおかしさが目立ちますよね……それをはっきり感じられるのが、まず<歩く>動きでしょう。じっさい歩行の動作をさせたら、すぐ倒れてしまいます:[※1]
これはもちろん、キャラクタのからだが重力に引っ張られるからですーー2本足ではすこしの重心の移動でバランスがくずれるので、それに対応できなければ倒れるしかありません。[※2]
それでは環境に対して、キャラクタが自律的に反応するようにはできないでしょうか? 重力に対してなら、自分で立って歩けるように。
- ※1
- とうぜん重さや境界のないキャラクタ(いわゆるふつうの3Dキャラ)なら、このようなことにはならないわけですが。
- ※2
- キャラクタをフックで引っ掛け、体の上下左右の動きに合わせフックを動かせば、それらしい感じにはなるでしょうけど。あるいは仮想の環境なので、重力の影響をなくすことも考えられますね(フワフワ浮いている状態になってしまいますが)。
歩行のルールを生成する=機械学習を使う
かりに歩かせるとして、どのようにすればいいのでしょう? 工学では、これまでロボットの歩行が研究されてきましたが、2足歩行のルールを組むこと(2足歩行の計測・制御プログラミング)は、けっこう大変です。[※1]
それにプログラムも、けっきょくはキャラクタに指定した動きをさせるものです。想定外のことが起これば、やはり倒れてしまいます。
なら逆に、そのような<柔軟に対応できる>ルールそのものを、うまく生成できないでしょうか?……もちろんできないことはなく、ルールを生成するやり方のひとつに機械学習があります:[※2]
- ※1
- いわゆる最適化のプログラミングを行います。たとえばあの(世界を驚かせた)ボストンダイナミクス社のアトラスですら、最適化手法のひとつを使っているようです:
- ・
- https://www.youtube.com/watch?v=tF4DML7FIWk
- ・
- https://twitter.com/Atsushi_twi/status/965304165315493893
- ※2
- 機械学習が現実のロボットの2足歩行で試されるようになったのは、ごく最近のことです。機械学習(の強化学習)では、大量のデータを得るためにシミュレーションを重ねる必要があります。しかし現実のロボットで何百万回〜何千万回もの動作をさせれば、ガタつきが大きくなったり壊れたりします。かといって仮想環境でシミュレーションを行なっても、仮想と現実の間にズレがあれば、ロボットは(とくに2足歩行という微妙な制御では)まともに動きません。なのでロボットの制御に機械学習を採用する場合は、相応の対策が必要になるはずです:
- ・
- https://www.technologyreview.jp/s/239267/forget-boston-dynamics-this-robot-taught-itself-to-walk/
データをシミュレーションで生み出す=強化学習を使う
しかし機械学習は、ルールを生成するためにデータを必要とします。では<歩く>ためのデータとはなんでしょう?
そもそも<歩く>という行為は、重力や手足(環境)と意識(主体)との相互作用に支えられています。からだが重力に引っ張られ倒れようとする 〜 意識が手足を筋肉で動かし、重心を動かしつつバランスを保つ 〜 わざとバランスを崩し前に進むーーその繰り返しです。
ならそういった行為をシミレュートすることで、データをとれないでしょうか?ーー主体が<行動>すると、環境の<状態>が変わります。このとき、かりにそれが主体にとって望ましい状態なら(<歩く>場合は<前に進む>)、相応の<報酬>(得点)が与えられるとします……このようにすれば、<状態・行動・報酬>はそれぞれ数値にできるので、学習のためのデータやルールになりえます。そして主体が状態を観察し、報酬がより大きいだろう行動を選択していくなら、それが望ましいルールになるはずですーーこのような試行錯誤と報酬による機械学習を、強化学習といいます:[※1]
- ※1
- 状態(S)・行動(A)・報酬(R)は強化学習の基本の要素ですが、ただ直近の報酬が大きいことだけをもとに方針を決めれば、より大きな報酬を見逃すこともあります(迷宮に置かれた最後の宝箱がラスボスの背後にあれば、ラスボスに倒されるマイナスの報酬を避けるために、最後の宝箱を獲得するという大きなプラスの報酬を逃してしまう、など)。そのため強化学習では、直近の報酬だけでなく、全体から得られるだろう報酬群の総和=<収益(G)>も考慮に入れます。この収益を最大にするための方針に、<探索>といった考え方が出てきます。また方針の判定に、<価値(V)>や<行動価値(Q)>といった考え方が出てきます。
強化学習をニューラルネットで実装する
さらに強化学習をニューラルネットで実装することで、(ニューラルネットが生成する関数で行動を近似できるので)連続する制御が、よりかんたんにできるようになります:[※1][※2][※3]
- ※1
- ニューラルネットワークの利点は、(離散的ではなく)連続的な関数を生成できるという点、そしてその関数を生成するのに、(各ノードに入力する)ウェイトやバイアスといった変数を、効率よく微分して修正できるという点にあります(誤差逆伝搬法)。
- ※2
- 強化学習は大きく、価値ベースと方策ベースの学習に分かれます。方策ベースはもともと、連続する制御のためのアルゴリズムです。いっぽう価値ベースは、離散値のテーブルを使って行動価値(その行動から得られる報酬群の総和の期待値=Q値)を記録します。ただし連続する行動の場合、テーブルのサイズが膨大になり、現実には使えません。そのため、テーブルのQ値群を関数で近似させる必要があります。価値ベースでも、問題のサイズが大きい学習では、ニューラルネットワークが使われます。
- ※3
- とくに価値ベースのニューラルネットワークでは、よく深層ニューラルネットワークが使われます(深層学習/ディープラーニングによる強化学習=深層強化学習)。方策ベースの場合は、ニューラルネットワークの層の数はそれほど大きくないのですが、(深層学習の定義があいまいになってきたこともあり)深層学習のくくりであつかわれることもあります。
強化学習&ニューラルネットのフレームワークを使う
とはいえ、強化学習&ニューラルネットのプログラミングも、それなりに手間がかかります。
さいわいUnity には、強化学習&ニューラルネットのためのフレームワークが提供されています。それが、ML-Agents です。これを使うことで、さまざまなサンプルをもとに学習を始めることができます。[※1][※2]
- ・
- https://unity.com/ja/products/machine-learning-agents
しかもML-Agents には、キャラクタを歩かせるためのサンプル(Walker)が、すでに用意されています。
- ※1
- ML-Agents が提供する強化学習のアルゴリズムは、方策ベースのものです。しかもかなり最新のアルゴリズムです。オンポリシー(現在の方針しか使わない)向けにはPPO が、オフポリシー(過去の方針も使う)向けにはSAC が提供されています。また模倣学習(真似をして学習させる)のアルゴリズムには、敵対的生成ネットワーク(GAN )のひとつである、GAILが提供されています。
- ※2
- ML-Agents が使う言語は、Unity 上ではC#ですが、強化学習のアルゴリズムはPythonで書かれています。つまりC#とPythonの間のAPI が用意されているので、Pyhtonで書かれた独自のアルゴリズムをUnity のキャラクタに反映させることもできます(またこのAPI を使った、OpenAI Gym向けのラッパも用意されています)。
強化学習の手法を使うことで、最適化などを考慮しなくても、物理ベースのキャラをあるていど自律的に歩かせることができるようになります:[※1]
- ※1
- とはいえ強化学習ではルールを自動生成するため、それを決定する状態・行動・報酬のパラメータの調整、という別の課題は出てきますが。