ランド研究所の「機械学習による航空支配」を実装する（その１１）： ２次元問題の概要

#1. はじめに
本記事は、ランド研究所の「機械学習による航空支配」を実装する（その１１）です。

[Air Dominance Through Machine Learning: A Preliminary Exploration of Artificial Intelligence–Assisted Mission Planning, 2020](https://www.rand.org/pubs/research_reports/RR4311.html)

今回からランド研究所のレポートに記載されている```2次元問題```を取り扱います。2次元問題には、GAN は使わずに、強化学習のみを適用しています。記載がないので理由は判りません。

（その11）では、手始めにレポートの二次元問題について、概要をまとめます。

過去記事へのリンクは最下段にあります。レポートの結論は、（その１）で纏めているので、今回は省略しています。

#2. 2次元問題（Two-dimensional Problem）

2次元問題は、以下のような Blue Team と Red Team の戦闘パッケージからなる SEAD (Suppression of Enemy Air Defense) ミッション・プランニング問題で、AI は Blue Team のミッション・プランニングを実施します。なお、以下は説明用の例示で、レポートでは異なる構成のパッケージからなる Blue Team, Red Team を用いて、目的が異なる幾つかの SEAD ミッション・プランニングの実験を行っています。

```
Blue Team: Fighter x 1
Red Team: SAM x 1, Target x 1
```

レポートは原理検証なので、問題を簡単にするために Fighter, SAMのレーダは全周、Fighter 搭載ウェポンと SAM の邀撃範囲も全周としています（指向性は、今後導入予定とのこと）。Target については説明がないのですが、それ自体はウェポン等で防護されていない静止目標のことのようです。1次元問題と同様にウェポンやレーダは完璧です。

この例示での問題は下図に示すように、```もし Fighter 搭載ウェポンの射程よりも SAM の射程の方が長ければ、Fighter は SAM の邀撃範囲を迂回して Target を直接撃破```し、```もし Fighter 搭載ウェポンの射程の方が SAM の射程よりも長ければ、Fighter はSAM を撃破した後 Targetを撃破する```ようなミッション・プランを生成する問題です。戦場の広さは、全てのシナリオで 100km x 100km 固定です。

![キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/0764d432-595f-40bc-8890-84af7a3850c8.png)


このミッションのミッション条件は下記 Table 3.1 で与えられています。敵であるSAM の射程と位置、Target の位置は既知で、ミッション・プランニングの対象外としている点は 1D 問題と同じです。これらのミッション条件は、AI の学習時にはランダムに与えられます。なお、この表は Figure 3.1 に示すシナリオの時のもので、複数 Fighters, Jammer, Decoy を使うような別のミッション・シナリオでは、当然ミッション条件はもっと増加するはずです。レポートに記載はありません。この辺りは、きちんと記載してもらわないと問題自体を誤解してしまいます。

![キャプチャ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/392d2141-585a-899e-141d-bd415fb9f195.jpeg)

#3. AFGYM 

ミッション・プランナー（Agent）のトレーニングは、米軍の標準シミュレータである AFSIM の簡易版である AFGYM で行います。AFGYM の仕様は以下の通りで、２次元なので全周性という特徴が加わりましたが、それ以外は１次元の時と同じです。

```
- OpenAI Gym に対応
- Radar Equation の計算はしない
- 射程内に相手がいれば自動で射撃する
- 電子戦（EW: Electronic Warfare）のモデル化はしない。Jamming効果は、ウェポンの%減少で計算する
- 不確定性を除去するためウェポンは完璧とする
- レーダ、ウェポンは全周に対応できる
```

各タイムステップで、シミュレータが、プランナー（Agent） とやり取りする状態変数は Table A.1 の通りです。

![キャプチャ.JPG2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/81ad6a16-3eba-1663-89b6-ef77d8f7a231.jpeg)

１次元問題の時から追加となった項目としては、Fighter と SAM のウェポン数（weapon count）がありますが、いくつに設定しているのかは不明です。ウェポン性能は完璧と仮定しているので、相手チームのエンティティ数以上は必要ないはずです。（実施内容から、これは将来の拡張用で、今回は使っていない気がしました）。また、表にはありませんが、レポートでは聞きなれない SAM のクールダウン・タイム（cooldown　time）という用語が出てきます。これが何を意味しているのか記載がなくてわかりませんが、SAM の射撃間隔の最小値のことのようです。設定値の記載もありません。

繰り返しになりますが、複数 Fighters, Jammer, Decoy を使う時は、状態変数はもっと増加します。

上記の Table A.1 のままでは、いろいろ書いてあって見づらく、毎回英語を読むのは嫌なので、簡潔にまとめ直しておきます。

表３．１
![状態変数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/b0e4ce80-9bff-bbff-b76a-8ed41f8a0f4b.png)

ここで少し気になる点が幾つかあります。

１つ目は、射程の正規化を Fighter の初期位置と Target 位置の相対距離で行っているところです。これを文字通り受け取ると、エピソード毎に Fighter の初期位置と Target 位置をランダムに設定しているので、エピソード毎に正規化の分母の大きさが変わることになります。正規化のダイナミック・レンジを広くとれるのは良いのですが、分母が変わってしまうと、Jammer を使う場合に縮退の効果を上手く学習できなくなるのではないかという気がします。ここは、実装では固定値を使いました。

２つ目は、Fighter の heding を角度で [-180,180] deg と指定している点です。このままだと、本来は連続である -180 deg と 180 deg の境界が不連続となってしまうので、あまり良い方法ではない気がします。ここは、実装時に工夫します。


#4. ミッション・プランナー（AI Agent）
 
観測（observation）は、前出の Table A.1 の状態変数（の正規化値）となっています。

アクション（action）は、Blue team の各エンティティの heading （の正規化値）と記載されています。速度、高度は一定値なのでアクションには入っていません。アクションがヘディングの場合、１アクションで 180 度の反転が可能になってしまいます。これは、固定翼機の動きとしては無理があります。目的がプランニングなので良いのかもしれませんが、少し無理がある気がするので実装では工夫します。

なお、アクションが heading （の正規化値）なので、アクション空間は連続空間です。このため、連続アクション空間に対応した強化学習アルゴリズムを使う必要があります。レポートでは、A3C と PPO を使って比較しています。DQN は離散アクション空間にしか対応していないので使えません。

実験では、以下の Blue Team パッケージ：

- 複数Fighters
- Fighter + Decoy
- 複数Fighters + Jammer

を使って、ミッション・プランナーは、次のような学習ができたと記載されています（詳細な記載がないので、何をどうしたのか細部までは判りません）。

- Jammer が SAM の射程を縮退させることで、短い射程の搭載ウェポンしか持たない Fighter が SAM を撃破できることを学習できた。 
- Fighter が SAM よりも長い射程のウェポンを搭載しているときには、まず SAM を撃破し、そうではない時には SAM を迂回して直接ターゲットに向かうことを学習できた。
- 各 Fighter が異なる射程のウェポンを搭載している際に、それぞれが適切な Red Target を撃破することを学習できた。

また、A3C では学習が進まないことがあったので、SAM やターゲットの近くに Fighter を初期配置するカリキュラム学習を併用したと記載されています。PPO では、この問題は生じなかったようです（詳細な記載はありません）。

学習のやり方については記載がありませんが、以下の二通りの方法が考えられます。

- ミッション毎に、専門のプランナー（Agent）を学習させる
- 全シナリオに対応できる汎用プランナー（Agent）を学習させる

言うまでもなく、二つ目の汎用アプローチの方が学習は遥かに困難ですが、汎用性は遥かに高いです。このとても重要な点についてレポートには全く記載はありません。どちらともとれるような書きぶりでした。ただ、今回の目的は原理検証であることと例として出てくる図等から、一つ目のアプローチだったのでは、と想像します。一つ目のアプローチが上手く行かなかったら、二つ目のアプローチが上手く行くはずありませんから。

#5. 結果（AFGYM環境）

結果については、AFGYM 環境での話と AFSIM 環境での話が、ごちゃまぜに書いてあって少し混乱しています。

##5.1 A3C でトレーニングした場合

AFGYM にオーバー・フィッティングしてしまい、AFSIM では 10% のみが成功したとのことです。

以下は、図から判断して、AFGYM 上の話だと思われます。

A3C の最大の問題は、```ミッション・シナリオ（laydown）の変動に脆弱で、汎化（Generalization）能力に問題があること```と結論づけています。ここでミッション・シナリオの変動とは、Target 位置や、Fighter 初期ヘディング等が学習時の値の範囲外になるシナリオのことです。

下図 Figure 3.2 (A) のミッションでは、３機の Fighters の内１機だけが SAM の射程よりも長いウェポンを搭載しているケースです。適切な１機が SAM を撃破しミッションに成功しているものの、ふらふらした（erratic）動きになっているので、プランとしてはイマイチです。

(B)は、Jammer を使うことで Fighter が搭載ウェポンよりも長い射程の SAM を撃破するミッションに成功している様子です。図の緑線が Jammer、青線が Fighter の動きです。この例では Jammer が上手く SAM のレンジ外で滞空していますが、これは例外的にうまくいった（rare）ケースで、たいていは (C) のように Jammer が SAM の射程に入って撃墜されたと記載されています。

なお、このケースは、

```
     sam.firing_range > fighter.firing_range > sam.jammed_firing_range
```

の条件だけでトレーニングしたと思われます。1D 問題のように、他の条件と混合させてトレーニングをした訳ではないような気がします。また、初期位置をどうしたのかは、記載がないので判りませんが、図を見る限り、初期位置は固定されているようです。

(D)は、学習に失敗した（learning collapse）例の一つで、３機の Fighter は SAM の射程外で無意味に旋回しているだけです。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/8b3b8db8-dc6f-699d-1bd2-071d66aacebb.jpeg)

