マインド・エンジンの全貌　～第１回～

# ごあいさつ的な何か

　はじめまして（はじめてじゃない人も）、stk2k（首藤／しゅとう）と申します。1年前までWeb関連のサイト構築などを個人でやっていた者でして、Qiitaの方にもPHP関連の（くだらない）記事をいくつか投稿させていただいておりました。
　半年ほど前ご縁があり、[株式会社ロボマインド](https://robomind.co.jp "株式会社ロボマインド")でお仕事をさせていただくことになり、今に至ります。そもそもプログラマーになったのも、元々はAI技術者になりたかったというのがありましたので、代表の田方氏にはとても感謝しております。この場を借りまして御礼申し上げます。
　ロボマインド・プロジェクトでは「AIに意識を・・・」合言葉のもとYouTube動画投稿をしており、これまで200本以上のAIに関する話題、考え方などをロボマインド社長である田方 篤志氏が **松岡修造氏ばりに大変熱く** 語っておられます（褒めてます！）。AIとは何か、今すでに解決されている問題とまだ解決されていない問題、さらにはちょっぴりスピリチュアルな話題まで、広大なテーマについて大変分かりやすく解説されていますので、もし興味のある方[こちら](https://www.youtube.com/c/ROBOmindProject)からどうぞ。

　こちらの記事ではQiitaということで、主に技術的な内容（プログラム、構成や設計思想など）に絞って皆さんにお伝えしていこうかと思っておりますのでよろしくお願いします。もちろん、ロボマインド・プロジェクト公認です。

# マインド・エンジンとは

　マインド・エンジンは、[株式会社ロボマインド](https://robomind.co.jp "株式会社ロボマインド")が開発しているAIプログラムで、人類初（？）の「**意識をもつAI**」を目指しています。実装については主にC#言語を使用しており、プレゼンテーションレイヤーとして**ゲームエンジン**として有名な[Unity](https://unity.com/ja)を採用しています。

# 記事の対象

　本ロボマインド・プロジェクト投稿記事の対象者は、「AIやAIプログラミングに興味がある」人を対象とします。ただし、DL（ティープ・ラーニング）だけに関する記事はあまり投稿されないと思います。DLの良記事はすでにQiitaに山ほどありますから。気が変わったら書くかもしれません。どっちだ。

# こういうことを書くよ！

- 技術的基盤に関すること（プログラミング言語、ミドルウェアなど）
- システム設計に関すること（モジュール分割、クラス設計、デザインパターンなど）
- AIに関すること（用語、思考実験、心理学・医学的知識など）
- YouTubeで公開された動画の解説、こぼれ話など
- マインド・エンジンの更新内容
- その他もろもろ

# 今回のテーマ：　【マインド・エンジン23】ＡＩ技術者が、見て見ぬふりをしてるものとは

　今回のテーマとなる動画は、[こちら](https://www.youtube.com/watch?v=JkvmiQh0i4g&t=2s)にて公開中です。

<iframe width="460" height="400" src="https://www.youtube.com/embed/JkvmiQh0i4g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### 【ポイント】
- 物体を認識したからといって、その物体の状態や挙動の意味を理解できたわけではない
- 「見える」とか「ある」を感じるのは、意識があるから
- 今回のマインドエンジンでは、物体を認識した後、それらを「オブジェクト」として生成する
- 生成されたオブジェクトを専用スクリプト言語上で扱う
- 名詞概念と動詞概念の違い
- 今回のマインドエンジンでは、動詞の意味理解が可能になった

# ここから本題

## 物体認識技術

　動画でも触れられていますが、画像や動画からオブジェクト（この場合のオブジェクトは文字通り「物体」）を切り出すことは**物体認識**と呼ばれます。HoloLensもそうですが、よくあるのはカメラによる**顔認証**や**フェイストラッキング**、**自動運転システム**などでしょう。監視カメラを使った**人物検出**なども物体認識技術の応用ですね。

　動画では、田方さんが「物体を認識しても、意味を理解したわけじゃない」と言っていますね。

　これは、

　「物体を**識別**することと、物体を**分類**したり**使用**することは同義ではない」

　ということを意味しています。

　もちろん、扇風機を見て「これは扇風機だ」と識別した後で「扇風機はスイッチを持つ」という情報を付加すればロボットはボタンを押して扇風機のスイッチを入れることができるかもしれません。
　しかし、それでもこのロボットは「僕は扇風機のスイッチをONにした」とは思っていないかもしれません。それは、「扇風機とは何か」「スイッチとは何か」「スイッチを入れるとは何か」をロボットが**理解**していないからです。

　動画でも、「お皿を洗っている動画を大量に見て学習したAIに『お皿を洗って』と言ってもたぶん洗ってくれない」と言っています。物体を認識しただけでは「洗う」の意味を理解していないからです。

　今回公開されたマインドエンジンは物体認識そのものの機能は搭載していませんが、物体を認識した後の処理、すなわち「内部的にオブジェクトを認識し、インスタンス化する」という部分は実装しています。
　図にしますと、

```mermaid
graph LR
    A["物体認識"] --> B["名詞（クラス）の判別"] --> C["インスタンス化"]
```

 このようになります。

## 名詞（**要素**）とは

　名詞とは、「鶏（にわとり）」「蛙」「犬」など、**モノ**に名前をつけたことば、ということになります。物体認識の結果、例えば動画のように「皿を洗っているシーン」を見たのであれば、「皿」「手」「スポンジ」「水」といった「モノ」を認識することになります。

## インスタンス化するとは

　インスタンス化とは、特定のメモリに「モノ」の状態を記録するための領域を確保することを指します。C#やJavaなどのようなクラスベースのオブジェクト指向言語ではクラスを**new**することで確保します。

　マインドエンジンは内部に **VM(Virtual Machine)** を搭載しており、専用のスクリプト言語を使うことができますが、C#やJava言語などと同様に**new**することでクラスのインスタンスを作成できます。作成されたオブジェクトは「**サンドボックス**」と呼ばれるメモリ領域で管理されます。
（**仮想世界**が抱えているVMのサンドボックスは特に「**ワーキングメモリ**」と呼ばれ、特殊な扱いとなります）

![cc01c0355224fc78b70412c1c9692aee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17003/ac12be53-65df-d938-40f3-d8c654dc8c68.png)
図１：マインドエンジン画面構成（緑枠内が **ワーキングメモリ** ）

以下のスクリプトを仮想世界VMで実行すると、マインドエンジンのワーキングメモリに「お皿」「手」「スポンジ」「水」「人間」オブジェクトを生成します。

```cpp
Let plate = new DailyLife.Plate();
Let hand = new HumanParts.Hand();
Let sponge = new DailyLife.Sponge();
Let water = new DailyLife.Water();
Let person = new DailyLife.Person();
```

「Let」は代入文であることを表し、「new」はそれに続くクラスをインスタンス化して返します。つまり、１行目では「DailyLife.Plateというクラスのインスタンスを作成し、その参照を"plate"という変数に代入する」という意味となります。
オブジェクトは生成しただけでは意味がなく、プロパティに値を代入したり、メソッドを呼び出すことで機能します。そのため、**new** した際にその参照を変数に保持する必要があるのです。

「動詞概念の認識」フェーズでも説明しますが、動詞の認識の前にまずその場面で必要な**モノ**を認識して、インスタンス化しておく必要があります。「洗う」という動詞は「誰が洗うのか」「何を洗うのか」「何を使って洗うのか」が重要だからです。「人間（**主体**）が、スポンジ（**道具**）を使ってお皿（**対象**）を洗う」、といった具合です。

## 仮想世界とは

　仮想世界とは、マインド・エンジンの中核をなす考え方の１つです。それは、「意識は現実を直接認識せず、**仮想世界**という脳が作り上げた仮想空間を介して認識する」というものです。詳しくはロボマインドの[YouTubeチャンネル](https://www.youtube.com/channel/UCF7k8BrfIwPSennLMByxyuQ)または書籍『[普通に会話ができる ドラえもんの心のつくり方１](https://www.amazon.co.jp/dp/B08R3JZZ7W/)』をご参照ください。

## 動詞（**演算子**）とは

　マインド・エンジンでは複数のオブジェクト（**要素**）間の相互作用（**演算子**）を「動詞」としてとらえます（下図）。分かりやすく言うと「**メソッド**」です。オブジェクトに定義されている「メソッド」を実行すると、そのオブジェクトまたは引数で渡されたオブジェクトの内部状態が変化します。これが「動詞の実行」です。

![ec02bf52a185f4f767423c5824f95196.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17003/f02907ed-0ecf-dc52-c377-16fee3ae2508.png)

 次回は「名詞」「動詞」がマインド・エンジンでどのように定義されているか、またそのデータベースを管理するツールについて解説します。

## 最後に

　株式会社ロボマインドではこれまでにないAI、『マインド・エンジン』の制作に一緒に携わっていただける開発者の方を募集しています。下記に興味または実績がある方はふるってご応募ください。お待ちしています！

- ディープラーニングの知識または技術をお持ちの方
- ディープラーニングに詳しくなくても、AIの開発に興味のある方
- 自然言語処理の知識または技術をお持ちの方
- AI技術の応用（メタバースやロボット等）に関心のある方
- C#、Java等オブジェクト指向プログラミングの経験のある方

 ご応募は会社の[採用応募フォーム](https://robomind.co.jp/saiyoujouhou/)または私の[Twitter](https://twitter.com/stk2k)までDMをお願いします。

### 次の記事

https://qiita.com/stk2k/items/009025eb58647c18cf7d