大規模開発のための の ログ分析と自動テスト

株式会社 Luminous Productions 岩﨑 浩 自己紹介

• 岩﨑 浩 Hiroshi Iwasaki

– Luminous Productions http://www.luminous-productions.com/ – プログラムセクション ディレクター

FINAL FANTASY XV MONSTER OF THE DEEP FINAL FANTASY XV © 2016 SQUARE CO., LTD. All Rights Reserved. MAIN CHARACTER DESIGN: LOGO ILLUSTRATION:© 2016 YOSHITAKA AMANO

©2019 Luminous Productions CO.,LTD. Agenda

• LUMINOUS ENGINE 紹介 主に機能紹介 • ログ分析と自動テスト の概要 • ログ分析 15分(目標) • プレイログ 機械学習の話とか • 自動プレイ

©2019 Luminous Productions CO.,LTD. What’s

© 2016-2019 CO., LTD. All Rights Reserved. ©2019 Luminous Productions CO.,LTD. MAIN CHARACTER DESIGN:TETSUYA NOMURA コリジョン C#スクリプト ナビメッシュ レベルエディタ

キャラツール グラフィックス テラインツール AI LUMINOUS ENGINEの構成

VFX アニメーション UI アセットブラウザ

アセットビルド

Mayaプラグイン DevOps © 2016-2019 SQUARE ENIX CO., LTD. All Rights Reserved. MAIN©2019 CHARACTER Luminous DESIGN Productions:TETSUYA CO.,LTD. NOMURA ログ分析と自動テスト 概要

©2019 Luminous Productions CO.,LTD. QA or デバッグで 大変な所

©2019 Luminous Productions CO.,LTD. QAで大変なところ • 繰り返すのが大変 – 必須ルート、サブクエストの通しプレイ – 全ハードウェアで同じ内容をチェック • 多数のパターンを網羅するのが大変 – 全部のアイテムを検証 – 様々なセーブデータが正常にロードできるかの確認 – マップ全域を、いろいろな時間、天候で、確認

©2019 Luminous Productions CO.,LTD. デバッグで大変なところ

• どこでバグっているか見つけるのが大変。 – ほとんどの場合、原因を見つける方が、直すより大変です。 • バグを再現するのが大変。 – 再現性が低い、とか。 – 再現する手順が大変、とか。

©2019 Luminous Productions CO.,LTD. 自動化したいこと

繰り返し 自動プレイ

パターンの網羅 スクリプト実行

発生した 原因の特定 バージョンの特定

再現 リプレイ

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. Webサーバーの役割 • ログや自動テストの可視化です。

©2019 Luminous Productions CO.,LTD. Webサーバー の機能紹介

©2019 Luminous Productions CO.,LTD. テスト結果一覧

©2019 Luminous Productions CO.,LTD. テスト結果の一覧

©2019 Luminous Productions CO.,LTD. テストが失敗したバージョンを特定

©2019 Luminous Productions CO.,LTD. テストが失敗する原因となった更新を特定

誰のSubmit?

Submitのコメント

テストが失敗した時に、 どのSubmitからバグが起きるようになったか?がわかる。

©2019 Luminous Productions CO.,LTD. 各種、レポート

パフォーマンス スクショ(2D) クラッシュした場所

JIRAチケットの場所 スクショ(パノラマ) 現在プレイされている場所

©2019 Luminous Productions CO.,LTD. 過去の履歴

2019/6/15 2019/7/16 2019/8/5

すべてのログは、過去の情報も見られます。

©2019 Luminous Productions CO.,LTD. グラフィックスの単体テスト

©2019 Luminous Productions CO.,LTD. テストに失敗したときのレポート

Microsoft Teams での通知

前回と見た目が変わっていたら通知

©2019 Luminous Productions CO.,LTD. アセットごとのスクショ&履歴

©2019 Luminous Productions CO.,LTD. Webサーバー の仕組み

©2019 Luminous Productions CO.,LTD. 全体の図

