Slide 1

Slide 1 text

TFUG: ベイズ分科会 2020/9/6 ブログ : HELLO CYBERNETICS Twitter : ML_deep やってます 近年の PPL の動向

Slide 2

Slide 2 text

自己紹介 ● 学生時代: Brain Computer Interface の分野 – 制御や最適化に興味があった(応用対象は問わず) – 流れの中で機械学習を学ぶことを決意(ブログ) ● 今:ロボティクスの分野 – 制御や認識を扱っている興味の分野に戻ってきた – 逆に機械学習・確率モデリング楽しい

Slide 3

Slide 3 text

自己紹介 ● 基本的に当該分野は独学です ● むしろ教わりたいことが沢山あります ● このウェビナーに参加できたのは光栄です (恐らく発表側でなければリアルタイムで参加しなかった)  須山さん、運営のみなさん。ありがとうございます。

Slide 4

Slide 4 text

目次 ● PPL の役割と意義 ● PPL 速度比較 ● モデリング、推論 API を簡単に比較 ● Pyro で Gaussian Mixture Model の MCMC, ADVI

Slide 5

Slide 5 text

なぜ PPL を利用するのか ■ データ分析の大まかな流れ – 仮説を構築 – データ収集 – データと現象のモデリング – 推論実行 – 説明、予測実施

Slide 6

Slide 6 text

なぜ PPL を利用するのか ■ データ分析の大まかな流れ – 仮説を構築 – データ収集 – データと現象のモデリング – 推論実行 – 説明、予測実施 ここを助けてもらうため 近年データは複雑化・巨大化 計算機が重要に

Slide 7

Slide 7 text

モデリングと推論実行の概要 X Y W X Y W μ ∑ σ p( X ,Y ,W )=p(X) p(W ) p(Y|X ,W ) p(Y ,W|X)=p(W ) p(Y|X ,W ) p(W )=N (W|μ ,Σ) p(Y ,W|X)= p( X ,Y ,W ) p(X) =p(W ) p(Y|X ,W ) p(Y|X ,W )=N (Y|f (W , X),σ) X Y W μ ∑ σ N p(W|( X ,Y )N )= p(W ,(X ,Y )N ) p(( X ,Y)N ) 1.予測したい変数を取り巻く確率変数の関係性を整理 2.各変数、パラメータに確率分布を設定(具体的な同時分布が形成) 3.観測データによるパラメータの事後分布を計算(紙とペン or MCMC or 変分推論) = ∏ i=1 N p(W , X i ,Y i ) ∫ W ∏ i=1 N p(W , X i ,Y i )dW = p(W )∏ i=1 N p(Y i |X i ,W ) ∫ W p(W )∏ i=1 N p(Y i |X i ,W )dW

Slide 8

Slide 8 text

モデリングと推論実行の概要 X Y W X Y W μ ∑ σ p( X ,Y ,W )=p(X) p(W ) p(Y|X ,W ) p(Y ,W|X)=p(W ) p(Y|X ,W ) p(W )=N (W|μ ,Σ) p(Y ,W|X)= p( X ,Y ,W ) p(X) =p(W ) p(Y|X ,W ) p(Y|X ,W )=N (Y|f (W , X),σ) X Y W μ ∑ σ N p(W|( X ,Y )N )= p(W ,(X ,Y )N ) p(( X ,Y)N ) 1.予測したい変数を取り巻く確率変数の関係性を整理 2.各変数、パラメータに確率分布を設定(具体的な同時分布が形成) 3.観測データによるパラメータの事後分布を計算(紙とペン or MCMC or 変分推論) = ∏ i=1 N p(W , X i ,Y i ) ∫ W ∏ i=1 N p(W , X i ,Y i )dW = p(W )∏ i=1 N p(Y i |X i ,W ) ∫ W p(W )∏ i=1 N p(Y i |X i ,W )dW この領域を PPL が対応

Slide 9

Slide 9 text

様々な PPL ● Wikipedia   https://en.wikipedia.org/wiki/Probabilistic_programming 参照 , 一部抜粋 近年は深層学習ライブラリベースの GPU 対応 PPL が出てきている ● TensorFlow Probability (TensorFlow) ● Pyro (PyTorch) ● NumPyro (Jax) ● PyMC4 (TensorFlow Probability) ● Stan (TensorFlow Probability 予定? ) 等

