筋肉 · 実験 · バイオメカニクス · 構え · パンチ

モーターの代わりに筋肉で

著者 ヤム トニー(Tony Yum) ·

学習コスト 約$273件の作業ログで学習ラン33回、約20マシン時間 · 内訳

ポッドキャストのエピソードをSpotifyで聴く

要約。 これまでのファイターはすべて、各関節にあるモーターが関節を目標の角度まで動かす仕組みで動いています。私は、代わりに筋肉を使ったらどうなるかを問いました。筋肉は引くことしかできず、オンになるのが遅く、最適な長さから外れると弱くなり、拮抗する筋肉が両方働いたときにだけ硬くなります。3つの段階で、それぞれレンタルしたGPU上でムエタイの構えをゼロから学習させ、同じ設定のモーターの体と比べました。関節の筋肉(関節ごとに1対、計86本):学習ステップ数の2.1–2.9倍で解けました。MyoSuiteの本物の脚の筋肉を解剖学的な経路に沿わせたもの(まず26本、次に80本すべて):3つの修正を入れた後、それぞれ2.6–3.9倍と4.9–5.8倍でした。GPUシミュレーションは遅くならず、増えた分はすべて学習です。次にパンチです。モーターの体は自力でパンチを学びました(ヒット4 % → 9 %)が、筋肉の体は点が入るほど速くパンチを打てませんでした。腕の筋肉がすべてのパンチにブレーキをかけていたのです。強制的にオンにすると、ジャブは拮抗筋をオフにしたとき8.6 m/s、半分オンにしたとき3.0 m/sに達します(ヒットには3.5が必要)。腕を脱力させるとブレーキは解消し、ファイターは初めて筋肉でパンチを当てましたが、その後は倒れずにいられる遅いパンチに落ち着いてしまいました。

関節にモーター

ほかのすべての記事に出てくるファイターは、43の可動関節を持つMuJoCoの体で、関節ごとにモーターがあります。モーターは位置サーボです。方策(ポリシー)が各関節に参照モーションへの補正として目標角度を与え、サーボが関節をそこへ押し動かします。行動がゼロなら、すでに参照モーションに沿っています。ポーズを保つことが初期状態で、方策は何を変えるかだけを学べばよいのです。

本物の体は仕組みが違います。筋肉は引くことしかできないので、どの関節にも互いに逆向きに働く筋肉が最低2本必要です。筋肉は瞬時には反応しません。神経の信号(興奮)が筋肉をオンにするのに約10 ms、オフにするのに40 msかかります。その力は、どれだけ伸びているか、どれだけ速く動いているかによって変わります。そして関節は、両側の筋肉が同時に引いたときにだけ硬くなります。10月27日、私は問いました。もしファイターが筋肉で動いていたら、学習はどれだけ長くかかるのか、そもそも可能なのか、そして既存の成果のどれだけを再利用できるのか。

第1段階:すべての関節に1対の筋肉

最もすっきりした最初のテストは、駆動方式だけを変えることです。骨格、質量、接触、参照モーション、報酬は同じで、各関節のモーターを2本のMuJoCoの筋肉に置き換えます。それぞれ逆向きに引き、最適な長さではモーターと同じ強さです。これで86本の筋肉になります。MuJoCoの筋肉には、筋肉の制御を難しくする3つの性質があります。指令より遅れる活性化、長さと速さに依存する力、そして引くことしかできないことです。この段階で省いているのは解剖学です。各筋肉は1つの関節に固定のてこで作用します。

方策は筋肉ごとに1つの興奮を出力するようになり(43個ではなく86個の数値)、何もタダでは手に入りません。ゼロのときはすべての筋肉が半分の興奮で、どの関節も回さず、どの姿勢も保ちません。何もしなければ、サーボの体はサーボの力で約2秒立っていますが、筋肉の体は0.6秒で崩れ落ちます。

