ムエタイ · パンチ · スピード · 報酬設計 · コーチング

速いパンチへ:練習している一般人からプロへ向けて

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

学習コスト 約$8学習ラン7回、約4.5マシン時間 · 内訳

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

5種類のパンチの記事の最後で、ファイターはジャブ、クロス、左右のフック、アッパーカットを、空中でも35 kgのサンドバッグに対しても、倒れずに打てるようになっていました。コーチのヤム トニーはそれに満足していましたが、まだ終わりではありませんでした。

トニーの評価は2つありました。1つ目は、パンチは悪くないものの、まだ少し届かないものがあること、特にクロスです。2つ目はスピードです。練習している一般の人としては悪くありません。しかしプロのレベルなら、もっと求めます。インパクトの瞬間の拳がもっと速く、そしてガードから目標へ行って戻ってくるまでのパンチ全体がもっと早く終わることです。

この記事は10月18日の午後、11:45から16:27 UTCまでの7回の学習ランを扱います。修正のいくつかは、ファイターの学習のさせ方と報酬の与え方の変更でした。1つは体そのものの変更です。トニーは肘に、より強く速いモーターを許可しました。

記事の冒頭の動画が結果です。下の図はMuJoCoシミュレーションの静止画です。

まず測る

何かを変える前に、まず測りました。ファイターは、各パンチの手本となるアニメーションである参照モーションより遅いのでしょうか。それなら、学習の何かが足を引っ張っていることになります。それとも、アニメーションとちょうど同じ速さなのでしょうか。それなら、アニメーションそのものが上限になっていることになります。

答えは後者でした。どのパンチも、アニメーション自身のスケジュール通り、100分の数秒以内の差で目標に届いていました。ボタンを押してから、ジャブは0.22 s、クロスは0.26 s、フックは約0.5 s、アッパーカットは0.36 sです。理由は仕組みそのものにありました。方策(ポリシー)は関節を直接動かしません。アニメーションの姿勢に小さな補正を加え、モーターが各関節をその合計に向けて引っ張ります。アニメーションは自分の時計で進むので、ファイターはパンチの形を少し曲げることはできても、そのタイミングは変えられなかったのです。

そして報酬も、それ以上を求めていませんでした。目標に早く届くことには何も支払われず、拳の速さへの支払いも、拳がアニメーションの速さに追いついたところで伸びなくなっていました。ファイターは、支払われる通りのことを正確にやっていたのです。

教訓1:ペースはファイターに決めさせる

最初の変更では、時計の操作を方策に任せました。方策の出力を1つ増やし、パンチのクロックの速さを決められるようにしました。アニメーションのペースから2倍速までの範囲です。パンチの形は引き続きアニメーションが示しますが、それをどれくらいの速さで再生するかは方策が決めます。新しい報酬は、アニメーションより早く目標に届くとパンチ1回につき1回支払われ、拳の速さへの支払いは従来の上限の1.5倍まで伸びるようにしました。

最初のランは、狙いとは逆の結果になりました。11 Mステップのうちに、どのパンチも遅くなったのです。ジャブが目標に届くまで0.22 sではなく0.36 s、左フックは0.52 sではなく0.92 sかかりました。クロックは上げられるどころか、下げられていました。

理由は報酬の計算にありました。スタイルの項目のほとんど(腰がどれだけよく回るか、手がどこにあるか、体がどれだけまっすぐか)は、毎ステップ、つまり1秒に50回支払われます。2倍の時間がかかるパンチは、それを2倍受け取れます。そのほうが速さへの新しいボーナスより価値があったので、方策は報酬を稼ぐために遅くなったのです。これは報酬ハッキングの教科書的な例です。方策は意図されたことではなく、数字が言う通りのことをしました。

