CoderDojo名古屋 子供のための無料プログラミング道場

CoderDojo名古屋

CoderDojo名古屋 子供向けの無料プログラミング教室

【第39回例会終了報告】特別講演 中京大学加納教授「ゲームで使われる人工知能」

日時:2017年6月25日(日)13:30~16:00
場所:あいちNPO交流プラザ 会議コーナー2・3

参加 : 17名
メンター&サポーター :中京大学 加納教授、宇津、田中さん、石川さん、玉井さん、ちびっこメンターS君、山岡さん、田口さん、岩田さん


今回は、スペシャルゲストとして、中京大学の加納教授に来ていただき、みんなに小さな授業をしてくれました。
テーマは「ゲームで使われる人工知能
f:id:CoderDojoNagoya:20170717101103j:plain f:id:CoderDojoNagoya:20170717104255j:plain f:id:CoderDojoNagoya:20170717102746j:plain


簡単なお話から最新の人工知能のとても高度な内容まで、分かりやすくとても楽しくお話してくれて素晴らしい授業でしたね。
もっとたくさんの人に聞いてもらいたいぐらいですが、今回は内容を簡単にかいつまんで紹介しますね。


ゲームでは敵がプレーヤーのキャラクターを倒そうと自動的に動きます。
それは敵の動きがプログラムされているためそのように動くのですが、加納先生は、みんなが大好きな横スクロールアクションゲームを例に、自分のキャラクターに知能があるようにプログラムするとどんなことができるのか紹介してくれました。
※イメージがわきやすいよう似たような感じのyoutube動画をリンクします。

Infinite Mario AI - Long Level by Robin Baumgarten



どう実現するか、のひとつとして「ルールベースシステム」を紹介してくれました。
f:id:CoderDojoNagoya:20170717104821j:plain 「もし○○なら××である」というルールで知識を表現する方法。
このルールをたくさん作ればかしこくなれる!
例として、お医者さん。
高熱で、頭痛があり、だるければ、インフルエンザ。
首が痛い、頭痛、だるい、ならば、扁桃炎。
頭痛、嘔吐、ならば、胃腸風邪。
などなど。


これを先ほどのゲームに利用すると、
主人公の1マス右に敵がいれば左に動く。
主人公の2マス右に敵がいればジャンプする。
主人公の1マス右が崖ならば、ジャンプする。
というルールが作れます。
f:id:CoderDojoNagoya:20170717111600j:plain


こんな簡単なルールをいくつか組み合わせただけで
うまくゲームをクリアするプログラムを紹介してくれました。
また、Scratchでも同じようなことをできることを見せてくれました。
僕たちが操作するよりもずっとうまく動いていて驚きましたね。




でも、これではプログラムを作る人が頭が良くないと、
キャラクターもかしこく動いてくれませんね。
先生は次に、どうやったら自動的にかしこく動くようにできるか、
その方法を紹介してくれました。


その一つが「遺伝的(いでんてき)アルゴリズム」。
生き物の進化(しんか)をまねして作る方法です。

f:id:CoderDojoNagoya:20170809003905j:plain
生きものの進化と生物多様性 -種の多様性・遺伝子の多様性 -生物多様性 - 環境省

多くの生き物は人間も含めてお父さんお母さんから生まれます。
そのとき、お父さんとお母さんに少しずつ似た子どもが生まれますね。
それは、お父さんとお母さんの特徴を遺伝子(いでんし)というものを使って
半分ずつもらって生まれてくるからです。
これをプログラムに応用します。


例えば、
f:id:CoderDojoNagoya:20170717122517j:plain
ランダムに戦い方の特徴を決めた「勇者」を複数作ります。
それぞれの「勇者」が「敵」と戦います。
そして、「敵」に勝った「勇者」だけが生き残ります。
生き残った「勇者」を二人づつ組み合わせて親とし、その特徴を半分ずつもらった子供を作ります。
その子供「勇者」たちが「敵」と戦います。
戦いに勝った「勇者」がまた子供を作り、、、と繰り返していくと
とても強い「勇者」が作れる、というわけです。



先生は、「勇者」のかわりに、迷路をクリアする車のプログラムを紹介してくれました。
Scratchのプログラムが公開されているのでぜひ試してみてください。

Car with a genetic algorithm https://scratch.mit.edu/projects/79331554/ by TheMinerMan44

f:id:CoderDojoNagoya:20170717123445j:plain

ランダムにいろいろな走り方をする車をたくさん用意します。
このうち、壁にぶつからずにできるだけゴール近くまで走った優秀な車を残します。
その優秀な車の走り方を組み合わせて、その走り方を受け継ぐ子供を作ります。
その子供の車を走らせ、優秀な車を残します。
これを次の世代と繰り返していくと、だんだん遠くまで走れる車が生まれてきます。
そして、最後にはゴールまでたどり着くことができる車が誕生します。