結論として、以下の理由により、A3Cはこのプランニング問題には不適としています。

 1. トレーニングの 3000 イテレーションで、100% 学習に失敗（learning collapse）し、単に旋回するだけとなってしまった。
 1. トレーニングに失敗する前の Agent を調べたが、ほとんど機能していなかった。
 1. A3C で成功させようとすると、報酬シェーピングが必要。例えば、ターゲットに近づく、ターゲットの方を指向する、といったことに対し報酬を与えることが必要だった。これでは、だんだんとルールベースに近づいて行ってしまう。 

##5.2 PPO でトレーニングした場合

PPO による Agent の学習は上手くいったようで、ミッション・シナリオ（laydown）の変更に対しロバストであったと結論しています。

下図に示すミッションは、もし Fighter 搭載ウェポンの射程よりも SAM の射程の方が長い場合は、SAM の邀撃範囲を迂回して Target を直接撃破し、もし、Fighter 搭載ウェポンの射程の方が SAM の射程よりも長い場合は、SAMを撃破した後、Targetを撃破するミッションです。このミッションでは、10,000 シミュレーション中 96% がミッションに成功したとのことです。ただし、「Fighter 搭載ウェポンの射程 ＞ SAM の射程」というミッション条件での学習が全体の 35% だったため、SAM を迂回することを学習し、10,000 シミュレーション中 3% のみが、SAM と Target の両方の撃破に成功したと記載されています（これ成功なんでしょうか？ミッション目的が Target 撃破の一点ならば成功なんですが？なんだか、ここで話が変わっているような気がしました）。なお、学習中の各エピソードの Fighter, SAM, Target の初期位置は、下図の左図のエリアから夫々ランダムに決定されています。

