皆んなでやろう。 汎用人工知能 “General AI Challenge” のススメ

# 汎用人工知能!

降って湧いたようなここ数年のAIブームですが、このブームに当初から違和感を感じていた方も多いと思います。

確かにディープラーニングなど劇的なスピードで進化を遂げているのですが、現状ではある限定された状況での最適化問題に過ぎないものも多いです。ただのマシンラーニングと言うべきものまでが最近はAIと呼ばれていて、ぱっと見ではもはや区別がつかない状況です。

さて、そんな中で[Good AI](https://www.goodai.com)というスタートアップがMicrosoftとＮVidiaの協賛を得て [“General AI Challenge”](https://www.general-ai-challenge.org) を開催しています。これはまさにたった一つのプログラムでいろいろなタスクを学習する、汎用的なAIを開発するコンテストです。__賞金総額500万ドル(約５億円）__です。

そう聞くと難しそうに感じますが、とりあえずウォームアップラウンドでのタスクの内容はそこまで難しくはないです。そして何だかあまり盛り上がっていないように見えて、狙い目です。さらに参加者にはMicrosoft Azureのインスタンス利用権まで無料でついてきます。_（松本さん、今がチャンス！）_

コミュ障な僕でも、このポストをきっかけに一緒にチームを組んで参加してくれる人が出てこないかな、という淡い下心での投稿です。


# General AI Challenge

日本では[株式会社アラヤ](http://www.araya.org)の金井先生と[ドワンゴ人工知能研究所](http://ailab.dwango.co.jp)が音頭をとって進めています。僕は最初に行われた説明会には参加できなかったため、後からキャッチアップした内容をここにまとめました。なんというか、General AI Challengeのウェブサイトは分かりにくいのです。あまり盛り上がってないのもこれが原因ではないかと思っていたりします。

<div align="center"><img width="934" alt="Screen Shot 2017-04-23 at 6.35.50 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/145675/326b8040-4c4c-7ba0-f74b-34be0e28a041.png"></div>


## Warm up round

ウォームアップラウンド：賞金総額500万円
最初のラウンドはもう始まっています。締め切りは8月15日。

CommAI-Env ([github](https://github.com/facebookresearch/CommAI-env)) というFacebook Researchの提供するpythonのエージェント実行環境をベースにトレーニングや評価を行います。
エージェントは各ターンで一つの数字や文字を受け取ります。それに対して何らかの答えを送信し正解なら報酬を得られるという枠組みです。

マイクロタスクと呼ばれる非常にシンプルなタスク群と、ミニタスクと呼ばれる若干難しめのタスク群があります。それらが簡単なものから順番に与えられ、トータルでできるだけ早く学習し正しい答えを出せるようにするのが目標です。

__・強化学習__
あらかじめ全てのデータセットに対して正解が与えられているのではなく、手探りで評価を頼りに探索していきます。googleやPFNさんが力を入れている分野です。

__・「段階的」学習__
あるタスクで学習した内容を別のタスクに応用する、というところがこのチャレンジの焦点です。簡単なタスクを学習してベースの知識を獲得していきます。

__・評価__
評価は、それぞれのタスク(ルール)をどれだけ早く学習できるかという点以外にも「段階的」に学習できているかという点も確認されます。
例えば下図で、Task4を単発で学習した場合よりも Task 1,2,3,4 と続けて学習した時の方が早くTask 4をクリアできる必要があります。つまりは前のタスクで得た知識を活用していることがポイントですね。

さらにもう一つのポイントは学習した内容を忘れないこと。Task 1をクリアした後に他のタスクを学習させ、その後で再度Task 1を与えた時にクリアにかかる時間が以前よりも長くならないということです。

<div align="center"><img width="827" alt="Screen Shot 2017-04-23 at 6.47.13 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/145675/00a97d32-83d0-34cb-981e-1fdde44721e8.png"></div>


案ずるより産むがやすし。まずは課題となるタスクを実際にみてみましょう。


## Micro Tasks

コンピュータの代わりに人間が試せる環境があります。[General AI Challenge webserver test](http://www.frank-buss.de/ai/index.html)を開いて下さい。赤枠で囲ったところが入力用のボックスです。ここに、数字やアルファベットなどを入力してみましょう。

<img width="565" alt="Screen Shot 2017-04-23 at 6.58.20 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/145675/731c583c-b2c2-07e8-7083-86196d7a758e.png">

訳が分かりませんが、とりあえず適当に入力してみて下さい。
文字に大文字と小文字の区別はあるのか？記号は入力できるのか？
最下段に表示されるマイナスやプラスの記号が報酬です。プラス記号を20個ぐらい受け取れれば上出来です。


<img width="488" alt="Screen Shot 2017-04-23 at 7.01.31 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/145675/9ce5d5fe-70aa-8878-f707-2c3f7698af95.png">

... 答えは少し下に ...
.
.
.
.
.
.
.
.
.

恐らく今のタスクは、受け取った文字に関係なくただある正解の文字（あるいは数字、記号）を返せばそれで報酬がもらえるようです。


それさえ分かれば後は簡単。同じ文字を連打します。報酬連続ゲット。やったね！

<img width="337" alt="Screen Shot 2017-04-23 at 7.18.54 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/145675/7e41cbd6-425f-5e65-26aa-9a51d5506d85.png">

そうすると... あれ？いつの間にか報酬がもらえなくなりました。

どうやら正解の文字が切り替わったのか、タスクが切り替わったのか。それらを推定しながら続けていきます。
つまり今回のタスクは、何か正解の答えがあってそれを出力すれば報酬がもらえることを学習するわけです。

そして次のタスクでは、受け取った文字に対して何か対応する文字を送信することを学習します。

<img width="878" alt="Screen Shot 2017-04-23 at 7.22.54 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/145675/4f539cc9-0483-0104-c199-ebfa6dad1094.png">

さらに次は受け取った文字をそのまま返すタスクです。このような感じで少しづつ複雑なタスクを学習していきます。

<img width="893" alt="Screen Shot 2017-04-23 at 7.23.08 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/145675/5f52268f-f98d-0d29-d598-81fa4e94928c.png">

この次は、出力を要求する記号が来るまでは正解を返さずに空白を返すなどのタスクが続きます。
単純なタスクですが、それだけでも例えば

・どのような正解を返せば良いのか
・ルールを早く理解するためにはどんな値を返せば良いのか
・タスクが切り替わったことをどうやって判断すれば良いのか

などなかなか面白い問題です。このような感じで17-8つのマイクロタスクを学習します。
詳しい内容はこちらからダウンロードできます。流石にマイクロタスクの次のミニタスクになるとなかなか難しそうです。
[General AI Challenge Specifications of the First (Warm-Up) Round](https://mirror.general-ai-challenge.org/challenge_first_round_specifications.pdf)


## 実装するには

興味のある方は Round1 の実行環境をダウンロードしてみて下さい。 ( [github](https://github.com/general-ai-challenge/Round1) )

上で書いたように手動でテストしたい場合は下記で起動できます。

```
python src/run.py src/tasks_config.challenge.json -l learners.human_learner.ImmediateHumanLearner
```

サンプルのエージェントを動かしてみたい場合は learners/sample_learners.py にサンプルが複数用意されています。

```
python src/run.py src/tasks_config.challenge.json -l learners.sample_learners.SampleMemorizingLearner
```

```py
class SampleMemorizingLearner(BaseLearner):
    def __init__(self):
        self.memory = ''
        self.teacher_stopped_talking = False
        # the learner has the serialization hardcoded to
        # detect spaces
        self.serializer = StandardSerializer()
        self.silence_code = self.serializer.to_binary(' ')
        self.silence_i = 0

    def reward(self, reward):
        # YEAH! Reward!!! Whatever...
        # Now this robotic teacher is going to mumble things again
        self.teacher_stopped_talking = False
        self.silence_i = 0
        self.memory = ''

    def next(self, input):
        # If we have received a silence byte
        text_input = self.serializer.to_text(self.memory)
        if text_input and text_input[-2:] == '  ':
            self.teacher_stopped_talking = True

        if self.teacher_stopped_talking:
            # send the memorized sequence
            output, self.memory = self.memory[0], self.memory[1:]
        else:
            output = self.silence_code[self.silence_i]
            self.silence_i = (self.silence_i + 1) % len(self.silence_code)
        # memorize what the teacher said
        self.memory += input
        return output
```

これを真似て自前のエージェントを実装してみれば良いわけですね。next()では受け取った情報に対しての返事を送信し、reward()でそれに対する報酬を受け取ります。


既に実装されているタスクは言わば課題であって、応募するエージェントの学習用といったところでしょうか。実際のラウンドではこれらと似たタスクが複数出題され、それら未知のタスクへの対応力、学習能力を競います。


## みんなでやろう。汎用人工知能！

賞金5億円、なんだか盛り上がっていない今がチャンス！

なんて煽ってはみましたが、さすがに自分たちが参加していきなり賞金を得られるなんて考えてはいません。:)
では何故参加するのか？


僕も素人ながらディープラーニングを試しています。
これがなかなか面白くて、例えば画像処理の素人の人間でもうまく学習セットを用意できればプロ並みの処理ソフトが比較的短期間で書けたりします。大きな可能性を感じるのですが、ただやはりこれだけでは知能と言うには物足りなく感じます。

そして何より日本のAI分野は大きく遅れています。
これを打開するには、マスコミの煽り記事や政府の科学技術予算への問題を批判しているだけではだめなのではないでしょうか。まず一人一人がAIやいろいろな技術について理解を深めることが大事ではないかと思っています。マスコミや国だって、それなりに我々が欲するものを提供しているのですから。というわけで。

__・AIへの理解が深まる。自分たちが関わっているソフトウェアやプロジェクトへの応用もできるかも__

__・参加することでコンテスト入賞者の手法や各界の動きが理解しやすくなります__

__・何より汎用人工知能のアルゴリズムを考えることは非常に楽しいです__

__・Microsoftの機械学習実行用インスタンスも使えます__


実は今これを書いている日の翌日なのですが、[General AI Challengeの中間報告会](https://general-ai-challenge.connpass.com/event/54912/)が東京で開催されます。（僕も参加する予定です）

一緒にチームを組みたい、あるいは参加したいと言う方からのメッセージお待ちしています！！



## 参考資料

以下、幾つかの資料を置いておきます。
時間があれば下記の論文は要旨をまとめた記事を書くかもしれません。


> 汎用人工知能に必要な要件は何か。コミュニケーションを用いて人工知能を構築するという提案の論文。
> [A Roadmap towards Machine Intelligence](https://arxiv.org/pdf/1511.08130.pdf)
> [CommAI: Evaluating the first steps towards a useful general AI](https://arxiv.org/abs/1701.08954)


> 他にも関連する論文や資料はウォームアップラウンドの仕様書に沢山載っています。
> [General AI Challenge Specifications of the First (Warm-Up) Round](https://mirror.general-ai-challenge.org/challenge_first_round_specifications.pdf)


> General AI Challenge のフォーラム。分からないことがあればここから気軽に質問したり、アップデートをもらえます。
> [General AI Challenge | Forum](https://discourse.general-ai-challenge.org)


> 毎週の世界中のアップデートはこちらから。tensorflowを使ったエージェントについてやテレビゲームから学習する方法まで、ライブ配信などがあります。
> [General AI Challenge | Updates](https://www.general-ai-challenge.org/updates)

> Facebook上でのグループ　（トラフィックはあまりない）
> [facebook](https://www.facebook.com/AIchallenge/)