はじめに
株式会社EfficiNet Xの林 佑恭です.本記事では対人勝率95%以上を誇る最強エアホッケーAIについて紹介します!具体的には,UnityのML-Agentsを用いて開発した2DエアホッケーAIの作成方法や開発の狙いを解説します.ML-Agentsを使ったゲームAIに興味がある方の開発の参考になれば幸いです!
Unity上でエアホッケー台を作成する方法やコードの詳細については下記GitHubをチェックしてください!mainブランチでは速度モデル,加速度モデルブランチでは加速度モデルの環境が用意されています.
エアホッケーAIと対戦することができるexeファイルは下記リンクからダウンロードいただけます.是非,遊んでみてください!
目次
1. この記事の新規性
2. 実際に作成したもの
- 速度モデルの挙動
- 加速度モデルの挙動
- 速度モデルと加速度モデルの比較まとめ
3. 強化学習の枠組みから見た各モデルの問題設計
- 速度モデルの問題設計
- 加速度モデルの問題設計
4. 強いモデルを作るコツ
- 観測次元数の決め方
- スタック数の決め方
- 報酬の決め方
- ハイパーパラメータの決め方
5. 残された課題点とその解決法
6. 参考文献
この記事の新規性
本記事の新規性は,2025年時点でネットに公開されているUnityを用いたエアホッケーAIよりもシンプルな状態取得で実装しており,現実世界への転用性を高めたエアホッケーAIを作成したというところです.
MLAgentsを用いたエアホッケー関連のネット記事・動画は,【ML-Agents】エアホッケーロボットの動きを強化学習で作ると【エアホッケー】鍛え上げた人工知能とゴール前で高速往復するだけのやつを勝負させてみた結果(笑)【物理エンジン】の2つになっています.
前者の方はエアホッケーロボットの動きのみを学習することに焦点を当てており,エアホッケーをプレイするところまではいたっていません.後者の方では具体的な作成方法に触れていない上に,環境の状態取得にRay Perception Sensor 2Dを使用しているため現実世界への転用が難しいです,今回紹介するエアホッケーAIは,取得する環境の状態がパックの位置・速度,自身と敵のマレットの位置のみの簡単なモデルになっています.
実際に作成したもの
今回は,自身のマレットの最適な速度を推定する「速度モデル」と,加速度を推定する「加速度モデル」の2種類を作成しました.どちらのモデルも,Sim-to-Realを意識しており,マレットが台にぶつからないよう制御を学習させました.
学習に使用したUnityのコードは,こちらからダウンロードできます.mainブランチでは速度モデル,加速度モデルブランチでは加速度モデルの環境が用意されています.
使用した環境は
- Unity2022.3.37f1
- Unity MLAgents release 21
です!
エアホッケーAIと対戦することができるexeファイルは,こちらのGitHubのページからダウンロードできます.是非,遊んでみてください!!
速度モデルの挙動
ボールを撃ち漏らすこともなく,高速でラリーができるようになっています!このエアホッケーAIと対戦することができるexeファイルは,こちらのGitHubのページからダウンロードできます.
速度モデルの性能は非常に高く, 2025年の五月祭で速度モデルと対戦するエアホッケーゲームを展示した際は,95パーセント以上エアホッケーAIが勝利していました.
一方で,エアホッケーAIと対戦すると実感すると思いますが,あまりに非現実的なスピードでラリーが展開されていたり,パックの速度が異常なスピードだったりと,現実離れした挙動が多くみられます.これは,速度モデルでは慣性を全く考慮していないために,現実離れした現象が発生しているのだと思います.
加速度モデルの挙動
速度モデルでは慣性を考慮しているため,マレットの動きが滑らかになっています.一方で,パックの撃ち漏らしが発生していることから,速度モデルのエアホッケーAIよりも弱いAIになっています.
速度モデルと加速度モデルの比較まとめ
速度モデル
-
最強エアホッケーAIを作るのには向いている
- 対人勝率95パーセント以上を誇る強さ
-
動きが滑らかでなく,現実では追従できない場合がある
- 例:右に全力疾走した直後に左へ全力疾走するなど,慣性を無視した挙動が起きる
- Unity上では実現可能だが,モーター制御では加減速に限界があり再現が難しい
加速度モデル
-
速度モデルと比較するとエアホッケーの強さは劣る
- 例えば,パックの撃ち漏らしが発生しています.
-
動きが滑らか.現実でも追従可能な動きになっている
- モーターのトルクによる加減速の1/60秒ごとの上限をニューラルネットワークの出力最大値として設定できるため,速度モデルよりもハードウェアの制約を考慮できます.
両モデルとも良い部分と悪い部分があるので,目的に合わせて実装したいモデルを選択しましょう!エアホッケーAIのケースでは,エアホッケーAIの強さとマレットの動きの滑らかさがトレードオフになっていると考えられます.
強化学習の枠組みから見た各モデルの問題設計
強化学習を行うには,観測変数,行動空間,報酬.状態遷移といった要素を設定する必要があります.さらに.実際に学習する際は,学習手法の選別やハイパーパラメータの調整が結果に大きく影響を与えます.各モデルでは,これらの要素がどのように設定されていたかを紹介します.
速度モデルの問題設計
観測情報
以下の8次元の情報を観測しています.
- 自身のマレットの位置座標のx成分,y成分
- 敵のマレットと自身のマレットの相対座標のx成分,y成分
- パックと自身のマレットの相対座標のx成分,y成分
- パックの速度のx成分とy成分
スタック数を5にしているため,エアホッケーAIは,$8*5 = 40$次元のベクトルを状態として受け取り,次の行動を決定することになります.
報酬設計(速度モデル)
ゴールを決める時の報酬を+1,決められる時の報酬を-1に固定して報酬設計を考えました.
正の報酬(速度モデル)
報酬名 | 目的 | 発生条件 | 計算式 / 値 |
---|---|---|---|
ゴール報酬 | ゴールを決めることを促す | 相手ゴールにパックが入った時 | +1.0 |
パック接触報酬 | パックに積極的に接触することを学習させる | 自身のマレットとパックが衝突したとき | +0.00025 * attackrewardmagnitude |
打ち返し報酬 | パックを敵陣へ打ち返す基本的な攻撃行動を学習させる | エアホッケーAIが触れたパックが自陣から敵陣に移動した瞬間 | +0.005 * attackrewardmagnitude |
攻撃速度報酬 | 高速で強力なショットを打つことを学習させる | 「打ち返し報酬」と同時に与えられる | (パックの速度 / マレットの最大速度) * 0.01 * attackrewardmagnitude |
攻撃方向報酬 | 敵ゴールを狙った正確なショットを学習させる | 「打ち返し報酬」と同時に与えられる | (方向報酬の最大値) * (パックの速度) * 0.005 * attackrewardmagnitude |
(注)
attackrewardmaginitude
:マレットがパックを動かすことに関連する報酬の大きさを調整する変数.学習初期では,この値を大きくすることでマレットはパックを打つ動作関連の報酬が増加し,パックを打つ動作を素早く学習することができる,そして,学習後半ではこの値を小さくすることでマレットはパックを打つ動作を維持しつつも,負の報酬を避ける挙動に改善させるために導入した.
負の報酬(速度モデル)
ペナルティ名 | 目的 | 発生条件 | 計算式 / 値 |
---|---|---|---|
ゴールペナルティ | ゴールを決められないよう防御することを促す | 自ゴールにパックが入った時 | -1.0 |
遅延行為ペナルティ | ゲームの停滞を防ぐ.自陣でパックが止まり続けないようにする | パックが自陣エリアでほぼ静止している状態が続く場合 | -0.0005 * Time.deltaTime |
エネルギー消費ペナルティ | 無駄な動きを抑制する.速度を出す必要がないときは,停止するように学習を促す. | 毎フレーム(アクションごと) | (マレットのx方向の速度/マレットのx方向の最大速度 + マレットのy方向の速度/マレットのy方向の最大速度 ) * 0.0000001 |
敵陣地侵入ペナルティ | 自身のマレットが相手陣地に入らないように促す | マレットが中央ラインを越え,さらに敵陣方向へ移動しようとした時. | -1.0 * Time.deltaTime |
壁衝突ペナルティ | 壁への衝突を回避するように促す | 自身のマレットが壁に衝突した時 | -1.0 |
学習アルゴリズムとハイパーパラメータ(速度モデル)
以下のように設定しました.
behaviors:
AirHockey:
trainer_type: ppo
max_steps: 10000000
time_horizon: 2400
summary_freq: 100000
keep_checkpoints: 5
hyperparameters:
batch_size: 2048
buffer_size: 20480
learning_rate: 0.0005
learning_rate_schedule: constant
beta: 0.005
epsilon: 0.3
lambd: 0.95
num_epoch: 3
network_settings:
normalize: true
hidden_units: 128
num_layers: 3
reward_signals:
extrinsic:
strength: 1.0
gamma: 0.99
self_play:
save_steps: 10000
play_against_latest_model_ratio: 0.3
team_change: 100000
swap_steps: 25000
window: 40
initial_elo: 1200.0
Unity ML-Agents実践ゲームプログラミング Unityではじめる機械学習・強化学習のp122に掲載されているマレットが横移動のみのエアホッケーと比べると,今回のエアホッケーの環境は複雑だと思ったので,上述の本のエアホッケーの例で使用されたハイパーパラメータよりもニューラルネットワークの層の数を増やしたりと,マイナーチェンジを行ないました.
学習方法(速度モデル)
-
attackrewardmagnitude
を1にして1000万回学習する - 1で作成したニューラルネットワークのパラメータを初期値として,
attackrewardmagnitude
を0.5にして1000万回学習する - 2で作成したニューラルネットワークのパラメータを初期値として,
attackrewardmagnitude
を0.2にして1000万回学習する
簡単な技術から順番に習得するように学習を進めていくという,「カリキュラム学習」というアイデアを用いて学習をしました.学習前半では,攻撃報酬による報酬を大きめに設定することで,素早くマレットがパックを打つことを学習するように促しました.学習後半では,攻撃報酬による報酬を小さくすることで,相対的にゴールにシュートを入れることによる報酬,壁に触れることによる負の報酬の影響力を増やし,マレットが壁にぶつかることなくゴールにシュートを決める方策に収束するように学習方法を設計しました.
学習結果(速度モデル)
学習方法のステップ1のニューラルネットワークを用いたときの様子
学習方法のステップ3のニューラルネットワークを用いたときの様子
学習結果の考察(速度モデル)
学習結果として,ステップ1のモデルは「パックのラリーを続ける」技術は体得したものの,守備や性格にゴールを狙ったシュートといった複雑な行動はあまりみられませんでした.これは,ラリーによる攻撃報酬が他の報酬よりも得られやすく,マレットはコートの中央付近でパックを打ち返し続けることで,ラリーによって攻撃報酬を稼ぐことを優先しているためだと考えられます.
一方,ステップ3のモデルでは,「ゴールに向かって積極的にシュートする」「ゴール付近に滞在して守備する」といった行動が見られ始め,より実践的なプレーに近づいています.攻撃報酬が小さくなったため,相対的にゴールを決めることの価値が高まり,結果的に守備や壁回避を含む多様な戦略が選択されるようになったと考えられます.これは,最終的な「壁にぶつからずにゴールを決める」ゴールに近づいていると考えられます.
カリキュラム学習によって「簡単なスキルを先に確立し,徐々に報酬構造を変えて複雑なスキルへ移行させる」という方針が有効に機能していたといえます.attackrewardmagnitude
をさらに小さくしながら学習を進めていくことで,よりゴール重視・防御重視の高度なモデルができるようになります.
加速度モデルの問題設計
観測情報(加速度モデル)
以下の10次元の情報を観測しています.
- 自身のマレットの位置座標のx成分,y成分
- 自身のマレットの速度のx成分,y成分
- 敵のマレットの位置座標のx成分,y成分
- パックの位置座標のx成分,y成分
- パックの速度のx成分とy成分
スタック数を5に設定しているため,エアホッケーAIは,$10*5 = 50$次元のベクトルを状態として受け取り,次の行動を決定することになります.
速度モデルで観測していたものに加えて,「自身のマレットの速度のx成分,y成分」を観測値に追加しました.マレットの次の行動,つまり,マレットの次の加速度を決める時,マレットの現在の速度情報は次の加速度の決定に大きく影響を与えると考えたため,追加しました.
また,速度モデルでは敵のマレットと自身のマレットの相対座標のx成分,y成分を観測していましたが,加速度モデルでは敵のマレットの絶対座標を観測するように変更しました.
絶対座標を観測値にした方が性能が上がる可能性を見込んで変更を行いましたが,座標の取り方を変えることによって性能は上がりも下がりもしなかったため,変更しなくても良いです.
報酬設計(加速度モデル)
速度モデルと同様に,ゴールを決める時の報酬を+1,決められる時の報酬を-1に固定して報酬設計を考えます.
正の報酬(加速度モデル)
報酬名 | 目的 | 発生条件 | 計算式 / 値 |
---|---|---|---|
ゴール報酬 | ゴールを決めることを促す | 相手のゴールにパックが入った時 | +1.0f |
パックヒット報酬 | パックに積極的に接触することを学習させる | 自身のマレットがパックに衝突した時 | +0.025f * attackrewardmagnitude |
打ち返し報酬 | パックを敵陣へ打ち返す基本的な攻撃行動を学習させる | 自身のマレットで打ったパックが,自陣から敵陣へ移動した時 | +0.005 * attackrewardmagnitude |
良い攻撃報酬 | 敵の防御を突破し,ゴールチャンスを作り出すことを促す | パックが敵のマレットよりも奥(敵ゴール側)に進んだ時 | +0.05f * attackrewardmagnitude |
攻撃方向報酬 | 敵のゴールを正確に狙うショットを学習させる. | 「打ち返し報酬」と同時に発生 | exp(-5 * (1 - dot(パックの進行方向, ゴールへの方向))) * パックの速度 * 0.005 * attackrewardmagnitude |
攻撃速度報酬 | マレットの速度を効率的にパックに伝え,高速なショットを打つことを学習させる | 「打ち返し報酬」と同時に発生 | (パックの速度 / マレットの最大速度) * 0.05f * attackrewardmagnitude |
マレット速度報酬 | マレットを高速で動かすことを促す. | 常時.ただし,マレットの速度が一定値(5)を超えている場合のみ | max((マレットの速度 - 5), 0) * 0.0000001f |
加減速報酬 | 俊敏な動き(急な加減速)を促す | マレットに加速度が発生している時 | (abs(x軸の加速度) * abs(y軸の加速度)) * 0.0000001f |
負の報酬(加速度モデル)
報酬名 | 目的 | 発生条件 | 計算式 / 値 |
---|---|---|---|
被ゴールペナルティ | ゴールされることを避けるように学習させる | 自身のゴールにパックが入った時 | -1.0f |
敵陣侵入ペナルティ | マレットが敵陣に深く侵入しすぎることを防ぐ | マレットが敵陣にいる時.侵入が深いほどペナルティが増加する. | -1.0f * Time.deltaTime * (マレットのy座標 / マレットの最大移動可能y座標)^2 |
遅延行為ペナルティ | ゲームの停滞を防ぐ.自陣でパックが止まり続けないようにする | パックが自陣エリアでほぼ静止している状態が続く場合 | -0.0005 * Time.deltaTime |
壁衝突ペナルティ | 壁への衝突を回避するように促す | 自身のマレットが壁に衝突した時 | -1.0 |
(注)
マレットの最大移動可能y座標・・・1に設定されています.マレットが$y>1$以上には移動できないように制限をかけています.別の視点で考えると,相手の陣地であってもy=0~1まではマレットは侵入できるということです.敵陣への侵入を完全に禁止する(ハードな制約)のではなく,相手の陣地への侵入は許すが,その分ペナルティを与える(ソフトな制約)ようにしたのは,エアホッケーAIの行動の自由度を確保し,学習の効率を高めるためです.
ハイパーパラメータ(加速度モデル)
学習初期では1つ目のyamlファイル,学習後半では2つ目のyamlファイルを使いました.1つ目のyamlファイルは探索に特化しているのに対し,2つ目のyamlファイルは活用に特化しているという違いがあります.活用に特化させるために,2つ目のyamlファイルは,1つ目のyamlファイルから,epsilonを0.3から0.1に,play_against_latest_model_ratioを0.3から0.8にする変更を行いました.
ラリーができるモデルができるまで探索特化の1つ目のyamlファイルを利用し,その後は活用特化の2つ目のyamlファイルを利用することで,効率的な学習を進められました.
↓探索特化のyamlファイル
behaviors:
AirHockey:
trainer_type: ppo
max_steps: 10000000
time_horizon: 512
summary_freq: 100000
keep_checkpoints: 5
hyperparameters:
batch_size: 2048
buffer_size: 20480
learning_rate: 0.0005
learning_rate_schedule: constant
beta: 0.005
epsilon: 0.3
lambd: 0.95
num_epoch: 3
network_settings:
normalize: true
hidden_units: 128
num_layers: 3
reward_signals:
extrinsic:
strength: 1.0
gamma: 0.9999614
network_settings:
normalize: true
hidden_units: 128
num_layers: 3
self_play:
save_steps: 10000
play_against_latest_model_ratio: 0.3
team_change: 100000
swap_steps: 25000
window: 40
initial_elo: 1200.0
↓活用特化のyamlファイル
behaviors:
AirHockey:
trainer_type: ppo
max_steps: 10000000
time_horizon: 512
summary_freq: 100000
keep_checkpoints: 5
hyperparameters:
batch_size: 2048
buffer_size: 20480
learning_rate: 0.0005
learning_rate_schedule: constant
beta: 0.001
epsilon: 0.1
lambd: 0.95
num_epoch: 3
network_settings:
normalize: true
hidden_units: 128
num_layers: 3
reward_signals:
extrinsic:
strength: 1.0
gamma: 0.995
network_settings:
normalize: true
hidden_units: 128
num_layers: 3
self_play:
save_steps: 10000
play_against_latest_model_ratio: 0.8
swap_steps: 50000
window: 20
initial_elo: 1200.0
学習方法(加速度モデル)
-
attackrewardmagnitude
を1にし,1つ目の探索特化のyamlファイルを使用し,パックのLinearDrag(≒摩擦力)を0にして,1000万回学習する - 1で作成したニューラルネットワークのパラメータを初期値として,
attackrewardmagnitude
を0.1にし,2つ目の活用特化のyamlファイルを使用し,パックのLinearDrag(≒摩擦力)を1.5にして,1000万回学習する
学習結果(加速度モデル)
学習方法のステップ2のニューラルネットワークを用いたときの様子
学習結果の考察(加速度モデル)
加速度モデルの学習の難解さ
速度モデルの学習と比べて,加速度モデルの学習は難しいです.速度モデルというのは加減速が事実上無限大であるのに対し,加速度モデルでは加減速が有限であることから,壁にぶつかり易いです.そのため,壁にぶつからないようにマレットを動かす方法を学習しきれず,「動くとリスクがあるから,いっそ動かない方が損しない」と学習してしまう可能性が高くなります.以上より,加速度モデルの学習では,マレットを静止させ続ける局所最適解に陥りやすいです.
その難しさを解消するために,探索特化・活用特化の2種類のyamlファイルを用意したり,相手コートへの侵入を一部許容したり,学習段階に応じてattackrewardmagnitude
の値を変えたり,学習初期段階ではマレットのLinearDrag(≒摩擦力)を0にしてパックが止まらない環境下で学習させたりしました.全ては,学習が滞ることによってマレットを静止させ続ける局所最適解に陥ることを回避するための工夫です.
Sim-to-Realに向いた挙動
一番性能のいい加速度モデルの動画をみるとわかるように,マレットが滑らかに動いているのがわかります.当初の想定通り,速度モデルと比べて,加速度モデルの動きはSim-to-Realに向いた挙動になっていることが推察されます.
より性能の良いモデルを作るには
一番性能のいい加速度モデルの動画と比較すると,ステップ2のモデルの動きは鈍いです.マレットを静止させ続ける局所最適解に陥らないようにattackrewardmagnitude
を徐々に小さくしながら学習回数を増やしていくと,一番いいモデルに近い性能が出せるので是非試してみてください.
強いモデルを作るコツ
強化学習を行う際,作り手側で決めなくてはいけないパラメータが沢山あるので,どのように決めれば良いか混乱すると思います.その時に役に立つTipsをまとめます.
観測次元数の決め方
観測次元を無駄に増やすと,学習時間がかかったり,学習がうまくいかなかったりすることが多かったため,観測する次元数を減らすようにするのをオススメします.
速度モデルを学習させる時,
- 自身のマレットの位置座標のx成分,y成分
- 敵のマレットと自身のマレットの相対座標のx成分,y成分
- パックと自身のマレットの相対座標のx成分,y成分
- パックの速度のx成分とy成分
に加えて,相手ゴールと自身のマレットの相対座標のx成分,y成分,自身のマレットと右壁との距離,自身のマレットと左壁の距離などの値を観測値に加えて学習**をしてみましたが,3000万回学習を回してもマレットを静止させ続ける局所最適解から抜け出せませんでした.
観測次元に追加するか判断する際は,追加したい観測値が既存の観測値と得られる報酬から類推が可能かを考えると良いと思います.既存の観測値と得られる報酬から類推可能ならば,その値は観測次元に追加しないで良いでしょう.
今回の場合,相手ゴールと自身のマレットの相対座標のx成分,y成分は,既存の観測値と,マレットがゴールを決めた時に得られる正の報酬から十分に類推できたため不要であったと考えます.定性的には,ゴールの報酬をもらった時の,マレットの位置座標,パックと自身のマレットの相対座標の値からゴールの位置を計算することができるので,観測次元に追加しないで良かったと考えられます.
自身のマレットと右壁との距離,自身のマレットと左壁の距離も同様に考えることで,観測次元に追加しないで良かったと考えられます.
スタック数の決め方
最初の段階では,無難にスタック数を5に設定しておくと良いと思います.スタック数を大きくすると,時系列的な状態の変化も考慮した判断ができるようになる一方で,入力次元が増大するので状態空間が指数関数的に広くなり,サンプル効率が悪化し,学習にかかる時間が大きくなったり,性能が頭打ちになってしまいます.このトレードオフを意識して,スタック数を5から調整すると良いでしょう.
報酬の決め方
今回のエアホッケーAIで用いた報酬には大きく4種類あります.
-
メインの報酬:こなして欲しいメインタスクをした時の大きな正の報酬
- 例:ゴールを決めることでの報酬
-
中間報酬:メインタスクをこなすために必要であろう行動に対する報酬
- 例:パック接触報酬,攻撃方向報酬など
-
ペナルティ:絶対にやってほしくないことをした時の大きな負の報酬
- 例:壁にぶつかる,ゴールを入れられることでのペナルティ,遅延行為ペナルティ
-
微調整のための報酬:動きをより滑らかにしたりと,ちょっとした無駄をなくすための報酬
- 例:エネルギー消費ペナルティ,加減速報酬
最初に報酬設計をするときは
メインの報酬 ≒ ペナルティ > 中間報酬 >> 微調整のための報酬
となるように設計すると良いと思います.
次に中間報酬の大きさを適切に決定します.中間報酬は一回のエピソードで複数回得られることが多く,
中間報酬の総和 > メインの報酬
となる場合があります.こうなってしまうと,エアホッケーAIの動きはメインの報酬を無視して,中間報酬を沢山得ようとする方向に学習してしまいます.今回のケースでいうと,ゴールを決めることなく,ラリーをずっと繰り返すようなモデルになってしまいます.この視点から見ると,中間報酬は大きくしすぎないほうが良いと結論付けられます.
一方で,中間報酬を大きくすると,メインタスクをこなすために必要な技術を短い学習時間で習得することができるメリットがあります.今回の場合では,攻撃方向報酬を大きくすることで,短い学習時間でマレットがパックを打てるようになり,マレットを静止させ続ける局所最適解から脱却することもできます.
中間報酬を大きくすることによるメリット,小さくすることによるメリット両方を享受するためには,カリキュラム学習を用いながら報酬設計をすることをオススメします.学習初期ではattackrewardmagnitude
を大きくすることで中間報酬を大きくし,メインタスクをこなすために必要な技術を短い学習時間で習得させます.そして,学習後半ではattackrewardmagnitude
を 小さくすることで中間報酬を小さくすることで,最終的には
メインの報酬 > 中間報酬の総和
にできます.
ハイパーパラメータの決め方
多くのハイパーパラメータは,先行研究で類似タスクに用いられた値をそのまま利用すると良いと思います.
一方で,ニューラルネットワークの層の大きさ,層の数,PPOのイプシロンなどの学習結果に大きく影響を与えるパラメータは自身で調整する価値があると思います.
残された課題点とその解決法
学習の進行度に応じて,ゴールを決めることによる報酬の期待値が減少することによって生じる課題点があります.
何故,ゴールを決めることによる報酬の期待値が減少することで問題が生じるのでしょうか?それは,学習が進むにつれて,互いのエアホッケーAIのシュートブロックが上達し,ゴールを決めにくくなった結果,ゴールを狙う行動の報酬の期待値が下がり,ゴールを狙う行動の期待値がラリーを続けることによる報酬の期待値が下回ってしまうためです.この状態で学習を続けると,ゴールを狙わずにラリーの継続を重視するエアホッケーAIが生成されるかもしれません.
これの対策方法として,ある程度学習が進んだら中間報酬を0にする方法,self-playのwindowを大きくするという2つの方法が考えられます.前者は,学習後半に報酬をゴールのみに絞ることで本来の目的へ誘導し,後者は,対戦相手の多様性を増やすことでゴールを狙う行動の価値を再評価させる効果が期待できます.
参考文献
Unity ML-Agents実践ゲームプログラミング Unityではじめる機械学習・強化学習強化学習難しいタスク