オーストラリアで勉強してきたデータサイエンティストの口語自由詩

主に、ベイズ・統計・データ分析・機械学習について自由に書く。

英語記事の翻訳 - ”Bayesian Analysis with Python - 第二版(オズワルド・マーティン)“ への序文(2019)

TL;DR

最近出版された「Bayesian Analysis with Python - Second Edition」への序文をPyMC3のコア開発者であるThomas Wieckiがブログ記事で書いていたので翻訳してみました. 「Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド」という訳書がすでに出版済みですが, こちらは第一版なので少し内容が異なるので注意が必要です. 具体的には最新の第二版では arviz による可視化などが含まれていたりします.

できるだけ直訳ではなく, 自然な日本語になるように言い換えたり, 言葉足らずだと感じた箇所にはあえて言葉を増やしたりしてます.

そんなに長くない記事なのですぐ翻訳できると思ってたんですが, 結局1時間かかってしまいました汗.

本文 - My foreword to "Bayesian Analysis with Python, 2nd Edition" by Osvaldo Martin

オズワルドが彼の新しい著書への序文を私に頼んできた時, 誇らしさや興奮した気持ちとともに少し怖さもあったが, 自然に受け入れることにした. これから, 私にとって確率プログラミングがどれだけ魅力的であるか出来るだけ伝えてみよう. オズワルドの素晴らしい本は, 見つけうる限りの中で最新の情報を提供しており, 確率プログラミングを学び始めるよい手がかりになるでしょう. さあ, この本を手に取ってみてください.

もしこれ以上にこの本を読む動機が必要な人には:

「確率プログラミング」はプログラミングのコードによってベイズ統計モデルを柔軟に構築するためのフレームワークです. 一度モデルを構築してしまえば, そのモデルとは独立に動作する強力な推論アルゴリズムによって, モデルをデータに適応(fit)させることができます. 柔軟なモデルと自動推論の仕組みは, 研究者が新しい統計モデルをすばやく構築・分析・改善するための強力なツールを提供します. 以前のベイジアンモデルの手法では, 推論アルゴリズムは通常は特定の一つのモデルに対してのみ機能しました. このアプローチはモデルを定式化して推論スキームを構築するために高い数学的スキルを必要とするのみならず, モデルを変更して再度推論するという改善の反復サイクルをかなり遅くしていました. 確率プログラミングは多くの人に統計モデリングを活用してもらえるための必要な数学的理解のハードルを下げ, 新規モデルを構築するための時間を効率化することによってデータから独自の考察を得ることを可能にするでしょう.

確率プログラミングのアイディはそんなに新しいものではありません. 最初にBUGSという確率プログラミング言語が1989年にリリースされました. この第一世代の確率プログラミング言語は, うまくデータに適合するモデルは非常に限られ推論の処理も遅く, あまり実用的なものではありませでした. 昨今ではより大規模で複雑な問題を解決するために, 学術の領域やGoogle, Microsoft, Amazon, Facebook, Uberなどの企業で使用されている多数の確率的プログラミング言語があります. 何が変わったのでしょうか? 確率プログラミングを単なるおもちゃから複雑で大規模な問題を解決できる強力なエンジンへと変えた重要な要素は, 従来のサンプリングアルゴリズムより数段強力なハミルトンモンテカルロサンプリング(HMC)の出現でした. もともとは1987年に考案されましたが, StanとPyMC3という最近の確率プログラミングシステムがこのサンプリング手法を幅広く利用可能なものにしました.

この本は確率プログラミングという非常に強力で柔軟なツールへの実用的な入門書です. この本を読むことで, 複雑な分析問題をどのように考え解決するかというあなたの思考に大きな影響を与えるでしょう. PyMC3のコア開発者であるオズワルド以上にこの本を書くに適した人は少ないでしょう. 彼には複雑なトピックを簡単に消化できるように細分化するという貴重な才能を持っています. 困難な経験を通して得られた彼の深く実用的な理解が読者を最も効率的なルートに導くことでしょう. また, 実行可能な可視化やコード例を通して, 理論的基礎を直感的に理解する手助けにつながります.

読者の皆様, この本を手に入れたことにも感謝します. 正直なところ, これは決して速くて簡単な方法ではありません. 現在および将来のすべての分析問題を解決するための技術としてディープラーニング(深層学習)を宣伝している時代には, 特定の目的のためにカスタムモデルを構築するより慎重で慎重なアプローチはそれほど魅力的ではないかもしれません. しかし, 他の方法ではほとんど解決できない問題を解決することができるのです.

