ライブシミュレーション

ファイターにキューブを投げてみましょう

ブログに登場するファイターが、あなたのブラウザの中でリアルタイムに動いています。物理演算も、学習済みのニューラルネットワークも同じものです。ボタンを押すと、重いキューブがランダムな方向から飛んできます。動きは一切台本どおりではありません。彼は自分の体が傾くのを感じ取り、どうすれば倒れずにいられるかを自分で見つけ出します。

未開始

ドラッグで視点を動かせます

お使いの端末で実行しますか?

シミュレーションはすべてブラウザの中で動くため、初回のみ約4.1 MBのダウンロードが必要です。まだ何もダウンロードしていません。

  • 物理エンジン2.6 MBWebAssemblyにコンパイルしたMuJoCo(展開後 10.8 MB)
  • ニューラルネットワークとファイター1.4 MB半精度のネットワークの重み1.1 MBと、体とモーションのテーブル

このほかにコードが約0.2 MBあります。技(さらに3.1 MB)は「パンチ」「キック」「膝と肘」を初めて開いたときに、歩きとダッシュ(1.2 MB)は「歩き / ダッシュ」を初めて開いたときにダウンロードされます。Wi-Fiでのご利用をおすすめします。すべて端末に保存されるので、次回からはすぐに始まります。

ダウンロード元はHugging Faceの当社ページです: huggingface.co/kakuto-io

ファイターのモデルとMuJoCoのエンジンは、Hugging Faceからダウンロードしています。モデルはKakutoのクレジットを表示すれば自由に使えます: huggingface.co/kakuto-io

アクション
キューブ
0
立て直し
0
転倒
0
パンチ

先に上のシミュレーションを開始してください。

パンチを選んでから、画面上のボタンを押してください(「ランダムなパンチ」は毎回違うパンチを打ちます)。パンチは点の位置に向かいます。上または彼の右へは最大10 cm、下または彼の左へは最大15 cmです。学習で中心から外して狙ったのはジャブとアッパーカットだけで、ほかのパンチは常に中心に打っていました。そのため、ここでは練習したことのないターゲットに挑むことになります。ボディストレートは、点が中心より上ならみぞおちへ、下なら下腹部へ向かいます。プルカウンター(上体を反らして間合いの外に出てから、奥の手のストレート)は常に中心を狙います。

キック

先に上のシミュレーションを開始してください。

ハイキックは対戦相手の頭(高さ1.56 m)を狙います。学習時と同じく、点を動かすとターゲットを頭から最大15 cm下、左右に10 cmまでずらせます(頭より上にはなりません)。左のハイキックは、まず小さく跳んで構えを入れ替えます。ローキックとミドルキックは単独では学習済みですが、まだこのネットワークには入っていません。

膝と肘

先に上のシミュレーションを開始してください。

膝蹴りは常にボディの中心を狙います。奥足の膝蹴りと、跳んで構えを入れ替えるスイッチニーです。肘打ちはあごを狙い、学習時と同じく、点で周囲7.5 cmまで動かせます。

何が見えているのか

このファイターはMuJoCoによる物理シミュレーションです。身長1.75 m、体重77 kg、83個のモーターを持つ体が、私のムエタイの構えで立ち、リズムを刻んでいます。すべての動きは方策(ポリシー)から生まれます。これはニューラルネットワークで、体についての465個の数値(関節の角度、速度、それぞれの足にどう体重がかかっているか)を1秒に50回読み取り、すべての関節の目標値を決めます。これは生徒モデル、つまりすべての技が蒸留されたモデルです。ブロックと対戦相手のための入力は、ここではゼロのままです。

「歩き / ダッシュ」を押すと、画面にスティックが表示されます。少し倒すと、彼はその方向に小さなステップで歩き、また構えに戻ります。さらに倒すと、ステップがつながって歩きになります。どちらの場合も、スティックを倒したときに向いていた方向を向いたままなので、リングの上と同じように横や後ろにも歩けます。スティックは前足のすぐ先の床に地点を設定します。これは学習時と同じゴールで、学習環境のプランナーがそれをリズムの一拍ごとに一歩ずつに変換します。スティックの端、内側の輪より外がダッシュです。私のモーションキャプチャから作った素早い一歩で、その方向の足から先に出てもう一方の足が続き、同じ方向を向いたまま構えに戻ります。その方向にダッシュが学習した距離(約30〜65 cm)だけ進み、スティックを端まで倒すたびに1回ずつダッシュします。キーで操作する場合はShiftを押したままにしてください。

「パンチ」「キック」「膝と肘」では、ネットワークが学習したときと同じボタンを選べます。ジャブ、クロス、左右のフック、左右のアッパーカット、ボディストレート、プルカウンター、左右のハイキック、奥足の膝蹴りとスイッチニー、左右の肘打ちです。各セクションにはランダムボタンがあり、そのセクションの技から毎回違うものを出します。そのあと画面上のボタンを押すと、選んだ技を出します。ボタンを押すとどの技をどこに打つかがネットワークに伝わり、ネットワークは参照モーションに沿って、タイミングも自分で決めて技を出します。空中では、半透明の球がターゲットです。サンドバッグ(35 kg)とアッパーカット用のボール(25 kg)は物理演算の中の本物の物体なので、打たれると揺れ、彼は衝撃に対してバランスを保たなければなりません。

キューブの重さは4〜6 kgで、胸を狙って秒速6.5〜8 mで飛んできます。学習中、ファイターに物が投げつけられたことは一度もありません。バランスを身につけるために、ランダムな方向からの見えない力で押されていただけです。衝撃でキャプチャーポイントが足の外に出ると、彼はサバイブモードに入ります(画面上のラベルが紫になります)。リズムが止まり、脚はずっと広い範囲で踏み出せるようになり、ただ立っていることだけが目標になります。落ち着きを取り戻すと、また構えに戻ります。

すべてお使いの端末の上で動いています。MuJoCoはWebAssemblyにコンパイルされ、1秒に500回物理演算を進めます。ネットワークの重みはクラウドで学習したもので、シミュレーションのコードは学習環境を一行ずつ移植し、1ステップずつ照らし合わせて確認したものです。もし倒れても、2秒後には立ち上がります。

半精度の重み

ダウンロードを半分にするため、ネットワークの重みは半精度で保存しています。学習に使った32ビットの数値(有効数字約7桁)ではなく、有効数字約3桁の16ビットの数値です。2.1 MBの重みが1.1 MBになり、ブラウザは実行前にそれを32ビットの数値に戻すので、計算が遅くなることはありません。ただし丸めた分は元に戻らないため、これはクラウドのネットワークとはごくわずかに違うネットワークです。

どれくらい違うのでしょうか。このシミュレーションの同じ4,500の瞬間(空中とサンドバッグでのすべての技、キューブ、歩き、ダッシュ、リズム)で、両方のネットワークを動かしてみました。両者が決める48個の関節の目標値の差は平均0.019%で、大きさ約0.35の目標値に対して最大でも0.001でした。次に、半精度のネットワークだけですべてを通して動かしてみましたが、一度も倒れませんでした。(以前の生徒モデルでも、同じ40個のキューブと36回のパンチで両方のネットワークを単独で動かしましたが、どちらも倒れませんでした。)物理シミュレーションはわずかな差を時間とともに増幅するので、二つのネットワークの動きが秒単位で完全に一致することはありません。それでも、彼の動き方やバランスの保ち方を変えるようなものは見つかりませんでした。