influxdb

アプリケーション開発者が 記述可能

定義ファイル Python (JSON)

自前 カスタム Flask python JavaScript ブラウザ

©2019 Luminous Productions CO.,LTD. エディタ

定義ファイル カスタム (JSON) JavaScript

ブラウザ上で、 編集し、確認が可能。

©2019 Luminous Productions CO.,LTD. Webサーバーの機能、動画

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. テストサーバーの役割

• いろいろなテストを実行します。

©2019 Luminous Productions CO.,LTD. テストの記述の言語

©2019 Luminous Productions CO.,LTD. テスト記述の言語 外部(ホストPC)で動作 実機で動作

C# C++ python C# with “Python for .NET” Visual Script

.NET Frameworkに アクセス可能な言語なら、 RPC 何でもOK

©2019 Luminous Productions CO.,LTD. エンジンのスクリプトサポート

LM_FUNCと書くと、 エンジンがサポートする 全てのスクリプトからアクセス可能になります。

こんな感じで使える。

©2019 Luminous Productions CO.,LTD. Pythonでの記述例

スクショを取って、 前回の結果と比較 の例

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. スケジューラの役割

• テストを実行するタイミング、条件などを制御します。 • どのマシンで実行するか?なども制御します。

©2019 Luminous Productions CO.,LTD. スケジューラ

バックエンドは Jekinsを使っています。

実行条件などは、自前のスクリプトです。

©2019 Luminous Productions CO.,LTD. スケジューラの構成

Test A 実行命令

Test B 実行命令

実行命令

マスター Job Test C 前半実行命令 実行 Job テスト実行命令を 実際に 最小単位に分解 テストを実行する

Test C 後半実行命令

©2019 Luminous Productions CO.,LTD. マスター Jobの役割

例えば、デイリーテストを実行 という命令に対して、 ・何のテストを、 ・どのプラットフォームで、 ・どのマシンでテストするか? を分解し、 複数の実行Job に投げます。

©2019 Luminous Productions CO.,LTD. 実行Jobの役割

• 複数のマシンがアサインされています。 • JenkinsのLabelを使って、実行するマシンの制御を行っ ています。

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. ログ サーバー&ホストの役割

• ログを永続的に記録します。

©2019 Luminous Productions CO.,LTD. ログの構成

実機 ログホスト 実機 influxdb

Local Server

©2019 Luminous Productions CO.,LTD. ログの取り方

• 各種スクリプトにコードを仕込むことで、ログが記録されま す。 • ログは、InfluxDB に永続的に記録されます。 – ある程度古いのは間引いて消しています。

©2019 Luminous Productions CO.,LTD. C#でログを取る例

Measurement(テーブル)の Performance.FPSに value, pos, angleというFieldで保存されます。

©2019 Luminous Productions CO.,LTD. DBに書き込んだ内容を、 先ほどのWebで可視化します。

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. プレイログとは?

©2019 Luminous Productions CO.,LTD. リプレイログとは?

• ゲームをリアルタイムに記録する目的に特化したログです。 – 今まで紹介したInfluxDBで取るログとは別の仕組み です。(連携はできますが)

©2019 Luminous Productions CO.,LTD. プレイログ 開発の動機

©2019 Luminous Productions CO.,LTD. あの1フレに 何が起きたかを知りたい。

©2019 Luminous Productions CO.,LTD. プレイログ開発の動機

• コリジョンが抜けた。 • キャラが突然消えた。 • 扉を開けたら、いるはずのキャラがいなかった。 • 今、立つはずのないフラグが立っている。 その瞬間、 何が起きていたのかを知りたい!

©2019 Luminous Productions CO.,LTD. 後からじゃ遅い。 常に、全部 記録しておく!

©2019 Luminous Productions CO.,LTD. プレイログでできること。

©2019 Luminous Productions CO.,LTD. プレイログを使ったデバッグ

©2019 Luminous Productions CO.,LTD. プレイログの仕組み

