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

  • 10
    いいね
  • 0
    コメント

汎用人工知能!

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

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

さて、そんな中でGood AIというスタートアップがMicrosoftとNVidiaの協賛を得て “General AI Challenge” を開催しています。これはまさにたった一つのプログラムでいろいろなタスクを学習する、汎用的なAIを開発するコンテストです。賞金総額500万ドル(約5億円)です。

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

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

General AI Challenge

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

Screen Shot 2017-04-23 at 6.35.50 PM.png

Warm up round

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

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

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

・「教師なし」学習
あらかじめ正解が与えられているのではなく、手探りで正解を探していきます。これはつまりは強化学習ですね。

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

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

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

Screen Shot 2017-04-23 at 6.47.13 PM.png

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

Micro Tasks

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

Screen Shot 2017-04-23 at 6.58.20 PM.png

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

Screen Shot 2017-04-23 at 7.01.31 PM.png

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

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

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

Screen Shot 2017-04-23 at 7.18.54 PM.png

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

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

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

Screen Shot 2017-04-23 at 7.22.54 PM.png

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

Screen Shot 2017-04-23 at 7.23.08 PM.png

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

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

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

実装するには

興味のある方は Round1 の実行環境をダウンロードしてみて下さい。 ( github )

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

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
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の中間報告会が東京で開催されます。(僕も参加する予定です)

一緒にチームを組むなど、参加したいと言う方の是非メッセージお待ちしています!!

参考資料

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

汎用人工知能に必要な要件は何か。コミュニケーションを用いて人工知能を構築するという提案の論文。
A Roadmap towards Machine Intelligence
CommAI: Evaluating the first steps towards a useful general AI

他にも関連する論文や資料はウォームアップラウンドの仕様書に沢山載っています。
General AI Challenge Specifications of the First (Warm-Up) Round

General AI Challenge のフォーラム。分からないことがあればここから気軽に質問したり、アップデートをもらえます。
General AI Challenge | Forum

毎週の世界中のアップデートはこちらから。tensorflowを使ったエージェントについてやテレビゲームから学習する方法まで、ライブ配信などがあります。
General AI Challenge | Updates