ディープラーニング(深層学習)が非常に刺激的なテクニックであることは言うまでもありません. 実際, 確率プロギグラミング自体は古典的な統計モデルに成約されていません. 現在の機械学習の文献を読むと, ベイズ統計が次世代のディープニューラルネットワークを表現し理解するための強力なフレームワークとして浮上していることがわかります. この本は, このように難しい分析問題を解決するためのスキルのみならず, AI(人工知能)開発という人文科学の最前線の特等席に座る手助けをするでしょう. Enjoy!

Thomas Wiecki

参考資料

英語記事のサマリ - UberのAIラボが #Pyro という深層学習+ベイズのライブラリを発表(2017)

UberのAIラボがPyroという深層学習+ベイズPythonライブラリを発表したブログ記事をサマリ翻訳してみた.

2017年11月の記事で若干古いが, 他にPyMC4やTFP(Tensorflow Probability)などのライブラリがある現状, Pyroがどのようなポジショニングをしているか確認する目的.

注)正確な翻訳ではなくあくまでも記事の翻訳サマリなので, 個人的に重要でないと判断した部分は省略したり, 原文がわかりづらい部分は意図的に言葉を付け加えたり補足したりしてます(`・ω・´)(ぺこり)

TL;DR

  • UberのAIラボが Pyroという深層学習+ベイズPythonライブラリを発表した
  • 確率モデリングによりデータの不確実性を推論し, 専門家の知識をAIシステムに活用することができる
  • 4つのコンセプトがある
    • 汎用性
    • 拡張性
    • 最小限
    • 柔軟性
  • 既存の確率プログラミング言語の枠組みに加え, guide という概念を取り入れている

内容

はじめに

Uberのやりたいことはユーザに信頼性のある移動手段を提供することで, そのためには毎回の予測と最適化を容易に行う必要がある.

用途としては主に以下の通り.

  • 乗り手とドライバーとのマッチングをする
  • 最適なルートのレコメンドする
  • 賢いライドシェアの組合せを見つける
  • 次世代の自動運転車を開発する

これらの課題を解決していく試みの中で, UberのAIラボがOSSとして Pyro を発表した. Pyroはモダンな深層学習とベイズ統計モデリングの手法を統合したツール.

なぜPyro?

  • なぜ確率モデリングが必要?
    • 教師なし学習および半教師つき学習のモデルと予測の不確実性を正しく捉え, 専門家の前提知識をAIシステムに組み込むため.
  • なぜ確率プログラムが必要?
    • 複雑なモデルを構築するための明確で高レベルかつ完全なツールが必要なため.
  • なぜ深層確率モデルが必要?
    • データから生成過程を学び, どのように推論するか知識を具体化するため.
  • なぜ最適化による推論が必要?
    • 大量データにもスケールして対応できるよう, モダンな最適化と変分推論を活用するため.

以下は詳細.

確率やそれを用いたモデルによって不確実性を推論し, それによりデータから「何がどれだけわかっているか?」「何がどれだけわからないか?」を理解することができる. 加えて, その業界の専門家の前提知識をそのAIシステムに組み込むことができる.

確率モデルの実装はめんどうでバグりやすいので, 「確率プログラミング言語(Probability Programming Language)」というものが必要になる. これを用いることで確率モデルの実装に伴う決定論的な計算(例: 1+1=2 など)と乱数生成(例: 正規分布から値をサンプリングする)を自然に組み合わせることができる.

Pyroはそれらを可能にし, かつ既存の確率プログラミング言語の問題点であるスケーラビリティの低さを解消しつつ, 深層学習の手法も取り入れている. 重要な概念としては 第二のモデル(guide) を導入しており, これは Helmholtz machine のアイディアである. 通常の確率モデル(第一のモデル)はデータの生成過程表し, guide(第二のモデル)はデータを潜在変数への変換の生成過程を表している.

注) ↑ このあたりは説明不足っぽいので, 別の資料を参考にしたい(`・ω・´)

もちろん正確なguideを実装するのは不可能なので, そのかわりに 変分 の手法を用いて最適化問題を解くことでguideをモデルの事後分布に近づけるようにする. この最適化は 自動微分 で行われるため, 勾配計算などを自動で効率的に計算してくれる. このあたりは PyTorch というPyroのバックエンドのライブラリによって行われる.