すべてのランは構えの環境をゼロから学習しました。構えを保ち、次にリズムに合わせて揺れ、次に押しを受け、トレーナーのテスト(リズム全開で20イテレーションにわたり、転倒5 %以下かつエピソードがほぼ最大長)に合格するまでです。どのランもレンタルしたGPU1台(RunPod、RTX 4090または5090)で、MuJoCo Warpを使って1,024体のファイターを同時にシミュレーションしました。

  • 筋肉はGPU上のコストを増やしません。 筋肉の体は毎秒45.5kのステップでシミュレーションでき、サーボの体は36.6kでした。コストの大部分は接触であって、筋肉ではありません。
  • サーボの体と同じ設定では、解けませんでした。 2つのシードは転倒7–9 %で頭打ちになり、1つは走り続けた末に185 Mステップで転倒100 %へと崩壊しました。どの転倒の前にも、最大の強さに達している筋肉はありませんでした。問題はタイミングでした。方策の行動は平滑化フィルタを通り、筋肉自身の遅れに加えて約80 msの遅れが生じていたのです。
  • フィルタを軽くすると(約20 ms)解けました。 2つのシードで37.8 Mと26.6 Mステップです。同じフィルタのサーボの体は12.9 Mと12.7 Mでした。シードごとに比べてステップ数は2.1–2.9倍、時間は1.8–2.6倍(5~6分に対して10~15分)です。
  • サーボの方策を教師にする(その関節トルクを目標の興奮に変換する)と、序盤は3~4倍速くなりましたが、教師の影響が薄れるとランは同じ頭打ちに戻りました。筋肉の体で学習することの代わりにはなりません。

学習済みモデル以外のすべては、そのまま引き継げました。体、参照モーション、報酬、GPUのトレーナー、クラウドのツール、評価ツールです。

第2段階:本物の脚の筋肉

関節の筋肉は単純化したものです。本物の脚の筋肉は骨の上を通る経路に沿って走っているので、関節に対するてこが角度によって変わり、2つの関節をまたぐものもいくつかあります(ハムストリングは膝を曲げ、股関節を伸ばします)。私は、この種の研究のために作られたオープンソースの筋骨格モデルであるMyoSuiteの脚の筋肉を使い、その経路をファイターの骨格に合わせて拡大縮小し、ファイターの脚に対応させました。第2a段階ではMyoLeg26(片脚13本、経路は計26本)を、第2b段階では完全なMyoLeg(片脚40本、骨に巻きつくもの)を使いました。股関節より上はすべて第1段階の関節ペアのままなので、全身では96本、次に142本の筋肉になりました。すべての筋肉のてこの腕の長さを、それがまたぐすべての関節で、MyoSuite自身のモデルと照らし合わせて確認しました。どこでも2.2 cm以内、ほとんどが1 cm以内でした。

2aの体が構えを学習するまでに3つの修正が必要でした。そのどれも、サーボの体には必要ありませんでした。

中立なゼロ行動。 半分の興奮では、本物の脚の筋肉は打ち消し合いません。たとえば股関節の伸筋は屈筋よりずっと強く、脚は構えから最大約180 N mの力で押しやられていました。そこからでは、方策は構えをまったく見つけられませんでした。背筋を伸ばし、脚をまっすぐにし、腕を広げて立っていたのです。私は各脚の筋肉の安静時の興奮を、静止した構えを保つ値に設定しました。これでゼロ行動は、サーボの体と同じく「立て」を意味するようになります。

関節の限界に寄りかかることへのコスト。 これで両方のシードがトレーナーのテストに合格しましたが、姿勢が間違っていました。後ろ脚がまっすぐ伸びて後ろへ振られ、それを補うように体幹が曲がっていたのです(図1、中央)。最初は筋肉が弱いのだと推測しました。構えでは後ろの股関節を45°外へ回しますが、そこでは股関節の外転筋がてこの半分を失います。MyoSuite自身のモデルでもそうです。外転筋を1.5倍、2倍に強くしても、角度は1度も変わりませんでした。本当の原因は、後ろ脚が股関節と膝の関節の限界に押しつけられ、その筋肉が遊んでいたことでした。限界に達したまっすぐな脚は、シミュレーションの骨によってタダで支えられます。方策はそれを見つけ、手放しませんでした。限界から10°以内で寄りかかることに小さなコストを課すと、このタダの支えがなくなりました。後ろの膝は33–35°になり(参照は43°)、サーボの体はこのコストにまったく影響を受けませんでした。

方策の更新を小さく。 正しい姿勢になると、バランスは転倒7–15 %で頭打ちになり、その後崩壊しました。学習率を3分の1にし、各バッチに対するPPOのパス数を半分にすると、さらに6.6 Mステップ以内に解けました。

ムエタイの構えをとるファイターのMuJoCoのフレーム5枚:サーボの体、第1段階、後ろ脚がまっすぐな第2a段階、修正後の第2a段階、第2b段階
図1 3秒後の静止した構え。決定論的な方策、押しなし、ファイターの左側から見たもの:サーボの体(mbase-s0-11.7M)、第1段階(muscle1f-37.8M)、後ろ脚が股関節と膝の限界に寄りかかった第2a段階(muscle2n-46.2M)、関節の限界のコストを入れた第2a段階(muscle2S-33.1M)、第2b段階(muscle2b-63.3M)。最後の3つの脚にある赤い線は筋肉の経路です。チェックポイントからMuJoCoでレンダリングしました。

