Abstraction and Reasoning Challengeを解こう！！

#Abstraction and Reasoning Challengeとは
まずはリンクを→(https://www.kaggle.com/c/abstraction-and-reasoning-challenge/overview)
ざっくり言えば、Abstraction and Reasoning Challenge（以下、ARC)とはkaggleで開催されていた、抽象推論問題のデータセットに対する機械学習での挑戦です。私がこれを見つけた時、機械学習が「知能」というものを得るには、これくらいの問題セットは解けなければならないと感じました。何せ、人間からすれば恐ろしく簡単なのです。そしてこのkaggleでの結果から言えば、現状のコンピュータにとっては恐ろしく難しいようです。

#ARCの問題例
実際に問題を見てみましょう。
まずは訓練データセットです。
![__results___5_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/e08a8157-ca40-1388-fcd8-5dea667c3b4d.png)

上の画像(train input)と下の画像(train output)は入力と出力というセットになっています。
この５セットから、入力と出力の間のルールを考えてみましょう。
そして、下の画像を入力として、あなたが考えたルールを適用したとき、出力はどのような形になるでしょうか。（**あまりスクロールし過ぎないで！！**）

![__results___5_2_up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/4a0ac6c7-ecef-9bff-3e3b-aea820b343a5.png)

正解は下の画像です。正解できましたか？？
![__results___5_2_down.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/487707af-ed64-4c34-053d-9e23972f06d0.png)


私が文章でルールを説明してみましょう。
まず出力は９×９のマスを持ちます。そして、この９×９マスを９分割した３×３の各正方径マスと入力画像３×３マスの各マスが対応します。入力画像のあるマスが黒ならば、それに対応する出力の３×３正方径マスはすべて黒に、入力画像のあるマスが色付きなら、それに対応する出力の３×３正方径マスは入力画像と同じパターンになります。


うーん、これでうまく説明できている自信がありません。この問題セットは文章で説明するより、目で見て、直感的に考えた方が理解できるかと思います。この特徴がこの問題セットの面白いところであり、コンピュータが苦手とする理由でもあるのでしょう。このようなIQテストのような問題が続きます。

次の問題に行きましょう。まだ問題セットの構造を理解できていない人もいるかもしれません。
![__results___5_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/19a22d59-5b33-1462-79cb-281e30cb38c0.png)

これはかなり簡単でしょう。さて、テストデータの入力は下の画像です。(**スクロールし過ぎないで!!**)
![__results___5_5_up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/e6d474ce-1817-7af5-255a-0c64021b0d10.png)

答えは下の画像です。
![__results___5_5_down.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/9baab984-3790-1515-7cd1-432fa99e869b.png)

このルールなら説明できそうです。元の入力から、緑色で完全に囲われている黒色部分を黄色に塗りつぶしたものが出力です。始めの問題はARCの中では難しい方の問題だと思います。一方、この問題はARCの中でも簡単な部類に入るでしょう。

このような問題データセットが訓練用に400個、評価用に400個あります。以下リンクのNotebookですべての問題を視覚化できるプログラムがありますので、良ければいくつか解いてみてください。（説明するのは疲れました↓↓。そして、やはり直接見た方が分かりやすいです。）
(https://www.kaggle.com/c/abstraction-and-reasoning-challenge/overview)

#kaggleコンテストの結果
問題データセットを見てもらえれば分かると思いますが、この文章を見ている人間のあなたが真面目に考えればほとんどの問題は解けるはずです。（この文章を読んでいるのが、すでに誕生している人工知能でないことを祈ります。）少なくとも８割は解けるのではないでしょうか。そして、結果は以下の通りです。
https://www.kaggle.com/c/abstraction-and-reasoning-challenge/leaderboard
![FireShot Capture 003 - Abstraction and Reasoning Challenge - Kaggle - www.kaggle.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595608/3f4bd80a-2930-56bc-1fa9-f3f6cc4aad0c.png)

最高スコアは0.794です。悪くありません。
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓

これが正解率だったなら。
残念ながら、この数字は間違いの割合です。もちろん、0.794やそれよりも低いスコアであっても、一つの正解を出すことすら、このタスクにおいて簡単なことではありません。実際、このコンテストの初期はほとんどが1.00スコア（全く解けていないということです。）でした。問題は人間と比較したときです。この数字と人間の正解率には大きな隔たりがあります。

ところで、いくつかの正解を出させたプログラムはどんなものだったのでしょう。コンテスト終了後のdiscussionを見る限り、（集計した訳ではありませんが、）どうやらDSL(domain-specific language,ドメイン固有言語）によるアプローチが多かったようです。DSLは簡単に言えば、その問題に特化した解法をコーディングする手法です。0.794というスコアが出ているのでそれなりには汎化しているのでしょうが、それでも低すぎます。

私はDSLのアプローチには限界があると思っています。どこまで行っても大きく汎化することはなく、新たな問題に対処できません。何より、私が思うに面白くありません。この考えはこのコンテスト初期からあり、ニューラルネットワークでアプローチしようと考えていました。

#うまくいかない
ニューラルネットワークのアプローチはまあ、うまく行きませんでした。問題は2点あります。
まずデータが少ない。明らかに少ない。今のよくあるニューラルネットワークは大量のデータを必要とします。そして、今回のデータセットは使えても800個です。何度でも書きます。少ないです。
そして、もう一つの問題は今のニューラルネットワークに新しいものに対する推論というものはほぼ存在しないという点です。基本的な原理は似た入力に対して似た出力を返すだけです。入力が180度変わってしまい、その180度変わったデータを学習していなければ、全く力を発揮しません。推論という能力がまだ弱いのです。（抽象という能力はディープラーニングにより、大きく発展したのではと感じています。）

#それでもニューラルネットワークで
やはり、ニューラルネットワークでアプローチしてみたいのです。DSLのようなハードなコンピューティングではなく、ニューラル（柔らか）なコンピューティングが抽象推論のようなタスクには必要不可欠だと。
ということで、ニューラルネットワークを使ってのアプローチをここに上げていこうかなと思っています。飽きるかもしれませんし、趣味みたいなものなんで、時間も取れないかもですが。
とりあえずは、データが少ないという問題に対してはfew-shot-learningの技術を、推論の能力が低いという問題に関してはRelational Networkという技術を使っていこうかと考えています。
もし、これを見た方でARCに興味を持って、何か意見がある方はアプローチください。現状、私は全くうまく行っていないので。