色々な システム プレイログ プレイログ 色々な システム システム

ポインタを 自動で比較して、 登録しておきます。 変わった値を記録します。

©2019 Luminous Productions CO.,LTD. ログを取っているパラメータ

• エンジンが認識できるゲームのプロパティ全部。 – Visual Scriptの実行履歴やプロパティの変化 – ゲームオブジェクトのプロパティ • 座標、ゲームステートなど。 • パッド入力 • パフォーマンス、プロファイル情報 – スパイクが起きたフレームを分析するため • ユーザーが指定したパラメータ

©2019 Luminous Productions CO.,LTD. プレイログに登録するコードの例

• この例では、カメラのView Matrix, Projection Matrixのリプレイログを取る、と言う指定です。 • あとは、エンジンが勝手に毎フレーム、差分を記録し続け ます。

©2019 Luminous Productions CO.,LTD. プレイログで できること

©2019 Luminous Productions CO.,LTD. プレイログでできること

• 過去の値の確認 • 過去のフレームのプレビュー • 過去の任意のフレームからのリスタート • グラフによる履歴の可視化 • 保存/読み込み • 機械学習の入出力に使う (後述)

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. 自動プレイに 期待すること

©2019 Luminous Productions CO.,LTD. 自動プレイの種類

自動で、今まで行われたことのないプレイをしてくれる。 発見的自動プレイ

過去に、一度行ったプレイを、繰り返し実行してくれる。 リプレイ的自動プレイ

今回はこちらの話

©2019 Luminous Productions CO.,LTD. リプレイ的 自動プレイの手法

©2019 Luminous Productions CO.,LTD. リプレイ的自動プレイの手法

• パッド入力を記録 • スクリプトで制御

パッド、と言っていますが、 もちろん、キーボードでもマウスでもタッチパネルでも同様です。

©2019 Luminous Productions CO.,LTD. パッド入力を記録するメリット

• 非常に高い汎用性 – ゲームの種類を問わず、入力を記録するリプレイは動 作します。 • リプレイのデータを用意するのが直感的 – 普通にプレイしたのを記録すれば良い。 • そのリプレイで再現したバグは、必ずユーザーも再現可能 – リプレイで行われた操作はパッドのみなので。

©2019 Luminous Productions CO.,LTD. パッド入力を記録するデメリット

• リプレイが安定しない – 何かの拍子に、少しでもずれると、使い物にならない。 • ⾧時間の通しプレイをパッド入力だけで、再現するには、 相当の仕込みが必要。 – ランダム要素の排除、エンジンとしての、結果の安定 性、など。

©2019 Luminous Productions CO.,LTD. スクリプトで制御のメリット

• ⾧時間の通しプレイも再現可能。 – 人力でスクリプトを組むので、がんばり次第で、何とで もなる。

©2019 Luminous Productions CO.,LTD. スクリプトで制御のデメリット

• 作るのが直感的ではない。 – プログラマ的作業。 • スクリプト制御特有のバグが起こりえる。 – 実際のユーザーのプレイとは若干違う。 • メンテコストが高い。 • 汎用性が低い。

©2019 Luminous Productions CO.,LTD. パッド入力のリプレイが 安定すれば 最高

©2019 Luminous Productions CO.,LTD. パッド入力のリプレイが安定しない理由

• 毎回、同じ結果にならないエンジン側の問題 • ランダム要素という、ゲーム側の問題

問題を取り除き、 維持し続けるのは、 難しい!

©2019 Luminous Productions CO.,LTD. リプレイがずれないように、がんばるのではなく、 一度ずれても、復帰できるように がんばった方が、よさそう。

©2019 Luminous Productions CO.,LTD. マシンラーニングで やってみる。

©2019 Luminous Productions CO.,LTD. 用語

記録したパッド入力を そのまま再生したリプレイ パッドリプレイ

マシンラーニングを使った リプレイ

ラーニングリプレイ

©2019 Luminous Productions CO.,LTD. ラーニングリプレイの結果

©2019 Luminous Productions CO.,LTD. マシンラーニング の中身

©2019 Luminous Productions CO.,LTD. ニューラルネットワークです。

以下、NN

©2019 Luminous Productions CO.,LTD. マシンラーニングの中身

• 何を学ばせるか?

色々な システム プレイログ プレイログ 色々な システム システム

これを使います。

©2019 Luminous Productions CO.,LTD. プレイログの中身

ゲームの状態を保存した データ列 ・・・

フレーム番号 N-2 N-1 N N+1 N+2 N+3 この中にはパッド入力も含まれています。

時系列のデータ

©2019 Luminous Productions CO.,LTD. ゲームの実際の進行

・・・

N-1のパッド Nのパッド N+1のパッド N-1 の状態 N の状態 N+1 の状態

©2019 Luminous Productions CO.,LTD. 何を学習するか?

今回の目的はQA用途のリプレイなので。 NNの出力は、パッド入力であるべき。 ここは? ここは、パッド入力

©2019 Luminous Productions CO.,LTD. 何を学習するか?

・・・

N-1のパッド Nのパッド N+1のパッド N-1 の状態 N の状態 N+1 の状態 このゲームの状態を NNの入力に使います。

©2019 Luminous Productions CO.,LTD. 何を学習するか?

解釈を変える Nのパッド

Nのパッド N の状態 N+1 の状態 N の状態 NとN+1の差分

©2019 Luminous Productions CO.,LTD. 何を学習するか?

Nのゲーム状態と N+1への差分 パッド入力

©2019 Luminous Productions CO.,LTD. 学習データ の用意の仕方

FPSが60の場合、1秒に60個の学習データが作れます。 プレイログ 早回しをすればもっと作れます。

先ほどの動画は、約20万のデータを学習させたものです プレイにして1時間くらいの分量。

普段のプレイログは使わず、 学習用の専用のプレイセットを用意しています。

©2019 Luminous Productions CO.,LTD. 学習データを作成している様子

©2019 Luminous Productions CO.,LTD. リプレイは何を保存するのか?

・・・

学習済みNNが既にあるとして。

N-1 の状態 N の状態 N+1 の状態 これが、今回のリプレイで 保存&再生につかうデータです。

©2019 Luminous Productions CO.,LTD. リプレイをどう再生するのか?

フレームNを再生する場合

フレームNの パッド入力を求める 保存されたN+1 と、 の 状態 の状態の差分

©2019 Luminous Productions CO.,LTD. ニューラルネットワークの構成

• 入力 • 出力 – キャラの座標 – スティックの傾き (4個) – キャラの早さ – ボタンの押し具合 (8個) – カメラの向き など

©2019 Luminous Productions CO.,LTD. ニューラルネットワークの構成(一例)

• 3層で、ノード数は64の全結合。 • Dropoutは0.2 • 正則化はL2 (0.001) • 活性化関数は、ReLU • 入力データは事前に正規化。

©2019 Luminous Productions CO.,LTD. 参考1

横軸:実際の値 縦軸:予測値

©2019 Luminous Productions CO.,LTD. 参考2

横軸:予測値と実際の値との差分 縦軸:数

©2019 Luminous Productions CO.,LTD. 参考3

青が、実際のデータ オレンジが、予測値 弱い入力は改善の余地あり

©2019 Luminous Productions CO.,LTD. 参考3

青が、実際のデータ オレンジが、予測値

©2019 Luminous Productions CO.,LTD. エンジンとの連携

プレイログ プレイの巻き戻し

パッドリプレイ プレイログ ゲーム システム ラーニングリプレイ

全部、プレイログのシステム経由で行います。 ・ゲームの値を取得して、NNに渡す ・NN結果をゲームに反映する など。

©2019 Luminous Productions CO.,LTD. エンジンとの連携

プレイログ プレイの巻き戻し