3つすべてを最初から入れると、2aの体はゼロから33.1 Mと49.6 Mステップで、完全な2bの体は63.3 Mと73.5 Mステップで解けました。一発で、体に特化したものは何も足さずにです。図2は4つの体を並べたものです。

解けるまでのステップ数(百万)サーボ(モーター43個): 12.7–12.912.7–12.9第1段階(筋肉86本): 26.6–37.826.6–37.82a(筋肉96本): 33.1–49.633.1–49.62b(筋肉142本): 63.3–73.563.3–73.5サーボの体のステップ数に対する倍率サーボ(モーター43個): 1×1×第1段階(筋肉86本): 2.1–2.9×2.1–2.9×2a(筋肉96本): 2.6–3.9×2.6–3.9×2b(筋肉142本): 4.9–5.8×4.9–5.8×サーボ(モーター43個)第1段階(筋肉86本)2a(筋肉96本)2b(筋肉142本)
図2 構えをゼロから学習して、トレーナーのテストに合格するまでのステップ数。2つのシードの平均で、各棒の上に範囲を示しています。すべて同じ行動フィルタと報酬です。第2a・2b段階には関節の限界のコストと小さなPPOの更新も入っていますが、これらはサーボの体の結果を変えません(12.3 Mと12.1 Mステップ)。RunPodのRTX 4090、5090、RTX PRO 6000 GPU、1,024体のファイターを同時に。

つまり、可能です。学習量は2~6倍で、解剖学的な要素が多いほど学習も多く必要になります。実時間では、筋肉の体はGPU1台で10~37分かかり、サーボは約6分でした。筋肉の構えは少し緩く(ポーズのスコアはサーボの0.95に対して0.86–0.89)、第1段階の構えはサーボより滑らかに静止していました(関節の反転は毎秒0.15に対して0.04)。

第3段階:パンチ

立つことと戦うことは別です。ファイターの目的は戦うことです。パンチの環境は、5つのパンチ(ジャブ、クロス、左右のフック、アッパーカット)を学習したものと同じです。指令に応じて空中の標的やサンドバッグにパンチを打ち、その合間に押しが入ります。拳が標的から5 cm以内を3.5 m/s以上で通過すると、パンチはヒットとみなされます。どの体もそれぞれ自分の構えから、同じ設定で始めました。

サーボの体は助けなしにパンチを学びました。10 Mステップ以内にパンチがガードから出るようになり、145 Mステップでヒットは4 %から9 %に上がり、外れの距離は25 cmから10 cmに縮まり、転倒は3 %未満でした。2aの筋肉の体は一度も当てられませんでした。最初のランでは腕がほとんどガードから離れず(外れは51–68 cm)、ラン全体が押しへの対応に費やされました。

伸張反射

サーボの体は大まかなパンチをタダで手に入れます。目標値がパンチの参照モーションに沿っているので、方策がまだ何も学んでいなくても腕が前に出るのです。筋肉の体は、96個の興奮と報酬だけからパンチを見つけなければなりません。人間の場合、この仕事の一部は脊髄が担います。伸張反射は、筋肉が伸ばされるとその筋肉を興奮させ、手足を本来向かっていた方向へ引き戻します。私は各筋肉に伸張反射を1つずつ与えました。目標のポーズでの長さを超えて伸ばされた量に比例した追加の興奮と、伸びる速さに応じた少しの追加です。腕はすぐに前に出るようになりました(外れは28–31 cmで、サーボの体の出発点と同じです)。

ただし、反射は最初から入っていなければなりませんでした。反射なしで学習した構えに後からオンにすると、体は最初エピソードの97 %で倒れ、30 Mステップ後でも25–30 %倒れました。反射ありでゼロから学習した構えは56.0 Mステップで解け、ポーズは全体で最もきれいでした(0.93)が、ジッターは3倍でした(関節の反転は毎秒0.10に対して0.30)。その構えからのパンチは、やはりヒットなしでした。

なぜ点が入らなかったのか

探索ノイズなしでテストすると、筋肉のファイターはまったく倒れず、いくつかのパンチは惜しいところまで行きました。アッパーカットは標的から3–10 cm、左フックは10–16 cmです。しかし拳の速さは0.5–2.9 m/sでした。サーボの体は3~11です。パンチは短いというより、遅かったのです。

ジャブの間の腕の筋肉を記録すると、理由が分かりました。肩と肘のペアの両方の筋肉が、ずっと0.3から0.7の興奮のあいだにありました。かなりの共収縮です。伸ばされながらオンになっている筋肉は、自分が引ける以上に抵抗するので、拮抗筋がすべてのパンチにブレーキをかけていたのです。力不足ではなくこれが原因だと確かめるため、ジャブの筋肉(肩を前に出す筋肉と肘を伸ばす筋肉)を構えから強制的に完全にオンにし、開ループで、ほかはすべて同じにしました。

拳の最高速度(m/s)ヒットには3.5が必要拮抗筋オフ: 8.68.6拮抗筋を半分: 3.03.0拮抗筋オフ拮抗筋を半分
図3 ジャブの筋肉を構えから強制的に完全にオンにしたときの拳の最高速度。拮抗筋(肩を後ろへ、肘を曲げる)はオフ、または学習済みの方策が保っていた半分の興奮にしています。反射ありの第2a段階の体(19 Mステップ時点のjab3R)、CPUのMuJoCo、0.5秒。破線はヒットに必要な速さです。

体は十分に強いのです。ブレーキを外せば8.6 m/sです。方策が保っていたように半分にすると3.0 m/sで、ヒットに必要な速さを下回ります。そして方策は、拮抗筋をオフにすることを最後まで学びませんでした。半分の興奮がすべての腕の筋肉の安静点であり、正しい筋肉で正しい瞬間にそこから離れるというのは、試行錯誤で見つけるには大変なことなのです。

脱力した腕

そこで腕の安静点を変えました。腕の筋肉はすべて50 %ではなく10 %で休み、方策の行動は引き続きオフから完全なオンまで全範囲をカバーします。これは違う出発点であって、違う体ではありません。筋肉もその強さも同じです。この設定での構えは47.1 Mステップで解けました(ポーズ0.92)。パンチでは拮抗筋がオフになるようになり(パンチを打つ筋肉が完全にオンになる間、反射がそれらをゼロへ押しやります)、ファイターは4 Mステップ以内に筋肉の体で初めてのヒットを記録しました。4.3 m/sのアッパーカットです。

そこで改善が止まりました。約10 Mステップのうちに、方策は倒れずにいられる遅いパンチ(局所最適解)に落ち着き、ジャブは1.5 m/sで、その後さらに120 Mステップそのままでした(図4)。学習中と同じく探索ノイズをオンにすると、押しが最も弱いときでもエピソードの約4分の1で倒れました。ノイズなしでは一度も倒れませんでした。ノイズを3分の1にすると、パンチは早く出るようになりました(序盤でヒット2 %)が、ほぼすべてのエピソードで倒れ、二度と回復しませんでした。速いパンチはこの体を倒してしまいます。サーボの体の脚はそれを吸収します。

サーボ(jab3s)筋肉(jab3A)転倒で終わったエピソード(%) 0–10 M: サーボ(jab3s) 47, 筋肉(jab3A) 70 4770 20–30 M: サーボ(jab3s) 6.3, 筋肉(jab3A) 26.5 6.326.5 60–70 M: サーボ(jab3s) 2.9, 筋肉(jab3A) 24 2.924 100–110 M: サーボ(jab3s) 2.7, 筋肉(jab3A) 22.4 2.722.4 130–140 M: サーボ(jab3s) 2.4, 筋肉(jab3A) 23.8 2.423.8ヒットしたパンチ(%) 0–10 M: サーボ(jab3s) 0.8, 筋肉(jab3A) 0.2 0.80.2 20–30 M: サーボ(jab3s) 4.3, 筋肉(jab3A) 0.4 4.30.4 60–70 M: サーボ(jab3s) 4.6, 筋肉(jab3A) 0.1 4.60.1 100–110 M: サーボ(jab3s) 6.9, 筋肉(jab3A) 0.1 6.90.1 130–140 M: サーボ(jab3s) 8.6, 筋肉(jab3A) 0.3 8.60.3外れの距離(cm) 0–10 M: サーボ(jab3s) 25.2, 筋肉(jab3A) 24.1 25.224.1 20–30 M: サーボ(jab3s) 21.7, 筋肉(jab3A) 24.9 21.724.9 60–70 M: サーボ(jab3s) 17.2, 筋肉(jab3A) 33.3 17.233.3 100–110 M: サーボ(jab3s) 12.5, 筋肉(jab3A) 34.7 12.534.7 130–140 M: サーボ(jab3s) 10, 筋肉(jab3A) 30.6 1030.60–10 M20–30 M60–70 M100–110 M130–140 M
図4 サーボの体(自身の構えからのjab3s)と、脱力した腕と反射を持つ筋肉の体(自身の構えからのjab3A)のパンチ。同じパンチの環境と設定で、どちらもRunPodのGPU。学習中と同じく探索ノイズと押しありで、10 M学習ステップごとの平均です。サーボの体はずっと改善を続け、筋肉の体はエピソードの約4分の1が転倒、ヒットはほぼなしのままです。
ジャブのMuJoCoのフレーム2枚:腕がまっすぐなサーボの体と、腕が曲がった筋肉の体
図5 最も遠くまで伸びたときのジャブ。決定論的な方策、押しなし:パンチの学習を145 Mステップ行ったサーボの体(jab3s)と、133 Mステップ行った脱力した腕の筋肉の体(jab3A)。サーボの腕はまっすぐで線上にあり、筋肉の体は肘を曲げたまま体重を後ろに残しています。最終チェックポイントからMuJoCoでレンダリングしました。

