深層学習と確率プログラミングを
融合したEdwardについて
小島 諒介(京都大学)
人工知能セミナー
確率プログラミングの世界:論理と確率をつなぐ人工知能
自己紹介
深層学習と確率プログラミングを融合した についてEdward 1
• 名前:小島 諒介
• 略歴:
2014年 東京工業大学 修士課程修了
2017年 東京工業大学 博士(工学)
京都大学 医学研究科 人間健康科学系専攻
ビッグデータ医科学分野 特定助教
• 興味:
人工知能の手法開発と実世界応用(特に時系列データ分析)
• 好きな確率プログラミング言語:
PRISM, Edward, PyMC3, Anglican, ProPPR
PRISM(開発メンバー)
深層学習と確率プログラミング
• 深層学習
– 人間が明確なモデルが与えられないような状況で学習するような問題
に適している.入力・出力のペアからモデルを学習するような状況.
2
入力
出力
ニンジン切ってる
• 確率プログラミング
– 明確にデータの生成過程(モデル)をプログラミング言語を用いて
柔軟に設計できる.規則・法則があるものに適している.
「野菜を切って炒める」 「野菜を炒めて切る」
得意分野が異なる →組み合わせたら面白そう
“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
(画像+音
+レシピ) 答え
各認識器の出力
(動作)
各認識器の出力
(対象)
深層学習と確率プログラミングを組み合わせた例
深層学習と確率プログラミングを融合した についてEdward 4
深層学習と確率プログラミングのシステムが分離している
• システム全体の最適化が難しい
• デバッグ・チューニングが困難
レシピモデル
出力
ニンジン切ってる
玉ねぎ焼いてる
時間 ニンジン切ってる
玉ねぎ切ってる
玉ねぎ切ってる
時間 ニンジン切ってる
玉ねぎ切ってる
深層学習ツール(Theano)
確率プログラミング(PRISM)
統合したツールが欲しい!!
認識ミスをレシピから修正
• 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
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 への計算の割り振
りも計算グラフ上で計画する)
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 の計算グラフ上に「確率変数」が入れることが可能
確率モデリングと推論
𝑝𝑝 𝐱𝐱 = � 𝑝𝑝 𝐱𝐱, 𝐳𝐳 𝑑𝑑𝐳𝐳
推論問題
𝑝𝑝 𝐳𝐳|𝐱𝐱 = 𝑝𝑝(𝐱𝐱, 𝐳𝐳)/𝑝𝑝(𝐱𝐱)
潜在変数:𝐳𝐳
観測変数:𝐱𝐱
潜在変数すべてについての積分
が必要なので計算困難
確率モデリングでは同時分布 𝑝𝑝(𝐱𝐱, 𝐳𝐳) を規定する
(実際にはいくつかの条件付き分布に分解してモデリング)
深層学習と確率プログラミングを融合した についてEdward 8
𝑝𝑝 𝐳𝐳|𝐱𝐱 の代わりに𝑞𝑞 𝐳𝐳 を計算
• MCMC
• 変分推論
Edwardによる確率モデリングと推論
𝑝𝑝 𝐱𝐱 = � 𝑝𝑝 𝐱𝐱, 𝐳𝐳 𝑑𝑑𝐳𝐳
推論問題
𝑝𝑝 𝐳𝐳|𝐱𝐱 = 𝑝𝑝(𝐱𝐱, 𝐳𝐳)/𝑝𝑝(𝐱𝐱)
潜在変数:𝐳𝐳
観測変数:𝐱𝐱
潜在変数すべてについての積分
が必要なので計算困難
同時分布 𝑝𝑝(𝐱𝐱, 𝐳𝐳) を計算グラフで表現
深層学習と確率プログラミングを融合した についてEdward 9
𝑝𝑝 𝐳𝐳|𝐱𝐱 の代わりに利用する𝑞𝑞 𝐳𝐳 を計算グラフで表現
• MCMC
• 変分推論
推論を行うための計算グラフを自動生成
例1 混合ガウス
𝑝𝑝 𝐱𝐱𝑛𝑛 𝝅𝝅, 𝝁𝝁, 𝝈𝝈 = �
𝑘𝑘=1
𝐾𝐾
𝜋𝜋𝑘𝑘 Normal 𝐱𝐱𝑛𝑛|𝝁𝝁𝑘𝑘, 𝝈𝝈𝑘𝑘
深層学習と確率プログラミングを融合した についてEdward 10
𝝅𝝅 = 𝜋𝜋1, 𝜋𝜋2, … , 𝜋𝜋𝑘𝑘, … , 𝜋𝜋𝐾𝐾
𝑎𝑎, 𝑏𝑏, 𝛼𝛼: ハイパーパラメータ
0 ≤ 𝑛𝑛 < 𝑁𝑁
𝑝𝑝 𝝅𝝅 = Dirichlet 𝝅𝝅|𝛼𝛼𝟏𝟏𝐾𝐾
𝑝𝑝 𝝁𝝁𝑘𝑘 = Normal 𝝁𝝁𝑘𝑘|𝟎𝟎, 𝟏𝟏
𝑝𝑝 𝝈𝝈𝑘𝑘
2
= InverseGamma 𝝈𝝈𝑘𝑘
2
|𝑎𝑎, 𝑏𝑏
データセット𝐗𝐗 中の𝑛𝑛番目のデータ𝐱𝐱 𝑛𝑛
𝐷𝐷 = 2, 𝐾𝐾 = 2
(𝐷𝐷次元, 0 ≤ 𝑛𝑛 < 𝑁𝑁 )
例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 𝐱𝐱 𝑛𝑛|𝝁𝝁𝑘𝑘, 𝝈𝝈𝑘𝑘
例1 混合ガウス:Edward によるモデリング
深層学習と確率プログラミングを融合した についてEdward 12
Edward による混合ガウスモデルの計算グラフ
ParamMixtureの詳細
例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()
計算を実行
もう一つの手法:変分推論
𝝓𝝓∗
= argmin𝝓𝝓 𝐾𝐾𝐾𝐾 𝑞𝑞 𝐳𝐳; 𝝓𝝓 | 𝑝𝑝(𝐳𝐳|𝐱𝐱))
𝑝𝑝 𝐳𝐳|𝐱𝐱 に KL-divergence の意味で“近い” 𝑞𝑞 𝐳𝐳; 𝝓𝝓 で近似する
深層学習と確率プログラミングを融合した についてEdward 14
𝐿𝐿 𝝓𝝓 = 𝐸𝐸𝑞𝑞(𝐳𝐳; 𝝓𝝓) log 𝑝𝑝(𝐱𝐱, 𝐳𝐳) − 𝐸𝐸𝑞𝑞 𝐳𝐳; 𝝓𝝓 log 𝑞𝑞(𝐳𝐳; 𝝓𝝓)
𝐾𝐾𝐾𝐾 𝑞𝑞 𝐳𝐳 | 𝑝𝑝(𝐳𝐳|𝐱𝐱)) = 𝐸𝐸𝑞𝑞 𝐳𝐳; 𝝓𝝓 log 𝑝𝑝 𝐳𝐳 𝐱𝐱 − 𝐸𝐸𝑞𝑞 𝐳𝐳; 𝝓𝝓 log 𝑞𝑞(𝐳𝐳; 𝝓𝝓)
𝝓𝝓∗ = argmax 𝝓𝝓 𝐿𝐿 𝝓𝝓
𝛻𝛻𝜙𝜙 𝐿𝐿 𝝓𝝓 = 𝛻𝛻𝜙𝜙 �
�𝐳𝐳
𝑞𝑞(�𝐳𝐳; 𝝓𝝓) log 𝑝𝑝(𝐱𝐱, �𝐳𝐳) − log 𝑞𝑞(�𝐳𝐳; 𝝓𝝓)
Edward ではこの最適化問題をnoisy gradient を用いた勾配
法で解く(Black Box VariationaI Inference)
�𝐳𝐳~𝑞𝑞(�𝐳𝐳; 𝝓𝝓)
以下の問題を解く
𝑞𝑞(�𝐳𝐳; 𝝓𝝓)と𝑝𝑝(𝐱𝐱, �𝐳𝐳)の計算グラフが与えられれば,
Tensorflowの自動微分により勾配が計算可能
実例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による
ニューラルネット
のコード
モデル𝑝𝑝(𝐱𝐱, 𝐳𝐳) (デコーダ)
𝐱𝐱
実例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 𝐱𝐱
inference = ed.KLqp({z: qz}, data={x: x_ph})
inference.run()
実例2 : VAE (Variational Auto Encoder)
深層学習と確率プログラミングを融合した についてEdward 17
𝐳𝐳
𝝁𝝁
𝚺𝚺
𝑞𝑞(𝐳𝐳|𝐱𝐱ph)
𝐱𝐱ph 𝐱𝐱
変分推論を使って推論を行う
グラフを構築する
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を用いてより複雑なニューラルネットのコードを書く
ことも可能
モデル𝑝𝑝(𝐱𝐱, 𝐳𝐳) (デコーダ)
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/
生成したデータ
実例3 : GAN (Generative Adversarial Network)
深層学習と確率プログラミングを融合した についてEdward 20
min
𝜃𝜃
max
𝜙𝜙
𝐸𝐸𝑝𝑝∗(𝐱𝐱) log 𝐷𝐷(𝐱𝐱; 𝝓𝝓) + 𝐸𝐸𝑝𝑝(𝐱𝐱;𝜽𝜽) log 1 − 𝐷𝐷(𝐱𝐱; 𝝓𝝓)
目的関数
inference = ed.GANInference( data={x: x_ph},
discriminator=discriminative_network)
モデルから生成されたデータと学習データを識別する識別器と
生成モデルを競わせることでデータの分布を学習させる手法
実例3 : GAN (Generative Adversarial Network)
深層学習と確率プログラミングを融合した についてEdward 21
min
𝜃𝜃
max
𝜙𝜙
𝐸𝐸𝑝𝑝∗(𝐱𝐱) log 𝐷𝐷(𝐱𝐱; 𝝓𝝓) + 𝐸𝐸𝑝𝑝(𝐱𝐱;𝜽𝜽) log 1 − 𝐷𝐷(𝐱𝐱; 𝝓𝝓)
目的関数
inference = ed.GANInference( data={x: x_ph},
discriminator=discriminative_network)
モデルから生成されたデータと学習データを識別する識別器と
生成モデルを競わせることでデータの分布を学習させる手法
生成したデータ学習データ(MNIST)
Edward (現バージョン)でのノウハウ
• 大きいモデルをいきなり書かくと危険
– サンプルにあるモデルから徐々に変数を追加していくのが吉
• 現状ではデバッグの手段が限られている(Tensorboad は利用可能)
• 計算結果がNanとなってしまうことを回避
• 学習法はモデルに応じて適切に選ぶ必要がある
– ニューラルネット色の濃いモデルなら変分推論,確率モデル
色の濃いモデルならMCMC
– 未実装の機能やいくつかあるが,どんどん実装されている
深層学習と確率プログラミングを融合した についてEdward 22
まとめ
• 確率モデルをTensorflow上で計算・実装できる
Python ライブラリEdwardを紹介
– MCMCによる推論の例:混合ガウスモデル
– 変分推論の例:VAE
– GAN
• 今後,Edwardを用いたアプリケーションが期待される
– ハードウェアによる高速化(GPUによる高速な行列計算)の活用
– 大量・高次元のデータ処理への可能性
深層学習と確率プログラミングを融合した についてEdward 23

