UE4の勉強記録

UE4の勉強の記録です。個人用です。

「Unreal Engine4.xを使用してRPGを作成する」の足りない部分を作成する。AIの勉強

<前文>

f:id:kazuhironagai77:20191215191711p:plain

ずっとデータサイエンスについての私見を述べていたので、一寸離れて軽い話題にしたいと思います。

といっても日本の将来についてです。

結構、日本の将来について悲観的な見方をする日本人が多くなっていると思いますが、私は日本と、中国、インドはアメリカと同等の国力を持つ国になって、アジアの時代が来ると思っています。

そんな事はない。特に日本に関してはそんな楽観的な事は起きないと思っている方に何故、私がそう思うのか説明します。

確かに現在、日本はほとんどの産業で国際競争力を失っています。

アメリカにいた時、大型テレビの売り場で、明らかに質が悪い映像を写しているテレビがあり、悪目立ちしてました。どの会社のテレビだろうと見に行ってみたら、日本の有名な会社のテレビでした。しかも値段も他の同じサイズのテレビの2倍近くしいて、それを見た時は、私も本当に日本は終わっていると思いました。

何でこんなテレビをわざわざ置いているのかと思ったら、韓国製のテレビが一番良さそうだと結論づけたアメリカ人が、「でもやっぱり日本製の方が...」と悩んでいる所でダメ押しするのに役立つからと言うちょっと国辱的な理由でした。

その時は、本当に日本は駄目になったな。と思いましたが、日本に帰ってきたら日本が駄目な理由がはっきり分かりました。

別に日本人が怠けているからじゃなかったんです。

努力の方向が間違っていたんです。

分かり易く説明するために英語学習を例にしますが、日本人は英語についてばっかし勉強しています。しかし今、必要なスキルは英語で勉強する能力なんです。よく経営者の方が「日本は、発展途上国と違って、日本語で何でも勉強出来て、英語を覚える必要がない。」と言っていますが、そんな時代はとっくに終わっています。

なのに、未だにその迷信を信じ切って、盲目的に間違った方向に努力しているんです。しかも成果が出ないせいか、途轍もないほどの努力をしてます。もし日本人が英語についての勉強の十分の一の努力でも、英語で勉強する事に費やしたら、劇的な成果を発揮出来ますよ。

と言うわけで、私は日本の将来に対してかなり楽観的に見ています。

どうですか? 

私でもカリスマデータ科学者になれそうでしょう。

さて、今週の勉強を始めます。

<本文>

今週は、PRGの方は一寸だけお休みしてAIについて勉強します。

まず、先週買ったAIの教科書、Artificial Intelligence: A Modern Approach とArtificial Intelligence for Gameをサラッと読んでまとめます。

うーん。買ってしまいました。まだ読んでいない本が5冊以上あるのに更に2冊も増えてしまいました。ここは読むしかないですね。

Artificial Intelligence: A Modern Approach の勉強には、バークレー校のAIの講義も参考にします。

そしてHTF do I? Basic AI From Scratch #1 in Unreal Engine 4は流石にもう十分ですのでやり直しませんがその続きの#2を勉強します。さらに前回出来なかったUnreal Engine 4 Tutorial – AIを勉強します。

Artificial Intelligence: A Modern Approachバークレー校のAIの講義

f:id:kazuhironagai77:20191215191834p:plain

本を読む事が三度の飯より大好きな私は、内容がある本ならどんな分厚い本でも読書が苦痛になる事はないです。ただし今回は時間との勝負ですので、好きなように読んでいる訳にはいきません。ので課題をはっきりさせて読書します。

私がこの本から知りたい事は、以下の事です。

  • 機械学習や深層学習以外のAIについて
  • ゲームにおけるAIとは
  • AIそのものの定義
  • AIの歴史
  • AIは機械学習と信じ切っている人にAIはそれ以外もあると説得出来るようになるための知識

今回はこれらに対する答えが書いてある箇所を重点的に読んでそれ以外は無視します。

Artificial Intelligence: A Modern Approachの目次を見ます。

全部で27章ありますね。バークレー校の講義が25章なのと被りますね。

以下に簡単に訳したのと対応しそうな講義を並べてみました。

f:id:kazuhironagai77:20191215191900p:plain

