ポケモンの強化学習AI(6)

報酬にダメージを入れて、学習を安定化させた

ポケモンの最適解を知るため、強化学習を勉強している。

前回の記事 では、学習が進まない問題を切り分けるために、一旦シンプルなルール下で試行錯誤した。 AI にとって不利な状況で最善の行動を学習する方法を検討し、カリキュラム学習によって成功体験を積むことで学習が進みやすくなることを確認した。またカリキュラム学習では全体としてかなり多いエピソード数が必要なこと、エピソード数がある程度貯まるまでは全く学習が進んでいないように見えることも学んだ。

現状の報酬は

  • ポケモンを倒した/倒された
  • 勝利/敗北

だけなので、新しく

  • 受けた/与えたダメージ

を報酬に入れることで、より安定して学習できるのではないかと考えた。

具体的には、

  • 勝利: +1
  • 敗北: -1
  • 討伐: +0.3
  • 死亡: -0.3
  • 与ダメージ: sigmoid(ダメージ割合) - 0.5
  • 受ダメージ: -1 * (sigmoid(ダメージ割合) - 0.5)

とした。 sigmoid はこれ。

1
2
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 体に増やして実験したい。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy