第4回 空戦AIチャレンジ 3位(対戦2位)解法

に公開

第4回 空戦AIチャレンジとは

課題

SIGNATEで2025/7から2025/11に開催されていたコンペで、BVR (視界外戦闘)を行うエージェントを作成するものです。毎回どのような状況で戦闘を行うかという課題が異なっており、今回は以下のようになっていました。

  • 護衛対象1機 (味方が撃墜したら負け、相手方を撃墜したら勝ち。操作対象外)
  • 戦闘機4機 (エージェントの操作対象)
  • 性能・初期位置のランダム化あり。

https://user.competition.signate.jp/ja/competition/detail/?competition=de1556abda294254b30bdec61520f764

専用のシミュレータと、サンプルとして HandyRL(かなり改造されている) を使った環境が提供されていたので、これを修正する形で取り組みました。学習環境をきれいに切り離すのはかなり難しく、多くの方がこの方針だったと思います。

何が難しいか

空戦AIでは一般に、以下の点が特に困難な点になると思われます。

  • 遅延報酬 (ミサイル発射~撃墜まで)
  • スパース報酬 (空戦中ほとんど撃墜は起きない)
  • 非推移的(じゃんけん構造)

基本方針

重視したのは、細かい報酬設計に頼らず、学習可能な部分は学習に委ねるという点です。特にニューラルネットワークの構成と入力特徴量の設計に重点を置きました。報酬について一般的なものにとどめています(位置取りの傾向についての報酬)。

また4機編隊をチームとして学習するか、一機ずつ制御するエージェント(戦闘の際は4つ動く)として学習するかという選択肢があったのですが、一回のエピソードで4機分の経験が得られることを重視し、一機ずつ制御するエージェントを作成しました。


パラメータ設定

学習パラメータ

HandyRL サンプルに含まれるパラメータのうち、学習に特に重要と考えられるものについて Optuna[1] を用いてチューニングを行いました。

パラメータ名 意味 探索範囲
lr 学習率 1e-6 ~ 1e-3
gamma 割引率(1-gamma を探索) 1e-2 ~ 1e-4
entropy_regularization エントロピー正則化 1e-10 ~ 1e-2
batch_size バッチサイズ 16, 32, 64, 128
lambda 過去の時間減衰率 0.5 ~ 0.9
eps_start, eps_end ε-greedy の ε 0.1 ~ 0.5

Optuna によるチューニングの結果、サンプル設定と大きく異なっていたのは batch_size のみでした。batch_size を 128 から 16 に変更するとレーティングの上昇が顕著に改善したため、本解法では 16 を採用しています。

この改善は、重み更新がより多様なサンプルに基づいて頻繁に行われること、またスパース報酬がバッチ内で希釈されにくいことが要因であると考えています。


初期配置パラメータ

後述の 2フェーズのカリキュラム学習 のため、以下の二種類の初期配置を使用しました。

  • フェーズ1: 相手陣営との距離が近い位置、ランダム配置から開始
  • フェーズ2: フェーズ1の隣接領域から、本来の対戦開始位置までをランダム化して開始

多様な状況を確保するため、両フェーズとも symmetric_initial_state = false としています。


学習方法

カリキュラム学習

全領域を1フェーズで自己対戦させた場合、戦闘領域の片側に寄って前進する挙動に過度に適応し、固定ルールエージェントに対する勝率が低下する現象が確認されました。これは自己対戦特有のオーバーフィットと判断し、カリキュラム学習を導入しています。(後述の「非推移的ゲーム」のたとえで言えば、ジャンケンのグーのみで強い手を探してしまうようなものだったかもしれません)

フェーズ1は、ランダムルールの初期エージェントに対する勝率が概ね70%を超えた epoch 200 で打ち切り、フェーズ2へ移行しました。これはフェーズ1への過学習を防ぎ、フェーズ間の接続を滑らかにするためです。

フェーズ2では、学習が停滞してしばらくするまで学習を行いました。(約15万エピソード)

文献[2]のような簡単な場面から始めるカリキュラム学習もあり得たのですが、ここでは多様な状況を先に体験するようなカリキュラムになっています。


非推移的ゲームへの対応