分からないながら講義も対比しそうな所に適当に並べてみたのですが、Lectureの18が二つあったりして、結構いい加減ですね。それでもAIにおけるキーワード的な言葉が幾つか分かりました。Agents、search、Adversarial Search、CSP、Bayes、Markov Models、Reinforcement Learningなどです。

1.紹介(Introduction)

まず、AIの目的とは何なのか?と言う疑問に対する答えですが、人工的に知性を作成する事だそうです。ただしこの知性に対しての定義が人間らしくと合理的であるの2つと、考えると行動するの2つがあり計4つの基準があるそうです。

更に、AIの歴史についての簡単な説明もありましたが、あんまり心に残らなかったです。要するに、人間を人工的に作ろうとしたんだけど出来なかった。と思いました。それで残った合理的であるの方を頑張ったみたいと思いました。で最後まで読んだら、Summaryがあって章の内容を箇条書きにまとめてありました。今回はこれだけ読んでいこうと思います。

2.インテリジェントエージェント(intelligent Agents)

Agentとは、環境を知覚してそれに対して行動するモノを指します。その行動に対する評価をPerformance Measurementと言います。Rational Agentは利益を最大化するためのAgentです。Agentが行動するために知覚する環境内の要素の事をTask Environmentと言います。Task Envrionmentは多次元です。Agent Functionを実装することをAgent Programと言います。Simple Reflex Agentは知覚に対して直接的に反応します。Model-Based Reflex Agentは内部にあるモデルを元に知覚に対して反応します。Goal-based agentはゴールを目指します。Utility-based agentは幸せを最大化するように行動します。

うん。結構Summaryだけ読んでも理解出来ますね。しかしそこは本好きな私。やっぱり読みたい。一回だけ読みます。

読みました。ジカバチとタクシーの例が面白かったですが、知見としてはサマリーを読んだのとあまり変わらないですね。Utility-based agentのハイレベルなモデルを見ても既に、UE4のAIよりもかなり複雑に思えます。Utility-based agentのようなモデルもUE4のAIで作成出来るのでしょうか?

所で、ジカバチの例で思ったのですが、自動運転で事故が起きても、保険で完全にカバー出来、かつ全体の事故の割合が今までより少なくなる。なら有じゃないかと思いました。そしてそう言う前提ならば結構実現出来そうですね。

Agentとは何かさえ理解出来れば取りあえずは勉強したと言っていいでしょう。次に行きます。

3.探索による問題の解決 (Solving Problems by Searching)

まず、サマリーの内容を以下に示します。それからどうするか考えます。

この章では、agentがdeterministic、observable、staticそしてcompletely knownな環境でactionを選択するために使用する手段を紹介します。Agentはそのゴールを達成するために一連のアクションを構築します。これをSearchと呼びます。

  • Agentが解答を探す前に、goalを明らかにし、丁寧に定義された問題が定式化される必要があります。
  • 問題は5つの要素から構成されます。:初期状態、Actionのセット、これらのActionの結果を描いた転移状態のモデル、goal test関数、そしてpath cost関数。問題の環境はState Spaceによって表されます。初期状態からゴール状態へのpathをsolutionと呼びます。
  • Searchアルゴリズムは状態とゴールをatomicとして扱います。
  • 一般的なTree-Searchアルゴリズムは解答を見つけるのに全ての可能な道を考慮します。Graph-Searchアルゴリズムは使われていない道は考慮しません。
  • SearchアルゴリズムはCompleteness、optimality、time complexityそしてspace complexityに基づいて評価されます。複雑さは、State spaceの枝要素であるbと最も浅い解答の深さであるdに依存しています。

流石に一寸分からなくなって来ました。deterministic、observable、staticそしてcompletely knownの違いが分かりませんね。調べます。

  • Deterministic: 次の環境の状態が現在の状態とagentのactionの実行によって完全に決定される。
  • Observable(Fully Observable):  agentのセンサーが時間内のそれぞれのポイントで環境の全ての状態にアクセス出来るならTaskの環境はFully Observableと言える。
  • Static: もしagentが考えている間に環境が変化するならば、その環境はdynamicsしないならstaticと言う。
  • Completely Known:  定義見つからない。

Completely Knownが分かりませんが、agentが環境の全ての要素にアクセス出来て、次の環境の状態は現在の環境の状態とagentのactionにしか影響されず、更にagentが考えている間に環境が変化しない条件ならばと言う事みたいですね。