Pyroのデザインコンセプト

  • 汎用性: 汎用的なPythonコードでループや再帰, および乱数生成や推論ができること
  • 拡張性: 少しのオーバーヘッドで大量データにスケーラブルに対応できる(最適化やミニバッチ, 近似推論などを用いて)
  • 最小限: 内部的に, 組合せ可能な抽象的なコードで実装されている(Pytorchや他ライブラリに処理を委譲している)
  • 柔軟性: 高レベルな抽象的なAPIを提供しつつ, より複雑な推論やモデルが必要であればカスタムすることもできる

これらのコンセプトを実現しようとすると, 実際には相反している項目があるため実現が難しい. 例えば汎用性を上げるとスケーラビリティを担保するのが難しくなり, 最小の抽象化を実現しようとすると応用的なカスタマイズが難しくなり拡張性が下がる.

これらの問題を解決するためにWebPPLやEdwardなどの他の確率プログラミング言語のさまざまなテクニックを拝借してきた.

  • 組み合わせ可能なハンドラーによるコントロールフローと計算処理の分離:
    • Poutine(Pyro Coroutine)
    • Trace
    • Replay
    • Condition

今後の課題

参考資料

英語記事のサマリ - PyMC開発者のThomas Wieckiさんにインタビューした記事

気分転換にベイズや確率プログラミングに関する英語記事や論文の翻訳サマリをさっくり書いていく予定.

第一回目はPyMC3の開発者のインタビュー記事.

TL;DR

PyMC3の開発者であり, かつQuantopian という投資会社で働いている Thomas Wiecki へのインタビュー記事の英語サマリ.

補足: Quantopianクラウドソース型の投資会社で投資アルゴリズムを開発・支援している

内容

注意) 重要でなさそうな質問や回答は省略している.

確率プログラミング(Probabilistic Programming)とは?

確率プログラミングはベイズ統計モデリングプログラミング言語のコードで表現するというパラダイムのこと. 例えばA_Bテストでモデルをコーディングして推論することで, “x%の確率でバージョンAのCVRの方がバージョンBより高い” と推論結果の分布から示すことができる. このA_Bテストの例は単純な例だが, 実際にはもっと複雑なモデルもありえる. 何かの問題を解決しようとする時, 何らかの事前情報や構造(階層構造など)があるため, それをモデルに組み込むことができる. 確率プログラミングはそれらのプロセスを支援するためのツールの一つ.

PyMCとは?

PyMC3は確率プログラミングのフレームワークの一つ. 特徴としてはPythonで記述することが可能であったり, 最先端の推論アルゴリズムを実装していることが挙げられる. また, コミュニティが活発であることも特徴の一つ.

PyMCはなぜ作られたの? 他プロジェクトのEdwardやStanとの違いは?

PyMC3はもともとMCMCアルゴリズムの上位である次世代のHMC(ハミルトンモンテカルロアルゴリズムを実装することも目的に作られた. HMCを実装するには勾配計算が必要だったため, そのためにTheanoが採用された.

StanはC++で書かれておりカスタムDSLでモデルを記述する必要がある. 一方, PyMC3の場合には単にPythonで記述することができ, DSLを覚える必要がない.

Edwardはtensorflow上に構築されておりPyMC3と近い. Edwardは特に変分ベイズやスケーラビリティ, 深層生成モデルに注力している(注: Tensorflow Probabilityに統合されたのでもうアクティブではない).

役割分担のまとめ

  • ML研究者で深層学習や変分ベイズがやりたい: Tensorflow Probability
  • 統計知識があるRユーザ: Stan
  • Pythonが好きなデータサイエンティスト: PyMC3

PyMCが実際に使われている例は?

主にアカデミックなさまざまな領域で使われており論文は200にのぼる. 企業のよくある例だとA/Bテストやサプライチェーン最適化など.

PyMCは深層学習の手法と連携していくことは可能?

PyMC4になるとバックエンドがTensorflow Probabilityになるからそうなるかもね.

金融分野で変分ベイズ vs MCMCを使用するトレードオフは?

変分ベイズは速いけどその分精度が落ちるから金融分野ではMCMCがおすすめ.

QuantopianではPyMC3はどのように用いられているか?

色々なところで使ってるけど, 主にポートフォリオ・ウェイティング(portfolio weighting)だね.

注) 金融周りがよくわからないのでちょっと省略

