Slide 1

Slide 1 text

TensorFlow 2 : Keras 入門&最新(?)ライブラリー紹介 中井悦司

Slide 2

Slide 2 text

Etsuji Nakai Solutions Architect, Google Cloud $ who am i

Slide 3

Slide 3 text

Contents ● Tensorflow 2 & Keras 入門 ● Tensorflow Probability 入門 ● Quantum Tensorflow 入門

Slide 4

Slide 4 text

Tensorflow 2 & Keras 入門

Slide 5

Slide 5 text

Tensorflow 2.x の特徴:Eager Execution 5 ● Tensorflow では、専用の tf オブジェクトを用いて計算処理を実施する(NumPy だと、np.array オブ ジェクトを用いて計算するのと同様) ● tf オブジェクトに対する計算方式のデフォルトが Define and Run から Eager Execution に変更 ● Define and Run:すべての計算処理を静的な「計算グラフ」として定義した後に計算を行う ○ if 文などの制御構造(条件分岐)を含む計算処理も「計算グラフ」として定義する必要があるた め、そのような計算処理をしたい場合、コードの書き方が非直感的で難しかった ● Eager Execution:NumPy などと同様にコードの実行と同時に計算処理を行う ○ 制御構造を含む関数内で tf オブジェクトに対する計算処理を動的に実行可能 ● ・・・とは言え、Keras を使う場合は、(Sub-classing を用いる場合を除いて)これらの違いは意識す る必要はありません。

Slide 6

Slide 6 text

Tensorflow 2.x の特徴:Dataset 機能 6 ● ストレージなどに格納された学習データに前処理を施してバッチ化する機能 ○ ファイル読み出し、前処理、シャッフル、繰り返し、バッチ化、プリフェッチをまとめて実行す る Generator を定義しておき、トレーニングデータとして利用 # all_image_paths : 画像ファイルのファイルパスのリスト # all_image_labels : 正解ラベルのリスト def load_and_preprocess_image(path): image = tf.io.read_file(path) image = tf.image.decode_jpeg(image, channels=3) image = tf.image.resize(image, [192, 192]) / 255.0 return image image_ds = tf.data.Dataset.from_tensor_slices(all_image_paths).map(load_and_preprocess_image, num_parallel_calls=AUTOTUNE) label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels, tf.int64)) image_label_ds = tf.data.Dataset.zip((image_ds, label_ds)) ds = image_label_ds.shuffle(buffer_size=image_count).repeat().batch(BATCH_SIZE).prefetch(buffer_size=AUTOTUNE) model.fit(ds, epochs=100, steps_per_epoch=image_count/BATCH_SIZE) ファイル読み込み +前処理関数 パスのリストに 読み込み関数適用 シャッフル、繰り返し、 バッチ化、プリフェッチを適用 得られた Generator を トレーニングデータに指定 GPU による学習と CPU によるデータ 読み出しを並列実行

Slide 7

Slide 7 text

Tensorflow と Keras の関係 7 Keras TensorFlow Distributed Execution Engine (C++) CPU GPU TPU C++, Python, R, GO, Java, Swift, ... layers, losses, metrics, optimizers, etc. Estimator APIs High-level APIs for building custom models ML Ingredients Premade Estimators Runs on different hardware Highly efficient C++ implementation Frontend SDKs for full control Dataset Android TensorFlow Core APIs Do anything XLA iOS Raspberry PI ... Keras Models - sequential - functional ● Keras:ニューラルネット ワークモデルを Python の コードで定義するための API (言語仕様) ● Tensorflow 2.x では、 Keras API を実装したライブ ラリを tensorflow.keras と して標準提供

Slide 8

Slide 8 text

Keras のプログラミングモデル:Sequential API 8 model = models.Sequential() model.add(layers.Dense(2, activation='relu',input_shape=(2,), name='hidden1')) model.add(layers.Dense(2, activation='relu', name='hidden2')) model.add(layers.Dense(1, activation='sigmoid', name='output')) model.summary() ================================================================== Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= hidden1 (Dense) (None, 2) 6 _________________________________________________________________ hidden2 (Dense) (None, 2) 6 _________________________________________________________________ output (Dense) (None, 1) 3 ================================================================= Total params: 15 Trainable params: 15 Non-trainable params: 0 _________________________________________________________________ ● 入力から出力までが(枝分かれなどが無い)一直線のシンプルなモデルを定義 隠れ層1 隠れ層2 出力層 入力データ 出力データ 空のモデルを用意して、 add メソッドで レイヤーを追加していく

