ホーム » 「Edward」タグがついた投稿

タグアーカイブ: Edward

TensorFlow : Edward : Getting Started (notebook)

TensorFlow : Edward : Getting Started (notebook) (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/28/2018

* 本ページは、Edward サイトの Getting Started (notebook) を翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

貴方の最初の Edward プログラム

Edward の確率モデリングは確率変数の単純な言語です。ここではベイジアン・ニューラルネットワークを示します。それはその重み上で事前分布を持つニューラルネットワークです。

web ページ版は Getting Started で利用可能です。

%matplotlib inline
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import edward as ed
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

from edward.models import Normal

plt.style.use('ggplot')
def build_toy_dataset(N=50, noise_std=0.1):
  x = np.linspace(-3, 3, num=N)
  y = np.cos(x) + np.random.normal(0, noise_std, size=N)
  x = x.astype(np.float32).reshape((N, 1))
  y = y.astype(np.float32)
  return x, y


def neural_network(x, W_0, W_1, b_0, b_1):
  h = tf.tanh(tf.matmul(x, W_0) + b_0)
  h = tf.matmul(h, W_1) + b_1
  return tf.reshape(h, [-1])

最初に、コサイン関係を持つ 50 観測の toy データセットをシミュレートします。

ed.set_seed(42)

N = 50  # number of data points
D = 1   # number of features

x_train, y_train = build_toy_dataset(N)

次に、2 層ベイジアン・ニューラルネットワークを定義します。ここでは、tanh 非線形を持つニューラルネットワークを定義します。

W_0 = Normal(loc=tf.zeros([D, 2]), scale=tf.ones([D, 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=neural_network(x, W_0, W_1, b_0, b_1),
           scale=0.1 * tf.ones(N))

次にデータからのモデルについて推論を行ないます。変分推論を使用します。重みとバイアスに渡る正規分布近似を指定します。

qW_0 = Normal(loc=tf.get_variable("qW_0/loc", [D, 2]),
              scale=tf.nn.softplus(tf.get_variable("qW_0/scale", [D, 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 の定義は変分因子のパラメータに変化することを可能にします。それらはランダムに初期化されます。標準偏差パラメータは softplus 変換によりゼロより大きいとして制約されます。

# fit を可視化するための変分モデルからのサンプル関数
rs = np.random.RandomState(0)
inputs = np.linspace(-5, 5, num=400, dtype=np.float32)
x = tf.expand_dims(inputs, 1)
mus = tf.stack(
    [neural_network(x, qW_0.sample(), qW_1.sample(),
                    qb_0.sample(), qb_1.sample())
     for _ in range(10)])
# FIRST VISUALIZATION (prior)

sess = ed.get_session()
tf.global_variables_initializer().run()
outputs = mus.eval()

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
ax.set_title("Iteration: 0")
ax.plot(x_train, y_train, 'ks', alpha=0.5, label='(x, y)')
ax.plot(inputs, outputs[0].T, 'r', lw=2, alpha=0.5, label='prior draws')
ax.plot(inputs, outputs[1:].T, 'r', lw=2, alpha=0.5)
ax.set_xlim([-5, 5])
ax.set_ylim([-2, 2])
ax.legend()
plt.show()

さて、与えられたデータでモデルの潜在変数を推論するために Kullback-Leibler divergence で変分推論を実行します。1000 反復を指定します。

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, n_samples=5)
1000/1000 [100%] ██████████████████████████████ Elapsed: 12s | Loss: -5.755

最後に、モデル fit を批評します。ベイジアン・ニューラルネットワークはニューラルネットワークに渡る分布を定義しますので、グラフィカル・チェックを遂行できます。推論されたモデルからニューラルネットワークを描いてそれがデータにどのくらい上手く fit したかを可視化します。

# SECOND VISUALIZATION (posterior)

outputs = mus.eval()

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
ax.set_title("Iteration: 1000")
ax.plot(x_train, y_train, 'ks', alpha=0.5, label='(x, y)')
ax.plot(inputs, outputs[0].T, 'r', lw=2, alpha=0.5, label='posterior draws')
ax.plot(inputs, outputs[1:].T, 'r', lw=2, alpha=0.5)
ax.set_xlim([-5, 5])
ax.set_ylim([-2, 2])
ax.legend()
plt.show()

モデルは観測された領域の x と y の間のコサイン関係を捕捉しました。

To learn more about Edward, delve in!

 

以上






TensorFlow : Edward API : モデル

TensorFlow : Edward API : モデル (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/28/2018

* 本ページは、Edward サイトの API : API and Documentation – Model を翻訳した上で適宜、補足説明したものです:


* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

Edward API : モデル

確率モデルはデータ \(\mathbf{x}\) と潜在変数 \(\mathbf{z}\) の同時分布 \(p(\mathbf{x},\mathbf{z})\) です。背景については、確率モデル・チュートリアル を見てください。

Edward では、確率変数の単一の言語を使用してモデルを指定します。確率変数 \(\mathbf{x}\) は tensor \(\theta^*\) によりパラメータ化されたオブジェクトで、そこでは一つのオブジェクト内の確率変数の数はそのパラメータの次元により決定されます。

from edward.models import Normal, Exponential

# 単変量正規分布
Normal(loc=tf.constant(0.0), scale=tf.constant(1.0))
# 5 単変量正規分布のベクトル
Normal(loc=tf.zeros(5), scale=tf.ones(5))
# Exponential の 2  x 3 行列
Exponential(rate=tf.ones([2, 3]))

多変量分布については、多変量次元はパラメータの最も内側の (右端の) 次元です。

from edward.models import Dirichlet, MultivariateNormalTriL

# K-次元ディリクレ分布
Dirichlet(concentration=tf.constant([0.1] * K))
#  lower triangular cov を持つ 5 K-次元多変量正規分布のベクトル
MultivariateNormalTriL(loc=tf.zeros([5, K]), scale_tril=tf.ones([5, K, K]))
# K-次元多変量正規分布の 2 x  5 行列
MultivariateNormalTriL(loc=tf.zeros([2, 5, K]), scale_tril=tf.ones([2, 5, K, K]))

確率変数は log_prob(), \(\log p(\mathbf{x}\mid\theta^*)\), mean(), \(\mathbb{E}_{p(\mathbf{x}\mid\theta^*)}[\mathbf{x}]\) そして sample(), \(\mathbf{x}^*\sim p(\mathbf{x}\mid\theta^*)\) のようなメソッドを備えます。更に、各確率変数は計算グラフの tensor \(\mathbf{x}^*\) と関連付けられます、これは単一のサンプル \(\mathbf{x}^*\sim p(\mathbf{x}\mid\theta^*)\) を表します。

これは、深層ニューラルネットワーク、数学演算の多様なセット、そして (TensorFlow 上で構築された) サードパーティのライブラリとの互換性によるような、複雑な決定論的構造を伴う確率変数をパラメータ化することを容易にします。このデザインはまた確率変数の合成に複雑な確率的構造を捕捉することも可能にします。それらは \(\mathbf{x}^*\) 上で作用します。

from edward.models import Normal

x = Normal(loc=tf.zeros(10), scale=tf.ones(10))
y = tf.constant(5.0)
x + y, x - y, x * y, x / y
tf.tanh(x * y)
x[2]  # 3rd normal rv in the vector

compositionality page では、確率変数を組み立てることによりモデルをどのように構築するかを記述します。

 

以上






TensorFlow : Edward API : データ

TensorFlow : Edward API : データ (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/28/2018

* 本ページは、Edward サイトの API : API and Documentation – Data を翻訳した上で適宜、補足説明したものです:


* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

Edward API : データ

データは観測の集合を定義します。Edward ではデータを読むために 3 つの方法があります。これらは three ways to read data in TensorFlow をフォローしています。

Preloaded データ。TensorFlow グラフの定数や変数は総てのデータを保持します。この設定はともに作業するために最速で、データがメモリに載るのであれば推奨されます。データを NumPy 配列か TensorFlow tensor として表します。

x_data = np.array([0, 1, 0, 0, 0, 0, 0, 0, 0, 1])
x_data = tf.constant([0, 1, 0, 0, 0, 0, 0, 0, 0, 1])

推論の間は、メモリ内でデータを一度以上コピーすることを回避するために内部的にはそれらを TensorFlow 変数にストアします。例としては、getting started notebook を見てください。

 
Feeding。手動コードは推論の各ステップを実行するときデータを提供します。この設定は最も優れた制御を提供し、実験に有用です。

データを TensorFlow placeholder として表し、これは実行時に供給されるグラフのノードです。

x_data = tf.placeholder(tf.float32, [100, 25])  # placeholder of shape (100, 25)

推論の間、ユーザは手動で placeholder に (データを) 供給しなければなりません。各ステップで、引数として feed_dict 辞書に渡す間 inference.update() を呼び出します、これは placeholder を実際の値にバインドします。例として、variational auto-encoder スクリプトを見てください。inference update に渡り値が変化しない場合には、最初に inference を構築するときに placeholder を data 引数内の値にバインドすることもできます。

 
ファイルから読む

入力パイプラインが TensorFlow グラフの最初にファイルからデータを読みます。この設定はデータがメモリに fit しない場合に推奨されます。

filename_queue = tf.train.string_input_producer(...)
reader = tf.SomeReader()
...

データを TensorFlow tensor として表し、そこでは tensor はデータリーダーの出力です。推論の間、各 update はデータリーダを通して表わされる新しいバッチ tensor に渡り自動的に評価されます。例として、data unit test (https://github.com/blei-lab/edward/blob/master/tests/inferences/test_inference_data.py) を参照してください。

 

以上






TensorFlow : Edward API : 推論

TensorFlow : Edward API : 推論 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/28/2018

* 本ページは、Edward サイトの API : API and Documentation – Inference を翻訳した上で適宜、補足説明したものです:


* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

Edward API : 推論

推論

確率モデルでどのように推論を遂行するかを記述します。背景については、推論チュートリアル を参照してください。

潜在変数 \((\mathbf{z}, \beta)\) を持つ、データ \(\mathbf{x}_{\text{train}}\) のモデル \(p(\mathbf{x}, \mathbf{z}, \beta)\) を持つと仮定します。事後推論問題を考えます :
\[
q(\mathbf{z}, \beta)\approx p(\mathbf{z}, \beta\mid \mathbf{x}_{\text{train}}),
\]

そこでは タスクは事後分布 \(p(\mathbf{z}, \beta\mid \mathbf{x}_{\text{train}})\) をパラメータ \(\lambda\) でインデックス付けされた分布の族 \(q(\mathbf{z},\beta; \lambda)\) を使用して近似することです

Edward では、z と beta をモデルの潜在変数として、そこでデータ x_train を持つ確率変数 x を観測します。qz と qbeta を事後分布を近似するために定義された確率変数とします。この問題を次のように書きます :

inference = ed.Inference({z: qz, beta: qbeta}, {x: x_train})

Inference は 2 つの入力を取る抽象クラスです。最初は 潜在確率変数 beta と z のコレクションで、それぞれの潜在変数に関連付けられた「事後変数」qbeta と qz を伴います。2 番目は 観測確率変数 x のコレクションで、データ x_train に関係付けられます。

Inference は qbeta と qz の分布のパラメータを事後分布 \(p(\mathbf{z}, \beta\,|\,\mathbf{x}_{\text{train}})\) に近接するように調整します

inference の実行は一つのメソッドを実行するように単純です。

inference = ed.Inference({z: qz, beta: qbeta}, {x: x_train})
inference.run()

Inference はまた訓練手続きの fine control もサポートします。

inference = ed.Inference({z: qz, beta: qbeta}, {x: x_train})
inference.initialize()

tf.global_variables_initializer().run()

for _ in range(inference.n_iter):
  info_dict = inference.update()
  inference.print_progress(info_dict)

inference.finalize()

initialize() は \(\lambda\) のためにアルゴリズムの更新ルール (計算グラフ) を構築します; tf.global_variables_initializer().run() は \(\lambda\) (グラフの TensorFlow 変数) を初期化します; update() は \(\lambda\) を更新するためにグラフを一度実行します、これは収束までループで呼び出されます; finalize() はアルゴリズムのが停止するとき任意の計算を実行します。

run() メソッドはこの手続きの単純なラッパーです。

 

他の設定

推論の間他の設定を強調します。

モデル・パラメータ。モデル・パラメータはモデルのパラメータで、そのために常に点推定を計算してそれについて不確かではありません。それらは tf.Variable で定義され、そこでは推論問題は :
\[
\hat{\theta} \leftarrow^{\text{optimize}}
p(\mathbf{x}_{\text{train}}; \theta)
\]

from edward.models import Normal

theta = tf.Variable(0.0)
x = Normal(loc=tf.ones(10) * theta, scale=1.0)

inference = ed.Inference({}, {x: x_train})

推論アルゴリズムのサブセットだけがモデルパラメータの推定をサポートします。(この推論サンプルはどのような潜在変数も持たないことにも注意してください。それは \(\mathbf{x} = \mathbf{x}_{\text{train}}\) を観測すると仮定して theta を推定することについてのみです。推論が事後推論とパラメータ推定の両者となるようにそれらを追加できます。)

例えば、モデルパラメータは、Keras と TensorFlow Slim のような高位ライブラリからニューラルネットワークを適用するときに有用です。より詳細については model compositionality ページを見てください。

 
条件付き推論 (= Conditional inference)

条件付き推論では、事後分布のサブセットだけが推論されて残りは他の推論を使用して固定されます。推論問題は :
\[
q(\mathbf{z}\mid\beta)q(\beta)\approx
p(\mathbf{z}, \beta\mid\mathbf{x}_{\text{train}})
\]

ここで \(q(\mathbf{z}\mid\beta)\) のパラメータは推定されて \(q(\beta)\) は固定されます。Edward では、確率変数をデータの他の確率変数にバインドすることにより条件付けを可能にします。

inference = ed.Inference({z: qz}, {x: x_train, beta: qbeta})

compositionality ページ では、多くの条件付き推論アルゴリズムを組み合わせてどのように推論を構築するかを記述します。

 
暗黙的な事前サンプル (= implicit prior samples)

潜在変数はそれらに渡るどのような事後推論なしでもモデルで定義可能です。それらは単一のサンプルで暗黙的に周辺化されます。推論問題は :
\[
q(\beta)\approx
p(\beta\mid\mathbf{x}_{\text{train}}, \mathbf{z}^*)
\]

ここで \(\mathbf{z}^*\sim p(\mathbf{z}\mid\beta)\) は事前サンプルです。

inference = ed.Inference({beta: qbeta}, {x: x_train})

例えば、暗黙的な事前サンプルは敵対的生成ネットワークのために有用です。それらの推論問題は潜在変数に渡るどのような推論も要求しません; それは事前分布からのサンプルを使用します。

 

以上






TensorFlow : Edward Tutorials (背景) : 変分推論

TensorFlow : Edward Tutorials (背景) : 変分推論 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/27/2018

* 本ページは、Edward サイトの Tutorials : Background : Variational Inference を翻訳した上で
適宜、補足説明したものです:


* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

変分推論

変分推論は事後推論を最適化 (問題) としてキャストするアルゴリズムのための総称です (Hinton & Camp, 1993; Jordan, Ghahramani, Jaakkola, & Saul, 1999; Waterhouse, MacKay, & Robinson, 1996)。

中心的なアイデアは 2 つのステップを含みます :

  1. 潜在変数に渡る分布の族 \(q(\mathbf{z}\;;\;\lambda)\) を仮定します;
  2. \(q(\mathbf{z}\;;\;\lambda)\) をそのパラメータ \(\lambda\) に渡り最適化して事後分布にマッチさせます。

このストラテジーは事後分布 \(p(\mathbf{z} \mid \mathbf{x})\) を計算する問題を最適化問題に変換します : divergence 尺度を最小化します
\[
\begin{aligned}
\lambda^*
&=
\arg\min_\lambda \text{divergence}(
p(\mathbf{z} \mid \mathbf{x})
,
q(\mathbf{z}\;;\;\lambda)
).\end{aligned}
\]

最適化された分布 \(q(\mathbf{z}\;;\;\lambda^*)\) は事後分布 \(p(\mathbf{z}\mid \mathbf{x})\) へのプロキシーとして使用されます。

Edward は次のような考え方をします: 事後分布は (典型的には) 手に負えない・解決困難な (= intractable) もので、そのため事後分布を最善に近似する潜在変数のモデルを構築しなければなりません。それは、真のデータ生成過程は未知であるために、真の過程を最善に近似するようなデータのモデルを構築するという考えに類似しています。

Edward で定義された変分推論クラスの詳細については、推論 API を見てください。Edward の特定の変分推論アルゴリズムの背景については、他の推論 チュートリアル を見てください。

 

References

  • Hinton, G. E., & Camp, D. van. (1993). Keeping the neural networks simple by minimizing the description length of the weights. In Conference on learning theory. ACM.
  • Jordan, M. I., Ghahramani, Z., Jaakkola, T. S., & Saul, L. K. (1999). An introduction to variational methods for graphical models. Machine Learning, 37(2), 183–233.
  • Waterhouse, S., MacKay, D., & Robinson, T. (1996). Bayesian methods for mixtures of experts. Advances in Neural Information Processing Systems, 351–357.
 

以上






TensorFlow : Edward API : API とドキュメント

TensorFlow : Edward API : API とドキュメント (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/27/2018

* 本ページは、Edward サイトの API : API and Documentation を翻訳した上で適宜、補足説明したものです:


* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

API とドキュメント

Edward のデザインは確率モデリングのためのビルディングブロックを反映しています。それは置き換え可能なコンポーネントを定義し、確率モデルによる急速な実験と研究を可能にします。Edward は革新的な統計学者 George Edward Pelham Box にちなんで命名されています。Edward は統計と機械学習の Box の哲学を追随しています (Box, 1976)。

最初に何某かの現実世界の現象からデータを集めます。それから Box のループ を通して循環します (= cycle) (Blei, 2014)。

  1. 現象の確率モデルを構築する。
  2. モデルとデータが与えられたとき、現象を論証します。
  3. モデルを批評し、改訂して繰り返します。

ここに toy サンプルがあります。子供がコインを 10 回投げて、結果の集合は [0, 1, 0, 0, 0, 0, 0, 0, 0, 1] となり、ここで 0 は裏を 1 は表を表します。彼女はコインが表になる確率に興味があります。これを解析するために、最初にモデルを構築します: 彼女はコイン投げは独立であり同じ確率で表になると仮定するとしましょう。2 番目に、現象を論証します: データが与えられたときモデルの隠れ構造を推論します。最後に、モデルを批評します: 彼女のモデルがコイン投げの現実世界の現象を捕捉しているか否かを解析します。もしそうでない場合には、モデルを改訂して繰り返すかもしれません。

上のこの解析を可能にするモジュールをナビゲートします。API のリストについては reference ページ を見てください。

 

References

  • Blei, D. M. (2014). Build, compute, critique, repeat: Data analysis with latent variable models. Annual Review of Statistics and Its Application, 1, 203–232.
  • Box, G. E. (1976). Science and statistics. Journal of the American Statistical Association, 71(356), 791–799.
 

以上






TensorFlow : Edward Tutorials (背景) : 確率モデルの推論

TensorFlow : Edward Tutorials (背景) : 確率モデルの推論 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/26/2018

* 本ページは、Edward サイトの Tutorials : Background : Inference of Probabilistic Models を翻訳した上で
適宜、補足説明したものです:


* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

確率モデルの推論

このチュートリアルは質問をします: 確率モデルの推論をするとは何を意味するのでしょう?これは Edward で推論アルゴリズムをどのように設計するかを理解するためのお膳立てをします。

 

事後分布

あるデータ \(\mathbf{x}\) を解析するためにモデル \(p(\mathbf{x}, \mathbf{z})\) をどのように使用できるでしょう?換言すれば、どのような隠れ構造 \(\mathbf{z}\) がデータを説明するのでしょう?私達はモデルを使用して隠れ構造を推論することを求めます。

推論の一つの方法は 事後分布 を定義するためにベイズの定理を活用します。
\[
\begin{aligned}
p(\mathbf{z} \mid \mathbf{x})
&=
\frac{p(\mathbf{x}, \mathbf{z})}{\int p(\mathbf{x}, \mathbf{z}) \text{d}\mathbf{z}}.\end{aligned}
\]

事後分布は、ある (観測された) データ \(\mathbf{x}\) で条件付けされた、潜在変数 \(\mathbf{z}\) の分布です。表現学習への類似を指摘するのであれば、それは データの隠れ表現の確率的記述です

帰納主義 (= inductivism) の観点からは、古典的なベイジアン (そして暗黙的に頻度主義者) により実践されたように、事後分布は潜在変数についての私達の更新された仮説です。仮説演繹 (= hypothetico-deductivism) の視点からは、Box, Rubin そして Gelman のような統計学者により実践されたように、事後分布は単純に (批評されてそして改訂されるべき) データに fit されたモデルです (Box, 1982; Gelman & Shalizi, 2013)。

 

事後分布を推論する

今では事後分布が何を表わすかを知っています。それをどのように計算するのでしょう?これは推論における中心的な計算上の挑戦です。

事後分布はその正規化定数 (= normalizing constant) のために計算することが困難です、これは分母の積分です。これはしばしば解析的 (閉形式 (= closed-form)) 解がない高次元積分です。このようにして、事後分布を計算することは事後分布を近似することを意味します

Edward でどのように推論を指定するかの詳細については、推論 API を見てください。チュートリアル で幾つかの詳細な例を記述します。

 

References

  • Box, G. E. (1982). An apology for ecumenism in statistics. DTIC Document.
  • Gelman, A., & Shalizi, C. R. (2013). Philosophy and the practice of bayesian statistics. British Journal of Mathematical and Statistical Psychology, 66(1), 8–38.
 

以上






TensorFlow : Edward Tutorials (背景) : 確率モデル

TensorFlow : Edward Tutorials (背景) : 確率モデル (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/26/2018

* 本ページは、Edward サイトの Tutorials : Background : Probabilistic Models を翻訳した上で
適宜、補足説明したものです:


* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

確率モデル

確率モデルは自然現象からの観測がどのように起きるかを主張します。モデルはデータに対応する観測変数 \(\mathbf{x}\) と、\(\mathbf{x}\) を生成するための隠れ構造を提供する潜在変数 \(\mathbf{z}\) の 同時分布 です :
\[\begin{aligned}
p(\mathbf{x}, \mathbf{z})\end{aligned}
\]

同時分布は 2 つの構成要素に分解されます。

尤度

\[
\begin{aligned}
p(\mathbf{x} \mid \mathbf{z})
\end{aligned}
\]

は任意のデータ \(\mathbf{x}\) が潜在変数 \(\mathbf{z}\) にどのように依存しているかを記述する確率分布です。尤度はデータ生成過程を仮定します、そこではデータ \(\mathbf{x}\) は \(\mathbf{z}\) で記述された特定の隠れパターン上で条件付けされた尤度からドローされると仮定されます。

事前分布

\[
\begin{aligned}
p(\mathbf{z})\end{aligned}
\]

はデータに存在する潜在変数を記述する確率分布です。それは 隠れ構造の生成過程を仮定します

Edward でモデルをどのように指定するかの詳細については、model API を見てください。チュートリアル で幾つかの例を詳細に記述します。

 

以上






TensorFlow : Edward Tutorials : 混合密度ネットワーク

TensorFlow : Edward Tutorials : 混合密度ネットワーク (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/22/2018

* 本ページは、Edward サイトの Tutorials : Mixture density networks を翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

混合密度ネットワーク

混合密度ネットワーク (MDN, Mixture density networks) (Bishop, 1994) は従来のニューラルネットワークを混合密度モデルと結合して得られたモデルのクラスです。

Edward で例を示します。Jupyter notebook による対話的バージョンは こちら で利用可能です。

 

データ

私達は David Ha のブログ投稿 からの同じ toy データを使用します、そこでは彼は MDN を説明しています。それは逆問題 (= inverse problem) でそこでは総ての入力 $x_n$ に対して複数の出力 $y_n$ があります。

from sklearn.model_selection import train_test_split

def build_toy_dataset(N):
  y_data = np.random.uniform(-10.5, 10.5, N)
  r_data = np.random.normal(size=N)  # random noise
  x_data = np.sin(0.75 * y_data) * 7.0 + y_data * 0.5 + r_data * 1.0
  x_data = x_data.reshape((N, 1))
  return train_test_split(x_data, y_data, random_state=42)

N = 5000  # number of data points
D = 1  # number of features

X_train, X_test, y_train, y_test = build_toy_dataset(N)
print("Size of features in training data: {}".format(X_train.shape))
print("Size of output in training data: {}".format(y_train.shape))
print("Size of features in test data: {}".format(X_test.shape))
print("Size of output in test data: {}".format(y_test.shape))

sns.regplot(X_train, y_train, fit_reg=False)
## Size of features in training data: (3750, 1)
## Size of output in training data: (3750,)
## Size of features in test data: (1250, 1)
## Size of output in test data: (1250,)

TensorFlow プレースホルダを定義します、これは推論の間にデータのバッチを手動で供給するために使用されます。これは Edward においてデータでモデルを訓練するための 多くの方法の一つ です。

X_ph = tf.placeholder(tf.float32, [None, D])
y_ph = tf.placeholder(tf.float32, [None])

 

モデル

feedforward ネットワークによりパラメータ化された 20 正規分布の混合を使用します。すなわち、メンバーシップ確率と構成要素毎 mean と標準偏差は feedforward ネットワークの出力により与えられます。

ニューラルネットワークを構築するために tf.layers を使用します。各隠れ層に対して 15 隠れユニットを持つ 3-層ネットワークを指定します。

from edward.models import Categorical, Mixture, Normal

def neural_network(X):
  """loc, scale, logits = NN(x; theta)"""
  # 2 hidden layers with 15 hidden units
  net = tf.layers.dense(X, 15, activation=tf.nn.relu)
  net = tf.layers.dense(net, 15, activation=tf.nn.relu)
  locs = tf.layers.dense(net, K, activation=None)
  scales = tf.layers.dense(net, K, activation=tf.exp)
  logits = tf.layers.dense(net, K, activation=None)
  return locs, scales, logits

K = 20  # number of mixture components

locs, scales, logits = neural_network(X_ph)
cat = Categorical(logits=logits)
components = [Normal(loc=loc, scale=scale) for loc, scale
              in zip(tf.unstack(tf.transpose(locs)),
                     tf.unstack(tf.transpose(scales)))]
y = Mixture(cat=cat, components=components, value=tf.zeros_like(y_ph))

Mixture 確率変数を使用していることに注意してください。それは各データポイントに対するメンバーシップ割り当てを崩壊させて (= collapse) モデルをその総てのパラメータについて微分可能にします。それは入力として (混合する個々の分布のリストである) 構成要素だけでなく Categorical 確率変数 – 各クラスタ割り当てに対する確率を表わします – も取ります。

MDN の更なる背景については、Christopher Bonnett のブログ投稿 か Bishop (1994) を見てください。

 

推論

モデルとデータセットを渡して、MAP 推定を使用します、Edward の MAP 推定 についてのこの拡張チュートリアルを見てください。

inference = ed.MAP(data={y: y_ph})

ここで、推論と各ステップでそれにどのようにデータを渡すかを手動で制御します。アルゴリズムと TensorFlow 変数を初期化します。

optimizer = tf.train.AdamOptimizer(5e-3)
inference.initialize(optimizer=optimizer, var_list=tf.trainable_variables())

sess = ed.get_session()
tf.global_variables_initializer().run()

さてデータを渡して、inference.update() を呼び出すことにより MDN を訓練します。数量 inference.loss は推論のステップにおける損失関数 (負の対数尤度) です。inference.loss を呼び出すことによりテストデータ上でも損失関数をレポートします、そこでは訓練データの代わりにテストデータを TensorFlow プレースホルダに供給します。train_loss and test_loss のもとで損失を追跡します。

n_epoch = 1000
train_loss = np.zeros(n_epoch)
test_loss = np.zeros(n_epoch)
for i in range(n_epoch):
  info_dict = inference.update(feed_dict={X_ph: X_train, y_ph: y_train})
  train_loss[i] = info_dict['loss']
  test_loss[i] = sess.run(inference.loss, feed_dict={X_ph: X_test, y_ph: y_test})
  inference.print_progress(info_dict)

MDN を訓練するときの一般的な失敗モードは個々の混合分布が点に崩壊することであることに注意してください。これは正規分布の標準偏差を 0 に近くあることを強制して NaN 値を生成します。望むのであれば標準偏差に閾値を設定することでこれを回避できます。

数多くの反復の間の訓練の後、モデルから興味のある予測を取り出します: 予測された混合重み、クラスタ mean、そしてクラスタ標準偏差です。これを行なうため、テストデータ X_test をプレースホルダ X_ph に供給して、セッションからそれらの値を取得します。

pred_weights, pred_means, pred_std = sess.run(
    [tf.nn.softmax(logits), locs, scales], feed_dict={X_ph: X_test})

訓練とテストデータの対数尤度を訓練エポックの関数としてプロットしましょう。数量 inference.loss は総計の対数尤度で、データポイント毎の損失ではありません。下で訓練とテストデータそれぞれをサイズで割ることによりデータポイント毎の対数尤度をプロットします。

fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(16, 3.5))
plt.plot(np.arange(n_epoch), -test_loss / len(X_test), label='Test')
plt.plot(np.arange(n_epoch), -train_loss / len(X_train), label='Train')
plt.legend(fontsize=20)
plt.xlabel('Epoch', fontsize=15)
plt.ylabel('Log-likelihood', fontsize=15)
plt.show()

それがおよそ 400 反復後に収束することを見ます。

 

批評

個々の例がどのように遂行するか見てみましょう。これは逆問題ですので正しい答えは得られないことに注意してください、しかし正解がモデルが高い確率を持つ領域にあることを望むことはできます。

このプロットでは正解は垂直のグレーの線で、一方で青色の線は混合密度ネットワークの予測です。見て取れるように、ある程度上手くやりました。

obj = [0, 4, 6]
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(16, 6))

plot_normal_mix(pred_weights[obj][0], pred_means[obj][0], pred_std[obj][0], axes[0], comp=False)
axes[0].axvline(x=y_test[obj][0], color='black', alpha=0.5)

plot_normal_mix(pred_weights[obj][2], pred_means[obj][2], pred_std[obj][2], axes[1], comp=False)
axes[1].axvline(x=y_test[obj][2], color='black', alpha=0.5)

plot_normal_mix(pred_weights[obj][1], pred_means[obj][1], pred_std[obj][1], axes[2], comp=False)
axes[2].axvline(x=y_test[obj][1], color='black', alpha=0.5)

予測のサンプルをドローしてそれらの密度をプロットすることによりアンサンブルをチェックできます。MDN はそれに学習させたいことを学習しました。

a = sample_from_mixture(X_test, pred_weights, pred_means, pred_std, amount=len(X_test))
sns.jointplot(a[:,0], a[:,1], kind="hex", color="#4CB391", ylim=(-10,10), xlim=(-14,14))

 

References

  • Bishop, C. M. (1994). Mixture density networks.
 

以上






TensorFlow : Edward Tutorials : ニューラルデータのための潜在空間モデル

TensorFlow : Edward Tutorials : ニューラルデータのための潜在空間モデル (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/21/2018

* 本ページは、Edward サイトの Tutorials : Latent Space Models for Neural Data を翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

ニューラルデータのための潜在空間モデル

多くの科学分野はネットワーク・データの研究を伴います、ソーシャル・ネットワーク、統計物理学のネットワーク、生物学ネットワーク、そして情報ネットワークを含みます (Goldenberg, Zheng, Fienberg, & Airoldi, 2010; Newman, 2010)。

ネットワークのノードについて (それらの) 連結性 (= connectivity) パターンから何を学習できるでしょうか?潜在空間モデルを使用してこれを学習し始めることができます (Hoff, Raftery, & Handcock, 2002)。潜在空間モデルはノードを潜在空間のネットワークに埋め込みます、そこでは 2 つのノード間のエッジを形成する尤度は潜在空間のそれらの距離に依存します。

神経科学 (= neuroscience) からのネットワークデータを解析します。Jupyter notebook による対話的バージョンは こちら で利用可能です。

 

データ

データは Mark Newman のレポジトリ に由来します。

それは線形動物の C. エレガンス のニューラルネットワークを表わす重み付けられ、方向付けられたネットワークで、White, Southgate, Thomson, & Brenner (1986) による実験データを使用して Watts & Strogatz (1998) により編纂されました。

ニューラルネットワークはおよそ $300$ ニューロンから成ります。ニューロン間の各接続は接続の強さを捉えた重み (正の整数) に関連しています。

最初に、データをロードします。

from observations import celegans

x_train = celegans("~/data")

 

モデル

ニューロンについてそれらの連結パターンから何を学習できるでしょうか?潜在空間モデル (Hoff et al., 2002) を使用して、それらの間の類似性を捕捉するために各ニューロンについて潜在埋め込みを学習します。

各ニューロン $n$ はネットワークのノードで潜在位置 $z_n\in\mathbb{R}^K$ に関係します。潜在位置の各々にガウス事前分布を置きます。

ノード $i$ と $j$ の間のエッジの対数オッズ (訳注: ロジット) はノード (群) の潜在表現間のユークリッド距離 $|z_i- z_j|$ に比例します。ここで、Poisson 尤度でエッジの重み $Y_{ij}$ をモデル化します。

レートは潜在空間の距離の逆数です。生成プロセスは次のようなものです :

  1. 各ノード $n=1,\ldots,N$ に対して、
    \[
    \begin{aligned}
    z_n \sim N(0,I)\end{aligned}
    \]

  2. 各エッジ $(i,j)\in\{1,\ldots,N\}\times\{1,\ldots,N\}$ に対して、
    \[
    \begin{aligned}
    Y_{ij} \sim \text{Poisson}\Bigg(\frac{1}{|z_i – z_j|}\Bigg)\end{aligned}
    \]

Edward では、モデルを次のように書きます。

from edward.models import Normal, Poisson

N = x_train.shape[0]  # number of data points
K = 3  # latent dimensionality

z = Normal(loc=tf.zeros([N, K]), scale=tf.ones([N, K]))

# Calculate N x N distance matrix.
# 1. Create a vector, [||z_1||^2, ||z_2||^2, ..., ||z_N||^2], and tile
# it to create N identical rows.
xp = tf.tile(tf.reduce_sum(tf.pow(z, 2), 1, keep_dims=True), [1, N])
# 2. Create a N x N matrix where entry (i, j) is ||z_i||^2 + ||z_j||^2
# - 2 z_i^T z_j.
xp = xp + tf.transpose(xp) - 2 * tf.matmul(z, z, transpose_b=True)
# 3. Invert the pairwise distances and make rate along diagonals to
# be close to zero.
xp = 1.0 / tf.sqrt(xp + tf.diag(tf.zeros(N) + 1e3))

x = Poisson(rate=xp)

 

推論

最大事後確率 (MAP, Maximum a posteriori) 推定は Edward では単純です。2 行が必要です: inference をインスタンス化してそれを実行します。

inference = ed.MAP([z], data={x: x_train})

Edward における MAP 推定 についてのこの拡張チュートリアルを見てください。

代わりに変分推論を実行することもできます。これは変分モデルを指定して KLqp をインスタンス化する必要があります。

qz = Normal(loc=tf.get_variable("qz/loc", [N * K]),
            scale=tf.nn.softplus(tf.get_variable("qz/scale", [N * K])))
inference = ed.KLqp({z: qz}, data={x: x_train})

Edward における変分推論 についてのこの拡張チュートリアルを見てください。

最後に、次の行は 2500 反復の間推論手続きを実行します。

inference.run(n_iter=2500)

 

References

  • Goldenberg, A., Zheng, A. X., Fienberg, S. E., & Airoldi, E. M. (2010). A survey of statistical network models. Foundations and Trends in Machine Learning.
  • Hoff, P. D., Raftery, A. E., & Handcock, M. S. (2002). Latent space approaches to social network analysis. Journal of the American Statistical Association, 97(460), 1090–1098.
  • Newman, M. (2010). Networks: An introduction. Oxford University Press.
  • Watts, D. J., & Strogatz, S. H. (1998). Collective dynamics of ‘small-world’networks. Nature, 393(6684), 440–442.
  • White, J. G., Southgate, E., Thomson, J. N., & Brenner, S. (1986). The structure of the nervous system of the nematode caenorhabditis elegans. Philos Trans R Soc Lond B Biol Sci, 314(1165), 1–340.
 

以上






AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com