TensorFlow : Edward Tutorials : Tensorboard (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/18/2018
* 本ページは、Edward サイトの Tutorials : Tensorboard を翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
Tensorboard
TensorBoard は Edward プログラムを理解し、デバッグし、そして最適化することを容易にする可視化ツールの一式です。貴方はそれを「TensorFlow グラフを可視化して、グラフの実行についての量的なメトリクスをプロットして、そしてそれを通過する画像のような追加データを表示する」(tensorflow.org) ために使用できます。
このチュートリアルの Jupyter notebook バージョンは こちら で利用可能です。
TensorBoard を利用するためには、inference (推論) の間にログをストアするためのディレクトリを最初に指定する必要があります。例えば、手動で inference を制御する場合、次を呼び出します :
inference.initialize(logdir='log')
catch-all inference.run() を使用している場合、引数として logdir を含めます。inference が動作しているとき、ファイルは作業ディレクトリ内の log/ に出力されます。コマンドラインで、TensorBoard を実行してそのディレクトリをポイントします。
tensorboard --logdir=log/
コマンドは TensorBoard へアクセスするための web アドレスを提供します。デフォルトでは、それは http://localhost:6006 です。正しく動作すれば、上の図のような何かを見るはずです。
You’re set up!
TensorBoard の命名 (= naming) をクリーンアップするためには追加のステップを取る必要があります。特に、計算グラフでランダム変数と tensor のための名前を configure するかもしれません。具体的な例を提供するために、教師あり学習 (回帰) チュートリアル を拡張します、そこではタスクはラベル付けされたサンプル $\{(x_n, y_n)\}$ から隠れ構造を推論します。
データ
$40$ データポイントの訓練とテストセットをシミュレートします。それらは入力 $\mathbf{x}_n\in\mathbb{R}^{5}$ と出力 $y_n\in\mathbb{R}$ のペアから成ります。それらは正規分布に従うノイズを伴う線形依存性を持ちます。
def build_toy_dataset(N, w): D = len(w) x = np.random.normal(0.0, 2.0, size=(N, D)) y = np.dot(x, w) + np.random.normal(0.0, 0.01, size=N) return x, y ed.set_seed(42) N = 40 # number of data points D = 5 # number of features w_true = np.random.randn(D) * 0.5 X_train, y_train = build_toy_dataset(N, w_true) X_test, y_test = build_toy_dataset(N, w_true)
モデル
モデルをベイジアン線形回帰として仮定します (Murphy, 2012)。$N$ データポイント $(\mathbf{X},\mathbf{y})=\{(\mathbf{x}_n, y_n)\}$ のセットに対して、モデルは次の分布を仮定します :
\[
\begin{aligned}
p(\mathbf{w})
&=
\text{Normal}(\mathbf{w} \mid \mathbf{0}, \sigma_w^2\mathbf{I}),
\\[1.5ex]
p(b)
&=
\text{Normal}(b \mid 0, \sigma_b^2),
\\
p(\mathbf{y} \mid \mathbf{w}, b, \mathbf{X})
&=
\prod_{n=1}^N
\text{Normal}(y_n \mid \mathbf{x}_n^\top\mathbf{w} + b, \sigma_y^2).\end{aligned}
\]
潜在変数は線形モデルの重み $\mathbf{w}$ と (バイアスとしても知られる) 切片 $b$ です。$\sigma_w^2,\sigma_b^2$ は既知の事前分散で $\sigma_y^2$ は既知の尤度分散であると仮定します。尤度の平均は入力 $\mathbf{x}_n$ の線形変換で与えられます。
$\sigma_w,\sigma_b,\sigma_y=1$ を固定して、Edward でモデルを構築しましょう。
with tf.name_scope("model"): X = tf.placeholder(tf.float32, [N, D], name="X") w = Normal(loc=tf.zeros(D, name="weights/loc"), scale=tf.ones(D, name="weights/scale"), name="weights") b = Normal(loc=tf.zeros(1, name="bias/loc"), scale=tf.ones(1, name="bias/scale"), name="bias") y = Normal(loc=ed.dot(X, w) + b, scale=tf.ones(N, name="y/scale"), name="y")
ここで、プレースホルダ X を定義します。推論の間、データのバッチに従ってこのプレースホルダに値を渡します。名前スコープもまた使用します。これは with コンテキストの総ての tensor にスコープの名前を prefix ("model/") として追加します。同様に、グループ化された命名システムのもとに各ランダム変数のパラメータに名前付けします。
推論
さて変分推論を使用して事後分布の推論に取り掛かります。変分モデルを重みに渡る fully factorized normal として定義します。変分ファミリでグループ命名にもう一つのスコープを追加します。
with tf.name_scope("posterior"): qw_loc = tf.get_variable("qw/loc", [D]) qw_scale = tf.nn.softplus(tf.get_variable("qw/unconstrained_scale", [D])) qw = Normal(loc=qw_loc, scale=qw_scale, name="qw") qb_loc = tf.get_variable("qb/loc", [1]) qb_scale = tf.nn.softplus(tf.get_variable("qb/unconstrained_scale", [1])) qb = Normal(loc=qb_loc, scale=qb_scale, name="qb")
Kullback-Leibler ダイバージェンスで変分推論を実行します。アルゴリズムのブラックボックスの確率的勾配を計算するために $5$ 潜在変数サンプルを使用します。(より詳細のためには、$\text{KL}(q\|p)$ チュートリアル を見てください。)
inference = ed.KLqp({w: qw, b: qb}, data={X: X_train, y: y_train}) inference.run(n_samples=5, n_iter=250, logdir='log/n_samples_5')
250/250 [100%] ██████████████████████████████ Elapsed: 5s | Loss: 50.865
オプションで、"inference" 名前スコープを含めても良いです。もしそれが欠けているのであれば、チャートは自然に分割されてモノリシックな "inference" のもとで自動的にグループ化はされません。もし追加されれば、計算グラフは僅かにより体系化されます。
批評
学習を調査して任意の問題を診断するために TensorBoard を使用できます。上のコマンドで TensorBoard 実行後、タブをナビゲートできます。
下で上のコードが n_samples ハイパーパラメータの異なる configuration で 2 回実行されると仮定します。log ディレクトリは log/n_samples_ であると指定しました。デフォルトでは、同じ実験の複数の実行が TensorBoard のために正しくログを体系化するように Edward はまたタイムスタンプされたサブディレクトリを含みます。inference の間に log_timestamp=False を指定することでそれを無効にできます。
TensorBoard スカラー
スカラーはアルゴリズム、wall time そして relative wall time の反復に渡るスカラー値情報を提供します。Edward では、タブはモデルか近似しているファミリのスカラー TensorFlow 変数 (自由パラメータ) の値を含みます。
変分推論では、損失関数や個々の項への分解のような情報もまた含みます。この特定の例は n_samples=1 は n_samples=5 より高い分散を持つ傾向にありますが依然として同じ解に収束することを示します。
TensorBoard グラフ
グラフはモデル、近似ファミリそして推論の基礎となっている計算グラフを表示します。ボックスは同じ名前スコープのもとにグループ化された tensor を示します。グラフの名前のクリーンアップ貴方のコードをより良く理解して最適化することを容易にします。
TensorBoard 分布
分布は反復に渡る各非スカラー TensorFlow 変数の分布を表示します。これらの変数は貴方のモデルと近似ファミリの自由パラメータです。
TensorBoard ヒストグラム
ヒストグラムは分布と同じ情報を表示しますが反復に渡り変化する 3-D ヒストグラムとしてです。
References
- Murphy, K. P. (2012). Machine learning: A probabilistic perspective. MIT Press.
以上