修正は、パンチの長さがスタイルへの支払いに関係しないようにすることでした。クロックは速くなる方向だけ(アニメーションのペースの1倍から2倍)にし、パンチの間はステップごとの報酬すべてにクロックの速さを掛けます。2倍速で打ったパンチは、半分の時間で、2倍の割合でスタイルの報酬を受け取ります。どちらでも合計は同じです。速いパンチと遅いパンチを区別できるのは、速さとインパクトだけになりました。

2回目のランは、体を回して打つパンチではすぐにうまくいきました。フックは0.48〜0.52 sではなく0.36〜0.39 sで、アッパーカットは0.36 sではなく0.24 sで目標に届きました。打撃の速さは5.5〜6.3 m/sでした。図1は左フックでの違いです。以前のファイターの拳が目標に届く頃には、新しいファイターはもう当てて、ガードに戻っています。

MuJoCoのファイターが左フックを打つ5コマが2段に並び、下の段では拳が2コマ早く緑の目標に届いてガードに戻っている
図1 空中での左フック。変更前(上:5種類のパンチの記事の最終モデル)と変更後(下:この記事の最終モデル)を、ボタンを押してから同じ時刻(0.12、0.24、0.34、0.44、0.52 s)で並べています。緑の点が目標です。変更後は0.34 sで拳が目標に届き、0.44 sにはガードに戻っています。変更前は0.52 sに届きます。

教訓2:手前で止まっても得をしないように

まっすぐ打つパンチ、ジャブとクロスはついてきませんでした。どちらも約10 m/sまで加速したあと、ブレーキをかけ、目標の約2.6 cm手前で止まっていました。

ここでも報酬が理由を説明していました。5種類のパンチの作業では、届かなかったパンチは途中の最高速度で採点されていたので、3 cm手前で止まった拳でも何かを学べました(トニーの「そんなに白黒はっきりさせないで」という言葉です)。速さへの支払いを1.5倍に上げたことで、10 m/sで2.6 cm手前に止まるほうが、2.4 m/sで届くより多くもらえるようになっていたのです。これは減額で直しました。届かなかったパンチは最高速度の0.4倍で採点し、6 m/sを超える評価にはしません。10 m/sで手前に止まっても4 m/sで届いたのと同じ評価になり、速さへの支払いもありません。

このランのジャブとクロスは再び目標を通るようになりましたが、届くのが遅く、約3 m/sでした。その状態が50 Mステップ続きました。下の図7の学習の数値は、このランの間ずっと横ばいです。

教訓3:伸びきる肘

まず思いつくのは腰でした。体が十分に前へ出ていないので、腕が届かないのではないかということです。測ってみると違いました。腰はほぼアニメーション通りの位置にありました。問題は腕でした。打つ側の肘は37〜44°より伸びることがなく、アニメーションでは20〜25°まで伸びています。

それは方策の選択だったのでしょうか。テストで答えが出ました。パンチの間、方策の肘の出力を上書きし、腕を完全に伸ばすよう強制しました。それでも肘は37〜40°で止まりました。つまり、方策が腕を曲げたままにすることを選んでいたのではありません。モーターが時間内に腕を伸ばしきれなかったのです。

各関節は位置サーボで動いています。ばねのように目標の角度へ引っ張り、関節がぐらつかないように動きに抵抗するダンパーがあり、トルクの合計には上限があります。ゆっくりした動きではダンパーはほとんど影響しません。しかし速く肘を伸ばすときには、ダンパーがトルクの予算をすべて使ってしまい、しかもアニメーションは腕をまっすぐに保つのがわずか0.01 sで、すぐ戻り始めます。拳は時間切れになっていました。クロスの以前からの「届かない」問題も、おそらくずっとこれが原因だったのでしょう。

トニーの質問は実際的なものでした。

肘をもっと速く伸ばせるようにしたら、役に立つかな? 今のニューラルネットワークをそのまま使い続けられるよね?

