More Related Content Similar to 深層学習と確率プログラミングを融合したEdwardについて
Similar to 深層学習と確率プログラミングを融合したEdwardについて (20) 深層学習と確率プログラミングを融合したEdwardについて2. 自己紹介
深層学習と確率プログラミングを融合した についてEdward 1
• 名前:小島 諒介
• 略歴:
2014年 東京工業大学 修士課程修了
2017年 東京工業大学 博士(工学)
京都大学 医学研究科 人間健康科学系専攻
ビッグデータ医科学分野 特定助教
• 興味:
人工知能の手法開発と実世界応用(特に時系列データ分析)
• 好きな確率プログラミング言語:
PRISM, Edward, PyMC3, Anglican, ProPPR
PRISM(開発メンバー)
4. “Multimodal Scene Understanding Framework and Its Application to Cooking Recognition”
R.Kojima, O.Sugiyama, K.Nakadai, Applied Artificial Intelligence, 30(3) :181--200 2016.
深層学習と確率プログラミングを組み合わせた例
3
深層学習
(画像+音)
深層学習
+PRISM
(画像+音
+レシピ) 答え
各認識器の出力
(動作)
各認識器の出力
(対象)
6. • Python / Tensorflow 上に実装
された確率プログラミング言語
– Tensorflow 上の他の便利なライブラ
リ(Keras, slim, etc.)を活用可能
– GPUによる高速化の恩恵が受けられる
確率プログラミング言語Edward
Edward
深層学習と確率プログラミングを融合した についてEdward 5
• モデル・推論・評価の3ステップを
設計するための機能を提供
“Edward: A library for probabilistic modeling, inference, and criticism”
Dustin Tran, Alp Kucukelbir, Adji B. Dieng, Maja Rudolph, Dawen Liang,
and David M. Blei. 2016. . arXiv preprint arXiv:1610.09787.
http://edwardlib.org
7. Tensorflow の基本的な仕組み
import tensorflow as tf
with tf.Session() as sess:
a=tf.Variable(1.0, name="a")
b=tf.Variable(2.0, name="b")
c=tf.Variable(3.0, name="c")
output=a * b + c
深層学習と確率プログラミングを融合した についてEdward 6
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(output))
> 5
計算グラフ
実際の計算は run の
ところで行われる
(CPU, GPU への計算の割り振
りも計算グラフ上で計画する)
8. Edward の基本的な仕組み
深層学習と確率プログラミングを融合した についてEdward 7
import tensorflow as tf
from edward.models import *
with tf.Session() as sess:
a=tf.Variable(1.0, name="a")
b=tf.Variable(2.0, name="b")
c=Normal(loc=0.0,
scale=1.0, name="c")
output=a * b + c
print(sess.run(output))
> 4.2449 #実行するごとに異なる結果
計算グラフ
Edwardを用いると
Tensorflow の計算グラフ上に「確率変数」が入れることが可能
9. 確率モデリングと推論
𝑝𝑝 𝐱𝐱 = � 𝑝𝑝 𝐱𝐱, 𝐳𝐳 𝑑𝑑𝐳𝐳
推論問題
𝑝𝑝 𝐳𝐳|𝐱𝐱 = 𝑝𝑝(𝐱𝐱, 𝐳𝐳)/𝑝𝑝(𝐱𝐱)
潜在変数:𝐳𝐳
観測変数:𝐱𝐱
潜在変数すべてについての積分
が必要なので計算困難
確率モデリングでは同時分布 𝑝𝑝(𝐱𝐱, 𝐳𝐳) を規定する
(実際にはいくつかの条件付き分布に分解してモデリング)
深層学習と確率プログラミングを融合した についてEdward 8
𝑝𝑝 𝐳𝐳|𝐱𝐱 の代わりに𝑞𝑞 𝐳𝐳 を計算
• MCMC
• 変分推論
10. Edwardによる確率モデリングと推論
𝑝𝑝 𝐱𝐱 = � 𝑝𝑝 𝐱𝐱, 𝐳𝐳 𝑑𝑑𝐳𝐳
推論問題
𝑝𝑝 𝐳𝐳|𝐱𝐱 = 𝑝𝑝(𝐱𝐱, 𝐳𝐳)/𝑝𝑝(𝐱𝐱)
潜在変数:𝐳𝐳
観測変数:𝐱𝐱
潜在変数すべてについての積分
が必要なので計算困難
同時分布 𝑝𝑝(𝐱𝐱, 𝐳𝐳) を計算グラフで表現
深層学習と確率プログラミングを融合した についてEdward 9
𝑝𝑝 𝐳𝐳|𝐱𝐱 の代わりに利用する𝑞𝑞 𝐳𝐳 を計算グラフで表現
• MCMC
• 変分推論
推論を行うための計算グラフを自動生成
11. 例1 混合ガウス
𝑝𝑝 𝐱𝐱𝑛𝑛 𝝅𝝅, 𝝁𝝁, 𝝈𝝈 = �
𝑘𝑘=1
𝐾𝐾
𝜋𝜋𝑘𝑘 Normal 𝐱𝐱𝑛𝑛|𝝁𝝁𝑘𝑘, 𝝈𝝈𝑘𝑘
深層学習と確率プログラミングを融合した についてEdward 10
𝝅𝝅 = 𝜋𝜋1, 𝜋𝜋2, … , 𝜋𝜋𝑘𝑘, … , 𝜋𝜋𝐾𝐾
𝑎𝑎, 𝑏𝑏, 𝛼𝛼: ハイパーパラメータ
0 ≤ 𝑛𝑛 < 𝑁𝑁
𝑝𝑝 𝝅𝝅 = Dirichlet 𝝅𝝅|𝛼𝛼𝟏𝟏𝐾𝐾
𝑝𝑝 𝝁𝝁𝑘𝑘 = Normal 𝝁𝝁𝑘𝑘|𝟎𝟎, 𝟏𝟏
𝑝𝑝 𝝈𝝈𝑘𝑘
2
= InverseGamma 𝝈𝝈𝑘𝑘
2
|𝑎𝑎, 𝑏𝑏
データセット𝐗𝐗 中の𝑛𝑛番目のデータ𝐱𝐱 𝑛𝑛
𝐷𝐷 = 2, 𝐾𝐾 = 2
(𝐷𝐷次元, 0 ≤ 𝑛𝑛 < 𝑁𝑁 )
12. 例1 混合ガウス:Edward によるモデリング
from edward.models import *
K = 2
N = 100
D = 2
pi = Dirichlet(tf.ones(K))
mu = Normal(tf.zeros(D), tf.ones(D), sample_shape=K)
sigmasq = InverseGamma(tf.ones(D), tf.ones(D),
sample_shape=K)
x = ParamMixture(pi,
{'loc': mu, 'scale_diag': tf.sqrt(sigmasq)},
MultivariateNormalDiag,
sample_shape=N)
深層学習と確率プログラミングを融合した についてEdward 11
𝑝𝑝 𝝅𝝅 = Dirichlet 𝝅𝝅|𝛼𝛼𝟏𝟏𝐾𝐾
𝑝𝑝 𝝁𝝁 = Normal 𝝁𝝁|𝟎𝟎, 𝟏𝟏
𝑝𝑝 𝝈𝝈𝑘𝑘
2
= InverseGamma 𝝈𝝈𝑘𝑘
2
|𝑎𝑎, 𝑏𝑏
𝑝𝑝 𝐱𝐱 𝑛𝑛 𝝅𝝅, 𝝁𝝁, 𝝈𝝈 = �
𝑘𝑘=1
𝐾𝐾
𝜋𝜋𝑘𝑘 Normal 𝐱𝐱 𝑛𝑛|𝝁𝝁𝑘𝑘, 𝝈𝝈𝑘𝑘
14. 例1 混合ガウス: Edward による推論
深層学習と確率プログラミングを融合した についてEdward 13
T = 500 # サンプル数
qpi = Empirical(tf.Variable(tf.ones([T, K]) / K))
qmu = Empirical(tf.Variable(tf.zeros([T, K, D])))
qsigmasq = Empirical(tf.Variable(tf.ones([T, K, D])))
qz = Empirical(tf.Variable(tf.zeros([T, N], dtype=tf.int32)))
𝑝𝑝 𝐳𝐳|𝐱𝐱 を近似するための分布𝑞𝑞 𝐳𝐳 を定義
inference = ed.Gibbs(
{pi: qpi, mu: qmu, sigmasq: qsigmasq, z: qz},
data={x: x_train})
近似する分布のペアを与えてGibbsサンプリングのための計算グラフを作成
inference.run()
計算を実行
15. もう一つの手法:変分推論
𝝓𝝓∗
= argmin𝝓𝝓 𝐾𝐾𝐾𝐾 𝑞𝑞 𝐳𝐳; 𝝓𝝓 | 𝑝𝑝(𝐳𝐳|𝐱𝐱))
𝑝𝑝 𝐳𝐳|𝐱𝐱 に KL-divergence の意味で“近い” 𝑞𝑞 𝐳𝐳; 𝝓𝝓 で近似する
深層学習と確率プログラミングを融合した についてEdward 14
𝐿𝐿 𝝓𝝓 = 𝐸𝐸𝑞𝑞(𝐳𝐳; 𝝓𝝓) log 𝑝𝑝(𝐱𝐱, 𝐳𝐳) − 𝐸𝐸𝑞𝑞 𝐳𝐳; 𝝓𝝓 log 𝑞𝑞(𝐳𝐳; 𝝓𝝓)
𝐾𝐾𝐾𝐾 𝑞𝑞 𝐳𝐳 | 𝑝𝑝(𝐳𝐳|𝐱𝐱)) = 𝐸𝐸𝑞𝑞 𝐳𝐳; 𝝓𝝓 log 𝑝𝑝 𝐳𝐳 𝐱𝐱 − 𝐸𝐸𝑞𝑞 𝐳𝐳; 𝝓𝝓 log 𝑞𝑞(𝐳𝐳; 𝝓𝝓)
𝝓𝝓∗ = argmax 𝝓𝝓 𝐿𝐿 𝝓𝝓
𝛻𝛻𝜙𝜙 𝐿𝐿 𝝓𝝓 = 𝛻𝛻𝜙𝜙 �
�𝐳𝐳
𝑞𝑞(�𝐳𝐳; 𝝓𝝓) log 𝑝𝑝(𝐱𝐱, �𝐳𝐳) − log 𝑞𝑞(�𝐳𝐳; 𝝓𝝓)
Edward ではこの最適化問題をnoisy gradient を用いた勾配
法で解く(Black Box VariationaI Inference)
�𝐳𝐳~𝑞𝑞(�𝐳𝐳; 𝝓𝝓)
以下の問題を解く
𝑞𝑞(�𝐳𝐳; 𝝓𝝓)と𝑝𝑝(𝐱𝐱, �𝐳𝐳)の計算グラフが与えられれば,
Tensorflowの自動微分により勾配が計算可能
16. 実例2 : VAE (Variational Auto Encoder)
𝐳𝐳
𝝁𝝁
𝚺𝚺
深層学習と確率プログラミングを融合した についてEdward 15
N=100
D=2
Mu=tf.zeros([N, D])
sigma=tf.ones([N, D])
z = Normal(loc=mu,scale=sigma)
hidden = Dense(256)(z.value())
x = Bernoulli(logits=hidden)
Kerasによる
ニューラルネット
のコード
モデル𝑝𝑝(𝐱𝐱, 𝐳𝐳) (デコーダ)
𝐱𝐱
17. 実例2 : VAE (Variational Auto Encoder)
x_ph = tf.placeholder(tf.float32, [N, 256])
mu = Dense(256)(x_ph)
sigma = Dense(256, activation='softplus')(x_ph)
qz = Normal(loc=mu, scale=sigma)
深層学習と確率プログラミングを融合した についてEdward 16
𝐳𝐳
𝝁𝝁
𝚺𝚺
推論𝑞𝑞(𝐳𝐳|𝐱𝐱)(エンコーダ)
𝑞𝑞(𝐳𝐳|𝐱𝐱ph)
Kerasによる
ニューラルネット
のコード
𝐱𝐱ph 𝐱𝐱
18. inference = ed.KLqp({z: qz}, data={x: x_ph})
inference.run()
実例2 : VAE (Variational Auto Encoder)
深層学習と確率プログラミングを融合した についてEdward 17
𝐳𝐳
𝝁𝝁
𝚺𝚺
𝑞𝑞(𝐳𝐳|𝐱𝐱ph)
𝐱𝐱ph 𝐱𝐱
変分推論を使って推論を行う
グラフを構築する
19. z = Normal(loc=mu,scale=sigma)
hidden = Dense(4*4*128,activation=None)(z.value())
hidden=Reshape([4,4,128])(hidden)
hidden=Conv2DTranspose(64,(2,2),strides=(2, 2)) (hidden)
hidden=BatchNormalization() (hidden)
hidden=LeakyReLU(alpha=0.2)(hidden)
……
x = Bernoulli(logits=hidden)
実例2 : VAE (Variational Auto Encoder)
18
Kerasを用いてより複雑なニューラルネットのコードを書く
ことも可能
モデル𝑝𝑝(𝐱𝐱, 𝐳𝐳) (デコーダ)
20. z = Normal(loc=mu,scale=sigma)
hidden = Dense(4*4*128,activation=None)(z.value())
hidden=Reshape([4,4,128])(hidden)
hidden=Conv2DTranspose(64,(2,2),strides=(2, 2)) (hidden)
hidden=BatchNormalization() (hidden)
hidden=LeakyReLU(alpha=0.2)(hidden)
……
x = Bernoulli(logits=hidden)
実例2 : VAE (Variational Auto Encoder)
19
Kerasを用いてより複雑なニューラルネットのコードを書く
ことも可能
モデル𝑝𝑝(𝐱𝐱, 𝐳𝐳) (デコーダ)
学習データ
アニメイラストの顔データセット
http://www.nurs.or.jp/~nagadomi/
animeface-character-dataset/
生成したデータ
21. 実例3 : GAN (Generative Adversarial Network)
深層学習と確率プログラミングを融合した についてEdward 20
min
𝜃𝜃
max
𝜙𝜙
𝐸𝐸𝑝𝑝∗(𝐱𝐱) log 𝐷𝐷(𝐱𝐱; 𝝓𝝓) + 𝐸𝐸𝑝𝑝(𝐱𝐱;𝜽𝜽) log 1 − 𝐷𝐷(𝐱𝐱; 𝝓𝝓)
目的関数
inference = ed.GANInference( data={x: x_ph},
discriminator=discriminative_network)
モデルから生成されたデータと学習データを識別する識別器と
生成モデルを競わせることでデータの分布を学習させる手法
22. 実例3 : GAN (Generative Adversarial Network)
深層学習と確率プログラミングを融合した についてEdward 21
min
𝜃𝜃
max
𝜙𝜙
𝐸𝐸𝑝𝑝∗(𝐱𝐱) log 𝐷𝐷(𝐱𝐱; 𝝓𝝓) + 𝐸𝐸𝑝𝑝(𝐱𝐱;𝜽𝜽) log 1 − 𝐷𝐷(𝐱𝐱; 𝝓𝝓)
目的関数
inference = ed.GANInference( data={x: x_ph},
discriminator=discriminative_network)
モデルから生成されたデータと学習データを識別する識別器と
生成モデルを競わせることでデータの分布を学習させる手法
生成したデータ学習データ(MNIST)
23. Edward (現バージョン)でのノウハウ
• 大きいモデルをいきなり書かくと危険
– サンプルにあるモデルから徐々に変数を追加していくのが吉
• 現状ではデバッグの手段が限られている(Tensorboad は利用可能)
• 計算結果がNanとなってしまうことを回避
• 学習法はモデルに応じて適切に選ぶ必要がある
– ニューラルネット色の濃いモデルなら変分推論,確率モデル
色の濃いモデルならMCMC
– 未実装の機能やいくつかあるが,どんどん実装されている
深層学習と確率プログラミングを融合した についてEdward 22