空戦では戦術間に非推移的な関係が生じやすいです。これはちょうど、ジャンケンの三すくみ(グー>チョキ>パー>グー>…)のような関係です。空戦では例えば速度重視>旋回重視>離脱重視>…のような関係になりえます。この場合、単一の「最強戦術」は存在しません。

自己対戦では、最終的にこれらが相殺され、学習が振動状態に入ることがあります。そこで本解法では、かなり多い数のスナップショットを保存し(サンプルの1000エピソードに対し、10エピソードごとに保存)、なるべく偏らないようにした自己を対戦相手として使用しました。


自己対戦相手の選択

学習フェーズ2では、対戦相手の選択について以下の工夫を行いました。

対戦相手プールの拡大

  • 10エピソードごとにスナップショットを保存
  • 強い順に最大1000個まで保持

対初期ランダムの確率調整

対戦相手として、初期にはパラメータをランダムとしたルールベースのエージェントを使用します(サンプルの通り)。この初期ランダムエージェントについては勝率を p としたとき対戦確率をp(1-p) + 0.2 としています。(最大の割合になるのは p=0.5 の時でそれ以外では対戦が減る。ただし最低限の対戦は維持)

対プールされたエージェントの選択

対初期ランダム分の割り当てを除いて、以下のように割り当てました。

  • 最新自己(あまり変わらないはずなのであまり対戦しない): (1 - 0.75)^{\alpha}
  • 過去自己(勝率によって変動): 勝率 p に対して (1 - p)^{\alpha}

\alpha = 3

AlphaStar の PFPS (Prioritized Fictitious Self-Play)[3] を参考にしています。異なる由来を持つエージェントがプールに入ってこないのが大きな違いと思いますが、これは主に開発・実行リソースの制約によるものです。やれればやった方がよかったと思います。


行動決定方法

チェックポイントの選択

学習終盤(checkpoint 9000 以降)について、動作の異なる複数エージェントと各30回対戦し勝利数を計測しました。その結果、相手を幅広くカバーできる複数のチェックポイントを選択し、行動決定のベースとしています。
下表が選択されたチェックポイントとその勝敗です。緑の濃い部分が勝ちの多い部分、赤の濃い部分が負けの多い部分ですが、チェックポイントによって得意・不得意な相手があることが分かります。


アンサンブル方針

単純平均によるアンサンブルは行動空間では不適切であるため、ポリシーを一つ選択してその出力を使用する以下のような方式を採用しました。

  • 選択基準は value が最大のポリシー。(通常、異なるポリシーではvalueが異なる分布を持つため直接比較はできないが、ここでは連続して訓練された近いエポックのニューラルネット同士の比較であるため、比較的安定して利用できることを期待)
  • 一定期間(5ステップ)、選択済みの同一ポリシーの出力を使用

5ステップ固定が最も安定した性能を示したため、この設定を採用しました。また、エージェントの出力は行動の確率ですが、最終エージェントでは確率が最大となる行動ではなく、確率に従って行動を選択するようにしています。


ポリシー(ニューラルネット)

構成概要

本エージェントでは、機体1機を制御します。ネットワーク構成はサンプルをベースとしつつ、特徴抽出と action head を大幅に変更しました。

ニューラルネット概略

parent / friend 共通特徴抽出

個数可変かつ順序不変な要素を扱うため、相対位置特徴を抽出した上で PMA (Pooling by Multihead Attention)[4] を用いて集約しています。

parent の特徴抽出

friend / enemy の相対位置・速度・各種フラグを入力とし、射撃対象選択用に中間特徴も保持しています。

PMA前の特徴量

特徴量 備考
相対位置 parentとの相対位置
相対速度 parentとの相対速度
敵フラグ friendなら0, enemyなら1
護衛対象フラグ friendの時、初期弾数0なら1, enemyの時、所定の位置範囲・速度なら1
相対方位のsin, cos +1した後0.5倍して正規化
速度のcos類似度 +1した後0.5倍して正規化
friend_enemy_relative friendなら0, enemyならobservation の値 (相手正面・背後のときの射程)
水平距離 後述のマルチスケールエンコーディング

構成イメージ

friend の特徴抽出

friend 視点での enemy 相対情報を用いることで、状況理解を強化しました。

PMA前の特徴量

特徴量 備考
相対位置 enemyとの相対位置
相対速度 enemyとの相対速度
friend_enemy_relative friendなら0, enemyならobservation の値 (相手正面・背後のときの射程)

