ポケモンの強化学習AI(6)
投稿: 2022年9月15日 
  ポケモンの最適解を知るため、強化学習を勉強している。
前回の記事 では、学習が進まない問題を切り分けるために、一旦シンプルなルール下で試行錯誤した。 AI にとって不利な状況で最善の行動を学習する方法を検討し、カリキュラム学習によって成功体験を積むことで学習が進みやすくなることを確認した。またカリキュラム学習では全体としてかなり多いエピソード数が必要なこと、エピソード数がある程度貯まるまでは全く学習が進んでいないように見えることも学んだ。
現状の報酬は
- ポケモンを倒した/倒された
 - 勝利/敗北
 
だけなので、新しく
- 受けた/与えたダメージ
 
を報酬に入れることで、より安定して学習できるのではないかと考えた。
具体的には、
- 勝利: 
+1 - 敗北: 
-1 - 討伐: 
+0.3 - 死亡: 
-0.3 - 与ダメージ: 
sigmoid(ダメージ割合) - 0.5 - 受ダメージ: 
-1 * (sigmoid(ダメージ割合) - 0.5) 
とした。 sigmoid はこれ。
def sigmoid(x: float):
    return 1 / (1 + math.exp(-x))ダメージ割合に応じて、報酬はこうなっている。経験上、与えたダメージが 50% を超えてくると一気に有利になるので、これは感覚に合っている。
| ダメージ割合 | 報酬 | 
|---|---|
| 0% | 0.0 | 
| 10% | 0.024979187478940013 | 
| 30% | 0.07444251681165903 | 
| 50% | 0.1224593312018546 | 
| 70% | 0.16818777216816616 | 
| 90% | 0.2109495026250039 | 
| 100% | 0.2310585786300049 | 
結果
上述の報酬を加えたところ、下記のように AI にとって 圧倒的に不利な状況でも、カリキュラム学習に頼らずとも正しい行動 (「にどげり」を選択)を学習することができた。
- AI: サンダース
 - 敵: サイドン
 
まあ当然といえば当然なのだが。
| わざ | 評価値 | 
|---|---|
| 10 万ボルト | -0.21343611 | 
| のしかかり | -0.23202442 | 
| にどげり | -0.183582 | 
| ミサイルばり | -0.29433399 | 
次回予告
DQN がポケモンの交代を正しく認識できていないようなので、今回得られた知見をもとに、まずは 2 体のポケモンで最適な行動を学習してもらうのを目標とする。その次は、6 体に増やして実験したい。