Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「AIにゲームを学習させる環境」の導入から安定運用までの学び【DeNA TechCon 2022】

「AIにゲームを学習させる環境」の導入から安定運用までの学び【DeNA TechCon 2022】

近年においてゲームはリリースして終わりではなく、リリース後も数年に渡って運用を行うケースが増えています。その中では運用年数に比例して増えるキャラクターやスキルのバランス調整や、ゲームの改修に伴って発生する不具合の事前検知などの課題に対して、AIを用いて解決する手法の研究や報告が活発です。

DeNAでもこれらの課題を解決するため、シミュレータを用いた「AIにゲームを学習させる環境」を開発、運用しています。

ゲームの開発初期からこのような「AIにゲームを学習させる環境」を開発し活用するには、ゲーム開発チームにAI導入の提案を行い、AIを用いた開発推進のための体制を構築し、シミュレータの安定的な運用を行うための設計・実装を行う必要があります。

本発表では、この「提案」や「体制構築」、「設計・実装」をどのように行ってきたか紹介しつつ、実際にやってみて「良かったノウハウ」「悪かったノウハウ」をお話します。

資料内でのリンク集:
p.8-1, https://cedec.cesa.or.jp/2021/session/detail/s6051bc8b8d6ee
P8-2,p56, https://cedec.cesa.or.jp/2020/session/detail/s5e7d8eee81142.html

◆ You Tube
https://youtu.be/jY4Kl1_cb1Q

◆ You Tube チャンネル登録はこちら↓
https://youtube.com/c/denatech?sub_confirmation=1

◆ Twitter
https://twitter.com/DeNAxTech

◆ DeNA Engineering
https://engineering.dena.com/

◆ DeNA Engineer Blog
https://engineering.dena.com/blog/

◆ DeNA TechCon 2022 公式サイト
https://techcon2022.dena.dev/spring/

DeNA_Tech

March 17, 2022
Tweet

More Decks by DeNA_Tech

Other Decks in Technology