私はそこで止めました。次のステップは、ステップ数を増やすことではなく、もっと大きな作業です。サーボの体のパンチを筋肉の腕に見せる教師か、低いところから始めてファイターが上達するにつれて上がっていくヒット速度の基準です。

これが意味すること

  • 可能か:構えについては、はい。 本物の脚の解剖学を含む142本の筋肉を持つ体が、ムエタイの構え、そのリズムと押しへの対応を、ゼロから、GPU1台で40分未満で学習します。
  • どれだけ長くかかるか:関節の筋肉で2~3倍、完全な脚で5~6倍。同じ設定のサーボの体と比べた値です。シミュレーションは遅くならず、増えた分はすべて学習です。
  • 何が引き継げるか: 学習済みモデル以外のすべて。体、参照モーション、報酬、学習コード、ツールです。サーボの方策を教師にしても、役立つのは序盤だけです。
  • モーターの体には要らず、筋肉の体に必要なもの: ポーズを保つ安静点。関節の限界にぶら下がらない理由。バランスの限界近くでの小さな学習ステップ。腕については、速く動けるほど低い安静点。
  • まだ学んでいないこと:速くパンチを打ちながら倒れないこと。 サーボの体はパンチの形をタダで手に入れ、脚がその振りを吸収します。筋肉の体はその両方を見つけなければなりません。腕は十分速く動けます。速さとバランスを両立させることが、未解決の問題です。

コーチとして思うこと

私の問いは単純なものでした。このファイターがモーターではなく筋肉を持っていたら、学ぶのにどれだけ長くかかるのか、そもそも学べるのか、そしてこれまで作ってきたもののどれだけがまだ役に立つのか。私は実験をその推奨のとおりに進めさせ(「推奨はすべてそのとおりにやって」)、2日目からは$50の予算内で自分で判断して報告するように伝えました。新しい構えの動画が届くたびに、それを見ていました。

これまで体にはサーボモーターを使ってきました。便利で学習が速いからです。でも本当の目標は、人間としてムエタイを戦うことです。ですから筋肉がどう動くのか、そしてゆくゆくはその動きにかかるエネルギーを理解することがとても大切です。

これはごく初期の実験です。すべての技を扱っているわけではなく、冗長性や、筋肉の損傷、過伸展についてはあまり試していません。いずれはブラジリアン柔術もやります。そこでは関節が過伸展し、靭帯が切れることもあります。ですからこれは文字どおり、サーボのロボットが筋肉と、より人間に近い構造にどう置き換わるのかを理解するための、私の最初の実験です。

作業ログ

この記事の裏にあるランを、段階ごとにまとめています。費用は、RunPodの台帳にある各ポッドの課金時間に時間単価を掛けたものなので、請求書ではなく見積もりです。新しい体ごとに、そのシミュレーションがCPU版と一致するかを確かめた短いGPUのチェックも含んでいます。

作業ログラン時間コスト
筋肉、ステージ3:パンチ2026年10月28日 · 筋肉の体での5つのパンチを、同じ設定のサーボの体と比べる。筋肉の体は一度も点になるほど速く打てませんでした。その理由、伸張反射と脱力した腕、そしてどこで止めたか。109$11.18
筋肉、ステージ2:本物の脚の筋肉2026年10月27–28日 · MyoSuite の脚の筋肉を本来の経路のままファイターに当てはめる:まず26本、次に80本すべて。トルクが中立なゼロ行動、関節の可動限界に寄りかかることへのコスト、小さめの PPO 更新で、どちらも構えにたどり着きました。156.1$9.69
筋肉、ステージ1:モーターの代わりに関節の筋肉2026年10月27日 · 私が頼んだ実験です。ファイターをサーボではなく86本の関節の筋肉で動かし、構えを覚えられるのか、覚えられるならどれだけ長くかかるのかを測ります。84.9$5.75
合計3320$26.62