確率や統計を学ぶのにおすすめの書籍やeラーニングは?

書籍

eラーニング

参考資料

2019年の抱負: ベイジアンとしてやること・やらないことを宣言する(˘ω˘)スヤァ

目標ややりたいことは書き留めたり人に宣言した方がいいらしいので、改めてまとめてみた。

TL;DR

一言でいうと ベイズ x python x 金融 の3つに関連することだけやっていくつもり(`・ω・´)

基本方針として Focus(選択と集中) にこだわって、 やること も決めつつ やらないこと も書いた。 自分の性格や今までの経験上、いろいろな技術をつまみ食いして時間を無駄に費やす癖があるので汗。

やること(MUST)

  • ベイズ統計モデリングについて書いていく
  • ベイズに関する英語の論文や記事をサマる
  • kaggleにベイズ勢として参加したい(`・ω・´)
  • python極める
  • pytorchに魂売る(ベイズ統計モデリングのライブラリとしてpyroを使っていく)
  • 他のIDEに浮気しない(neovim + jupyterのみ)
  • 金融周りに詳しくなる。できればシステム作りたい。
    • スモールビジネスでちゃりんちゃりんしたい

やってもいいこと(COULD)

  • 可視化する方法や技をもっと知る(matplotlibやseabornを使いこなす)
  • Rで書かれた本も多いため、理解する目的で必要であればRも継続して学習していく
  • クラウド周り(GCP/AWS)の知識は本業でも副業でも必要になるので、仕事で必要になり次第知識を深める