この条件ならばagentはSearchと言う方法で最適な答えを導けるみたいですね。しかしSearchを実行するにもまだ条件があり、それがゴールの設定と問題の定式化と言う事でしょうね。

問題の定式化には、問題を初期状態、Actionのセット、これらのActionの結果を描いた転移状態のモデル、goal test関数、そしてpath cost関数の5つの要素で表す必要があります。

問題の環境はState Spaceによって表されます。このState Spaceの意味が分かりませんね。調べます。

State Spaceとは、初期状態、actionそして遷移状態がそれとなく定義するものです。初期状態から如何なる一連のactionによって到達できる全ての状態のセットを指します。

何となくは分かりました。

Atomicは一個のそれ以上分解できない塊として扱う事でしょう。これは分かります。

Tree SearchとGraph Searchはアルゴリズムのクラスで勉強した気がします。どっちが最適な経路を見つけるのが速いとかだったけ?

最後のSearchアルゴリズムの評価方法であるCompleteness、optimality、time complexityそしてspace complexityのそれぞれの定義が分かりませんね。調べます。

  • Completeness:  このアルゴリズムはもし解答があるならその解答を見つける事を保証するか?
  • Optimality: この戦略は最適な解答(教科書の68ページで定義している)を見つけられるのか?
  • time complexity: その解答を見つけるのにどの位の時間がかかるか?
  • space complexity:  そのSearchを行うために必要なメモリーはどのくらいか?

ありました。教科書にしっかり説明されていました。

ちょっと思っているのですが、これがゲームのAIじゃないんでしょうか?

何か条件のagentが環境の全ての要素にアクセス出来て、次の環境の状態は現在の環境の状態とagentのactionにしか影響されず、更にagentが考えている間に環境が変化しない。って結構当てはまるような気がします。

うーん。やっぱりこの章も一回だけ全部読みます。

途中まで読んでギブアップです。とてもじゃないが、片手間に読める内容ではありません。

一端中止してUE4のAIについて先に勉強します。

UE4とAI>

HTF do I? Basic AI #2 in Unreal Engine 4を勉強します。

今回はこれを作成するそうです。

f:id:kazuhironagai77:20191215192332p:plain

見ただけでも結構意味が分かるようになりました。まずsequenceに来てFindPlayerServiceとSeviceCanSeePlayerでBlackBoardに作成した変数に値をアサイン(assign)します。その後、Can See Player?でその変数の値が適切かどうかを判断して適切ならばFindExit、MoveTo、そしてWaitを実行します。その後Waitを実行します。

この場合、FindPlayerServiceでアサイン(assign)したPlayerKeyはどうなるのでしょうかね。何処にもチェックしてないですね。

まあ、やって行くうちに分かるでしょう。

今回は、出口を4つの角に作成して、それをNPCが追いかけるようなAIを作成するみたいですね。このNPC、プレイヤーのコントロールするキャラクターが見える時だけ、その出口を追いかけるそうです。

いきなり、上記のAIが完成している前提で話が進むので急いで作成しました。

f:id:kazuhironagai77:20191215192400p:plain

FindExitタスクは元から存在していないタスクなので

f:id:kazuhironagai77:20191215192420p:plain

から作成しました。ServiceCanSeePlayerは

f:id:kazuhironagai77:20191215192440p:plain

から作成しました。どちらも中身は空です。

ServiceCanSeePlayerの中身を以下のように作成しました。

f:id:kazuhironagai77:20191215192500p:plain

ナレーションを聞くと、これを作成している前提で話しています。ひょっとすると今回のチュートリアルは、作成するのが目的でなく、UE4のAIにはこんな機能もありますと説明するのが目的なのかもしれません。

まあ、出来るところまではやってみましょう。

次にBlackboardが少しだけ映りました。以下に示す変数が既に作成されていました。

f:id:kazuhironagai77:20191215192532p:plain

のでAI-BB に追加しました。CanSeePlayerはBooleanと説明されたのでそのように作成しましたが、Exitが何なのか分かりません。Object Keyである事はイメージから分かるので、base classにはActorを選択しておきました。

更に、Behavior Treeに戻って、ServiceCanSeePlayerを選択して以下に示すようにBlackboardの変数とCanSeePlayerの値をアサイン(assign)しました。

f:id:kazuhironagai77:20191215192550p:plain

次にDecoratorであるCan See Player?内のコードを表示して説明しているのでその部分を作成します。

と思ったらDecoratorが開けません。どうもこのDecoratorも以下の所をクリックして作成しないといけないみたいです。