次に先生は、生き物が進化していく仕組みが最新の研究でどのように生かされているかというのを紹介してくれました。
名古屋大学のヨアキムチャック(Michał Joachimczak)先生の研究です。

Harnessing evolutionary creativity: evolving soft-bodied animats in simulated physical environments by Michał Joachimczak, Rishemjit Kaur, Reiji Suzuki, Takaya Arita, Graduate School of Information Science, Nagoya University

f:id:CoderDojoNagoya:20170717143249j:plain
たくさんの細胞のようなものがつながり、それぞれが筋肉のように伸び縮みします。
この細胞のようなものの動きを進化させるとあたかも動物が足や尾を使うかのように移動します。
水の中のような環境で進化させると、どうでしょう。
まるで魚のような動き方をします。
ところでオタマジャクシは成長するとカエルになります。
先ほどの水の中のような環境で進化した生き物を陸のような環境で体の形を変えられるよう進化させるとどうでしょう。
なんと、足のようなものが生えて歩けるようになりました!
では、豚やクリオネの絵を描き、その形に先ほどの細胞を埋めて陸や水の中で進化させたらどうなるでしょう。
それぞれ、歩いたり泳いだりするようになるのですが、本当の豚の筋肉のような部分が進化して動くようになっていることがわかります。
クリオネも同様でした。
是非、リンク先の動画を見てみてください。



さて、ここからは脳のお話です。
f:id:CoderDojoNagoya:20170718094436j:plain 人間は、46億年前の地球が誕生してから、進化するにつれていろいろな物事を伝える方法を手に入れてきました。

先生は大きく次の3つを教えてくれました。

種類 説明
遺伝子 お父さんお母さんから体の特徴を受け継ぐ
自分で体験したことを学んで考える
言葉 体験していないことでもあたかも体験したかのように知ることができる

人間は言葉を手に入れたことで地球の歴史の46億年のうちたったの5,000年で急速に進化を遂げたと考えられるかもしれません。
遺伝子の進化だけではちょっと時間がかかりそうですね。
先ほどは遺伝子の仕組みをまねた人工知能でしたが、こんどは脳の仕組みをまねたらどんなことができるのか紹介してくれました。



次の例は脳の仕組みをまねたプログラムでアニメのキャラクターを見分けるものです。

「ディープラーニングでおそ松さんの六つ子は見分けられるのか 〜実施編〜」bohemia日記 by ぼへみあ (id:bohemian916) 氏

f:id:CoderDojoNagoya:20170718103007p:plain それぞれのキャラクターは少しずつ顔の特徴が違うのですがプログラムにそれを学習させると違った場面でもだれがだれだか見分けられるのだそうです。
なかなか人間が見ても難しいですよね。



先生が最後に紹介してくれた研究は、穴の開いた写真をコンピューターが自動的に予想して穴があるところを描いてくれるプログラムです。

ディープネットワークによるシーンの大域的かつ局所的な整合性を考慮した画像補完 by 飯塚里志、シモセラ エドガー、石川博

たとえば、もとの画像がこちら。
f:id:CoderDojoNagoya:20170731191140j:plain
それをこのように画像に白く穴を空けたところを
f:id:CoderDojoNagoya:20170731190800j:plain
こんな風にコンピューターが学習した知識で穴を埋めてくれます。
f:id:CoderDojoNagoya:20170731190904j:plain
すごいですね。まるでこれがもともとの写真だったみたいです。

ほかには、柵の向こうに人がいる写真。 f:id:CoderDojoNagoya:20170731191911p:plain
人の部分を白く消すと、
f:id:CoderDojoNagoya:20170731192038p:plain
コンピューターが考えて、自然な感じで穴を埋めてくれます。
f:id:CoderDojoNagoya:20170731192457p:plain
まるで、初めから人はいなかったみたいですよね!すごい研究です。
詳しくは、上のリンクから論文の紹介ページに飛べます。その中に動画がありますのでぜひ見てみてください。


加納先生は、「皆さんもぜひプログラムを勉強して、こんな研究をしてみてください」と締めくくられました。

とても面白い研究をたくさん紹介してくれましたね。お話もとても分かりやすく説明してもらえたんじゃないかと思います。ゲームを作ったりすること以外にもプログラムでこんなことができるんだ、という気づきのきっかけになったらいいですね。是非、みなさんもたくさん勉強して面白いプログラムを作ってみてくださいね。


加納先生、素晴らしい授業をありがとうございました!!

今回は、長くなりましたので、みんなの活動の様子はお休みです。すいません(^_^;


恒例の集合写真
f:id:CoderDojoNagoya:20170731194522j:plain
また、Dojoで会いましょう!


記:宇津 義一