やらないこと(WON'T)

  • 他のプログラミング言語に浮気して時間を浪費しない(NO go/rust/julia/clojure
  • 代替ライブラリを無意味に比較・検証しない(NOT tensorflow/tensorflow probability)
  • 無意味にIDEを試したり設定にこだわったりしない(NO emacs/vscode

補足

↓ もともとはtensorflowをやっていこうかと思っていたが、tensorflowやTFP(tensorflow probability)の開発が進んでないとか、そもそも書きづらいとか色々考えて早々にpytorch/pyroに乗り換えることにした(`・ω・´)

Chapter 3 統計モデリングをはじめる前に 3.3〜3.5 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

3.3 背景知識の役割

背景知識を活用することで内部構造がブラックボックスな問題(逆問題: inverse problem)を解く手がかりとなる. 逆問題の回答は何通りもあり得, 答えが一意に定まらない問題は不良設定問題(ill-posed problem)と呼ぶ.

データを活用して解きたいビジネス問題の多くはこのようにメカニズムが不明なものが多いように思える. 例えば, 金融業界における株価の上下や広告のクリック率の増減など.

統計モデリングでは背景知識にもとづいた仮定をモデル式(数式)として表現し, 逆問題を解く手がかりとする. 真のモデル(正解)はわかりえないため仮定したモデルが「正しい」かではなく, そのモデルが

  • 解釈しやすいのか(複雑すぎず理解しやすいのか等)
  • 納得しやすいのか(背景知識と整合性が取れているのか等)
  • 予測がよいのか(未知のデータに対して予測がよいのか等)

という観点が重要.

3.4 モデルの記述方法

モデル式 は以下のような変数の式で表される.

Y[μ] ~ Normal(μ, 1) n = 1,…,20

Y[μ]は平均がμで標準偏差が1の正規分布から確率的に生成されたことを表す.

3.5 情報量基準使ったモデル選択

情報量基準 という指標を用いてモデルの評価をすることができる. 主に以下の4つが挙げられている. しかし, 本書の中ではこの指標を過信しないように敢えて情報量基準について触れない(らしい).

  • 予測のよさを表す
  • 真のモデルへの近さを表す

情報量基準については別途資料を参照したほうがよさそう.

特に以下の本を読む必要がありそう.

see: ベイズ統計の理論と方法

TODO

  • [ ] グラフィカルモデルについて別途説明

参考資料

Chapter 3 統計モデリングをはじめる前に 3.1〜3.2 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

3.1 データ解析の前準備

このあたりのデータ前処理(Data Preparation)のプロセスは一般的なものなので特に深入りしない. データの分布を可視化して確認する点は機械学習EDA(Exploratory Data Analysis)のプロセスでも重要とされているが, 多くの統計モデリングや確率的プログラミングの書籍やサイトでは特に可視化を重要視しているように思える.

  • データをとる前に
    • 背景知識の収集(Domain Knowledge)
    • 問題設定(Define Problem)
    • 解析計画(Plan)
  • データをとった後で
    • データの分布の確認(Visualisation)

個人的にはデータ解析のプロセスに関しては以下の本がわかりやすいと思う.

see: データ解析の実務プロセス入門

3.2 統計モデリングの手順

対象書籍内では複数のプログラミング言語が使用されているが, 本ブログでは一貫してPythonで実装・実行する想定.

  1. 解析の目的
  2. データの分布の確認
  3. カニズムの想像
    • イラストで考えをまとめる
  4. モデル式の記述
    • 数式に落とし込んでみる
  5. Rでシミュレーション
  6. Stanで実装
  7. 推定結果の解釈 + 図によるモデルのチェック

特に3と4のプロセスが統計モデリングでは重要らしい.

複雑なモデルだとMCMCが収束しないなどの問題が起こりやすいため, まずはシンプルなモデル式を使うこと.

追加プロセス

  • 再現性のチェック
  • データ解析のサイクル
    • 新しいデータを取得しモデルを改良する等のサイクルを回していくことで予測性能を上げていく

参考資料

Chapter 2 ベイズ推定の復習 2.4〜2.7 - pythonで『StanとRでベイズ統計モデリング』

f:id:yukinagae:20181031083449p:plain

2.4 ベイズ推定とMCMC

伝統的な統計学の手法や最尤推定の問題を解決する一つの手法がベイズ推定(Bayesian inference)とマルコフ連鎖モンテカルロ法(MCMC).

ベイズ統計

  • パラメータを確率変数とみなして確率分布を推定する(伝統的な統計学の点推定と異なる)

 p(θ|Y) = \dfrac{p(Y|θ)p(θ)}{p(Y)}

  • p(θ|Y): 事後分布(posterior distribution)
  • p(θ): 事前分布(prior distribution)

分母の p(Y) は観測データに依存する定数のため, と比例の式に書き換えることができる. (そもそも p(Y) の計算は現実的に難しいらしい)

 p(θ|Y) \propto p(Y|θ)p(θ)

分母の p(Y) 抜きだと正規化されておらずトータルが1にならないため, 実際には確率とみなすことはできないが, p(Y|θ)p(θ) から乱数サンプルを生成して事後分布の代わりにできる, というのがMCMCの考え方らしい(なぜそれが問題ないかは別途資料を読む必要がありそう)

MCMC周りの理論的な説明は別途参考資料を読んだが方が良さそう.

MCMCアルゴリズム

  • メトロポリス・ヘイスティング法
  • ギブスサンプリング

  • 初期値を適当に決める

  • 現在のサンプルから次のMCMCサンプルを乱数生成し更新する(生成したサンプル列は chain と呼ぶ)
  • 最初の方のサンプルは初期値への依存が高いため除外する(除外する期間を warm upburn in と呼ぶ)
  • ある程度のサンプルを生成すると事後分布の形状が変わらなくなり収束する(確か定常分布に収束すると表現するはず)
  • (おまけ)収束しない場合には, まびく( thinning )と改善する場合がある

2.5 ベイズ信頼区間ベイズ予測区間

ベイズ信頼区間

  • 確率分布の幅を計算することで「事後分布を考慮して, 95%の確率でパラメータの値がa〜bの範囲に入る」という言い方が可能になり, これを ベイズ信頼区間 と呼ぶ( 信用区間確信区間 と呼ぶ場合もある)

このベイズ信頼区間は伝統的な統計学の信頼区間と本質的に異なるので注意!

ベイズ予測区間

別途記事にする予定.

2.6 最尤推定ベイズ推定の関係

別途記事にする予定.

2.7 事前分布の選び方

  • 選択肢1: 無情報事前分布(non-informative prior)を使う
    • 何も情報がない場合
  • 選択肢2: 弱情報事前分布(weakly informative prior)を使う
    • パラメータの値についてある程度の知識や経験がある場合(例: 人間の身長は0m〜3mの間 etc)
  • 選択肢3: 共役事前分布(conjugate prior)を使う
    • 過去, コンピュータの計算速度が遅い時に使われていた(計算が速い)

TODO

  • [ ] 予測区間について
  • [ ] MAP(事後確率最大推定値)について

参考資料

MCMC関連