TensorFlow : Edward : Getting Started (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 11/18/2018
作成日時 : 10/14/2018
* 本ページは、Edward サイトの Getting Started を翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
貴方の最初の Edward プログラム
Edward の確率的モデリングはランダム変数の単純な言語です。ここではベイジアン・ニューラルネットワークを示します。それはその重み上に事前分布を持つニューラルネットワークです (この例は簡略しています; Jupyter notebook による対話的バージョンは こちら で利用可能です)。
最初に cosine 関係を持つ 50 観測の toy データセットをシミュレートします。
import numpy as np x_train = np.linspace(-3, 3, num=50) y_train = np.cos(x_train) + np.random.normal(0, 0.1, size=50) x_train = x_train.astype(np.float32).reshape((50, 1)) y_train = y_train.astype(np.float32).reshape((50, 1))
次に、2-層ベイジアン・ニューラルネットワークを定義します。ここでは、tanh 非線形性を持つニューラルネットワークを手動で定義します。
import tensorflow as tf from edward.models import Normal W_0 = Normal(loc=tf.zeros([1, 2]), scale=tf.ones([1, 2])) W_1 = Normal(loc=tf.zeros([2, 1]), scale=tf.ones([2, 1])) b_0 = Normal(loc=tf.zeros(2), scale=tf.ones(2)) b_1 = Normal(loc=tf.zeros(1), scale=tf.ones(1)) x = x_train y = Normal(loc=tf.matmul(tf.tanh(tf.matmul(x, W_0) + b_0), W_1) + b_1, scale=0.1)
次に、データからモデルについて推論を行ないます。変分推論を使用します。重みとバイアスに渡り正規近似を指定します。
qW_0 = Normal(loc=tf.get_variable("qW_0/loc", [1, 2]), scale=tf.nn.softplus(tf.get_variable("qW_0/scale", [1, 2]))) qW_1 = Normal(loc=tf.get_variable("qW_1/loc", [2, 1]), scale=tf.nn.softplus(tf.get_variable("qW_1/scale", [2, 1]))) qb_0 = Normal(loc=tf.get_variable("qb_0/loc", [2]), scale=tf.nn.softplus(tf.get_variable("qb_0/scale", [2]))) qb_1 = Normal(loc=tf.get_variable("qb_1/loc", [1]), scale=tf.nn.softplus(tf.get_variable("qb_1/scale", [1])))
tf.get_variable の定義は変分ファクターのパラメータが変化することを可能にします。それらは総て 0 に初期化されます。標準偏差パラメータは softplus 変換に従ってゼロより大きいものとして制約されます。
今、データが与えられてモデルの潜在変数を推論するために Kullback-Leibler ダイバージェンス で変分推論を実行します。
1000 反復を指定します。
import edward as ed inference = ed.KLqp({W_0: qW_0, b_0: qb_0, W_1: qW_1, b_1: qb_1}, data={y: y_train}) inference.run(n_iter=1000)
最後に、モデル fit を批評します (= criticize) 。ベイジアン・ニューラルネットワークはニューラルネットワークに渡る分布を定義しますので、グラフィカルなチェックを遂行できます。
推論されたモデルからニューラルネットワークを描いてそれがどの程度上手くデータにフィットするかを可視化します。
モデルは観測された領域の $x$ と $y$ 間のコサイン関係を捕捉しています。
以上