パッドリプレイ プレイログ ゲーム システム ラーニングリプレイ

一般化させるため、 値の意味を知った上での学習は、 極力排除しています。

©2019 Luminous Productions CO.,LTD. 取り扱い注意な値

向き(角度) sin(θ)とcos(θ)

ビットフラグ 各ビットばらばらに

ハッシュ値 連番に

©2019 Luminous Productions CO.,LTD. 向き(角度)

• 0度と360度が同じ、とニューラルネットワークは、 理解してくれないっぽい。 – 剰余算はうまく、学習してくれない印象。 – 良い方法があるのかも知れませんが・・・ 教えて偉い人!

©2019 Luminous Productions CO.,LTD. ラーニングリプレイ再生時の工夫

• 「距離」を元に、最も近い近隣フレームに自動で補正

ここで言う「距離」とは、3Dの座標の距離のことではないです。 多次元ベクトル間の、距離のことです。 また、直値で比較するのではなく、 正規化された値で「距離」を計算しています。

この値、全体の距離です。

©2019 Luminous Productions CO.,LTD. 近隣フレームへの自動補正

©2019 Luminous Productions CO.,LTD. リプレイとの「距離」

• リプレイが、正しく再生されているか?の判定にも使えま す。

正常な再生 何かあったけど、復活した 失敗

距離のグラフ

©2019 Luminous Productions CO.,LTD. パッドリプレイへの切り替え

・・・

リプレイデータには、 パッド入力の情報も含まれていますので、 パッドリプレイ ラーニングリプレイ フレーム番号 N-2 N-1 N N+1 N+2 N+3 をシームレスに切り替えられます。

時系列のデータ

©2019 Luminous Productions CO.,LTD. パッドリプレイ ラーニングリプレイの切り替え

©2019 Luminous Productions CO.,LTD. ゲームの状況が変わった時の リプレイについて

©2019 Luminous Productions CO.,LTD. 環境変わったときのリプレイ

©2019 Luminous Productions CO.,LTD. 検出はできる。

©2019 Luminous Productions CO.,LTD. 自動テストのログを、確認

©2019 Luminous Productions CO.,LTD. 部分的に リプレイを取り直す。

©2019 Luminous Productions CO.,LTD. リプレイを、部分的に、撮り直す

©2019 Luminous Productions CO.,LTD. 日々の運用のイメージ

サーバーの自動テストの結果を確認。

自動プレイが、ずれているのを発見!

ずれている、一部のリプレイを撮り直す。 自動化したくない?

©2019 Luminous Productions CO.,LTD. マシンラーニングで リプレイを撮り直そう!

©2019 Luminous Productions CO.,LTD. 強化学習を 使います。

©2019 Luminous Productions CO.,LTD. 強化学習を使う上での、2つの目標

できるだけ、一般化を維持するため、

最終出力は、パッド入力 ゲームの内容に依存する処理は極力しない。

©2019 Luminous Productions CO.,LTD. 強化学習の結果

©2019 Luminous Productions CO.,LTD. 強化学習の中身

• Actor-Critic (DDPG)を使っています。 • 出力された値をそのまま、パッド入力として使ってい ます。 • 毎フレ評価しています。

©2019 Luminous Productions CO.,LTD. 強化学習のおおざっぱな説明 学習

ある状態(state)で、ある行動(action)をした時に、 どんな状態(next state)になって、 どんな報酬(reward)がもらえるか? を学習していく

学習後 ある状態(state)でどんな行動(action)を取るのが良いか? を教えてくれるようになる

©2019 Luminous Productions CO.,LTD. 強化学習の超おおざっぱな説明 AIは超適当に行動するから、 その結果が「良い」か「悪い」か教えてね。 良い行動ばっかり取るようになるよ!

良い結果になったら、 それまでの過程の行動も、良かったと覚えるよ!

これがポイント

©2019 Luminous Productions CO.,LTD. 強化学習で使うパラメータ

状態 ゲーム状態 (state)