どちらも答えは「はい」です。ネットワークの入力と出力は変わらないので、同じモデルから学習を続けられます。肘のモーターはトルクの上限を1.5倍の90から135 N mに、減衰を4分の1の1ラジアンあたり36から13.5 N m sにしました。これは学習ではなく体についての判断です。コーチが、ファイターの肘は鍛えられたアスリートのようにパッと伸びるべきだと決め、シミュレーションの腕はその部分が以前より強くなりました。図2がその効果です。

MuJoCoのファイターがクロスを打つ様子を横から見た4コマが2段に並び、下の段では腕が完全に伸びて拳が緑の目標に届いている
図2 横から見たクロス。肘の変更前と変更後を、押してから0.18、0.20、0.22、0.24 sで並べています。上:以前の肘のモーター。腕は曲がったままで、拳は目標(緑)の手前で止まります。下:強く、減衰を減らした肘のモーターで、学習ランを1回行ったあと。腕は目標のところで完全に伸びています。

肘はすぐに伸びるようになりました。伸びきったときの角度は、以前の37〜44°に対して16〜17°です。学習中の命中率は約18%から27%に跳ね上がり、腕をいっぱいに伸ばすジャブは学習中、以前の10〜14%に対して41〜49%当たりました。図7の中で最も大きな一段の伸びです。

教訓4:肩が前へ出てこなければならない

これでジャブは届くようになりました。クロスはまだ1〜2 cm足りません。伸びきったときにパンチの線に沿って測ると、理由がわかりました。クロスの腰は正しい位置にありましたが、胸と奥の肩がアニメーションより6〜8.5 cm遅れていました。胴体が奥の肩を前へ回しきれていなかったのです。クロスは後ろ足から腰、胴体を通って拳へと打ち出されます。これが運動連鎖で、ここではその連鎖が肩で切れていました。

胴体が弱すぎたのでしょうか。いいえ。クロスの間、背骨と肩のモーターはトルクの上限に一度も達していませんでした。単に求められていなかったのです。そこで新しい報酬項目で求めることにしました。まっすぐのパンチの毎ステップ、打つ側の肩のアニメーションからの遅れが約4 cm以内であることに支払います。

最初の版は何の効果もありませんでした。遅れが開くのはインパクト直前の最後の1〜2ステップだけで、その後もインパクトのあとまで続き、そこではこの項目がもう数えられていませんでした。そのため、どちらにしてもほとんど支払いがなかったのです。2つ目の版は3倍近く強く(1ステップあたり4)、範囲を狭く(3 cm)し、インパクトを通して数え続けるようにしました。10 Mステップのうちに、空中でのクロスが当たり始めました。このシリーズ全体で初めてのことです。クロスの肩の遅れは、最も大きいところで7〜9 cmから2〜6.5 cmに減り、当たり終わる頃には約0〜1 cmに戻りました。

約15 Mステップのあと、学習中の命中率は約33%で頭打ちになりました。さらに1000万ステップ続けても何も変わらなかったので、プラトーに達したところで、16:27 UTCにランを止めました。

現在の到達点

最終モデルは5種類のパンチの記事と同じ方法でテストしました。探索ノイズなし(決定論的)で、ファイターのリズムの異なる瞬間に、パンチごとに6回ボタンを押し、空中と重い目標の両方で試しました。図3は、各パンチが目標に届いた瞬間です。

MuJoCoのファイターがジャブ、クロス、左フック、右フック、アッパーカットを当てた瞬間の5コマ
図3 最終モデルの空中での5種類のパンチ。それぞれ目標(緑)に届いた瞬間です。押してから、ジャブは0.18 s、クロスは0.22 s、左右のフックは0.34 s、アッパーカットは0.24 s。5つすべてが当たっています。

どのパンチも以前より早く目標に届くようになりました。ジャブで0.04 s、左フックで0.19 s早くなっています(図4)。どれも、手本にしたアニメーションより早くなりました。トニーが名指ししたクロスが最も変わりました。空中では以前、6回中4回は約1 m/sで手前に止まっていました。今は6回中5回、4.4 m/sで当たります。図5はそれをコマ送りで示しています。