![キャプチャ.JPG1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/2c5f9dce-449f-c626-9b75-1ef4fef8963b.jpeg)

下図は、Fighter x 1, Decoy x 1 からなるパッケージで SAM で防護されたTargetを排除するシナリオの例です。右上から SAM 邀撃範囲に進出してきているのがデコイ、左下から進出してきているのが Fighter です。まずデコイが SAM の邀撃エリアに侵入し SAM に撃破されます。この時、SAM のクールダウン・タイムの間に、Fighter が SAM 邀撃範囲に侵入出来れば Fighter は SAM を撃破できるシナリオになっていて、Decoy と Fighter の進出タイミングが非常に重要です。クールダウン・タイムの設定値は判りません。この場合、失敗したミッションの多くで Fighter が早く進出しすぎていて、タイミングを完全に学習できている訳ではないと記載されています。また、シナリオを少し変えるとうまくいかなくなる（10,000 シミュレーション中、Fighter の初期位置を変えた場合の成功率は 18% 、初期ヘディングを変えた場合の成功率は 80% に減じた）とのことでした。

![キャプチャ.JPG2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/155b0fcf-8e39-68db-2386-ba444b89347d.jpeg)


既存シミュレータである AFSIM との連接には、かなり苦労したようで、下図に示すように csv ファイルで情報交換するインタフェースとなっていて、これには目が眩みました。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/c896a22e-7136-9722-4bc2-80ea3015333e.jpeg)