Transcript

  1. 目次 • 第1章:登壇者紹介 • 第2章:導入 • 第3章:AIによるゲームの学習 • 第4章:実践~エンジニアリング編~ ◦

    第1節:「AIにゲームを学習させる環境」における機構・機能 ◦ 第2節:「AIにゲームを学習させる環境」における設計・実装 • 第5章:実践~プロジェクト推進編~ ◦ 第1節:「AIにゲームを学習させる環境」の更なる活用 ◦ 第2節:ゲームドメインとAIドメインの接合点 • 第6章:総括
  2. • 味方 ◦ HP/MP/攻撃力/防御力/… ◦ スキル ◦ 装備 ◦ 好感度

    • 敵 ◦ ... • ダメージ計算 • etc ... AIが学習できる環境とは? アナログゲームとデジタルゲームを比較した場合, デジタルゲームは内部的に持つパラメータが多く,画面には表示されない要素が多い. また「味方・敵・地形・天候・時間」などプレイヤーが能動的に干渉できない要素も多い. • 盤面 • 自身の駒 • 相手の駒 • 取られた自身の駒 • 取った相手の駒 • 駒の移動方向 • 経過ターン
  3. • 味方 ◦ HP/MP/攻撃力/防御力/… ◦ スキル ◦ 装備 ◦ 好感度

    • 敵 ◦ ... • ダメージ計算 • etc ... AIが学習できる環境とは? ゲームにおける因果関係を伴う一連の事象をAIに学習させようと考えた時, デジタルゲームの状況は画面から目視のみで得られる情報だけで十分だろうか? • 盤面 • 自身の駒 • 相手の駒 • 取られた自身の駒 • 取った相手の駒 • 駒の移動方向 • 経過ターン
  4. • 味方 ◦ HP/MP/攻撃力/防御力/… ◦ スキル ◦ 装備 ◦ 好感度

    • 敵 ◦ ... • ダメージ計算 • etc ... AIが学習できる環境とは? ゲームにおける因果関係を伴う一連の事象をAIに学習させようと考えた時, デジタルゲームの状況は提供されたUIから操作できる内容だけで十分だろうか? • 盤面 • 自身の駒 • 相手の駒 • 取られた自身の駒 • 取った相手の駒 • 駒の移動方向 • 経過ターン
  5. メッセージ駆動のゲーム ゲーム ロジック UI 描画 敵AI 味方 AI システム これから説明する

    出力機構・入力機構では メッセージ駆動で動くゲームを 例に用いて解説を行う
  6. メッセージ駆動のゲーム ゲーム ロジック UI 描画 敵AI 味方 AI システム そのため,

    出力機構・入力機構の解説に先行して メッセージ駆動の解説を行う.
  7. メッセージ駆動のゲーム ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    メッセージキュー ゲームロジック メッセージ発行者
  8. 実践~エンジニアリング編~:出力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    メッセージを いつ・誰が・何の メッセージを キューに送ったか をログに記録 1: From: AI Value: 2: From: UI Value: 3: …
  9. 実践~エンジニアリング編~:出力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    1: From: UI Value: 2: From: AI Value: 3: … メッセージを いつ・誰が・何の メッセージを キューに送ったか をログに記録
  10. 実践~エンジニアリング編~:出力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    メッセージを 処理した結果, どの様な計算になり, どの様に処理し, どの様に反映したか をログに記録 MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], …
  11. 実践~エンジニアリング編~:入力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    1: From: AI Value: 2: From: UI Value: 3: … 入力機構とは ログなどに従って 各メッセージ発行者のフリをして メッセージを発行する機構. 入力 機構
  12. 実践~エンジニアリング編~:入力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    1: From: AI Value: 2: From: UI Value: 3: … 入力 機構 入力機構に ログを読ませると...
  13. 実践~エンジニアリング編~:入力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    1: From: AI Value: 2: From: UI Value: 3: … 入力機構が 「それぞれのフリ」 をしてメッセージを発行 入力 機構
  14. 実践~エンジニアリング編~:入力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    1: From: AI Value: 2: From: UI Value: 3: … 1: From: AI Value: 2: From: UI Value: 3: … 入力機構を用いて いるときも同じ様に 出力を記録する 入力 機構 メッセージを いつ・誰が・何の メッセージを キューに送ったか をログに記録
  15. 実践~エンジニアリング編~:入力機構 ゲーム ロジック UI 描画 敵 キャラ 味方 キャラ システム

    1: From: AI Value: 2: From: UI Value: 3: … メッセージを 処理した結果, どの様な計算になり, どの様に処理し, どの様に反映したか を記録 入力機構を用いて いるときも同じ様に 出力を記録する 入力 機構 MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], …
  16. 「AIにゲームを学習させる環境」の更なる活用 「AIにゲームを学習させる環境」とは,     出力機構 = AIが学習に用いる為のログを出す機構     入力機構 = ログを用いてゲームロジックに干渉する機構     並列実行 =

    サーバ上で並列にゲームを動かせる     高速実行 = ゲームをGUIから切り離しCUI上で動かせる の機能をゲーム上に実装したものである. シミュレータ環境
  17. 「AIにゲームを学習させる環境」の更なる活用 「AIにゲームを学習させる環境」をAI機能開発以外に利用する例. • リプレイ機能 ◦ スナップショットテスト ◦ チート検知 ◦ 観戦機能

    ◦ お手本機能 ◦ 周回機能 • バランス調整 • 自動編成 • 自動プレイ シミュレータ環境 「AIにゲームを学習させる環境」における 入力機構・出力機構 を利用することで リプレイ機能を作ることができる. シミュレータ環境 さらにリプレイ機能を派生させることで, 様々な利用用途に展開可能.
  18. 「AIにゲームを学習させる環境」の更なる活用 「AIにゲームを 学 習 させる 環 境 」をAI 機 能

    開 発 以 外 に 利 用 する 例 . • リプレイ機能 ◦ スナップショットテスト ◦ チート検知 ◦ 観戦機能 ◦ お手本機能 ◦ 周回機能 • バランス調整 • 自動編成 • 自動プレイ シミュレータ環境 「AIにゲームを学習させる環境」における 入力機構・出力機構 を利用することで リプレイ機能を作ることができる. シミュレータ環境 さらにリプレイ機能を派生させることで, 様々な利用用途に展開可能. 本発表ではリプレイ機能と その派生の中でも費用対効果が得やすい スナップショットテストとチート検知 について解説を行う
  19. リプレイ機能 1: From: UI Value: 2: From: AI Value: 3:

    … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … Ver:2.0 シミュレータ環境 プレイヤーが行った操作を 出力機能を用いてログとして保存する
  20. リプレイ機能 1: From: UI Value: 2: From: AI Value: 3:

    … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 1: From: UI Value: 2: From: AI Value: 3: … Ver:2.0 シミュレータ環境 プレイヤーが行った操作を プレイヤーの代わりに 再現する
  21. スナップショットテスト 1: From: UI Value: 2: From: AI Value: 3:

    … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … Ver:2.0 Ver:1.0 プレイヤーが行った操作を 出力機能を用いてログとして保存する
  22. スナップショットテスト Ver:2.0 1: From: UI Value: 2: From: AI Value:

    3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 1: From: UI Value: 2: From: AI Value: 3: … プレイヤーが行った操作を プレイヤーの代わりに 再現する
  23. スナップショットテスト 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], …
  24. スナップショットテスト 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 同じ操作を行った時... 同じ操作を行った時...
  25. スナップショットテスト 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 同じ操作を行った時... 同じ結果が現れるかを 確認する
  26. スナップショットテスト 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 同じ操作を行った時... ログが一致している場合は, 機能改修前後でバグやデグレードが 発生していないことが確認できる
  27. スナップショットテスト 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: false, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … ログが不一致の場合は, 機能改修前後でバグやデグレードが 発生していることがわかる. ログを読むことで. どの時点の操作で差分が発生したか確認可能. ログが不一致の場合は, 機能改修前後でバグやデグレードが 発生していることがわかる. ログを読むことで. どの時点の操作で差分が発生したか確認可能.
  28. チート検出 1: From: UI Value: 2: From: AI Value: 3:

    … MessageId: 1 Result: { IsHit: true, Damage: 100000, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … Ver:2.0 Ver:1.0 プレイヤーが行った操作を 出力機能を用いてログとして保存する
  29. チート検出 1: From: UI Value: 2: From: AI Value: 3:

    … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 1: From: UI Value: 2: From: AI Value: 3: … Ver:2.0 Ver:1.0 プレイヤーが行った操作を プレイヤーの代わりに 再現する
  30. チート検出 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100000, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], …
  31. チート検出 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100000, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 同じ操作を行った時... 同じ操作を行った時...
  32. チート検出 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100000, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … 同じ操作を行った時... 同じ結果が現れるかを 確認する
  33. チート検出 1: From: UI Value: 2: From: AI Value: 3:

    … 1: From: UI Value: 2: From: AI Value: 3: … MessageId: 1 Result: { IsHit: true, Damage: 100, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … MessageId: 1 Result: { IsHit: true, Damage: 100000, AttackFrom: player, AttackTo: enemy1, … }, Units: [ { Id: 1, Hp: 50, … }, … ], … ログが一致している場合は, 機能改修前後でバグやデグレードが 発生していないことが確認できる プレイヤーがチートを使用していた場合, 同じ操作を行っても違う結果がログに現れる.
  34. 総括 AIにゲームを学習させるためには, • 出力機構 = AIが学習に用いる為のログを出す機構 • 入力機構 = ログを用いてゲームロジックに干渉する機構

    • 並列実行 = サーバ上で並列にゲームを動かせる • 高速実行 = ゲームをGUIから切り離しCUI上で動かせる が必要. これらを満たした 「AIにゲームを学習させる環境」を シミュレータ環境と呼びます!