Slide 10

Slide 10 text

可視化ライブラリ ArviZ ● 共通のデータ構造である InferenceData を提供 ● Python, Julia から利用可能 ● TFP, PyMC, Pyro, PyStan 対応 pip install arviz https://arviz-devs.github.io/arviz/

Slide 11

Slide 11 text

ざっくりとした雰囲気 ArviZ 粒度小 粒度大 ● TF Probability ● Pyro / NumPyro ● Stan ● PyMC

Slide 12

Slide 12 text

実行時間ベンチマーク 1 (by Turing.jl team) Slowest Fastest Dirichlet Process Gaussian mixture model の推論速度を検証 4 Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz 引用: https://luiarthur.github.io/TuringBnpBenchmarks/

Slide 13

Slide 13 text

実行時間ベンチマーク 2 (by Turing.jl team) Slowest Fastest Gaussian Process regression model の推論速度を検証( c5.xlarge AWS instance. ) 引用: https://luiarthur.github.io/TuringBnpBenchmarks/

Slide 14

Slide 14 text

実行時間ベンチマーク 3 (by Turing.jl team) Slowest Fastest Gaussian Process classifier model の推論速度を検証( c5.xlarge AWS instance. ) 引用: https://luiarthur.github.io/TuringBnpBenchmarks/

Slide 15

Slide 15 text

新しい PPL も十分に実用的速度 ● 基本的に Stan は速い ● Compile 時間を含めると New PPLs は速い モデル自体を何度も弄るなら PPLs は十分な選択肢

Slide 16

Slide 16 text

各 PPL のコードを比較 性能は分かった。使いやすさはどうか。 単回帰を MCMC で推論するコードを比較 (本来 MCMC を持ち出すモデルではないが…) それぞれの書き方、 API の雰囲気を見る

Slide 17

Slide 17 text

モデリングと推論実行の概要 X Y W X Y W μ ∑ σ p( X ,Y ,W )=p(X) p(W ) p(Y|X ,W ) p(Y ,W|X)=p(W ) p(Y|X ,W ) p(W )=N (W|μ ,Σ) p(Y ,W|X)= p( X ,Y ,W ) p(X) =p(W ) p(Y|X ,W ) p(Y|X ,W )=N (Y|f (W , X),σ) X Y W μ ∑ σ N p(W|( X ,Y )N )= p(W ,(X ,Y )N ) p(( X ,Y)N ) 1.予測したい変数を取り巻く確率変数の関係性を整理 2.各変数、パラメータに確率分布を設定(具体的な同時分布が形成) 3.観測データによるパラメータの事後分布を計算(紙とペン or MCMC or 変分推論) = ∏ i=1 N p(W , X i ,Y i ) ∫ W ∏ i=1 N p(W , X i ,Y i )dW = p(W )∏ i=1 N p(Y i |X i ,W ) ∫ W p(W )∏ i=1 N p(Y i |X i ,W )dW

Slide 18

Slide 18 text

Stan で単回帰 1. モデル作成  ( Stan ファイルフォーマットに従う) 2. MCMC サンプル取得 Stan (C++) を Python や R から叩く Stan にやらせたいことは Stan ファイルに書ききる

Slide 19

Slide 19 text

TFP で MCMC :単回帰モデル分散既知 1. モデル作成(同時分布の定義) 2. 同時確率関数作成 3. 確率遷移核の作成 4. MCMC サンプラ関数呼び出し サンプラ周りのコードが少し重い 推論対象のパラメタもユーザが管理

Slide 20

Slide 20 text

TFP で MCMC :単回帰モデル分散未知 1. モデル作成(同時分布の定義) 2. 同時確率関数作成 3. 確率遷移核の作成 4. MCMC サンプラ関数呼び出し サンプラ周りのコードがだいぶ重い 推論対象のパラメタもユーザが管理

Slide 21

Slide 21 text