Slide 9

Slide 9 text

Keras のプログラミングモデル:Function API 9 ● 複数の入出力層を持つモデルを定義したり、複数のモデルを組み合わせる際に使用する 生成モデル 識別モデル 潜在変数 識別結果 discriminator.trainable = False gan_input = tf.keras.Input(shape=(latent_dim,)) gan_output = discriminator(generator(gan_input)) gan_model = models.Model(gan_input, gan_output) gan_model.summary() ================================================================== Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 64)] 0 _________________________________________________________________ sequential (Sequential) (None, 784) 614145 _________________________________________________________________ sequential_1 (Sequential) (None, 1) 212865 ================================================================= Total params: 827,010 Trainable params: 614,145 Non-trainable params: 212,865 _________________________________________________________________ モデルを通常の関数の ように組み合わせていき、 最後に入出力層を指定する

Slide 10

Slide 10 text

Keras のプログラミングモデル:Sub-classing 10 ● Layer クラスや Model クラスのサブクラスを定義して、条件分岐などを含む振る舞いを直接に 記述する class Linear(keras.layers.Layer): def __init__(self, units=32, input_dim=32): super(Linear, self).__init__() w_init = tf.random_normal_initializer() self.w = tf.Variable( initial_value=w_init(shape=(input_dim, units), dtype="float32"), trainable=True, ) b_init = tf.zeros_initializer() self.b = tf.Variable( initial_value=b_init(shape=(units,), dtype="float32"), trainable=True ) def call(self, inputs): return tf.matmul(inputs, self.w) + self.b このレイヤーで行う計算処理を 通常の関数として実装する

Slide 11

Slide 11 text

Keras API を用いたモデル定義と学習処理の例 11 ● 青点で示したデータをニューラルネットワークによる回帰モデルでフィッティングした結果 ※ ここでは、ニューラルネットワークモデルに適さないデータを意図的に用いています。    この後で登場する確率モデル(ガウス過程)を用いるとより適切なフィッティングが      実現されます。

Slide 12

Slide 12 text

Keras API を用いたモデル定義と学習処理の例 12 model = models.Sequential() model.add(layers.Dense(256, activation='relu', input_shape=(1,))) model.add(layers.Dense(128, activation='relu')) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1)) model.summary() ================================================================== Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 256) 512 _________________________________________________________________ dense_1 (Dense) (None, 128) 32896 _________________________________________________________________ dense_2 (Dense) (None, 64) 8256 _________________________________________________________________ dense_3 (Dense) (None, 1) 65 ================================================================= Total params: 41,729 Trainable params: 41,729 Non-trainable params: 0 _________________________________________________________________ model.compile(optimizer='adam', loss='mse') history = model.fit(xs, ys, batch_size=len(xs), epochs=10000, verbose=0) DataFrame({'loss': history.history['loss']}).plot()

Slide 13

Slide 13 text

Tensorflow Probability 入門

Slide 14

Slide 14 text

Tensorflow Probability とは? 14 https://www.tensorflow.org/probability

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

「確率分布」を計算対象とするライブラリー 16 ● Tensorflow が計算対象とする tf オブジェクトとして、「確率分布」のクラスを追加 ● 確率分布に対する数値計算処理を Tensorflow の実行エンジンを用いて高速に実行 ※ 確率分布:ある観測量 X がどのような値をとるかを確率的に示したもの ● これを利用すると、特定の予測値ではなく、その背後にある「確率分布」そのものを予測するモデルが 構築できます ポアソン分布 正規分布

Slide 17

Slide 17 text