Figure 3.3 と似たシナリオの下図で、AFGYM で学習した Agent が、そのまま AFSIM で走ることを確認しています。1回の run に時間がかかるので統計的な確認まではしなかったとのことです。つまり、走ることを確認しただけのようです。

この場合、PPO で学習が失敗（learning collapse）したのは稀で 5〜10% とのことでした。また、汎化能力が高く、異なる laydown でも 96 % 成功（A3C では 5%）したとのことでした。

![キャプチャ.JPG3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/f421c375-2e55-7dd0-e5eb-cb298e0b67f9.jpeg)



#6. Possible Future Approaches

レポートでは下図のように、ニューラルネットへの入力が、Red Team と Blue Team のロケーション (xi, yi) になっているので、取り扱うことが出来るエージェント数の最大値はあらかじめ決めておく必要があります。（入力エンティティ数が、最大数よりも少ない時には(0,0)を入力するそうです）。

![キャプチャ.JPG1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/4ca92764-ff21-1d98-d056-9b46cbba4702.jpeg)

この問題を解決するには、下図のように、戦場をグリッド化し、ニューラルネット入力を、各グリッドに存在するエンティティ数とする方法が考えられます。

![キャプチャ.JPG2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/e347c812-c9f5-48b4-ec97-bb0bb5ceeb2e.jpeg)

実際には、各グリッドにはRed Team と Blue Team のエンティティが複数存在できるので、下図のようにエンティティ数をペアで与えることになります。これによって、任意のエンティティ数を入力出来るので、SWARM のようなプランニングにも対応できると述べられています。ニューラルネットの出力については、述べられていませんが、図からすると最大数 n は予め決めておく必要があります。つまり、プランニング対象となる Blue Team のエンティティ数の上限は予め決めておく必要があります。

![キャプチャ.JPG3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366937/acc57aee-1682-4992-037d-54220426f89b.jpeg)

#（その１１）へ続く
（その１１）では、１次元問題のためのシミュレータを２次元問題のためのシミュレータに拡張します。


# 過去記事へのリンク
- [ランド研究所の「機械学習による航空支配」を実装する（その1）：レポートのまとめ](https://qiita.com/DreamMakerAi/private/95e0aad16e450cb0c53d)
- [ランド研究所の「機械学習による航空支配」を実装する（その2）：1次元問題について](https://qiita.com/DreamMakerAi/items/72c90f9df5339dedd9cd)
- [ランド研究所の「機械学習による航空支配」を実装する（その3）： 1D simulator for GAN と Random mission planner の実装）](https://qiita.com/DreamMakerAi/private/1a0e25a9f673e531ee6f)
- [ランド研究所の「機械学習による航空支配」を実装する（その4）： conditional GAN の実装とトレーニング](https://qiita.com/DreamMakerAi/private/3a416d5cb64d9b7e86db)
- [ランド研究所の「機械学習による航空支配」を実装する（その5）：トレーニング結果の分析](https://qiita.com/DreamMakerAi/items/6c78181b71c470632fcf)
- [ランド研究所の「機械学習による航空支配」を実装する（その６）：トレーニング・データの重要性と GAN の性能向上](https://qiita.com/DreamMakerAi/private/b8ae6c9afd28e90b5b5c)
- [ランド研究所の「機械学習による航空支配」を実装する（その７）：1D simulator for RL の実装](https://qiita.com/DreamMakerAi/private/f008fa9981c3ad74c3cc)
- [ランド研究所の「機械学習による航空支配」を実装する（その８）： Stable Baselines による強化学習](https://qiita.com/drafts/37e6a18810b83d759d81/edit)
- [ランド研究所の「機械学習による航空支配」を実装する（その９）： 少し複雑な環境](https://qiita.com/DreamMakerAi/private/f4d3e35c07ab053608ea)
- [ランド研究所の「機械学習による航空支配」を実装する（その10）：GAN / 強化学習プランナーの連携を考える](https://qiita.com/DreamMakerAi/private/6cb416e42fc35a7a425c)