行動 パッド入力 (action)

報酬 ? (reward)

©2019 Luminous Productions CO.,LTD. 報酬(reward)について

• まずは、ゴールを決める。

これがゴール

現実 理想の位置

©2019 Luminous Productions CO.,LTD. AIに見えている世界

これがゴール

理想

現実

©2019 Luminous Productions CO.,LTD. DDPGのモデルについて

• Actor – 4層。16ノード – 活性化関数は、LeakyReLU • ReLUだと、dying ReLUが多発したので。 – 出力層の活性化に、sigmoid • linearにしていたら、出力(パッド入力)が数百、数千にすぐに 行ってしまい、その後、値が張り付いて動かないこと多発。 • 試しにsigmoidにしたら、改善したので、そのまま利用。 – 出力が0-1になるので、これを-1 ~ 1に変換して利用して います。

©2019 Luminous Productions CO.,LTD. DDPGのモデルについて

• Critic – 4層。32ノード – 活性化関数は、LeakyReLU

©2019 Luminous Productions CO.,LTD. DDPGの構成

• 入力 • 出力 – キャラの座標 – スティックの傾き (4個) – キャラの早さ – ボタンの押し具合 (8個) – カメラの向き (連続値) – キャラの向き ラーニングリプレイと同じ

©2019 Luminous Productions CO.,LTD. 試行 1

• ゴールしたときにのみ報酬(reward)を与える

©2019 Luminous Productions CO.,LTD. 試行1の結果 • この後、しばらく続けても、1度もゴールに到達す ることはありませんでした。

途中経過を評価しないとダメ。

©2019 Luminous Productions CO.,LTD. 試行 2

• 「距離」を報酬に利用 • 近くなったら、プラス報酬(reward) 遠くなったら、マイナス報酬(reward) • 毎フレ、「距離」に応じて、少しずつマイナス評価

©2019 Luminous Productions CO.,LTD. 試行2の結果

• 序盤は良さげですが、最終的には、ひたすら壁に向かって歩き続けると言う 結果になりました。

他の事例を見るに、もっとうまくいきそう?? 一度、シンプルな例で検証

©2019 Luminous Productions CO.,LTD. 単純な移動で検証

• actionは、パッド入力ではなく、「上下左右の4方向移動のみ(離散値)」 • 4方向、固定量、必ず移動する(壁との衝突は取ります) • 速度、加速、アニメーションなどは無視 • DQNで学習。

©2019 Luminous Productions CO.,LTD. 単純な移動の検証を受けて 報酬(reward)は、そんなに間違ってなさそう。 単純な移動版を見るに、細かい動きが多い。

パッド入力は、細かい入力の切り替えだと、 移動方向が変わらない。

乱数を60フレームに 1回のみ更新するように。

©2019 Luminous Productions CO.,LTD. 試行3

• 乱数を60フレームに1回のみ更新。(モデルの実行は毎フレーム)

©2019 Luminous Productions CO.,LTD. 試行3の結果

• かなり改善。 • ゴールに到達できたので、一旦OKではありますが、壁に向かって移動してい る時間が⾧いです。 • 何回か試しましたが、うまくいくか、うまくいかないかは、ランダム。 • もっと複雑な例だと、厳しそう。

壁に当たった時に減点したい。

©2019 Luminous Productions CO.,LTD. 壁に当たったときに減点したい でも、一般化は維持したい。 直近の30フレーム分 現在 過去30フレームで、 一番近い状況(status)がどれか? を求める。 ・・・ 直近、5フレーム以外が 一番近い場合は、減点。

古 新

©2019 Luminous Productions CO.,LTD. 壁に当たったときに減点したい

壁にぶつかっていないとき

時間的に近い物は、 時間的に遠い物は、 距離的にも近い 距離的にも遠い

©2019 Luminous Productions CO.,LTD. 壁に当たったときに減点したい

壁にぶつかっているとき

時間的に近い物も 時間的に遠い物も 全部近い