特定の値を予測する(普通の)モデル 17 ● 領域によって分散が異なるデータであっても、モデルの出力には分散に関する情報は含まれない model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape=(1,))) model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(1)) model.summary() ================================================================== Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 64) 128 _________________________________________________________________ dense_1 (Dense) (None, 32) 2080 _________________________________________________________________ dense_2 (Dense) (None, 1) 33 ================================================================= Total params: 2,241 Trainable params: 2,241 Non-trainable params: 0 _________________________________________________________________ 出力層は単一ノード (単一の実数値を出力) x 軸の値によって データの分散が異なる

Slide 18

Slide 18 text

確率分布を予測するモデル 18 ● x の値ごとに、分散が異なる(独立な)正規分布が隠れていると仮定して、その分布を予測するモデル model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape=(1,))) model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(2)) # predict loc and scale model.add(tfp.layers.DistributionLambda( lambda t: tfd.Normal(loc=t[..., :1], scale=tf.math.softplus(t[..., 1:])) )) model.summary() ================================================================== Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_3 (Dense) (None, 64) 128 _________________________________________________________________ dense_4 (Dense) (None, 32) 2080 _________________________________________________________________ dense_5 (Dense) (None, 2) 66 _________________________________________________________________ distribution_lambda (Distrib ((None, 1), (None, 1)) 0 ================================================================= Total params: 2,274 Trainable params: 2,274 Non-trainable params: 0 _________________________________________________________________ 平均と√分散を出力 正規分布の オブジェクトを出力 確率分布そのものが得ら れるので、新しいサンプ ルを取得することも可能 平均と2×√分散をプロット https://github.com/enakai00/tfp_examples/blob/main/DNN_regression_for_means_and_variances.ipynb

Slide 19

Slide 19 text

19 普通に平均と分散を 予測するモデルを作れば いいだけじゃん

Slide 20

Slide 20 text

ガウス過程:確率的に「関数」を出力するモデル 20 ● 「ガウス過程」は、このような確率分布の1つで、滑らかに変化する関数を予測す る際に用いられる ⇨ パラメーター値(カーネル関数)により、変化の振れ幅や頻 度が変わるので、トレーニングデータを用いてパラメーターチューニングする ● ・・・と言った処理をまとめて行うライブラリが Tensorflow Probability には予め 用意されています くじを引くと関数 y=f(x) が1つ出てくる ● たとえば、先ほどのデータを「一年間の気温変化のデータを過去50年分集めたもの」と仮定して、 「来年以降の気温変化 y = f(x) を予測するモデル」を作る場合を考えると・・・ ● 夏の気温は、「日々の変動が激しい」のではなく、「年ごとの変動が激しい」(冷夏だったり、暑夏 だったり)と考えるのが自然なので、x ごとに独立した確率分布で値を出力するのではなく、一年間の データを(滑らかに変化する関数として)まとめて出力するモデルが必要 ● つまり、一連の(相関を持った)値がまとめて得られる確率分布、言い換えると、「(滑らかに変化す る)関数 y = f(x) を確率的に出力する分布」が必要

Slide 21

Slide 21 text

ガウス過程による欠損値の推定 21 ● ガウス過程を用いると関数全体の変化 に基づいて、欠損部分の変化が予測で きていることが分かります ニューラルネットワーク による予測 「関数の分布」を予測し た後に、いくつかのサン プルを取得した結果 https://github.com/enakai00/tfp_examples/blob/main/Gaussian_Process_Regression.ipynb

Slide 22

Slide 22 text

Quantum Tensorflow 入門

Slide 23

Slide 23 text

Quantum Processor の開発 23 https://japan.googleblog.com/2019/10/quantum-supremacy-using-programmable.html

Slide 24

Slide 24 text

量子回路 = 量子ビットの制御手順 24 量子ビットの 状態を測定 H H 1ビットの足し算を 同時に実行する量子回路

Slide 25

Slide 25 text

デジタル論理回路との比較 25 Time (sequence) Space (layout) デジタル論理回路 ● 出力結果は決定的 ● NAND ゲートの組み合わせ であらゆる演算が構成可能 量子回路 ● 測定結果は確率的 ● 1 qubit rotation と 2 qubit CNOT であらゆる 演算が構成可能 H H

Slide 26