PyMC4 で MCMC : 単回帰 ( 分散未知 ) PyMC4 モデルを推論関数に渡すだけ(パラメタ管理等を任せられる) 別途モデルを解釈できる関数で予測モデルなどを構築可能 1.モデルを書く 2 . sample 関数に渡す

Slide 22

Slide 22 text

Pyro で MCMC : 単回帰(分散未知) Pyro / NumPyro モデルを推論クラスに渡す(パラメタ管理等を任せられる) 別途モデルを解釈できる関数・クラスで予測モデルなどを構築可能 1.モデルを書く 3 . MCMC 関数に渡して run()! 2 .確率遷移核インスタンス作成

Slide 23

Slide 23 text

書きやすさに関する所感 ● TensorFlow Probability は一段低いとこから書く 細かいことを書ける / 書かなければいけない ● 個人的には Pyro のインターフェースが気に入っている ● PyMC4 は完成すれば第一候補 ( PyMC4 で弄れない時に仕方なく TFP を使う感じ)

Slide 24

Slide 24 text

現在の状況 ・ TFP  基本的には研究用 + バックエンドの立ち回り ?   (Stan3, PyMC4, Edward2 等 TFP を基礎に置く PPL, TFP for Jax, for numpy 開発中 )   tf.Variable を tf.Module で管理 , tf.keras.Model で管理が両方いる   tfp.layers, tfp.sts, tfp.glm, tfp.vi 等の高レベルモジュールあり ・ Pyro / NumPyro  本体は必要最小限の機能を提供( MiniPyro でコアが分かる)     contrib に特定用途用の高レベルモジュールが点在   Pyro は特に変分推論と NN の組み合わせが非常に柔軟 ・ PyMC4   Mixture や TimeSeries 等の整備はこれから、本格利用はまだ早い

Slide 25

Slide 25 text

Pyro で GMM を一通り ● TFP の使い方、例は他の発表で見られる ● PPL 比較のために Pyro の例を出していく

Slide 26

Slide 26 text

クラスタリングの例 3つの異なる多変量正規分布から ランダムにデータを取得 色分け:各クラスタを表現 データのクラスタ割当は知らない設定

Slide 27

Slide 27 text

同時分布の記述 p μ ∑ X Z K N 事前分布からの サンプリング

Slide 28

Slide 28 text

事後分布の推論 ・推論はたった3行 ・推論するパラメタは自動判定 ・離散パラメタは自動で周辺化 ・ summary() メソッドで結果確認 p μ ∑ X Z K N

Slide 29

Slide 29 text

事後分布の可視化 arviz フォーマット対応 可視化が楽!! ( TFP も PyMC4 も PyStan も対応)

Slide 30

Slide 30 text

推論済のパラメタで生成モデル p μ ∑ X Z K N 1. 事後分布( mcmc サンプル)から 各パラメタの平均を計算 2. 元のモデルから条件付き確率モデル作成 3. 条件付き確率モデルからサンプル生成

Slide 31

Slide 31 text

パラメタとデータで潜在変数推論 p μ ∑ X Z K N 設計した同時分布から潜在変数以外の条件付き分布を求め MAP 推定

Slide 32

Slide 32 text

変分推論モジュールも充実 ・変分分布の設定を自動で行ってくれる機能あり ・マニュアルで作成することも可能 ・ Flow 系各種も取り揃えられている ・パラメタの事前分布を把握し、自動で再パラメタ化

Slide 33

Slide 33 text

最後に ● Deep Learning がライブラリの整備で隆盛した ● Julia Lang でも Turing.jl や Gen.jl 等が開発中 ● 今後 PPL の整備で確率モデリングの人口増加、有用性認知 ● TFP と PyMC4 は確率モデリングをブーストするはず ● 今は個人的に Pyro が使いやすいが、今後の整備に注目

Slide 34

Slide 34 text

参考 DynamicPPL: Stan-like Speed for Dynamic Probabilistic Model https://arxiv.org/abs/2002.02702 Turing.jl チームメンバによる PPL の比較 https://luiarthur.github.io/TuringBnpBenchmarks/dpsbgmm ArviZ https://arviz-devs.github.io/arviz/ TensorFlow Probability https://www.tensorflow.org/probability?hl=ja