©2019 Luminous Productions CO.,LTD. 壁に当たったときに減点したい

過去30フレームの状況(status)が同じ 同じって何? 壁にぶつかったり、立ち止まったり、 何か、無駄なことをしている。

減点対象

©2019 Luminous Productions CO.,LTD. 「同じ」ってどう判定する?

直近の30フレーム分 ただの、数字の配列。 「同じかどうか?」の閾値を何にすれば良い?

一般化されたデータで、 ・・・ その閾値を決めるのは危険。

どっちのデータの方が近いか? の比較なら、データに依存せず可能。

©2019 Luminous Productions CO.,LTD. 壁にぶつかっていないケース

壁にぶつかっていないけど、 減点対象になってしまうケース。

こういったケースも、 減点してしまって良いと判断。

©2019 Luminous Productions CO.,LTD. 試行 4

• 近い過去に同じ状況(status)があれば、減点

©2019 Luminous Productions CO.,LTD. 試行4 の結果

• 壁に向かって歩く時間が減って、最終結果は改善。 • 学習時間は延びました。 • でも、最適化前でも、20万ステップで、1時間くらいなので、OK。

©2019 Luminous Productions CO.,LTD. 参考

横軸:エピソード数(1エピソードはおよそ1000ステップ) 縦軸:エピソードの報酬(reward)

©2019 Luminous Productions CO.,LTD. 次に、リプレイを、 どう更新するか?

©2019 Luminous Productions CO.,LTD. リプレイの更新

• 学習した強化学習のモデル自体をリプレイでは利用しません。 • 利用するには、もっと学習を収束させないと使えないので。 • たまたまのラッキーでも、とにかくゴールに1度でも到達できれば、その プレイを記録すれば十分です。 • ただ、あまりに遠回りだと微妙なので、一度ゴールに到達しても、しばら くは、学習を継続しています。

©2019 Luminous Productions CO.,LTD. リプレイの更新

• ゴールにたどり着いたら、スコア(累計の報酬reward)を評価。 • 最高スコアを更新していたら、リプレイを更新。

©2019 Luminous Productions CO.,LTD. まとめ

©2019 Luminous Productions CO.,LTD. ラーニングリプレイ の良い点

• 出力は「パッド入力」なので、応用範囲が広いです。 • ある程度ずれてても補正されます。 • 一部だけ、撮り直すと言うことができます。 • 状況が変わっても、ある程度は自動で復旧できます。

©2019 Luminous Productions CO.,LTD. ラーニングリプレイ の課題

• リプレイが【だいたい】再現できている、という感じなので、厳密 な動作を要求する場合は、現状、難しいです。 – 細い綱渡りをする場面、とか。 – もっとたくさんデータを集めて、もっと適切なモデルで学習さ せれば、もっと良くなると思います。 – ある場面だけ、パッドリプレイに切り替える、のもOK • 学習させるデータにはコツが必要。 – AIトレーニングを担当する人が必要かも。

©2019 Luminous Productions CO.,LTD. QAの近未来はこうなる(かも)

QA AI トレーナー テストの内容を決める。 色々な、お手本プレイを再現できるよう、 お手本プレイを作る。 AI を学習させる人

自動プレイシステム

ゲームのジャンルを問わず、 共通化された仕組み。

©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像

ログホスト ログサーバー Web サーバー

開発機 スケジューラ

プレイログ

テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ

©2019 Luminous Productions CO.,LTD. Q&A

©2019 Luminous Productions CO.,LTD. http://www.luminous-productions.com/

©2019 Luminous Productions CO.,LTD. • Microsoft Teams はMicrosoft Corporationの商標または登録商標です。 • INFLUXDBはインフラックスデータ インクの商標または登録商標です。 • MAYAはオートデスク インコーポレイテッドの商標または登録商標です。 • その他掲載されている会社名、商品名は、各社の商標または登録商標です。

©2019 Luminous Productions CO.,LTD.