AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

Stacked Capsule Autoencoders

Stacked Capsule Autoencoders

A. R. Kosiorek, S. Sabour, Y. W. Teh and G. E. Hinton, NIPS2019

 

先に、次の論文を理解しておきたい。

Transforming Auto-encoders

G. E. Hinton, A. Krizhevsky and S. D. Wang, ICANN 2011

 

<雑談>

画像認識における驚きは、その仕組み知ると同時に、ほとんど消え去ってしまう。ただし、ニューラルネットワークの学習能力に対する驚きは、残る。画像認識において驚きをもたらす要因は、いうまでもなく、ラベルの存在である。学習済みのANNに画像1枚通せば、分類、位置、配向、姿勢、医療診断、第一原理計算、薬剤効果などの結果が出力される。この驚きが落胆に変わるときがくる。それは、失敗例を見た時であり、精密に作られたラベル(教師データ)をみたときである。とはいえ、ANNは変化し、進化し続けている。ヒトの知性の源は脳であり、五感であり、思考であり、言語であり、・・・。ヒトの知能は、ゼロから始まり、脳、五感、思考、言語、画像、空間認識、・・・、などを駆使しながら成長していく。ANNも、成長していく。

 

Transforming Auto-encoders

G. E. Hinton, A. Krizhevsky and S. D. Wang, ICANN 2011

この論文は、約10年前に発表されたものなので、次の文章は、現在のCNNには当てはまらないかもしれない。おそらく、当時は、物体認識のみだった。

This paper arguues that convolutional neural networks are misguided in what they are trying to achieve. 

 

 

 

 

 

 

 

f:id:AI_ML_DL:20200328092753p:plain

style=118 iteration=1

f:id:AI_ML_DL:20200328092856p:plain

style=118 iteration=20

 

f:id:AI_ML_DL:20200328094525p:plain

style=118 iteration=500

 

Generative Deep Learning

Generative Deep Learning by David Foster

 

abstraction and reasoning challengeのようにレベルの高いコンペに太刀打ちできないのは明らかだ。最先端のレベルを超えて、新たなモデルを生み出すことが求められているのだから。それでもヒントを求めてさまよう。

 

この本は、GANの勉強をしようと思って、昨年の8月に購入したが、ダウンロードしたプログラムが動かず、対策がうまくいかず、放置していた。

 

300ページに次の記述があったので、あらためて、読んでみようと思った。

This is the core idea that I believe will propel generative modeling into the spotlight in the next decade, as one of the keys to unlocking artificial general intelligence.

 

program synthesisは、自動プログラム作成:プログラムを作るプログラムを作る

generative modelは、文章・絵画・音楽・作成プログラム:Deep Learning

ということで、全く異なる分野だが、generativeとsynthesisを共通点として捉えて、ヒントになるものを探す、あるいは、この分野の技術をしばし学ぶことにする。

 

Chapter 9  The Future of Generative Modeling

翻訳、作文:Transformer, BERT, GPT-2

f:id:AI_ML_DL:20200319142633p:plain


作曲:MuseNet

*GPT-2:性能が良くなると、悪用される可能性があることから、開発したOpenAIが出荷をコントロール(高性能なものは出さない)しているとのこと。

*Transformerは、RNN(LSTM)やCNNを使っていない。

 

画像生成:Pro-GAN, SAGAN, BigGAN, StyleGAN

f:id:AI_ML_DL:20200319145004p:plain

言語処理のTransformerや画像処理のSAGANなどで使われている”Attention”が、RNN(LSTM)を超えるパフォーマンスを発揮しているようだ。

もう1つ重要な技術要素があって、それが、エンコーダ・デコーダのようである。

 

Attensionを理解するには、自然言語処理における切り札的な存在として認識するのがよさそうなので、A. Geronさんの2019年のテキスト:Hands-On Machine Learning with Scikit-Learn, Keras & TensorFlow, 2nd Edition Updated for TensorFlowを使って勉強しようと思う。

初版(2017)を購入していたので、第2版の購入をしばらく躊躇していたのだが、PyTorchやらFastaiやら迷っているときに、上っ面を眺めていてもだめで、どれかに集中しようと思ったときに、少しは慣れているTensorFlow-Kerasをきちんと勉強しようと思って、購入した。最近5年間の技術の進歩が基礎からわかりやすく説明されているのが良い。

 

Chapter 16  Natural Language Processing with RNN and Attension

attention mechanismのオリジナル論文

NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
Dzmitry Bahdanau Jacobs University Bremen, Germany
KyungHyun Cho Yoshua Bengio Universit´e de Montr´eal 

f:id:AI_ML_DL:20200320140414p:plain

f:id:AI_ML_DL:20200320140501p:plain

attentionの単語は、この論文の中では、直上に張り付けた文章の下から4行目と5行目に3回出てくるだけである。”a mechanism of attension, pay attention to, attention mechanism”

へたな説明はやめておく。

この論文では、エンコーダ・デコーダ部分にちょっと追加しただけのように見えるが、このアイデアを中心に据えた次の論文が、脚光をあびることとなった。

それが、"Attention Is All You Need : NIPS 2017"である。

この論文の序文に、次の文章がある。

f:id:AI_ML_DL:20200320143546p:plain

 

f:id:AI_ML_DL:20200320144148p:plain

TensorFlowのHPには、Transformer model for language understandingに関する詳細な説明とプログラムコード例が掲載されている。

TensorFlowもTransformerも、Googleのメンバーが中心になって開発された手法であるから当然かもしれない。

その、ごく一部を示す。

Multi-head attention consists of four parts:

  • Linear layers and split into heads.
  • Scaled dot-product attention.
  • Concatenation of heads.
  • Final linear layer.

Each multi-head attention block gets three inputs; Q (query), K (key), V (value). These are put through linear (Dense) layers and split up into multiple heads.

The scaled_dot_product_attention defined above is applied to each head (broadcasted for efficiency). An appropriate mask must be used in the attention step. The attention output for each head is then concatenated (using tf.transpose, and tf.reshape) and put through a final Dense layer.

Instead of one single attention head, Q, K, and V are split into multiple heads because it allows the model to jointly attend to information at different positions from different representational spaces. After the split each head has a reduced dimensionality, so the total computation cost is the same as a single head attention with full dimensionality.

A. Geronさんは、2018年にELMo, ULMFiT, GPT, BERTなどの論文が出て、自然言語処理はLSTMからTransformersに移行したように見えるかもしれないが、進歩は非常に速く、2019年にかけて、CNNやRNNによる興味深い論文が出版されるなど、来年どうなっているかは誰にもわからないだろうと述べている。


Chapter 17  Representation Learning and Generative Learning Using Autoencoders and GANs

Efficient Data Representations

Performing PCA with an Undercomplete Linear Autoencoder

最小サイズのMLP(multi layer perceptron)で、エンコーダ・デコーダの説明をしている。入力が3つ、隠れ層が2つ、出力が3つのニューロンを、エンコーダ・デコーダの最も単純なモデルとみなす。

これをプログラムすると以下のようになる。

from tensorflow import keras

encoder = keras.models.Sequential([keras.layers.Dence(2, input_shape=[3])])

decoder = keras.models.Sequential([keras.layers.Dence(3, input_shape=[2])])

autoencoder = keras.models.Sequential([encoder, decoder])

autoencoder.compile(loss="mse", optimizer=keras.optimizers.SGD(lr=0.1))

入力と出力の数が等しい。

このモデルで単純な主成分分析PCAを行うので、活性化関数は使わず、コスト関数はMSEを使う。

3次元データセットをX_trainとすると、

histry = autoencoder.fit(X_train, X_train, epochs=20)はcodings = encode.predict(X_train)

通常の訓練であれば、X_trainとy_trainのセットだが、オートエンコーダ―の訓練は、入力と出力が同じになるように訓練するので、X_trainとX_trainで訓練する。

このテキストは非常に丁寧に説明している。

Stacked Aytoencoders

入力データはFashion MNIST:28x28=784

ちょっと前までは、手書き数字のMNISTだったが、Fashion MNISTになっている。

このオートエンコーダは、784 -> 100 -> 30 -> 100 ->784 

オートエンコーダは、層を増やせば、いくらでも精度は上がり、入力と完全に一致した画像を出力することも可能だが、それは、何も生み出さない。

このオートエンコーダの出力をt-SNEアルゴリズムで変換することによって、Fashion MNISTのデータが、物体ごとにクラスター化していることを確認することで、次元削減に使えることを示している。

Unsupervised PretrainingUsing Stacked Autoencoders

AEをunlabeled dataで学習したパラメータをtransferして活用できる。

Tying Weights

エンコーダとデコーダの対応する層のパラメータを共通化する。

Training One Autoencoder at a Time

層を深くしたときに効率よく学習させるための工夫で、2006-2007に発表された、G. Hinton, Y. Bengioなどの大御所が用いていた方法。個々にトレーニングした層を組み合わせる。

Convolutional Autoencoders

画像を扱う。特徴量抽出に使える。

Recurrent Autoencoders

時系列データを扱う。Transformer、BERTなどに発展した。

Denoising Autoencoders

入力画像データにノイズを付加、もしくは入力画像データにDropoutを施して、トレーニングすると、それらの操作の影響のない出力が得られる。使い方次第。

Sparse Autoencoder

Kulback-Leibler divergence regularizationを含む。ハイレベル。

Variational Autoencoders (VA)

probabilisticであり、generativeなオートエンコーダの登場。

Diederik P. Kingma and Max Welling, Auto-Encoding Variational Bayes, arXiv 2014
これがオリジナルの論文。深すぎて近寄れない。

まずは、テキストで、どこまで理解できるか。

AEは、エンコーダの出力を、デコーダがそのまま受け取っている。

VAEは、エンコーダが、mean coding µとstandard deviation σを出力し、このµとσのガウス分布空間からランダムにサンプリングして、デコーダーから出力する。

VAEを訓練することによって、ガウス空間から、新規な画像を取り出せるようになる。

コスト関数(損失関数)は、通常のreconstruction loss(入力画像と出力画像の差)とlatent lossからなる。

latent lossは、ふむふむと納得するしかない。オリジナル論文のそれらしき箇所。

f:id:AI_ML_DL:20200321121317p:plain

ちょっとだけ、写経しておく。

完全なシーケンシャルモデルではないので、Functional APIでコードを書くことになる。

class Sampling(keras.layers.Layer):

      def call(self, inputs):

            mean, log_var = inputs

            return K.random_normal(tf.shape(log_var)) * K.exp(log_var / 2) + mean

 

codings_siza = 10

 

inputs = keras.layers.Input(shape=[28, 28])

z = keras.layers.Flatten()(inputs)

z = karas.layers.Dence(150, activation="selu")(z)

z = keras.layers.Dence(100, activation="selu")(z)

codings_mean = kera.layers.Dence(coding_size)(z)

codings_log_var = keras.layers.Dence(codings_size)(z)

codings = sampling()([codings_mean, codings_log_var])

variational_encoder = keras.Model(

      inputs=[inputs], outputs=[codings_mean, codings?log_var, codings])

 

decoder_inputs = kers.layers.Input(shape=[coding_size])

x = keras.layers.Dence(100, activation="selu")(decoder_inputs)

x = karas.layers.Dence(150, activation="selu")(x)

x = keras.layers.Dence(28 *28, activation="sigmoid")(x)

 

outputs = keras.layers.Reshape([28, 28])(x)

variational_encoder = keras.Model(inputs=[decoder_inputs], outputs=[outputs])

VAEを組み立てる。

_, _, codings = variational_encoder(inputs)

reconstructions = variational_decoder(codings)

variational_ae = keras.Model(inputs=[inputs], outputs=[reconstructions])

最後に、latent loss とreconstruction loss を加える。

latent_loss = -0.5 * K.sum(

      1 + codings_log_var - K.exp(codings_log_var) - K.square(codings_mean),

      axis=-1)

variational_ae.add_loss(K.mean(latent_loss) / 784.)

variational_ae.compile(loss="binary_crossentropy", optimizer="rmsprop")

最後に、訓練する。

history = variational_ae.fit(X_train, X_train, epochs=50, batch_size=128,

                                                       variation_data=[X_valid, X_valid])

このコードで、見慣れない活性化関数が出てきた。"selu"である。

著者推奨:SELU>ELU>leaky ReLU(and its variants)>ReLU>tanh>logistic、 

ただし、条件付きのようではある。

スピード第一であれば、ReLUがbest choiceとのことである。

SELUが性能を発揮するには条件があるようだ。

・入力の標準化(平均0、分散1)

・重みの初期値の規格化(LeCun normal initialization):Kerasでは、kernal_initializer="lecon_normal"とすればよいとのこと。

・ネットワークはシーケンシャルであること。

聞きかじりでは、変化についていけないな。

 

Generatiing Fashion MNIST Images

VAEをfashion MNISTに適用する。

これも写経しよう。

codings = tf.random.normal(shape=[12, codings_size])

images = variational_decoder(codings).numpy()

これだと、ぼやけたイメージとしか感じられない。

次のコードを実行すれば、中間状態の画像が現れる。

coding_grid = tf.reshape(codings, [1, 3, 4, codings_size])

larger_grid = tf.image.resize(codings_glid, size=[5, 7])

interpolated_codings = tf.reshape(larger_grid, [-1, codings_size])

images = variational_decoder(interpolated_codings).numpy()

なんとなく、generativeの雰囲気はある。

 

Generative Adversalial Networks (GAN)

Generator:Discriminatorを騙すために、リアルに見える画像を作成する。

Discriminator:fakeであることを見分ける。

訓練では、generatorとdiscriminatorが相反する目的で動作する。

最初に、リアルとフェイクの画像を用いてdiscriminatorを訓練する。

次に、generatorを訓練する。フェイク画像を作って、再びdiscriminatorにリアルかフェイクかを判定させる。このときリアルのラベルを付しておき、discriminatorに(間違って)リアルと判定させる。このとき、discriminatorの重みは凍結しておく。

次にコード例と訓練方法が再度説明されているのだが、理解するのは難しい。

ちょっと先まで読んでみる。GANを克服したいものだ。

The Difficulties of Training GANs

 

*急遽、方針転換。A. Geronさんのテキストは、盛りだくさんの裏返しで、コードについての説明が少なく、また、実用上のノウハウが少ないように思うので、F. CholletさんのDeep Learning with Pythonに戻る。といっても1からではなく、まずは、GANから。

*これでGANの基本を学んでから、D. FosterさんのGenerative Deep LearningのVAE及び最新のGANを学びたいと思う。Kaggleにはいつ戻れるのか。

 

8.5  Introduction to generative adversarial networks

重要なところを転記する。

Remarkably, a GAN is a system where the optimization minimum isn't fixed, unlike in any other training setup you've encountered in this book. Normally, gradient descent consists of rolling down hills in a static loss landscape. But with a GAN, every step taken down the hill changes the entire landscape a little. It's a dynamic system where the optimization process is seeking not a minimum, but an equilibrium between two forces. For this reason, GANs are notoriously difficult to train - getting a GAN to work requires lots of careful tuning of the model architecture and training parameters.

8.5.1  A schematic GAN implementation

 

<雑談> 

手元に、こんな本がある。ARTIFICIAL INTELLIGENCE A MODERN APPROACH : YOSHUA HINTON AND GEOFFREY BENGIO。昨年の8月にAmazonで購入したものだが、2名の大御所が書かれたものと思い込み、意気込んで、最後の方まで読んだ。しかし、なにか違う。研究者が、引用文献を一切示さずに文章を書くなんてありえないだろう。そう思いつつも、Chapter 8  The Future of AI、ふむふむAIの将来を大御所がどう見ているのか、と期待して読み進んだ。なんと、SFが4作ほど紹介されているだけ。騙されました。

この2月7日から12日まで、ニューヨークで、AAAI-20が開催され、Hinton, LeCun, Bengioの3名が講演したビデオが公開されている。講演タイトルは、

Hinton: Move on From CNN and Look at Capsule Autoencoders

LeCun: I Was Wrong; Dump Supervised Learning Now and Try Self-Supervised Learning

Bengio: It's Time to Explore Consciousness

これらが、現在進行中の、AIの変革の内容を表しているようなので、それぞれの講演からキーワードを捉えて、勉強してみよう。

 

つづく 

 

f:id:AI_ML_DL:20200319101745p:plain

style=117 iteration=1

f:id:AI_ML_DL:20200319101842p:plain

style=117 iteration=20

f:id:AI_ML_DL:20200319101935p:plain

style=117 iteration=500

 

Program Synthesis

Program Synthesis

Abstraction and Reasoning Challengeの課題に挑戦するために必要かもしれない。 

Program synthesis

S GulwaniO PolozovR Singh - Foundations and Trends® in …, 2017 - nowpublishers.com
 
ステップ1
訓練データを見て、出力画像を生成するプログラムを作成できるようになること。
ステップ2
訓練データを入力することによって、出力画像を生成するプログラムを作成できるようになること。
 
ステップ2には、自動プログラムが必要である。
 
自動プログラムには、いくつかのパターンが考えられる。
1.自動で、訓練データを解析して、1からプログラムを作る方法
2.自動で、訓練データを解析して、あらかじめ作成しておいたサブルーチンを呼び出してプログラムを作る方法
3.自動で、訓練データを解析して、あらかじめ作成しておいたあらゆる訓練データに対応できるプログラムから適切なプログラムを選ぶ方法
 
*3.は、邪道かと思ってしまうが、そうではない。これが出来ることが、プログラム合成において最も重要なことである。最終目的を達成するためには、これをクリヤしておかなければならない。
*プログラム合成は、あらゆるタスクに対応できることが、大前提となる。
*あらゆるタスクに対応するには、ドメインの特定が必要である。
ドメインの特定だけでは不足で、ドメイン内のタスクの範囲の制限も必要になるかもしれない。
*始めのうちは、ドメインもタスクも、プログラム合成が実現しやすい状態、すなわち、ドメインもタスクも最小単位から始めるのが良いかもしれない。
*たとえば、ARCのタスクでいえば、グリッドサイズの変化も、パターンの位置、パターンの形状の変化はなく、パターンの色が初期のグレーから赤に変化するタスクに制限し、グリッドサイズは9x9、パターンサイズは3x3くらいから始める。ドメインもタスクも、自動プログラムを作ることができるところまで縮小して検討してみることから始めるしかないだろう。
*簡単なものから複雑なものへ。
 
目標は、訓練データを解析するプログラムを作成することと、出力画像を作成するプログラムを作成することであるが、現状では、夢物語である。
 
しかし、到達点のイメージを明確にすることは、目標達成には不可欠である。
そのために、この論文を読もうとしている。
 
この論文は、本文が100ページくらいあるが、無償では、概要と序文約10ページを読むことができるだけである。まずは、概要と序文を読んでみて、それから次のことを考えよう。
 
1.1  Program Synthesis
1.2  Challengs
1.3  Dimensions in Program Synthesis
1.3.1  User Intent
1.3.2  Search Space
1.3.3  Search Technique
Enumerative
Deductive
Constraint Solving
Statistical
1.4  Roadmap
 
 

f:id:AI_ML_DL:20200317091349p:plain

style=116 iteration=1

f:id:AI_ML_DL:20200317091439p:plain

style=116 iteration=20

f:id:AI_ML_DL:20200317091758p:plain

style=116 iteration=500




Abstraction and Reasoning Challenge グリッド解釈

Abstraction and Reasoning Challenge グリッド解釈

グリッドの解釈方法を学ぶ。

といっても、頭の中でグリッドを動かしたり、ペンを持ってお絵描きするのとは違って、プログラムするというのは、簡単な作業ではない。

コンペのDiscussionで見かけた”Manual Coding for the First 10 Tasks @nagiss”が、F. Cholletさんの言う、10の課題についてのハードコードから始めるのが良い、とのアドバイスにしたがって、忠実に作業された成果のようで、非常に良くできているので参考にさせていただく。

 

最初のtrain dataは、007bbfb7.json

F. CholletさんのGitHubで、trainingデータとして最初に表示される。

そのままコピペして表示するとこうなる。

テストグリッドが最初の位置に置かれている。

{"test": [{"input": [[7, 0, 7], [7, 0, 7], [7, 7, 0]], "output": [[7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 7, 0, 0, 0, 0, 7, 7, 0], [7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 7, 0, 0, 0, 0, 7, 7, 0], [7, 0, 7, 7, 0, 7, 0, 0, 0], [7, 0, 7, 7, 0, 7, 0, 0, 0], [7, 7, 0, 7, 7, 0, 0, 0, 0]]}], "train": [{"input": [[0, 7, 7], [7, 7, 7], [0, 7, 7]], "output": [[0, 0, 0, 0, 7, 7, 0, 7, 7], [0, 0, 0, 7, 7, 7, 7, 7, 7], [0, 0, 0, 0, 7, 7, 0, 7, 7], [0, 7, 7, 0, 7, 7, 0, 7, 7], [7, 7, 7, 7, 7, 7, 7, 7, 7], [0, 7, 7, 0, 7, 7, 0, 7, 7], [0, 0, 0, 0, 7, 7, 0, 7, 7], [0, 0, 0, 7, 7, 7, 7, 7, 7], [0, 0, 0, 0, 7, 7, 0, 7, 7]]}, {"input": [[4, 0, 4], [0, 0, 0], [0, 4, 0]], "output": [[4, 0, 4, 0, 0, 0, 4, 0, 4], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 0, 0, 0, 0, 0, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 0, 4, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 4, 0, 0, 0, 0]]}, {"input": [[0, 0, 0], [0, 0, 2], [2, 0, 2]], "output": [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2], [0, 0, 0, 0, 0, 0, 2, 0, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0, 0, 0, 2], [2, 0, 2, 0, 0, 0, 2, 0, 2]]}, {"input": [[6, 6, 0], [6, 0, 0], [0, 6, 6]], "output": [[6, 6, 0, 6, 6, 0, 0, 0, 0], [6, 0, 0, 6, 0, 0, 0, 0, 0], [0, 6, 6, 0, 6, 6, 0, 0, 0], [6, 6, 0, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 6, 6, 0, 6, 6, 0], [0, 0, 0, 6, 0, 0, 6, 0, 0], [0, 0, 0, 0, 6, 6, 0, 6, 6]]}, {"input": [[2, 2, 2], [0, 0, 0], [0, 2, 2]], "output": [[2, 2, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 2, 0, 2, 2, 0, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 2, 0, 2, 2]]}]}

適当に改行して、適当に記号を消して、グリッド(行列)らしくすると、

"test":

"input":

[7, 0, 7],

[7, 0, 7],

[7, 7, 0]

"output":

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 7, 0, 7, 7, 0, 0, 0, 0],

"train":

"input":

[0, 7, 7],

[7, 7, 7],

[0, 7, 7]

"output":

[0, 0, 0, 0, 7, 7, 0, 7, 7],

[0, 0, 0, 7, 7, 7, 7, 7, 7],

[0, 0, 0, 0, 7, 7, 0, 7, 7],

[0, 7, 7, 0, 7, 7, 0, 7, 7],

[7, 7, 7, 7, 7, 7, 7, 7, 7],

[0, 7, 7, 0, 7, 7, 0, 7, 7],

[0, 0, 0, 0, 7, 7, 0, 7, 7],

[0, 0, 0, 7, 7, 7, 7, 7, 7],

[0, 0, 0, 0, 7, 7, 0, 7, 7]

"input":

[4, 0, 4],

[0, 0, 0],

[0, 4, 0]

"output":

[4, 0, 4, 0, 0, 0, 4, 0, 4],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 4, 0, 0, 0, 0, 0, 4, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 4, 0, 4, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 4, 0, 0, 0, 0]

"input":

[[0, 0, 0],

[0, 0, 2],

[2, 0, 2]

"output":

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 2],

[0, 0, 0, 0, 0, 0, 2, 0, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 2, 0, 0, 0, 0, 0, 2],

[2, 0, 2, 0, 0, 0, 2, 0, 2]

"input":

[6, 6, 0],

[6, 0, 0],

[0, 6, 6]

"output":

[6, 6, 0, 6, 6, 0, 0, 0, 0],

[6, 0, 0, 6, 0, 0, 0, 0, 0],

[0, 6, 6, 0, 6, 6, 0, 0, 0],

[6, 6, 0, 0, 0, 0, 0, 0, 0],

[6, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 6, 6, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 6, 6, 0, 6, 6, 0],

[0, 0, 0, 6, 0, 0, 6, 0, 0],

[0, 0, 0, 0, 6, 6, 0, 6, 6]

"input":

[2, 2, 2],

[0, 0, 0],

[0, 2, 2]

"output":

[2, 2, 2, 2, 2, 2, 2, 2, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 2, 2, 0, 2, 2, 0, 2, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 2, 2, 2, 2, 2, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 2, 2, 0, 2, 2]

f:id:AI_ML_DL:20200315203330p:plain

この配列のサイズであれば、配列を見ることと、画像を見ることの間に、それほど大きな差異はなさそうに感じる。

そう感じるのは、今見ている課題が、ARCの課題の中では簡単な部類に属しているからであろうか。

入力も出力も30x30程度の大きなグリッド(メッシュが細かいグリッド)となると、そうはいかないかもしれない。

 

課題00d62c1bの訓練グリッドの1つは20x20で、こんな感じ。

"input":

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 3, 3, 3, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

"output":

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 3, 3, 4, 4, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 4, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

これなら、30x30くらいまで大きくなっても、行列を直接見ながら考えることができそうである。

小さな行列に対して検討を重ね、解釈・解析の自動化が進んでいくことを予想しておこう。

行列を直接眺めていると、コンピュータになった気分で、入力行列と出力行列の関係性を把握する方法を、より具体的に考えることが出来るような気もしている。

 

さて、最初の課題007bbfb7に戻ろう。

入力グリッドは3x3、出力グリッドは9x9。

3x3の行列を見ると、CNNを連想する。

CNNモデルの多くが、畳み込み演算に、3x3の行列を使っているためであろう。

入力配列を用いて、出力配列に対して畳み込み演算をやってみよう。

"input":

[7, 0, 7],

[7, 0, 7],

[7, 7, 0]

"output":

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 7, 0, 7, 7, 0, 0, 0, 0],

ストライド3で、入力配列を用いて、出力配列を畳み込み演算すれば、3x3の出力行列が得られる。

このとき、要素ごとの積を足し算する積和演算ではなく、要素ごとの差を足し算すれば(出力配列に対して入力配列の演算をするので、[出力配列] - [入力配列] =[変換行列])、出力行列は次のようになる。

[0, -42, 0]

[0, -42, 0]

[0, 0, -42]  

この結果を使って、新たな入力行列から出力行列を得るには、逆向きの演算をすればよいのか。

[出力配列] = [変換行列] + [入力配列]

これだと、変換行列も入力行列も3x3だから、出力行列は3x3になる。

畳み込み演算は、情報を畳み込みベクトルの範囲内(3x3)の情報を集約しており、かつ、ストライド3を使ったこともあって、入力配列の構造情報が失われてしまっているようで、再現できない。

エンコーダとデコーダの関係のようだ。U-Netの出番か、と思ったりもするが、確率や統計の世界ではなく、決定論の世界なので、ちょっと違うような気もする。

3x3の配列からCNNを想起した結果、畳み込み演算の真似事をしてみたのだが、これはあまり良い方法とはいえないのかもしれない。

畳み込みからは、いったん、離れよう。

 

難しい問題をもう1度、検討してみる。

162
6d0160f0.json

f:id:AI_ML_DL:20200316170138p:plain

このデータセットの入力と出力の関係を、コンピュータになったつもりで、説明してみよう。

まずは、1番目の訓練画像について、

入力グリッドのサイズは11x11である。:array.shape

入力グリッドは、5が4行目と7行目、4列目と7列目に並んでいる。

入力グリッドは、3x3の配列が3行、3列、ある。

出力グリッドのサイズは11x11で、入力グリッドと同じ。

出力グリッドは、5が4行目と7行目、4列目と7列目に並んでいる。入力グリッドと同じ。

出力グリッドは、3x3の配列が3行、3列、ある。入力グリッドと同じ。

出力グリッドの3x3の配列は、要素がすべて0のものが8つ。

入力グリッドの3x3の配列は、要素のすべてが0のものはない。

出力グリッドの3x3の配列と同じものが、入力グリッドの3x3配列にあるかどうか調べた。

出力グリッドの3x3の配列を、ストライド4で動かしながら要素ごとの差をとることによって、7番目の3x3配列と同じであることが分かった。

*ここまでの情報から

1.出力画像は、11x11のグリッドサイズとする。

2.配列要素は全て0とする。

3.4行目と7行目、および、4列名と7列目に5を並べる。

ここまではほぼ確定だが、重要なのはここからだ。

9か所ある3x3ボックスの7番目の配列を、3番目のボックスに入れるので良ければ完了なのだが、残りの3つの訓練データについて調べれば、そうではないことがわかる。

ヒトは、一瞬でそのことに気付き、どこからコピーしたのか、どうしてその位置になるのか調べる。

ヒトは、3x3配列に黄色が含まれているものが、出力画像に使われ、その黄色の位置が、出力画像中での3x3グリッドの位置を決めていることに気付く。

コンピュータに、それができるようにすることが、このコンペの課題だ。 

 

何度も繰り返して、自分に言い聞かせているのだが、知能テストが調べようとしているのは、出力画像の作り方ではなく、出力画像を作るための方法を見つける能力である。

入出力画像について最初にやらなければならないことは、入出力画像から、出力方法を見つけることである。その次に、その出力方法を実行するプログラムを出力することである。最後に、テスト画像に対応した出力画像を作成することである。

誤解であれば、たいへん失礼なことになるのだが、お手本コードは、出力方法を見つけるプロセスを、スコープに入れていないように思う。

10件の課題は人には易しいものばかりで、画像を見るなり、作業内容(出力画像作成方法)を理解し、その実行プログラムを作成されたのだと思う。

ともあれ、出力画像を得るためのプログラムのお手本があるのは、非常にありがたい。

 

f:id:AI_ML_DL:20200316221157p:plain

コンピュータになったつもりで課題を見ていこう。

入力画像と出力画像のサイズ:21x21:入力と出力は同じサイズ

出力配列と入力配列の引き算を要素ごとに行う。

得られた配列と入力配列の比較から、入力画像の最も大きい像が繰り返し出現していることがわかる

複製する方向:中心像の部品がある方法

複製する像の色:部品の色

入力画像から、最も大きい像以外を消した配列つくる

出力配列から、その配列を差し引いて、生成する像の形と色を確認する

生成する像の基本形が3x3の配列で、像と像の間は、上下左右も、斜めも、グリッド1単位であることを確認する

これでテスト出力画像を作れるか。

f:id:AI_ML_DL:20200316224257p:plain

テスト画像中の最大画像(門の形)を確認する。

最大画像の近くにある部品の色と方向を確認する。

確認した色で、中心画像を、グリッド1単位の間隔で、部品の方向にコピーする。

 

f:id:AI_ML_DL:20200316224713p:plain

入力画像のサイズ:3x7

出力画像のサイズ:3x3

 

*200問までのグリッドを3つの場合、出力サイズが小さくなる場合、出力サイズが大きくなる場合、出力サイズが変化しない場合、に分けて解釈する。

 

*出力サイズの方が小さい場合:入力画像サイズ>出力画像サイズ

・演算(and, or, 

・抽出/取り出し(サイズの大小、数の多少、枠内、単純取り出し、数をグリッド数で表示、取り出しx2、単位構造、取り出し+色変化、取り出し部分判定、目印有無、目印有無+目印色変化、特定グリッド領域、特定色を含む枠内、対称性有無、枠内への当て嵌め、パターンへの当て嵌め、枠内取り出し+着色、マーキングか所取り出し+枠消去+着色、自己パターン合成、反転を含む目印領域への当て嵌め

・抽象化(グリッド接続+形状単純化、変形+単純化+色分類

・ノイズ(ノイズ除去+グリッド接続、ノイズ除去+取り出し+グリッド接続

・合成(小さなパーツの組み立て、重ね合わせ+優先順位

・分割(4分割、2分割

・二値化(接続の有無、対称性の有無、

・多値化(形状分類、大小判定+着色

・抽象化+二値化(枠消去+グリッド接続+数による2色化、

・接続(移動により部品端部の灰色間を接触・灰色は元の部品の色に変化

 

*出力サイズの方が大きい場合:入力画像サイズ<出力画像サイズ

・タイル(元のパターンを使う、長辺2倍、模様を追加して4倍、反転により4倍、目印方向に2倍+内部グリッド分割、上方反転2倍、回転角大

・相似(グリッド分割+模様追加、模様拡大+グリッド分割、グリッド分割+中央半分削除+4隅削除、模様拡大+色順保存

・拡張(模様拡張

 

*入出力サイズに変化がない場合:入力画像サイズ=出力画像サイズ

埋める(囲み領域、ボックス内の模様をボックス外にある同じ形状のブロックで埋める、89:矩形で最大の空白をピンクで埋める、98:埋めてふたをする、101:正方形または1点の穴のみ赤で埋める

修復(104:ライン状の模様の欠けを埋める

除く(84:矩形パターンの内部にはしご状に黒を入れる、97:矩形の内部をくりぬく

囲む(1つしかない点を赤で囲む、94:灰色の点を青で囲む

変形(部分平行移動、点から線へ・点の色により水平または垂直、点からパターンへ・点の色により異なる2種類、共通パターンへの変形、点から線・パターンへ、上方開口部を埋める

増殖(基本パターンの伸長、基本パターンの進展・埋め尽くし、3x3から5x5へ拡張、点から線へ・生成パターンの進展、共通パターンへの進展、部分パターン追加による回転対象体の完成、最大の3x3パターンへの変形と追加・5x5の枠内・仕切り線の色を使う、特定色方向へ伸長・単色、枠外の点を枠内内周に平行移動コピー、対角線方向に別色の模様を追加、2辺にある点の交点に別色の点を追加、2つの点を端部まで十字に伸ばす・交点を茶色に変える、三角形の底辺の中心から頂点を経て端まで出発点の色で直線を描く・元の色は保存、矩形パッド外のパターンを矩形パッド内の点の位置に移動し、パターン内の同色2点を矩形バッド内で端部まで伸長する、左右の両端部の点をその色で中心付近まで伸ばし、中心は灰色にする、79:点状グリッド集合体を中心に模様を増やす、81:下方に模様を作りながら増やす、83:下方にラインを作って45度方向に数珠状に端までつなぐ、

増殖・2倍体(パターンを赤いマークとの境界側に反転して接続する

増殖・基準点在り(88:緑の点に対して同一パターンを赤の点に対して反転パターンをつくる、100:1点または2点を用いて相似形をつくる

接触(パターンの水平・垂直移動、点が移動して同色の線に接触、92:点を中央の灰色のパターン方向に移動して接触させ灰色にする・複数点あれば積み上げる

接続(2点間 、対向する辺にある同色の2点間、水平または垂直で接続可能な2点間を緑で接続、内部の空間に水平と垂直方向に最も長い線を描く・複数候補があれば全て描く、点から矩形パッドに向かって水平もしくは垂直方向の線を描く、緑の2個組から赤の2個組に向かって折れ線を描く・直線は水色の模様に接触すると赤の2個組に近い方向に曲がる・直線は水色グリッドに接触するまでは曲がらない・緑から進みだす方向は水色グリッドがある方向である、91:同色の2点間をつなぐ・交点は縦線を優先、

色付け(高さ・長さ順、形状別・接触3x3に隔てられた4隅を除く矩形領域を訓練画像と同様に着色する、左上隅から緑色に右巻き方形渦巻を形成、3x3に隔てられた3x3領域のうち着色点が多い領域のみ着色点での色で塗りつぶし他は黒で塗りつぶす、複数ある水色のパターンを着色した同一形状パターンで色付けし元の着色パターンは消去する

色変化(4組の訓練画像が必要、近い方の側辺の色に変化、同色の行の色を灰色に変える・他の行は黒にする、水色で示された領域内の青色パターンのみ緑に変える、

部分選択(1/9の選択・色数の違い・選択後グリッド数増加、

ノイズ除去(96:単独の点を除去

マスク除去(マスク状の黒い領域を等価領域のパターンで埋める、矩形の単色パターンを削除・隠されていたパターンを反転により再生、茶色のパッドを削除し等価領域のパターンで再生する

パターンの併合(部分一致・移動・反転・回転、

再配置(特定の色のパターンに合わせて整列、接触するまで下方に移動、下方に1行移動、

移動(青点を2つ下に動かしそこを青にする、点を3x3のパターンで置き換える、77:線を上方に移動して欠けをを埋める

変形(小さな模様を大きな模様に変える・反転構造を含む、80:欠けを補って四角形にする、85:内外の色を交換・さらに外側に拡大する、

表出(76:隠れている矩形パターンの輪郭を明確にする、

回転(86:180度回転

ラインの追加(93:正方形の枠を中心に赤い十字線を描く・枠が表面側

 

*課題の特徴を把握する方法

・入力画像の特徴(一様性、対称性、ノイズ、

・出力画像ー入力画像の特徴(

・入力画像ー出力画像の特徴(

 

つづく 

 

f:id:AI_ML_DL:20200315162600p:plain

style=115 iteration=1

f:id:AI_ML_DL:20200315162709p:plain

style=115 iteration=20

f:id:AI_ML_DL:20200315162749p:plain

style=115 iteration=500

 

The Measure of Intelligence メモ

The Measure of Intelligence メモ

Kaggleコンペにおいて頭に入れておくのがよさそうな部分を原文のまま(タイプミス満載かも)示す。

 

A hypothetical ARC solver may take the form of a program synthesis engine that uses the demonstration examples of a task to generate candidates that transform input grig into corresponding output grids.

Schematically:

・Start by developing a domain-specific language (DSL) capable of expressing all possible solution programs for any ARC task.

Since the exact set of ARC tasks is purpously not formally definable, this may be challenging (the space of tasks is defined as anything expressible in terms of ARC pairs that would only involve Core Knouledge).

It would require hard-coding the Core Knouledge priors from III.1.2 in a sufficiently abstract and combinable program form, to serve as basis functions for a kind of "human-like reasoning DSL".

We believe that solving this specific subproblem is critical to general AI progress.

・Given a task, use the DSL to generate a set of candidate programs that turn the input grids into the corresponding output grids.

This step would reuse and recombine subprograms that previously proved useful in other ARC tasks. 

・Select top candidates among these programs based on a criterion such as program simplicity or program likelihood (such a criterion may be trained on solution programs previously generated using the ARC training set).

Note that we do not expect that merely selecting the simplest possible program that works on training pairs will generalize well to test pairs (cf. our definition of generalization difficulty from II.2).

・Uses the top three candidates to generate output grids for the test examples.

 

III.1.2  Core Knouledge priors

Any test of intelligence is going to involve prior knowledge. ARC seeks to control for its own assumptions by explicitly listing the priors it assumes, and by avoiding reliance on any information that isn't part of these priors (e.g. acquired knowledge such as language). The ARC priors are designed to be as close as possible to Core Knoledge priors, so as to provide a fair ground for comparing human intelligence and artificial intelligence, as per our recommendations in II.3.1.

The Core Knowledge priors assumed by ARC are follows:

a. Objectness priors:

Object cohesion: Ability to parse grids into "objects" based on continuity criteria including color continuity or spatial contiguity (figure 5), ability to parse grids into zeros, partitions.

Object persistence: Objects are assumed to persist despite the presence of noise (figure 6) or occulution by other objects. In many cases (but not all) objects from the input persist on the output grid, often in a transformed form. Common geometric transformations of objects are covered in category d, "basic geometry and topology priors".

Object influence via contact: Many tasks feature physical contact between objects (e.g. one object being translated until it is in contact with another (figure 7), or a line "growing" until it "rebounds" against another object (figure 8).

b. Goal-directedness prior:

While ARC does not feature the concept of time, many of the input/output grids can be effectively modeled by humans as being the starting and end states of a process that involves intentionality (e.g. figure 9). As such, the goal-directedness prior may be not be strictly necessary to solve ARC, but it is likely to be useful.

c. Numbers and Counting priors:

Many ARC tasks involve counting or sorting objects (e.g. sorting by size), comparing numbers (e.g. which shape or symbole appears most (e.g. figure 10)? The least? The same number of times? Which is the largest object? The smallest? Which objects are the same size?), or repeating a pattern for a fixed number of time. The notions of addition and substruction are also featured (as they are part of the Core Knowledge number system as per [85]). All quantities featured in ARC are smaller than approximately 10.

d. Basic Geometry and Topology priors:

ARC tasks feature a range of elementary geometry and topology concepts, in particular:

・Lines, rectangular shapes (regular shapes are more likely to appear than complex shapes).

・Symmetries (e.g. figure 11), rotations, translations.

・Shape upscaling or downscaling, elastic distortions.

・Containing / beingcontained / being inside or outside of a perimeter.

・Drawing lines, connecting points, orthogonal projections.

・Copying, repeating objects.

 

f:id:AI_ML_DL:20200315092432p:plain

style=114 iteration=1

f:id:AI_ML_DL:20200315092529p:plain

style=114 iteration=20

f:id:AI_ML_DL:20200315092617p:plain

style=114 iteration=500

 

Abstraction and Reasoning Challenge

Abstraction and Reasoning Challenge

 

これは、F. Chollet氏が ”The Measure of Intelligence” で議論し提案している、”知能テスト:ARCデータセット”、を解くための ”AIシステム” を開発するKaggleのコンペです。

ARC(Abstraction and Reasoning Corpus)は、1930年代に開発されたヒトのための知能テストのフォーマットに似ていて、ヒトとAIシステムの両方に使える”知能テスト”を目指して開発されたようです。

 

開発的要素が大きい、非常に難しい課題であるが、同時に、非常に面白い課題であると感じている。知能テストを解くモデルができれば、それは、人工知能と呼べるかもしれない。

 

まずは、ヒトの知能で、400問のARC知能テストに挑戦してみる。

 

とりあえず、200問を解いてみた、3~5問くらいは、数分間以上考えた(楽しめた)が、あとは、だいたい1分以内でできたと思う。不注意で2問ほど間違った。唯一、166問(6e02f1e3)が解けなかった。所要時間を度外視すれば、正答率は197/200で、これなら、当分の間、AIに負けることはないだろう。(自分に勝てるAIを作りたいものだ)

 

ARCデータ(terain input と train outputのペア およびtest input) は、全て、幾何学模様である。

基本図形は。正方形で、グリッドの数は、最大で30 x 30くらい。最少は1グリッドだが、3 x 3から 5 x 5 くらいが多いように思う。

train inputデータとtrain outputデータから、変形の規則性を学び、test inputデータからoutputデータを推測する。

訓練データは、平均で3ペア程度。全400問とすると1200となり、タスクとドメインが同じであればこれまでのCNNで学習できそうだが、問題のパターン(変形のパターン)は数十種類以上あり、ラベルに相当する情報も複雑なので、この方向で検討する場合は、ラベル(の作り方)がネックとなるだろう。

3パターン程度の教師データから、変形の仕方を学習し、inputデータから正しいoutputデータを推測することを可能にするモデルを開発することになる。

ARCデータベースは、ヒトの知能テストに準じた課題であり、機械学習モデルの性能を測る1つのものさしとして、非常に興味深いものである。

ARCモデルに対して高得点を出せるモデルを、人工知能と名付けることができるかどうかは、そのモデルのアルゴリズム次第ということになるだろう。

ARCモデルは開発途上で課題はあるだろうし、モデルの性能を測る1つのものさしにはなっても、それが、”人工知能のものさし”となるかどうかは、誰にもわからない。

 

ヒトは、入力画像を出力画像に変換する方法を、どうやって見つけているのだろうか。

ヒトにとってわかりやすい問題として、ノイズ除去、閉じた領域への着色、長方形の皮1枚残したくりぬきなどがある。

ヒトは、それらの変換作業を経た入力画像と出力画像のペアを見比べることによって、出力画像では、ノイズが減った、閉じた領域が着色された、長方形の内部が着色された、ということを認識することができる。

ヒトは、これら3種類の変換が出題されると知っていたわけではないし、ARCデータベースには数十種類の異なる処理が施された画像の組が存在する。知能テストでは、原則として、それぞれの問題の内容を、画像の組を見て、初めて知ることになる。

 

ヒトが容易に理解できる画像処理について検討していると、既知・既存の方法で、画像処理してしまいがちで、AI化にとっては、百害あって一利なしということになりかねないので、少し複雑な課題を取り上げよう。

6d0160f0というデータセットを見てみよう。入力画像は、3 x 3 の画像が9種類あり、9つに仕切られたグリッドに収まっている。出力画像は、3 x 3の画像が、9つのグリッドの1か所だけに存在し、残りのグリッドは空である。入力画像の9つの3 x 3画像のうちの1つだけ、黄色が1グリッド存在する。その1グリッドの黄色が存在する3 x 3画像が、出力画像の唯一の3 x 3画像である。さらに、その黄色グリッドの3 x 3画像中での位置が、9つのグリッドの中での位置を示しているのである。4ペアの入力―出力画像から、そのルールを発見し、テスト画像に適用し、最終出力として正しい画像を生成できるモデルを作成しよう、ということである。

この6d0160f0という課題を解くために、少なくとも5~6分以上はかかった。4つの事例のうちの1つで、模様の一致しているグリッドがすぐ見つかり、他の3つも目を凝らして見つけた。しかし、出力画像のグリッドの位置を決めている理由が、なかなかわからなかった。黄色のグリッドが、3 x 3画像の選択と、3 x 3のマスの中での位置の2つの要因を決めていることに気付くのに、すこし時間がかかった。

さて、正解にたどり着くまでにヒトは何をしたか。まずは、出力側の3 x 3の模様がどこからきたかを探した。次に、9つのグリッドの中での位置がどのように決められたのかを示しているものがないかどうかを調べた。

もっと詳細に眺めてみよう。

最初にやったことは、入力画像と出力画像のセットを眺めること。6d0160f0は、4セットあるので8枚の画像を、横並びでざっと眺めていた。

この、8枚の画像全体をざっと眺めながら、どういった類の作業をしたら、訓練用出力画像と同様な出力画像をつくることができるのかを考えていた。

ヒトは、このとき、どこを見て、何を考えていたのだろうか。

実際にやったことをもっと詳細に追跡しよう。

直前の作業は次の通り。

直前に解いた課題6cf79266は、20 x 20のグリッドで、ざっと見て60%くらいのグリッドが、単色のグリッドでランダムに埋められていた。埋まっていないグリッドは黒である。3ペアあり、それぞれ灰と緑と橙である。出力画像に目を移すと、画像中に1か所もしくは2か所のみ、3 x 3の青い領域が追加されていた。対応する入力画像の場所は、3 x 3の黒抜きになっていることがわかった。これで入力と出力の関係が分かったので、類似作業をするためにテスト入力画像を見た。3 x 3の黒抜きの場所が3か所あったので、そこを頭の中で青にして、テスト出力画像を見て正解であることを確認した。

そして、マウスを操作して、6d0160f0の4対の訓練画像を見た。

グリッドは11 x 11で、1グリッドのサイズは面積で直前に扱った画像の3~4倍あり、カラフルである。1グリッド幅のグレーの直線で、9つの3x3グリッドに仕切られている。3x3グリッド内のパターンは、ベースが黒で、カラーで埋まっているグリッドの数は2から4で、隙間が多い。入力画像の9つの3x3グリッドは全て3 x 3のパターン画像で埋まっているが、出力画像は、スカスカ。1か所の3x3グリッドにのみ、パターン画像が入っている。

6d0160f0の4対の訓練画像を初めて目にしたときのことは、よく覚えていないが、直前の問題が易しかったので、少し戸惑ったように思う。

最初から順に解いてきたので、163番目の課題である。100番目を過ぎたあたりから、少しずつ、類似パターンに出くわすようになった。しかし、それを思い出しながら解こうとしたことはないと思う。

 

ヒトは、知能テストの画像を見ながら、何を考えていたのだろうか、何をしていたのだろうか。

入力画像から出力画像を作る(手続きを探す)ことに集中していた。

入力画像から出力画像を得るための方法を見出すときに何が必要だったのだろう。

入力画像と出力画像に違いがあるかどうかを見出す能力。

入力画像と出力画像にどのような違いがあるかを見出す能力。

入力画像と出力画像に違いがない部分を見出す能力。

入力画像と出力画像に違いがない部分の役割を見出す能力。

入力画像と出力画像に違いをもたらしているものを見出す能力。

入力画像と出力画像に違いをもたらしているのが、サイズに基づくものであることを見出す能力。

入力画像と出力画像に違いをもたらしているのが、形状に基づくものであることを見出す能力。

入力画像と出力画像に違いをもたらしているのが、色に基づくものであることを見出す能力。

入力画像と出力画像に違いをもたらしているのが、数量に基づくものであることを見出す能力。

入力画像と出力画像に違いをもたらしているのが、相似性に基づくものであることを見出す能力。

入力画像と出力画像に違いをもたらしているのが、対称性に基づくものであることを見出す能力。

入力画像と出力画像に違いをもたらしているのが、配列に基づくものであることを見出す能力。

入力画像と出力画像に違いをもたらしているのが、順序に基づくものであることを見出す能力。

入力画像から出力画像を得るための方法は、違いをもたらしているものを、全て見出した時にはじめて可能になるのだろうと思う。

 

ヒトは、訓練画像を眺めながら、頭の中で、上記のような要素について、試行錯誤していたのだろうか。

どのような順序で試行錯誤していたのだろうか。

何問か解いているうちに、動かないもの、変化しないもの、に対して、もっと注意を払わないといけないと思ったことは、はっきりと覚えている。

さらに、途中から、対称性を強く意識した。反転、鏡像、回転など。

また、細部にとらわれすぎないように、抽象化と一般化も意識した。

相似を意識することも重要な要素だったと思う。

これらは、ほんの1部にすぎないかもしれないが、AIが備えておくべき能力なのかもしれないと思う。

 

知能テストは、知能を測る。知能は、意識して習得するものである。学習によって習得するものである。外界との相互作用によって獲得するものである。知能テストによって、獲得してきた能力が目的に応じて適切に適用出来るかどうか、そのレベルを測っている。当然のことながら、感情を測るものではない。創造性を測るものでもない。技能を測るものでもない。知識の量を測るものでもない。

 

知能テストの内容を分析的に捉えることによって、AIモデルを作り出すことができるだろうか。

シングルタスクからマルチタスクへ、その先にあるものとして、一般化されたものをイメージするのだが、その道筋は単純なものではなさそうだ。タスクの数を増やすだけでは一般化はできない。一般化と言うのは、各タスクの最大公約数のようなもので、一般化の概念としてはなんとなくあてはまりそうに思うが、数式を解くようにはいかないだろう。

ディープラーニングで、汎化と言う言葉が使われる。一般化、普遍化と同義だと思うのだが、狭い領域で使われることもあり、オーバーフィッティングではない、という程度の状態を指していることもある。画像認識においては、データ量が少ない場合には、物体固有の特徴量ではないものが画像から抽出されて、それが、オーバーフィッティングの原因になることがあり、それを避ける手段の1つが、データの増量である。

このデータの増量 (data augmentation) が、なぜ、効果があるのか、どのような場合にその効果が大きくなるのかを考えることは重要である。

data augmentationの典型的な手法は、上下左右の反転(反転対称)回転(回転対象)拡大縮小(相似)ノイズ付加(部分的には、抽象化や一般化の効果がある)などであり、これによって、物体固有の特徴が抽出される確率が高くなる。

data augmentationは、スモールデータビッグデータにする手段であるが、本質的には、画像固有の特徴を抽出するための、非常に合理的な画像処理手法であろう。

数学的な計算によって画像に加えた加工処理が、CNNによる訓練によって、画像から抽出した特徴量に一般性を与えていると考えることができるかもしれない。

知能テストの最中にヒトが行う試行錯誤は、この、data augmentationを頭の中で行い、得られたさまざまな画像を使って、入力画像と出力画像の関係を把握する作業とみなすことができるのではないだろうか。

知能テストの最中にヒトが行う典型的な作業として、ざっと見る、詳細に見る、単純化してみる、抽象化してみる、というのがある。これらは、CNNによる画像処理における、畳み込みやプーリングによって、前段中段後段のレイヤが獲得する画像の特徴量の抽象度の違いに対応しているように思う。

試行錯誤の仕上げに近づくと、試行錯誤によって獲得した加工手順を、訓練データに適用して、その手順が正しいかどうかを確認することになる。

知能テストにおけるヒトの試行錯誤の要素と、CNNの要素には、かなりの共通点があるように思うが、その共通点をどうモデル化するのか、考えると面白いかもしれない。

 

知能テストには、色、形、数量、大きさなどを判断基準にする場合がある。

 

知能は、一般化したものではなく、基礎、基本、ベースになるものではないかな。論理学や数学のように、知の枠組みとして捉えるのが良さそうな気がする。

 

今は、知能とはなんぞやに対する答えが必要なのではなく、F. Cholletさんが提案したARCを解くことができるモデルを開発することが重要である。

ARCを解くことができるヒトがここにいるので、このヒトの真似をすればよいだけだと思うのだが、そのためには、ヒトが知能テストの際に何をしているのかを正確に表現することが必要になる。

 

知能テストでは、最初に、訓練データ全体を眺める。

そこから、不動性、動性、追加、削除、選択、色、拡大、縮小、数量、順序、類似性、対称性、その他いろいろな基準を適用してみて、入力画像にどの操作をどの順序で適用したら出力画像になるかを試行錯誤しているのだろうと思う。

試行錯誤をする対象が、全体から部分へと移動し、詳細を眺め、場所を移動し、また視野を広げ、さらに全体像に戻ってから、また部分へと移動するような作業を繰り返しているのだが、これを一括して行う方法があるだろうか、

訓練モデルの出力画像を保持して、入力画像に対する関係を様々な角度から調べていくことが必要で、そのために、試行錯誤を行うことになる。

機械学習では、試行錯誤は、特徴量の選択であったり、特徴量の獲得であったりすると思うのだが、その範疇の試行錯誤で知能テストが解けるだろうか。

機械学習では、特徴量は明示的に存在することが多く、どう選定するのかが重要になるのだが、DNNでは、訓練データから特徴量を学んで獲得することになる。知能テストでは、特徴量は明示的には存在せず、数枚の訓練データの中に存在するので、知能テストに正解するには、訓練データから特徴量を学び取らなければならない。問題は、教師データが数件しかないことと、ラベルが明示的でないことである。

ARCデータセット全体を使えば、教師データは1200件くらいになるので、DNNのセンスからすれば、data augmentationがうまく適用出来れば問題のないデータ量ではある。問題は、数件ごとに、タスクが違うことである。類似タスクがあったとしても、データ数で最大数十枚程度である。augmentationをフル稼働させて数百枚にしたとすると、次の課題は、ラベルである。

 

ここで、根本的な問題点を思い出した。知能テストは、その本質からして、その問題を事前に知ることはできない。さらに、類似タスクを集めてトレーニングすることも、趣旨に反する。つまり、各問題は、試験を開始して初めて見ることができる、というのが大前提となっている。そのためもあって、知能テストは、公開されていない。

ARCデータセットは、知能テストではなく、知能テストに挑戦できるAIを開発するために開発された物であるから公開されているが、開発しようとしているAIモデルに、ARCデータセットを学ばせるのは、筋が通らないであろう。

  

知能テストは、予測問題ではない。したがって、知能テストにおける試行錯誤も、確からしさを指標にして、特徴量を抽出するのではない。特徴量という概念もあてはまらないかもしれない。

1つ1つの作業内容の結果は、確定値である。一致か不一致か、存在確率ではなく、存在するかしないかである。

 

さて、6d0160f0の問題を、AIに解いてもらいましょう。

8枚の画像をざっと眺めて、入力画像は3 x 3の画像が9つの3x3グリッドに配置されているのに対して、出力画像中では、1つの3x3グリッドの位置にしか3 x 3の画像が存在しないことに気付かなければならない。

その次には、出力画像の3 x 3画像が、入力画像のどの3x3グリッドの3 x 3パターンと同じなのかを調べて突き止めなければならない。

さらに、なぜ、出力画像中の9つの3x3グリッドの特定の位置にのみ、3 x 3の画像が存在するのかを調べて、答えを探し出さなければならない。

3 x 3の画像中での黄色のグリッドの位置が、9つの3x3グリッドの中での位置を決めていることに気付くためには、どうすればよいのだろうか。

 

3月14日

一昨日は、ARCデータセットの0番目から200番目までヒトのintelligenceで解いた。

昨日は、ARCを解いた結果を、振り返りながらまとめた。

今日は、201番目から、ヒトのintelligenceで解いて、そのプロセスをできるだけ詳細に追う。AIが解くことをイメージしながら。

 

201番目

<ヒトが普通に解く場合>

訓練画像

入力画像に黒いスポットがある ⇒ 出力画像は黒い線がある ⇒ 黒い点は黒い線に重なる ⇒ 黒い線の方向は垂直と水平 ⇒ 黒い線は同色の長方形の短辺方向 ⇒ 黒い線は同色の長方形の端部まで 

テスト画像

同色の長方形のパターン内で、入力画像の黒い点を短辺方向に両端まで伸ばす。

・点を線にする。

・線の方向は短辺に平行

・線は同色のパターンの両端まで

ヒトは、テスト画像の作成まで行わず、テストデータの出力画像がヒトが出力画像としてイメージした画像と一致すれば正解したとみなす。

ちょっと待った。

テスト入力画像から、テスト出力画像を出力し、その出力データを提出することで、当該問題の試験は終了する。

試験問題を受け取るところから、提出するところまでやらないと試験を受けたことにはならない。

出力画像を作成するために必要な能力は、

理解すること:

・点を線にすること

・線は点を含むようにすること

・線を引く方向は、点が属していた長方形の短辺方向とすること

・線を引く範囲は、点が属していた長方形の端部までとすること

技能:

・理解したとおりに線を描くこと

 

<雑談>

人工知能に期待しているのは、人工知能がヒトと同じかヒトに優る能力を示すことに加えて、ヒトと同じように、ということでなければならないということだろうと思う。

ヒトと同じように、という言葉から、ヒトは人工知能に、感情表現や創造力を求める。

過去に、人工知能は何度も現れては消え、現れては消えてきた。単に消えたのではなく、それは人工知能ではない、と否定されてきた。否定の主たる理由は、感情表現や創造力の無さではない。エキスパートシステムと呼ばれたものも、オーム返しにすぎないと言われたようだが、データ量が増えて検索方法が進歩すると、たとえばウイキペディアの発展形とみなすことができ、知的資源としての有用性が生じるのだろう。

データ解析方法としての機械学習が発展し、データ認識方法としてのディープラーニングが現れ、あたかも、入力データから何かを学んだかのごとき結果を出力することができるようになった。これも出現当初は、これぞ人工知能と称され、現在のAIブームにつながっている。ニューラルネットワークは、脳の仕組みを模したものであり、CNNは視覚認識機能を模したものであり、何より、deep learningが、ヒトの学習能力を想起させることなどから、AIは近いうちにヒトを超えるだろうと言われるようにもなった。

しかしながら、研究者たちは、AIと、ML/DLを分けて考えている。ML/DLは、ヒトが知識を移転したものであり、受動的であり、AIとは呼べない。

目指すものはどこにあるのだろうか。AIは、ML/DLとは全く別のものとして出現するのだろうか。AIは、ML/DLの延長線上に出現するのだろうか。もしかすると、AIは、ML/DL/AIのように、DLの部分集合として出現するのかもしれない。AIは土台であって、派手なアプリのようなものとして出現するようなものではないのかもしれない。ML/DLの上に君臨するものではなく、ML/DLを下から支えるものとして出現するのかもしれない。知能が知の源なのだから、AIもML/DLの源でいいんじゃないのか。AIが生まれ、成長し、DLに組み込まれることによって、本物のAIの世界がやってくる、かもしれない。

ML/DLは、ヒトが知識を移転したものであると考えるならば、その土台となるAIは、ヒトが知能を移転したものであると考えることができるかもしれない。ヒトの知能を移転することができた暁には、そのAIに、ARCテストを受けさせてみようではないか。

 

 201番目(855e0971)

<AIが解く場合>

訓練画像

AIには、訓練画像はヒトが見るようには見えない。

AIに、訓練画像8枚を入力する。行列が8個である。

最初の訓練入力画像の行列は、15x19のグリッドからなり、2x19, 7x19, 6x19のグリッドに分かれていて、それらのグリッドには、それぞれ、5, 4, 8の数字が入っている。

さらに、7x19のグリッドには0が2つ、6x19のグリッドには0が1つ入っている。

最初の訓練出力画像の行列は、入力画像と同様に、15x19のグリッドからなり、2x19, 7x19, 6x19のグリッドに分かれていて、それらのグリッドには、それぞれ、5, 4, 8の数字が入っている。

さらに、7x19のグリッドに入っていた2つの0のうちの1つは、上に3つ下に3つ増え、もう1つの0の上に1つ下に5つ0が増えている、6x19のマスにあった0は、その上に3つ、下に2つ0が増えている。

入力画像の3つの点が、出力画像において3本の線に変化したことは、ヒトは2枚の画像を(視覚で)見比べて判断することができる。

入力画像がどのように出力画像に変化したのかを知る方法は、まず、差をとること。要素ごとに差をとると、変化したグリッドの数値がマイナスとして残り、他は全てゼロになった残差ベクトルが得られる。

残りの訓練画像ペアについて残差行列を算出すると、それぞれの入力画像からの変化がわかる。

仮に、4ペアの残差行列の平均をとっても、意味のある配列にはならない。

欲しいのは、4つの入力画像と出力画像のそれぞれの残差に含まれている情報を、一般的、普遍的に表現したものである。

この問題のように、行列の差をとることは、単純だが、重要な情報を含んでいることは間違いない。3組くらいの訓練データから、共通項として、変換規則を抽出し、コンピュータ用語で表現しなければならない。

 

ここから前に一歩も進めない。

同じようなところで、同じような話を繰り返して、止まっている。

 

テスト入力画像からテスト出力画像を作るとき・・・。

 

訓練データから手順を読み取る方法と、それをテストデータに適用する方法

手順との簡単な例:

パターンを同じ色のバーの間に移動すること

ラインを訓練データと同じ形状でつくること

ノイズを消すこと

閉じた空間だけ塗りつぶすこと

つながった空間だけ塗りつぶすこと

お手本と同じ模様を作ること

特定の形のものだけ色を変えること

訓練データと同じようにパターンを増やすこと

同じ形状のパターンにマーキングすること

 

入力画像と出力画像の関係性をコンピュータ用語で表現する方法はあるのか

入力画像と出力画像の関係性を把握するために必要な画像処理技術はあるのか

左右に反転して移動するルールであることの把握

マス目の数が違う画像の比較

 

入力画像と出力画像の関係性を読み取る方法を定式化することに集中する。

 

必ず役に立つ、最も重要なことは、最も得意とするプログラミングソフトを使って、実際に、例題を解くこと。

入力画像(入力グリッド)を、出力画像(出力グリッド)に変換できること。

この作業を、コツコツと続けていくと、ヒトのintelligenceが、必ず、プログラミング技術を向上させる。

1問目が最初のヤマ、

それを超えると、例題もテスト問題も解ける。

2問目が次のヤマ、

課題が変わるとプログラムの内容が激変する、だろう。

これも、1例クリヤすれば、他の例とテストは解ける、だろう。

3問目も大きなヤマかもしれない、・・・。

・・・。

10問目くらいになると、どんな課題にも対応できるような気になってくる、かもしれない。

・・・。

20問目くらいになっても、難しい課題に出くわして、頭を抱え込んでしまうことがあるかもしれない。共通に使える関数が1つ2つできているかもしれない。

・・・。

50問目くらいになると、プログラミング技術に変化が出ている、かもしれない。共通に使える関数が10個くらいできているかもしれない。

・・・。

100問目くらいになると、なにかしら大きな変化が生じ始めているかもしれない。

・・・。

コンペ終了までにどのレベルまで到達できるか、ということよりも、まず、1問目の課題を解くことから始めましょう。

・・・。

Artificial General Intelligenceは、まだまだ、はるか先のほうにあるかもしれないし、200問くらい解いたら見えてくるかもしれないし、10問解ければ、ぼんやり見えてくるかもしれないし・・・。

 

つづく

 

f:id:AI_ML_DL:20200311102644p:plain

style=113 iteration=1

f:id:AI_ML_DL:20200311102739p:plain

style=113 iteration=20

f:id:AI_ML_DL:20200311102828p:plain

style=113 iteration=500

 

Transfer Learning

Transfer Learning

*Hands-On Transfer Learning with Python : Implement advanced deep learning and neural network models using TensorFlow and Keras, D. Sarkar, R. Bali and T. Ghosh, 2018, Packt Pub., 

 

Chapter 1: Machine Learning Fundamentals

*Why ML?

 我々は、学習するモデルを手に入れた。

 この学習モデルは、ヒトが学習することによってさまざまな活動が可能になるのと同様に、さまざまな活動が可能になっている。

 手書き文字認識、顔認識、スパムメールの振り分け、医療画像診断、自動運転のリアルタイム物体認識、翻訳、読み上げ、作画、作文、作曲、ボードゲーム素粒子物理実験結果の解析、第一原理計算の時間短縮、タンパク質の構造予測、化学物質の物理化学的性質の予測、低分子薬剤の探索、・・・。

 サイエンスの分野では、理論計算によって得られた成果を、モデルが学ぶことによって、正確さを損なうことなく高速に再現できるので、その結果を容易に次の解析に用いることが可能になっている。

*ML techniques

 supervise, unsupervise, semi-supervise and reinforcement

 batch learning and online learning

 classification : logistic regression, support vector machine, neural networks, random forest, k-nearest neighbours, decision trees

*CRISP-DM

    Cross Industry Standard Process for Data Mining (CRISP-DM) is one of the most popular and widely used processes for data mining and analytics projects. CRISP-DM provides the required framework, which clearly outlines the necessary steps and workflows for executing a data mining and analytics project, from business requirements to the final deployment stages and everything in between.

  ・Business understanding

 MLを何に使うのか。

  ・Data understanding

 ここでは、EDA(Exploratory data analysis):データの内容を、そのまま表やグラフに表示だけでなく、基本的な統計データや相関グラフを作って、ビジネスの目的に合っているかどうかを調べることによって、データを理解する。

 学習用テキストやコンペなどの整えられたデータセットではなく、ビジネス目的に合わせて集めたデータをデータベース化するような作業において重要。

  ・Data preparation

 繰り返しになるが、学習用テキストやコンペなどの整えられたデータセットではなく、ビジネス目的に合わせて集めたデータをデータベース化するような場合においては、全体の60~70%くらいの時間を要する作業であるとのこと。

 たくさんデータがあるので、それを活用して有用な情報を引き出したい、というようなときには、概して、データフォーマットはバラバラで、ファイルもバラバラで、電子化すらされていないこともまだまだ多いのだろうと思う。電子化といっても、pdf、それも、印刷物のpdfだったり、手書き文書のpdfだったりするかもしれない。

 依頼案件だと、何ができるかわからないので、何をしてほしいのかわからないこともありそうだ。受ける側は、何ができるか聞かれるだろうけど、データをある程度調べないと何ができるか言えないだろう。

 依頼を受ける場合は、最初のbusiness understandingとセットで、検討していくことになりそうだな。

 データベース化する、という作業も含めると、ラベル作成もあるから、たくさん仕事がありそうだな。

 ここを、自動化するためのモデルを作ることができないだろうか。 

  ・Modeling

 Kaggleのコンペの内容には、実際に依頼される可能性のありそうなテーマがあるように思うので、本気でサーチして、discussionやnotebookで勉強しておこう。

 コンペの目的とmetricsとデータセットが揃っていて、学習コースもあって、計算環境も整っているので、もっと活用しなければいけないな。

 突然だが、日本語で処理する、ということを考えていないので、これも考えていかねばなるまい。

 メジャーなモデルは、とにかく、使えるようにしておかないと。

 これからメジャーになるモデルも調べておかないと。

  ・Evaluation

 モデルの出来栄え。目的に適合した出力が得られているかどうかだな。

  ・Deployment

 実際の使用環境にインストールして、性能確認し、マニュアルを作成する。ソフトのみ(プログラムコードとデータセット)を出荷する場合には、ハードウエアの推奨条件、プログラム環境構築の説明、などが必要になる。

*Exploratory data analysis (EDA)

EDA is a very powerful mechanism for understanding the dataset in detail before jumping into other stages of ML. In the coming chapters, we will regularly perform EDA to assist us in understanding the business problem along with the dataset before we go into modeling, tuning, evaluation, and deployment stages.

*Working with text data

 

Chapter 2: Deep Learning Essentials

Deep learning framework

*Setting up a cloud-based deep learning environment with GPU support

*Setting up a robust, on-premise deep learning environment with GPU support

*Neural network basics

*A simple linear neuron

*Gradient-based optimization

*The Jacobian and Hessian matrices

*Chain rule of derivatives

*Stochastic Gradient Descent

*Non-linear neural units

*Learning a simple non-linear unit - logistic unit

*Loss functions

*Data representations

*Multilayered neural networks

*Backprop - training deep neural networks

*Challenges in neural network learning

*Initialization of model parameters

*Improvements of SGD

*Overfitting and underfitting in neural networks

*Hyperparameters of the neural network

 

Chapter 3: Understanding Deep Learning Architectures

*Why different architectures are needed

*MLPs and deep neural networks

*Autoencoder neural networks

*Variational autoencoders

*Generative Adversarial Networks

*CNNs

*Capsul networks

ヒトの視覚による認識能力と比べると、CNNには、多くの課題がある。その課題克服のために多くのDNNが開発されており、CapsNetもその1つである。

テキストに引用されている論文のabstractとCapsNetの概略図を転載する。

Dynamic Routing Between Capsuls, S. Sabour, N. Frosst and G. E. Hinton, NIPS2017, 

f:id:AI_ML_DL:20200309122559p:plain

f:id:AI_ML_DL:20200309120901p:plain


*Recurrent neural networks

*Memory Neural Networks

*Neural Turing Machine

*The attension-based neural network model

 

Chapter 4: Transfer Learning Fundamentals

学習済みモデルを正しく利用するための指針

*Introduction to transfer learning

学習済みモデルは、学習することによって、”知識”を獲得する。

獲得した”知識”は、学習済みモデルの”weights”として保存されている。

モデルと”weights"は一体物なので、目的に応じて、モデルに変更を加える。

*Advantages of transfer learning

 学習済みモデルの”知識”を上手に使えば次のようなメリットがある。

・Improved baseline performance

 学習曲線の初期値が高く、立ち上がりも早く、飽和も早く、高止まりする。

・Model-development time

 学習済みモデルを改造するだけなので、モデル開発時間は大幅に短縮される。

・Improved final performance

 高性能モデルを良質なデータセットで訓練しているので、高性能が期待できる。

*Transfer learning strategies

 種々の考え方がまとめられている。

 たとえば、ドメインとタスクが同一の場合に最良の結果が期待されるのだが、ドメインが異なる、タスクが異なる、などの場合に考慮すべき事項が示されている。 

*Transfer learning and deep learning

・Transfer learning methodologies

        Feature-extraction:学習済みモデルの最後の全結合層を除去して、別の分類器                                           に入れ替えることにより、特徴量の抽出を行う。

        Fine-tuning:学習済みモデルをそのまま用いるが、学習済みパラメータを部分的                                  に 凍結解除して学習させる方法。これにより、高度なモデルと良質                                  な学習済みパラメータを使用して、目的のタスクを良質に行える。

・Pretrained model

 学習済みモデルは、誰でも使えるようになっている。

 Kerasでは、Xception, VGG16, VGG19, Resnet50, InceptionV3, MobileNet, DensNet121などをImageNetで学習させたモデルが用意されている。

・Applications

 学習済みモデルは、すでに、様々な分野で広く使われている。

      Transfer learning with text data : sentiment analysis, document classification

      Transfer learning with computer vision : style transfer, face detection

      Transfer learning with speech/audio : Automatic Speech Recognition

*Deep transfer learning types

 いずれもtransfer learningである。内容は少しずつ異なっているが、ヒトによって使われ方が異なっていることがあるので、この本の中では、ここで説明した定義に従うとのこと。

・Domain adaptation

・Domain confusion

・Multitask learning

・One-shot learning

A Baysian Approach to Unsupervised One-Shot Learning of Object Categories, Li Fei-Fei, Rob Fergus and Pietro Perona, ICCV 2003

理解が正しければ、3種類の物体について十分な量のデータで訓練した後、4種類目の物体を1枚の画像で訓練して、4種類目の物体を有意な確率で識別できた例である。 

・Zero-shot learning

訓練データ中に、あるラベルに対応するデータがない状態。例えば、ImageNetで、飛行機のデータが全く無い(意図的に除く)場合に、訓練後に、飛行機の画像を入力したら、飛行機に分類されるか否かという命題のようだ。

特徴量空間における類似性の問題だと思うのだが、これを全分類データに対して行えば、特徴量空間における物体の類似性が得られそうだが、それと、機械学習での特徴量分布を比較するとか、モデル間での違いを調べるとかするのはどうだろう。計算資源が膨大になるので、当分は誰もやらないだろうな。

簡単なデータベースでやってみるかな。同じ条件で、one-shot learningもできそうだな。モデルによって結果が違ってくるのかな。

*Challenges of transfer learning

 transfer learningは、はかり知れないポテンシャルがある。と同時に、研究開発が必要な、核心にふれる問題点がある。

・Negative transfer

 transfer learningによる改善が見られず、かえって悪くなることがある。ソースとターゲットで、ドメインやタスクの類似度に問題があるとか、transfer learningの方法にも課題はあるかもしれない。

・Transfer bounds

 ”知識”がどれだけ移転されたかを定量的にはかることができれば、transfer learningをより効果的に行うとか、適用可能性を評価することができる。いくつか研究はあるが、これ以上はふれない。読者諸氏の奮起に期待する。

 

Chapter 5:  Unleashing the Power of Transfer Learning

 著者らは、F. Chollet氏に、Kerasの開発および、Deep Learning with Pythonにおいてtransfer learningが効果的であることを述べていることに対して感謝の意を表明している。(自分も昨年の6月に読んで、transfer learningはすごい技術だと感じたが、まだ全てにおいてレベルが不足していて、ついていけなかった。その後のKaggleのコンペAPTOS2019では、自作のCNNをこねくりまわしていた。ちゃんと読み返さないといけないな。テキスト全体が、示唆に富む言葉であふれているのだから。)

*The need for transfer learning

 ”知識”の適切な移転は時間短縮と高精度化につながる。

*Building CNN models from scratch

 F. Cholletさんの著書とよく似たストーリーなのでとりあえず、パス。

*Leveraging transfer learning with pretrained CNN models

 学習済みモデルを用いたfeature extractingと、学習済みモデルのファインチューニングを行う。

・Understanding the VGG-16 model

 192ページのVGG-16 Model Architectureと

 193ページのVanilla, Feature Extractor, Fine-Tuningのモデルは、非常にわかりやすい。

 特に193ページの図面は、特徴量抽出のモデルをどうやって作るのか、ファインチューニングのモデルをどうやって作るのかが、一目でわかる。

 これらの図面を見るだけでも、このテキストは価値があったと思う。

・Feature Extractor

 ImageNetデータセットで学習済みのVGG-16の、最後の3層、4096チャンネルのDwnce FC Layer 1と4096チャンネルのDence FC Layer 2と1000チャンネルのOutput Layerを除去する。次に、除去した場所に、新たな3層、512チャンネルのDwnce FC Layer 1と512チャンネルのDence FC Layer 2と2チャンネルのOutput Layerを挿入する。ダウンロードした学習済みの重みを凍結し、イヌとネコの画像データセットを用いて学習させ、最後に、テスト用のイヌとネコの画像を分類する。最後に、自前のCNNでイヌとネコの画像データセットで学習させ、テスト用のイヌとネコの画像を分類した結果と比較する。分類器だけの交換でも、自前のCNNでのaccが0.80~0.85だったのが、0.90くらいまで上がる。

・Fine-Tuning

 ImageNetデータセットで学習済みのVGG-16の最後の3層を置き換えるところまでは、上記Feature Extractorとまったく同じ。違うのは、学習済みの重みを全部凍結するのではなく、ブロック1から3まで凍結し、ブロック4と5の重みは学習可能にする。この状態で、訓練し、テストすると、accが0.96くらいになる。学習済みの高性能なCNNを使わなければ、画像分類で0.96は到底無理である。

 KaggleのAPTOS2019のときに、学習済みのVGG16を使う方法がよくわからず、VGG16 のモデルで1から学習させるしかなかった。Data augmentation、dropout。batchnormalization、などいろいろ試したが、0.85に達するのがやっと、という感じであった。

 F. CholletさんのDeep Learning with Pythonを片手に、APTOS2019に挑戦していたのだが、ファインチューニングをやらなかった理由はもう1つあって、眼底写真の画像分類に対して、ImageNetの画像データを使った事前学習モデルが役に立つわけなかろうと思っていたところもある。結果はわからないが、今なら、なんとしても、ImageNet画像データで学習済みのResNet50なんかを使ってみたいと思う。工学の世界だから、何でも試してみないとダメなんだと思う。

 F. Cholletさんのテキストを見ると、153ページに、Fine-tuningのわかりやすい模式図がのっている。きちんと見ていなかったかな。Fine-tuningは、5番目のブロックのみを使っていて、0.96を得ている。

 APTOS2019で、Fine-tuningを使って、late submissionに挑戦してみるかな。

*Evaluating our deep learning models

 

Chapter 6:  Image Recognition and classification

 

Chapter 7:  Text Document Categorization

 

Chapter 8:  Audio Event Identification and Classification

*Understanding audio event classification

*Exploratory analysis of audio events

*Feature engineering and representation of audio events

*Audio event classification with transfer learning

*Building a deep learning audio event identifier

 

Chapter 9: DeepDream

 

Chapter 10:  Style Transfer

・F. Chollet氏のプログラムを写経していたので、VGG16の転移学習であることはわかっていたが、4章で説明されている類型のどれに相当するのか、具体的にどう利用しているのかの詳細はまだ理解できていない。

*Understanding neural style transfer

*Image preprocessing methodology

*Building loss functions

*Constructing a custom optimizer

*Style transfer in action

 

Chapter 11: Automated Image Caption Generator

 

Chapter 12:  Image Colorization

 DNNにより、モノクロ画像に色を付ける。

 ここでも、transfer learning が活躍しているようである。

*Problem statement

・自分なら、この課題にどのように取り組むか、考えてから前に進め、と書いてある。

*Color images

*Building a coloring deep neural network

*Challenges

*Further improvement

Deep Koalarization: Image Colorization using CNNs and Inception-Resnet-v2

f:id:AI_ML_DL:20200309145258p:plain

f:id:AI_ML_DL:20200309145740p:plain

 

 つづく

 

*APTOS2019で、Fine-tuningを使って、late submissionに挑戦してみるかな。

 

f:id:AI_ML_DL:20200306211302p:plain

style=112 iteration=1

f:id:AI_ML_DL:20200306211406p:plain

style=112 iteration=20

f:id:AI_ML_DL:20200306211449p:plain

style=112 iteration=500