距離のマルチスケールエンコーディング

正規化された距離dに対して

d^{1/\gamma}, \quad \gamma = 1, 2, 4, 6

を並列に入力しています。これにより、近距離・中距離・遠距離それぞれに適した勾配が得られるようになります。

異なる\gammaで距離dを変化させると、下図のような曲線が得られます。

action head(turn and pitch)の値

action head のうち、turn と pitch については共通部分があり、かつ類似した処理を行っているためturn で代表して説明します。

turn と pitch は本来連続量ですが、サンプルでは既存のフレームワーク(HandyRL)との適合性から離散の値の選択として実装されていました。しかしながらどの値を選ぶかという分解をすると、たとえば45°の右ターンは30°の右ターンより大きな方向転換である、といった情報が失われてしまいます。

turn では角度を表した配列の各要素に対応するロジットl_{i}が得るべき出力となります。添え字をいったん-1~1にマップし(𝑥_{i}とする)、活性化関数tanhを用いて-1~1の範囲での動作\muを得た上で、動作\muと学習可能な逆温度\tau^{-1}を用いて方策のロジットをl_{i} =−\tau^{-1}(x_{i} - \mu)^{2}と定義しました。

また、ニューラルネットの初期値として\tau^{-1}に小さな値(緩やかな分布とするための値)を設定することで強化学習初期の探索を促し、学習が進むにつれて自然に分布が尖ることを狙いました。

action head(turn and pitch)の選択

turn と pitch については、それぞれ複数(5個)の action head を用意し、状況に応じてどの head を用いるかを選択する構成としました。状況から得られたベクトルを入力として各 head に対応する重みを計算し、その後 Gumbel-Softmax(hard オプション付き) を用いて 0/1 の選択を行っています。

また、状況に応じて計算結果にバイアスを加算することで、ヘッドの分化が促されるようにしました。以下にバイアスを示します。

ヘッドの添え字 バイアス(記載ないケースでは0)
0 MWS動作中(ミサイルにロックされた)なら10
1 相手陣内に半分以上奥なら1
2 自陣内で半分以上手前なら1
3 常に0
4 相手機が見つからない場合1

その他の変更点

強化学習では、学習の進展にともなって入力の分布が大きく変わることが予想されたため、訓練の安定化のために正規化の手法としてRMSNormを、活性化関数としてSiLUを適宜導入した。


報酬設定

概略

報酬はサンプル設定をベースとしつつ、一部に経過時間に応じて減少するような time decay を導入しました(逃げ回るだけの時間稼ぎ等を抑制)。ルールベース化を避け、探索を阻害しない設計を意識しています。

攻撃に関する報酬

項目 報酬
相手護衛対象位置が分かっている 0.01 (time decay あり)
相手護衛対象と最も近い機の距離の1 ステップ前との距離の差 0.001×正規化距離。近づくと正, 遠のくと負
相手陣営機全体の重心の進出状況と自陣営全体の重心の進出状況の差 0.001×正規化距離。攻撃方向に進むと正, 逆方向に進むと負 (time decay あり)
相手護衛対象にミサイルを発射 0.01 (time decay あり)
相手護衛対象にミサイルがロックオンした 0.05 (time decay あり)

防御に関する報酬

項目 報酬
レーダーでとらえていない相手陣営の機がある -0.001 ×機数 (time decay あり)
相手陣営の機が自陣営の最後尾の機より進出している -0.001 ×機数 (time decay あり)
陣営の護衛対象機に対してミサイルが発射された -0.1
陣営の機にミサイルがロックオンした -0.001 ×ステップ数
自陣営の機が撃墜された -0.1 (time decay あり)

結果

対戦成績は2位となりました(好き好きクラブさんに及ばず...)。アンサンブルを用いない状態でも2位であり、アンサンブルを用いるとそれよりリーダーボードのスコアは向上していたので、学習方式、アンサンブル方式ともにうまく動いたものと考えられます。

ピッチ方向に小刻みな揺れが観察されましたが、これを抑制すると性能が低下したため、戦術的に有効な挙動であると判断しています。表彰式で他の参加者に伺ったところ、これはこれでよい動きなのではないかとのことでした。


参考文献

Discussion