深層学習と確率プログラミングを融合したEdwardについて

  • 1.
  • 2.
    自己紹介 深層学習と確率プログラミングを融合した についてEdward 1 •名前:小島 諒介 • 略歴: 2014年 東京工業大学 修士課程修了 2017年 東京工業大学 博士(工学) 京都大学 医学研究科 人間健康科学系専攻 ビッグデータ医科学分野 特定助教 • 興味: 人工知能の手法開発と実世界応用(特に時系列データ分析) • 好きな確率プログラミング言語: PRISM, Edward, PyMC3, Anglican, ProPPR PRISM(開発メンバー)
  • 3.
    深層学習と確率プログラミング • 深層学習 – 人間が明確なモデルが与えられないような状況で学習するような問題 に適している.入力・出力のペアからモデルを学習するような状況. 2 入力 出力 ニンジン切ってる •確率プログラミング – 明確にデータの生成過程(モデル)をプログラミング言語を用いて 柔軟に設計できる.規則・法則があるものに適している. 「野菜を切って炒める」 「野菜を炒めて切る」 得意分野が異なる →組み合わせたら面白そう
  • 4.
    “Multimodal Scene UnderstandingFramework and Its Application to Cooking Recognition” R.Kojima, O.Sugiyama, K.Nakadai, Applied Artificial Intelligence, 30(3) :181--200 2016. 深層学習と確率プログラミングを組み合わせた例 3 深層学習 (画像+音) 深層学習 +PRISM (画像+音 +レシピ) 答え 各認識器の出力 (動作) 各認識器の出力 (対象)
  • 5.
    深層学習と確率プログラミングを組み合わせた例 深層学習と確率プログラミングを融合した についてEdward 4 深層学習と確率プログラミングのシステムが分離している •システム全体の最適化が難しい • デバッグ・チューニングが困難 レシピモデル 出力 ニンジン切ってる 玉ねぎ焼いてる 時間 ニンジン切ってる 玉ねぎ切ってる 玉ねぎ切ってる 時間 ニンジン切ってる 玉ねぎ切ってる 深層学習ツール(Theano) 確率プログラミング(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 tensorflowas 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 の基本的な仕組み 深層学習と確率プログラミングを融合した についてEdward7 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 によるモデリング fromedward.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 𝐱𝐱 𝑛𝑛|𝝁𝝁𝑘𝑘, 𝝈𝝈𝑘𝑘
  • 13.
    例1 混合ガウス:Edward によるモデリング 深層学習と確率プログラミングを融合したについてEdward 12 Edward による混合ガウスモデルの計算グラフ ParamMixtureの詳細
  • 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
  • 24.
    まとめ • 確率モデルをTensorflow上で計算・実装できる Python ライブラリEdwardを紹介 –MCMCによる推論の例:混合ガウスモデル – 変分推論の例:VAE – GAN • 今後,Edwardを用いたアプリケーションが期待される – ハードウェアによる高速化(GPUによる高速な行列計算)の活用 – 大量・高次元のデータ処理への可能性 深層学習と確率プログラミングを融合した についてEdward 23