変更前変更後参照アニメーション押してから目標までの時間(s)、短いほど速い ジャブ: 変更前 0.22, 変更後 0.18, 参照アニメーション 0.22 0.220.18 クロス: 変更前 0.26, 変更後 0.22, 参照アニメーション 0.23 0.260.22 左フック: 変更前 0.52, 変更後 0.33, 参照アニメーション 0.48 0.520.33 右フック: 変更前 0.48, 変更後 0.34, 参照アニメーション 0.48 0.480.34 アッパーカット: 変更前 0.36, 変更後 0.23, 参照アニメーション 0.36 0.360.23目標での拳の速さ(m/s) ジャブ: 変更前 4.3, 変更後 5.1 4.35.1 クロス: 変更前 1.0, 変更後 4.4 1.04.4 左フック: 変更前 5.3, 変更後 4.2 5.34.2 右フック: 変更前 5.7, 変更後 6.1 5.76.1 アッパーカット: 変更前 4.6, 変更後 4.3 4.64.3ジャブクロス左フック右フックアッパーカット
図4 変更前(5種類のパンチの記事の最終モデル)と変更後(この記事の最終モデル)。空中、決定論的、パンチごとに6回押した中央値です。上:ボタンを押してから拳が目標に届くまでの時間。両側の破線の印は参照アニメーションの時間です。下:目標に届いたときの、パンチの線に沿った拳の速さ。変更前のクロスは6回中4回、手前で止まっていました。
MuJoCoのファイターがクロスを打つ5コマが2段に並び、下の段は緑の目標に早く届き、最後のコマでは引き戻している
図5 空中でのクロス。変更前(上)と変更後(下)を、同じリズムの状態で、押してから0.06、0.12、0.18、0.22、0.26 sで並べています。変更後は0.22 sで拳が目標(緑)に5.5 m/sで届き、0.26 sにはもう戻り始めています。変更前は0.26 sでもまだ進んでいる途中で、届いたときは1.4 m/sと、命中と数えるには遅すぎます。

テスト全体では、以前の34回に対して60回中38回当たり、一度も倒れませんでした(図6)。

空中での命中(6回中)ジャブ: 55クロス: 55左フック: 66右フック: 66アッパーカット: 66重い目標での命中(6回中)ジャブ: 55クロス: 55左フック: 00右フック: 00アッパーカット: 00ジャブクロス左フック右フックアッパーカット
図6 最終モデルのテスト。パンチごとに6回押し、決定論的。上:空中での命中(10 cm以内に3 m/s以上で到達)。下:重い目標での命中(35 kgのバッグ。アッパーカットは25 kgのボール)。合計は60回中38回で、転倒なし(変更前は60回中34回)。クロスは空中で0回から5回になり、ジャブはバッグで1回分減りました。

すべてが良くなったわけではありません。

  • 重い目標に対するフックとアッパーカットは、以前と同じく当たりが軽いままです。バッグに伝わる運動量は10〜15 N sで、基準の約21 N sに届きません。左フックは、空中では約4 m/sなのが、バッグでは約1 m/sまで落ちます。
  • 左フックは早く届くようになったものの、少し遅くなりました。目標での速さは以前の5.3 m/sに対して4.2 m/sです。アッパーカットはほぼ同じです。早さの大部分は、拳が速くなったことではなく、無駄な時間を削ったことから来ています。
  • まっすぐのパンチは、腕が届くぎりぎりの位置で目標に当たっています。途中で約8.5 m/sの最高速に達し、目標までに4.5〜5 m/sに落ちます。リズムの状態によっては、まだわずかに手前で止まります。プロは腰で押し込んだり踏み込んだりして目標を打ち抜くので、インパクトの瞬間にも拳はまだ加速しています。

ここまでの道のりを数字で

