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
作曲:MuseNet
*GPT-2:性能が良くなると、悪用される可能性があることから、開発したOpenAIが出荷をコントロール(高性能なものは出さない)しているとのこと。
*Transformerは、RNN(LSTM)やCNNを使っていない。
画像生成:Pro-GAN, SAGAN, BigGAN, StyleGAN
言語処理の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
attentionの単語は、この論文の中では、直上に張り付けた文章の下から4行目と5行目に3回出てくるだけである。”a mechanism of attension, pay attention to, attention mechanism”
へたな説明はやめておく。
この論文では、エンコーダ・デコーダ部分にちょっと追加しただけのように見えるが、このアイデアを中心に据えた次の論文が、脚光をあびることとなった。
それが、"Attention Is All You Need : NIPS 2017"である。
この論文の序文に、次の文章がある。
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は、ふむふむと納得するしかない。オリジナル論文のそれらしき箇所。
ちょっとだけ、写経しておく。
完全なシーケンシャルモデルではないので、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の変革の内容を表しているようなので、それぞれの講演からキーワードを捉えて、勉強してみよう。
つづく