Slide 26 text

これまでの量子コンピューターの使い方 26 Cirq 量子コンピューター API コール 実行結果 量子回路を記述して、 量子コンピューターで実行する Python ライブラリー 人間が量子回路を考えて Cirq で実装する ● 量子回路は、人間が考えて実装する ● 量子コンピューターの実行結果は確率的に得られるので、多数の結果を収集して、統計的に答えを出す

Slide 27

Slide 27 text

Quantum Tensorflow とは? 27 https://www.tensorflow.org/quantum

Slide 28

Slide 28 text

28

Slide 29

Slide 29 text

Quantum Tensorflow が提供する機能 29 ● Tensorflow の ML モデルによる計算処理と Cirq による量子計算処理を組み合わせて実行する機能を提供 ● 利用例:量子回路に含まれるパラメーター値を ML モデルで最適化 Cirq 量子コンピューター API コール 実行結果 ML モデル パラメーター設定値 実行結果 実行結果をトレーニングデータとして 量子回路に含まれるパラメーターの 最適値を ML モデルで計算する

Slide 30

Slide 30 text

Hello World 的なサンプル 30 ● 量子プロセッサのハードウェアに製造過程で生じたズレがあるという想定 ● ズレを補正して、量子ビットを特定の状態(例えば |0>)に初期化する量子回路を設計したい ● 補正用量子回路に含まれるパラメーターの値を Tensorflow のモデルでチューニングする https://www.tensorflow.org/quantum/tutorials/hello_many_worlds Tensorflow の ML モデル Cirq で記述した量子回路 量子回路の出力値と期待する 結果の差を誤差関数とする 量子回路のパラメータ値 を ML モデルで計算

Slide 31

Slide 31 text

量子回路そのものを機械学習モデルとして利用するアイデア 31 ● 画像データが「犬であるか」「犬でないか」を判別する分類モデル、作ったことありますよね??? ● 「多数のパラメーターを含む(適当に複雑な)ニューラルネットワークを用意して、正解率が上がるよ うにパラメーターをチューニングする」というのが機械学習の基本でした ● 同様に、ある量子デバイスから得られた量子データ(量子ビットとして記録されたデータ)が「○○で るか」「○○でないか」を判別する量子回路を作りたくなるかも知れません ● 「多数のパラメーターを含む(適当に複雑な)量子回路を用意して、正解率が上がるようにパラメー ターをチューニングする」ことで、これが実現できる(かも知れません) ● Quantum Tensorflow を用いるとこれを実現するコードが簡単に書けます ※ パラメーターのチューニングそのもの(勾配降下法の計算)は、普通に古典コンピューターで     行います。トレーニングデータに対する予測結果を得る部分を量子コンピューターで行います

Slide 32

Slide 32 text

量子畳み込みニューラルネットワーク 32 ● Cirq で記述した量子回路をレイヤーに含む「量子機械学習モデル」を Tensorflow で記述して、学習処 理を実行する https://www.tensorflow.org/quantum/tutorials/qcnn トレーニング用の量子データを 生成する量子回路 量子データの種類を判別する量子回路 (ここに含まれるパラメーターを チューニングする) 正解ラベル 量子回路の出力値と 正解ラベルの差

Slide 33

Slide 33 text

Quantum Tensorflow によるハイブリッド ML モデル 33 ● Quantum Tensorflow では、ML モデルの隠れ層に Cirq を介した量子コンピューターによる計算処理を 組み込んだ、古典 - 量子ハイブリッド ML モデルが作成できる API コール 実行結果 (古典)隠れ層 量子隠れ層 (古典)隠れ層 量子コンピューター 入力データ 出力値 勾配降下法による学習処理は 古典コンピューターで実行 Cirq で記述した(チューニング可能な パラメーターを含む)量子回路

Slide 34

Slide 34 text

34 量子回路の微分なんて できないじゃん。Gradient どうやって計算すんの?

Slide 35

Slide 35 text

35 https://www.tensorflow.org/quantum/tutorials/gradients 量子回路の勾配計算 チュートリアルを ご参照ください

Slide 36

Slide 36 text

No content