f:id:kazuhironagai77:20191215192606p:plain

しました。

f:id:kazuhironagai77:20191215192624p:plain

作りました。更に、Behavior Treeに戻って、Can See Player?を選択して以下に示すようにBlackboardの変数とCanSeePlayerの値をアサイン(assign)しました。

f:id:kazuhironagai77:20191215192642p:plain

H-AICharacter内のコードを以下のように示しているんですけど。

f:id:kazuhironagai77:20191215192702p:plain

AI-ExitPointと言うActorを既に作成してますね。作るしかないですね。

f:id:kazuhironagai77:20191215192720p:plain

作りました。四隅に配置します。

f:id:kazuhironagai77:20191215192740p:plain

そしてFindExit内に以下のコードを作成します。

f:id:kazuhironagai77:20191215192758p:plain

更に、Behavior Treeに戻って、FindExitを選択して以下に示すようにEnd Point Keyの変数とExitの値をアサイン(assign)しました。

f:id:kazuhironagai77:20191215192819p:plain

これで動くはずなので試してみます。

動きました。

f:id:kazuhironagai77:20191215192837p:plain

今度はチュートリアルの通りに以下のようにBehavior Tree内のコードを変えました。

f:id:kazuhironagai77:20191215192855p:plain

更に、レベル内の遮蔽物も変更しました。

f:id:kazuhironagai77:20191215192913p:plain

一応、予測通りの行動をAIはしていますが、これの何か大切なんでしょうか?良く分かりません。

分かりました。

f:id:kazuhironagai77:20191215192932p:plain

f:id:kazuhironagai77:20191215192949p:plain

がSelfの時とNoneの時の違いを説明しているのでした。

Selfの時は、

f:id:kazuhironagai77:20191215193007p:plain

Playerのコントロールするキャラクターが見えなくなると直ぐにRootに戻って止まります。

それに反して、Noneにセットした場合は、Can’t See Playerを実行してから止まります。

f:id:kazuhironagai77:20191215193027p:plain

これを説明したかったようです。

でも何でそうなるのでしょうかね。

この後、チュートリアルは作者が作成したTaskを使用してAIがプレイヤーがコントロールするキャラクターを常に見ているようにするのですが、

f:id:kazuhironagai77:20191215193046p:plain

Task内のコードが良く見えないとUE4のAI的に特別に新しい事をしているのではないのでここで終了します。

Unreal Engine 4 Tutorial – AIは来週、勉強します。

Artificial Intelligence: A Modern Approachバークレー校のAIの講義 Part2

一端、読書は中止して来週までにどうするか考えます。

Millington, Ian. AI for Games, Third Edition

こっちの本も一応概要だけは把握しておきます。

第1章だけ、パラパラと読みました。

一言で言えば、こっちの本の方がかなり読みやすいです。まず内容が整理されています。一章だけで、

  • ゲームのAIは、アカデミックなAIとは別に発展。アカデミックなAIはArtificial Intelligence: A Modern Approachに良く書かれているのでそっちを参照してと書かれていた。
  • 単なるアルゴリズムも昔はAIの一種と考えられていた。
  • ゲームのAIの歴史でどのゲームがどんなAIを最初に搭載したのかを簡単に説明してある。例えばメタルギアソリッドのAIは…のように。

などなど、非常に分かり易いです。

こっちも読んでおかないといけないですね。

<まとめと感想

今週はAIの週と言う事で、RPGの作成は一端お休みして、Artificial Intelligence: A Modern ApproachとAI for Gamesの2冊の本を読む事にしました。

と言ってもたった一日では概要を把握するので精一杯でした。

UE4について何もやらないのもあれなので、UE4のAIのチュートリアルも一個だけ行いました。

Artificial Intelligence: A Modern Approachは内容多すぎて一日じゃ把握出来ません。丸一日この本のせいで潰れました。

一個だけ分かった事があります。

前回、UE4のAIって単なるIF節じゃねえ?と書きましたが、AIでは、単なるアルゴリズムもAIの一分野に入っていて、つまり実際のコードを実装する時には結果的にif節やswitch節にならざるえないみたいと言う事です。

つまり、機械学習や深層学習を勉強している人がUE4のAIを見て「何これ?これがAI?ばっかじゃねぇ!」と言われる事はないとは言えると思います。

これが知りたかったです。はい。