こんにちは.changです. 今回はAIを4名の自転車レーサー(マ○ュアン,ペ○ッキ,カ○ンディッシュ,カ○チェラーラ)に見立てて競わせてみました.
0. 自転車ロードレース
自転車レース戦術の必要知識については過去の記事*1*2をご覧ください.
モデルにした選手についての知識があるとより楽しんでいただけると思うのですが,選手の特徴を比較しながら理解できるような情報元はなかなか無いです. あまり参考にならないと思いますが,彼らがフィーチャーされているYouTubeを紹介しておきます*3*4*5*6.
1. プログラム
(1) フィールド
32×8の画像の上を上から下方向にレースさせます. プレイヤーが増えて窮屈になったので,横幅を8から12に増やしました.
(2) プレイヤー
今回はプレイヤー vs コンペティターという図式ではなく,4名のプレイヤーを対等に争わせます.
マ○ュアン
- アクションは5パターン
- 1ダッシュなら1,2ダッシュなら2だけエネルギーを消費する
- エネルギー残量不足でスーパースプリントした場合は,エネルギー残量分だけ進む
- エネルギーが0になると,スプリント(0)とスーパースプリント(4)は前進(2)と同じ動きになる
- 初期エネルギーは5
- ライバルの背後に入る動きを発生させる為,横方向の動きを大きくしている
- ロングスプリントは苦手(=初期エネルギーが小さい)だが小回りが効く(横方向の動きが大きい),マ○ュアン型の特性
ペ○ッキ
- アクションは5パターン
- 1ダッシュなら1,2ダッシュなら2だけエネルギーを消費する
- エネルギー残量不足でスーパースプリントした場合は,エネルギー残量分だけ進む
- エネルギーが0になると,スプリント(0)とスーパースプリント(4)は前進(2)と同じ動きになる
- 初期エネルギーは6
- 重量級(=横方向の動きが小さい)でロングスプリントを得意とする(=初期エネルギーが大きい),ペ○ッキ型の特性
カ○ンディッシュ
- アクションは5パターン
- 1ダッシュなら1,3ダッシュなら3だけエネルギーを消費する
- エネルギー残量不足でスーパースプリントした場合は,エネルギー残量分だけ進む
- エネルギーが0になると,スプリント(0)とスーパースプリント(4)は前進(2)と同じ動きになる
- 初期エネルギーは5
- 瞬発力に優れた(=スーパースプリントが長い)カ○ンディッシュ型の特性
カ○チェラーラ
- アクションは5パターン
- 1ダッシュで,エネルギーを1消費する
- エネルギーが0になると,スプリント(0 or 4)とは前進(2)と同じ動きになる
- 初期エネルギーは10
- スプリントを捨て(=スーパースプリントが無い),持続力に特化した(=初期エネルギーが大きい)カ○チェラーラ型の特性
(3) スリップストリーム
簡単なルールで擬似しました. ライバルの後ろを走ることで,エネルギーが回復します.
(4) 報酬
- 勝ち: 1.0
- 負け: -1.0
All or nothongの思想は前回までと同じです. 引き分けの場合も負けと同じになります.
Note: レース展開の学習方法を含めたプログラムの基本コンセプトは,過去の記事をご覧下さい.
2. 結果
プレイヤーが増えたことで,(15ケースの学習結果をみた)前回よりも更に結果にバリエーションが生じました. より多くのケースで学習結果をみたいところですが,計算時間の関係で今回は10ケースに留めました.
(1) 勝率
Case | マ○ュアン | ペ○ッキ | カ○ンディッシュ | カ○チェラーラ | 引き分け |
---|---|---|---|---|---|
0 | 0.073 | 0.157 | 0.503 | 0.000 | 0.267 |
1 | 0.497 | 0.107 | 0.177 | 0.000 | 0.219 |
2 | 0.037 | 0.010 | 0.057 | 0.010 | 0.886 |
3 | 0.390 | 0.013 | 0.123 | 0.003 | 0.597 |
4 | 0.133 | 0.320 | 0.130 | 0.000 | 0.417 |
5 | 0.033 | 0.017 | 0.087 | 0.003 | 0.860 |
6 | 0.043 | 0.817 | 0.063 | 0.000 | 0.077 |
7 | 0.650 | 0.120 | 0.040 | 0.020 | 0.170 |
8 | 0.023 | 0.330 | 0.247 | 0.200 | 0.200 |
9 | 0.220 | 0.250 | 0.247 | 0.033 | 0.250 |
Sum | 0.210 | 0.210 | 0.170 | 0.030 | 0.390 |
学習終了後に300回対戦させた場合の,各プレイヤーの勝率をまとめました. 10ケース全体で見ると:
- マ○ュアンとペ○ッキが拮抗
- カ○ンディッシュがそれに次ぐ
- カ○チェラーラは一人負け
Note: 念の為申し上げておきますが,カ○チェラーラが嫌いなわけではありません(汗)
(2) レース展開
各プレイターの勝ちパターンの抜粋したGIFアニメを作りました. 全ケースのGIFアニメはここ*7です.
Case | マ○ュアン | ペ○ッキ | カ○ンディッシュ | カ○チェラーラ |
---|---|---|---|---|
0 | / | / | 逃げ | / |
1 | スプリント | / | / | / |
2 | 逃げ | / | 逃げ | / |
3 | 逃げ | / | 逃げ | / |
4 | 逃げ | スプリント | 逃げ | / |
5 | 逃げ | / | 逃げ | / |
6 | / | スプリント | / | / |
7 | 逃げ | / | / | / |
8 | 逃げ | スプリント | スプリント | / |
9 | 逃げ | スプリント | スプリント | / |
各ケースでの動きをまとめるとこんな感じです. プレイヤーが2名だった前回と比べると,戦略が洗練されていない印象を受けました. ゴールスプリントを仕掛けるようにはなりますが,早がけで息切れするようなケースが目立ちます. また,4名が全員で勝負を争そう様な動きにはなりませんでした. スプリントするのは精々2名で,残りのプレーヤーは後ろから傍観と言うか... その辺の考察をしてみようと思います.
3. 考察
(1) 学習エポック数
戦略が洗練されなかった原因の一つとして,単純に学習回数が不足していたことが考えれます.
これは,ケース0の学習中の勝率の変化です. 25000エポック付近からペ○ッキとカ○ンディッシュの勝率が上がり初め,学習終了時(50000エポック)まで上がり続けました. この後更に学習を積めば,より高度なスプリントをするようになったかも知れません. 学習回数を(プレーヤー2名の)前回の20000エポックから50000に増やしましたが,それでも足りなかった様です. フィールド内のシチュエーションのバリエーションが飛躍的に増えたためでしょう.
(2) ネガティブ脳
4名全員で勝負を争わないのは,4名しかプレイヤーがいない閉じた世界で戦わせたからだと考えられます. 「誰かが勝てば誰かが負ける」「勝者は一人」という事です.
上に示したCase 0の学習中の勝率変化を再度見てみましょう. 25000エポックからマ○ュアンとカ○ンディッシュが勝利を増やしていくのに相反する様に,カ○チェラーラの勝率は下がっていきます. 勝負をしながら互いに高め合う事が出来なかったのです.
大半のケースに共通して,学習開始から25000エポック程度まではカ○チェラーラの圧勝になります. パワーで圧倒するカ○チェラーラは,全てのプレイヤーがランダムな動きをする学習初期に有利だからです.
Gifアニメを見ると,ライバルに敗れるケースでカ○チェラーラは全くエネルギーを使っていません. 力を出し切ればある程度の確率で勝てる筈なのに,そうしないのです. これは,学習初期にランダム(=無戦略)な動きでプラス報酬を得て構築したニューラル・ネットワークが,他の選手に負けるようになってマイナス報酬で上塗りされるだと思います. 過去の勝ちパターンを否定され,自身を失ったネガティブ脳に陥るのです. 現実の有力選手も負けがかさんで調子を崩すことがあります. 似たような現状なのかも知れません.
train.py
if terminal: # experience replay if reward_t[0] > 0: agent1.experience_replay() elif reward_t[1] > 0: agent2.experience_replay() elif reward_t[2] > 0: agent3.experience_replay() elif reward_t[3] > 0: agent4.experience_replay()
ちなみに今回,負けパターンばかりを学習してネガティブ脳になるのを避けるために,上記の様に勝ったときにだけその経験を学習するようにしました. プレーヤーを4名にしたことで,単純に勝ち1回に対して負け3回を学習することになり,負け癖をつけやすい為です.
dqn_agent.py
class DQNAgent: ... def __init__(self, enable_actions, input_shape, environment_name, model_name): ... self.replay_memory_size = 10
また,(負けを含む)過去の記憶を引き釣りすぎない様に,記憶容量(replay_memory_size)を10戦ぶんにとどめています. それでも,10戦中10戦勝てていたものが,8戦になり,1戦しか勝てなくなり,,,という流れで,ネガティブ脳に陥ってしまったようです.
現実世界では,選手たちは常に同じレースを戦うわけではありません. 個々に自国のレースを走って調子をあげてきた選手達が,本命レースで顔を合わせる場合も多いです. この様に異なるレースを走って調整することには,「むやみに負けを経験させない」という効果もあると考えられます. 2010年のファビアン・カンチェラーラや2011年のフィリップ・ジルベールのように,一人の選手が主要レースを独占することがあります. ああした年においては,勝った選手がノッていたことは勿論ですが,他の選手がネガティブ脳に陥っていた側面も在ったかも知れません.
試しに,各プレイターがノッているネットワーク(マ○ュアン:Case 1,ペタッキ: Case 6,カベンディッシュ: Case 0,カンチェラーラ: ランダム)を集めて対戦させると,途端にレース感が出ました. 見ていて飽きない程に,生き生きとした接戦を繰り広げます.
(3) 当て馬カ○チェラーラ
ファンの方に怒られそうですが...繰り返して申します. カ○チェラーラが嫌いな訳ではありません. プログラムが起こした現象について,客観的な考察をしております.
一人負けになったカ○チェラーラですが,AI対戦での学習において重要な役割を果たしました. ケース0の学習経過を再々度見てみると,ペ○ッキとカ○ンディッシュはカ○チェラーラに対抗するように強くなった様に見えます. それを証明するのが,ケース2です. ケース2は,引き分けが多くて退屈なレース展開でした.
ケース2の学習中の勝率変化を見てみると,学習開始時からのカ○チェラーラの圧勝が起こりません. 勝率を上げていくプレーヤーも発生せず,引き分けを増やしながら全プレイヤーが縮退する傾向になります. つまり,リスクを追ってアタックを仕掛ける当て馬がいないと,全プレーヤーがダルい戦略を取るようになるのです. 体格差で有利な選手(=初期エネルギー値が高い)に対抗しようとすることで,優れた戦略は生まれると言えます.
4. むすび
戦術面だけでなく,レースに向けた調整方法についても脳科学的な側面から言及することが出来るかも知れません.
ただ,学習に時間がかかって結果をまとめるのが大変になってきました(汗). 夜中にきらびやかに輝きながら回るマイマシンが,地味に睡眠を妨げやがります...
次はチーム戦をやってみるつもりですが,健康を崩さない範囲にしようと思います(笑). 今回の実験でカ○ンディッシュが思ったよりも勝てなかったことが気になっています. 彼の様なタイプは最終局面まで勝負がもつれた状態で脚を残せてこそ,その力を発揮する筈です. 逃げを自分で潰さなければならない個人戦ではスーパースプリントを生かせなかったのでは無いかと考えています. チームトレインからカ○ンディッシュが弾丸スプリントを決めたら最高ですね!!!
ソースを更新しました*8.
*1:https://changlikesdesktop.hatenablog.com/entry/2021/01/26/070425
*2:https://changlikesdesktop.hatenablog.com/entry/2021/02/18/061534
*3:https://www.youtube.com/watch?v=26wGptxqpiI
*4:https://www.youtube.com/watch?v=R1oG8dsrNtw
*5:https://www.youtube.com/watch?v=vPhjeAp1Fj8
*6:https://www.youtube.com/watch?v=zDdRUjMFhQo
*7:https://changlikesdesktop.hatenablog.com/entry/2021/03/04/095559