最初のランを除くすべてのランは、直前のモデルから続けて学習しました(ファインチューニング)。5種類のパンチの記事と同じように、以前のモデルを凍結したコピーが構えとリズムの教師になりました(方策蒸留)。ただし、パンチについてはもう口出しさせていません。変えたいのは、まさにパンチのタイミングだったからです。

全パンチ:命中率伸ばしきったクロス:命中率clockshort fistelbowsshouldershoulder ×40%10%20%30%40%50%1 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 6%2 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 8%3 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 10%4 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 10%5 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 10%6 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 10%7 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 11%8 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 9%9 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 9%10 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 7%11 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 7%12 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 9%13 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 8%14 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 10%15 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 8%16 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 7%17 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 10%18 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 8%19 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 7%20 M ステップ: 全パンチ:命中率 16%, 伸ばしきったクロス:命中率 8%21 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 8%22 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 8%22 M ステップ: 全パンチ:命中率 14%, 伸ばしきったクロス:命中率 7%23 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 9%24 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 9%25 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 10%26 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 9%27 M ステップ: 全パンチ:命中率 16%, 伸ばしきったクロス:命中率 8%28 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 8%29 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 11%30 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 11%31 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 11%32 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 14%33 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 14%34 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 13%35 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 12%36 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 13%37 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 12%38 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 12%39 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 12%40 M ステップ: 全パンチ:命中率 21%, 伸ばしきったクロス:命中率 14%41 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 14%42 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 8%43 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 11%44 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 11%45 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 13%46 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 10%47 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 9%48 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 11%49 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 10%50 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 12%51 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 13%52 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 14%53 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 10%54 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 10%55 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 11%56 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 12%57 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 11%58 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 13%59 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 12%60 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 11%61 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 12%62 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 9%63 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 13%64 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 10%65 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 12%66 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 13%67 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 16%68 M ステップ: 全パンチ:命中率 17%, 伸ばしきったクロス:命中率 13%69 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 10%70 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 13%71 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 11%72 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 12%73 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 10%74 M ステップ: 全パンチ:命中率 18%, 伸ばしきったクロス:命中率 10%75 M ステップ: 全パンチ:命中率 19%, 伸ばしきったクロス:命中率 12%76 M ステップ: 全パンチ:命中率 21%, 伸ばしきったクロス:命中率 15%77 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 15%78 M ステップ: 全パンチ:命中率 21%, 伸ばしきったクロス:命中率 15%79 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 13%80 M ステップ: 全パンチ:命中率 20%, 伸ばしきったクロス:命中率 14%81 M ステップ: 全パンチ:命中率 21%, 伸ばしきったクロス:命中率 17%82 M ステップ: 全パンチ:命中率 21%, 伸ばしきったクロス:命中率 17%83 M ステップ: 全パンチ:命中率 24%, 伸ばしきったクロス:命中率 19%84 M ステップ: 全パンチ:命中率 28%, 伸ばしきったクロス:命中率 29%85 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 27%86 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 27%87 M ステップ: 全パンチ:命中率 31%, 伸ばしきったクロス:命中率 31%88 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 31%89 M ステップ: 全パンチ:命中率 31%, 伸ばしきったクロス:命中率 33%90 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 31%91 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 30%92 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 28%93 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 26%94 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 23%95 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 25%96 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 27%97 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 22%98 M ステップ: 全パンチ:命中率 28%, 伸ばしきったクロス:命中率 22%99 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 24%100 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 25%101 M ステップ: 全パンチ:命中率 26%, 伸ばしきったクロス:命中率 19%102 M ステップ: 全パンチ:命中率 28%, 伸ばしきったクロス:命中率 23%103 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 22%104 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 21%105 M ステップ: 全パンチ:命中率 28%, 伸ばしきったクロス:命中率 23%106 M ステップ: 全パンチ:命中率 26%, 伸ばしきったクロス:命中率 25%107 M ステップ: 全パンチ:命中率 28%, 伸ばしきったクロス:命中率 24%108 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 25%109 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 24%110 M ステップ: 全パンチ:命中率 28%, 伸ばしきったクロス:命中率 27%111 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 31%112 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 26%113 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 29%114 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 29%115 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 28%116 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 24%117 M ステップ: 全パンチ:命中率 26%, 伸ばしきったクロス:命中率 22%118 M ステップ: 全パンチ:命中率 27%, 伸ばしきったクロス:命中率 22%119 M ステップ: 全パンチ:命中率 28%, 伸ばしきったクロス:命中率 23%119 M ステップ: 全パンチ:命中率 25%, 伸ばしきったクロス:命中率 23%120 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 32%121 M ステップ: 全パンチ:命中率 31%, 伸ばしきったクロス:命中率 34%122 M ステップ: 全パンチ:命中率 30%, 伸ばしきったクロス:命中率 31%123 M ステップ: 全パンチ:命中率 31%, 伸ばしきったクロス:命中率 36%124 M ステップ: 全パンチ:命中率 32%, 伸ばしきったクロス:命中率 36%125 M ステップ: 全パンチ:命中率 31%, 伸ばしきったクロス:命中率 36%126 M ステップ: 全パンチ:命中率 32%, 伸ばしきったクロス:命中率 37%127 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 40%128 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 38%129 M ステップ: 全パンチ:命中率 29%, 伸ばしきったクロス:命中率 31%130 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 39%131 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 41%132 M ステップ: 全パンチ:命中率 36%, 伸ばしきったクロス:命中率 45%133 M ステップ: 全パンチ:命中率 36%, 伸ばしきったクロス:命中率 44%134 M ステップ: 全パンチ:命中率 34%, 伸ばしきったクロス:命中率 40%135 M ステップ: 全パンチ:命中率 35%, 伸ばしきったクロス:命中率 42%136 M ステップ: 全パンチ:命中率 34%, 伸ばしきったクロス:命中率 42%137 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 40%138 M ステップ: 全パンチ:命中率 34%, 伸ばしきったクロス:命中率 42%139 M ステップ: 全パンチ:命中率 34%, 伸ばしきったクロス:命中率 43%140 M ステップ: 全パンチ:命中率 34%, 伸ばしきったクロス:命中率 39%141 M ステップ: 全パンチ:命中率 34%, 伸ばしきったクロス:命中率 41%142 M ステップ: 全パンチ:命中率 31%, 伸ばしきったクロス:命中率 34%143 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 36%144 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 39%145 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 39%146 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 37%147 M ステップ: 全パンチ:命中率 31%, 伸ばしきったクロス:命中率 36%148 M ステップ: 全パンチ:命中率 33%, 伸ばしきったクロス:命中率 38%149 M ステップ: 全パンチ:命中率 32%, 伸ばしきったクロス:命中率 37%150 M ステップ: 全パンチ:命中率 35%, 伸ばしきったクロス:命中率 40%0M20M40M60M80M100M120M140M環境ステップ(ランを連結)
図7 5回のランをつなげた学習(最初の、遅くなってしまったランは破棄したので載せていません)。ティール:学習中の全パンチのうち当たった割合。紫:腕をいっぱいに伸ばすクロスのうち当たった割合。探索ノイズありで、100万ステップごとの平均です。「届かない拳」のランは50 Mステップの間横ばいで、強くした肘と、その次に強くした肩の項目が、2つの跳ね上がりです。
12:0013:0014:0015:0016:0016:30自分のクロック:11:46–12:09 UTC、0.4時間、遅くなった自分のクロック遅くなったクロック ×1–2:12:11–12:46 UTC、0.6時間、フックが早くクロック ×1–2フックが早く届かない拳:12:48–14:24 UTC、1.6時間、肘の限界届かない拳肘の限界肘:14:27–15:04 UTC、0.6時間、腕が伸びる肘腕が伸びる肩:15:05–15:08 UTC、0.1時間、クラッシュ肩クラッシュ肩:15:10–15:34 UTC、0.4時間、弱すぎ肩弱すぎ肩 ×4:15:36–16:27 UTC、0.8時間、最終肩 ×4最終
図8 7回のランを1つの時間軸に並べたもの(UTC、10月18日)。塗りつぶしたバーは、モデルが採用(凍結)されたランです。「肩」のランは最初の起動時にクラッシュし、2分後に起動し直しました。ラン間の短い空白は、前のマシンに対するAmazonのスポットリクエストがまだ閉じている途中だった時間です。
ラン変えたこと結果
自分のクロック方策がパンチの速さを決める(アニメーションの半分から2倍)、早く届くことへの報酬どのパンチも遅くなった:ステップごとのスタイルの報酬が長いパンチを優遇した。破棄
クロック ×1–2クロックは速くなる方向のみ。ステップごとの報酬にクロックの速さを掛けるフックとアッパーカットが25〜33%早くなり、当たる。ジャブとクロスは2.6 cm手前で止まる
届かない拳届かなかったパンチは最高速度の0.4倍で採点ジャブとクロスは届くが遅い。肘が伸びきらない。50 Mステップの間横ばい
肘肘のトルク上限 ×1.5、減衰 ×0.25肘が伸びる。学習中の命中率 18% → 27%
肩打つ側の肩がついてくることへの報酬弱すぎ:遅れが開くのは項目が数えられなくなったあとだった
肩 ×4肩の項目をより強く、狭く、インパクトを通して空中のクロスが当たる。テストで38/60。最終モデル

かかった費用

7回のランはすべて、5種類のパンチの作業の終盤と同じマシンを使いました。Amazon EC2のc8a.24xlargeで、96vCPU、us-east-1dで1時間$1.80のスポットインスタンスとして借りたものです。同じマシンをオンデマンドで借りると約$4.90かかります。1時間に約37 Mステップのシミュレーションを回しました。長い「届かない拳」のランは、進捗の動画を同じマシンでレンダリングしていたため、約25 Mにとどまりました。

どのランも1分ごとにチェックポイントを保存し、新しいランは以前のどのランのチェックポイントからでも始められたので、止めたランの学習が失われることはありませんでした。1回のクラッシュ(学習エピソードがパンチの途中から始まったときに、ある属性の設定が遅すぎた)による損失は、3分と9セントでした。

ランマシン時間コスト
自分のクロック0.38$0.69
クロック ×1–20.58$1.05
届かない拳1.6$2.88
肘0.62$1.11
肩(クラッシュした起動)0.05$0.09
肩0.4$0.72
肩 ×40.85$1.53
合計約4.5約$8

これらは請求書からではなく、各ランの開始・停止時刻と、その時点のゾーンのスポット価格から出した見積もりです。シミュレーションは合計約160 Mステップで、100万ステップあたり約5セントです。同じ作業をオンデマンドで行っていたら、約$22かかっていたでしょう。

次にやること

トニーの指摘は2つでした。クロスが届かないこと、そしてパンチがプロとしては速さが足りないことです。1つ目はほぼ解決しました。クロスは空中でもバッグでも当たります。2つ目は半分まで来ました。どのパンチも以前より早く、手本のアニメーションよりも早く打ち終わるようになりましたが、拳はまだ強く当たってはいません。

それが次のステップです。まっすぐのパンチは、腕をいっぱいに伸ばして届かせるのではなく、スピードを保ったまま目標を打ち抜く必要があります。そのためには腰からの押し込みを増やすか、踏み込みが必要です。同じ踏み込みは、本物のファイターなら飛び込んで打つような、より遠い目標にも必要です。そしてフックとアッパーカットは、バッグに触れるだけでなく、本当に体重を乗せなければなりません。