HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

ベイズモデリング勉強の外観

はじめに

今回は下記のツイートが割と評判が合ったので、少し補足のための記事を書きたいと思います。

上記発言の意図

まずツイートの意図としては、「アヒル本」、「須山ベイズ」、「渡辺ベイズ」は指導の方向性が異なっており、それがベイズの全体像を埋めていくための知識を補い合っているということを伝えたかったのです。一応それぞれがどのような立ち位置かと言いますと

アヒル本

StanとRでベイズ統計モデリング (Wonderful R)

StanとRでベイズ統計モデリング (Wonderful R)

問題設定からデータの把握、そしてモデリング、結果の解釈までをStanの豊富なコード例と共に進めていく極めて実践的な本です。数式は基本的にモデリングをわかりやすく端的に表すためのツールとして用いられており、それほど複雑怪奇な式が出てくることはありません。基本的な確率統計の言葉と、線形代数の計算ができれば読み進めることができる本になっています。

一方で、データ解析を学ぶ本であり、データ解析手法としてベイズモデリングを(好んで)使っているというイメージが合うような気がします。ベイズ統計や周辺のアルゴリズムについて懇切丁寧に解説をしているわけではないということには注意が必要です。

須山ベイズ

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

様々な確率モデルについて「モデリング→推論」の流れを数式で追っていきます。紙面の半分は日本語で残りは計算式だと思ってください(言い過ぎ)。結構腕力がいると思われます。この本を追える、あるいはこの本のように確率モデルを作れるということは、(何らかの計算に向いた言語を知っていれば)そのままプログラムがかけるというわけです(著者の須山氏はJulia langで実装を公開しています)。

問題を解いていくことで理解が深まり身についていくあの感覚そのままです。本書は問題形式にはなっていませんが、答えを見ながらでもちゃんと式をフォローしていくことで勉強になる感覚を覚えているはずです。割とベイズで頻出する式変形を体に慣れさせる感覚の本です。

渡辺ベイズ

ベイズ統計の理論と方法

ベイズ統計の理論と方法

こちらはベイズモデリングの個々の手法やデータ分析にまつわる具体的な話を扱っている本ではありません。ベイズで扱われる予測分布等の数学的な性質について言及している本であり、理論の話がメインです(一応「方法」とタイトルに書いてありますが、アヒル本のような具体的なデータ解析を想像すると痛い目みます)。

難易度の高い数学が使われており、この本をスラスラ読めるのであればそもそもこんなブログで参考にしないでしょう。 ただスラスラとは読めなくとも、本で紹介されている結論などは知っておいて損はないでしょう。頻度主義とかベイズ主義とか、そんな区別するものでもないことが(結論を認めればですが)わかるはずです。

続いて、ベイズモデリングに関する概観をザッと見ていきます。

確率モデリング

確率モデリングとはデータ $x$ が確率分布 $\hat p(x)$ から生起していると考え、その確率分布 $\hat p(x)$ を手持ちの有限データから探ろうという試みです。そうして作られた確率モデルは新しいデータ$x_{new}$ の予測に使われたり、あるいは確率モデルの形状(あるいはパラメータ)から何らかの解釈に落とし込むことに用いられます。

確率モデリングの概要

通常は手元に有限個のデータ $D = \{x_1, \cdots, x_N\}$ を集めておいて、これらに対する物理的な知見や、ヒストグラム等の可視化から定性的(あるいは定量的)な情報を集めることから始まります。

その後、$x$ が従う確率分布 $\hat p(x)$ は一体どんなものであろうかと思いを馳せながら、既知の確率分布を組み合わせてモデルを構築します。例えば、データはある値を中心に大小に均等にぶれており、中心に近いほどデータの数も多いようなケースは正規分布を使ってみようなどと考えるわけです。

ところがデータが実際に従っている真の分布$\hat p(x)$ が勝手に我々が考えたモデル(例えば正規分布)で表せる保証などありません。単に、そんな気がするのでそう仮定するというだけなのです。そして、そう仮定した中で一番真っ当な形はどんなものであるかを決めることしか出来ません。この時点で、真の分布 $\hat p(x)$ を知ることを我々は諦めていることに注意してください。これから得ようとしている確率モデルは、真の分布と完全に一致していないという意味で間違っています。

それでも「間違っている度合いがどれだけマシか」を測る方法はいろいろあります。実直に「真の分布に比べてどれくらい隔たりがあるのか」ということを近似的に見ることもできます。あるいは「データの予測に対する誤差がどの程度で済むのか」ということを見てやることもできます。これは目的に応じてでしょう。いずれもどれくらいマシなのかを見ることは出来ても、真の分布それ自体を知ることは出来ないことに注意してください。

多くの場合は構築されたモデルから解釈を行ったり、あるいは新しいデータの予測を行ったりすることに使われるはずなので、その目的を達成することが確率モデリングの役割です(決して、集めたデータの真実をピタリと知れるなどと思わないように…)。

確率モデリング手順

ここでデータ $D = \{x_1, \cdots, x_N\}$ を持っているとしましょう。これに対して何らかの考察を行って、確率分布 $p(x | \theta)$ を仮定します。ここで $\theta$ は分布の形状を決定するパラメータです(例えば正規分布ならば平均と分散)。これを確率モデルと呼びます。確率モデルのパラメータ $\theta$ 自体もばらつきを持っており確率変数だと考えます。

例えば「夏場の気温 $x$」に対して正規分布$\mathcal N(x | \mu, \sigma)$を仮定し、「平均気温 $\mu$」なるパラメータを考えることが出来ますが、平均気温自体も年や国によってばらついているはずです(そもそも、いつ、どこの夏場の気温が知りたいのかによりますが)。なのでそのばらつきを反映するような確率分布 $p(\mu)$ を仮定してやることもできるわけです。

話を一般的なところに戻すと、確率モデル $p(x | \theta)$ に対して $\theta$ の確率分布 $p(\theta)$ を更に考えてやることができるというわけです。これを事前分布と呼びます。確率モデル$p(x |\theta)$ と 事前分布 $p(\theta)$ を合わせてベイズ確率モデル $p(x, \theta) = (x |\theta)p(\theta)$ を作ることが出来ます(式自体は条件付き分布の決まり事である)。これは要するにデータとパラメータの同時分布です。ベイズ確率モデリングというのは言わば、データとパラメータの同時分布を考えてやることに等しいのです(言い過ぎか?)。

ところで同時分布と条件付き分布の関係式は

$$ p(x, \theta) = p(x |\theta)p(\theta) = p(\theta | x)p(x) $$

と最右辺の形にできることも注意しておきましょう(余談ですが、同時分布自体はそれぞれの確率変数を完全に対等に扱っており、グラフィカルモデルでは無向グラフになります。一方、条件付き分布を使った表現は有向グラフになっており、ある同時分布を表現する条件付き分布での形式が複数あるというのは、無向グラフを有向グラフに変換する方法は1通りではないということです)。

この関係式をジッと眺めつつ、今、手元にある確率変数の実現値が$ D = \{x_1, \cdots, x_N\}$ であることを思い浮かべれば、

$$ \begin{align} p(\theta | x_1) &= \frac{p(x_1 |\theta)p(\theta)}{p(x_1)}\\ p(\theta | x_2) &= \frac{p(x_2 |\theta)p(\theta)}{p(x_2)}\\ & \vdots \\ p(\theta | x_N) &= \frac{p(x_N |\theta)p(\theta)}{p(x_N)} \end{align} $$

という条件付き分布たちを考えたくなります(条件付き分布というのは $ | $ の右側が確定した場合の 左側の確率変数の確率分布であった)。 今、 $x_i$ が全て独立に同じ分布から生成されてきたものであるとすれば

$$ \begin{align} \displaystyle p(\theta | x_1, \cdots, x_N) &= \frac{p(x_1, \cdots, x_N | \theta)p(\theta)}{p(x_1, \cdots, x_N)} \\ \displaystyle p(\theta | D) & = \frac{\prod_i^N p(x_i | \theta)p(\theta)}{p(D)} \end{align} $$

と表現できます。これを通常は事後分布と呼びます。基本的に、確率モデル $p(x | \theta)$ と 事前分布 $p(\theta)$ を決めた時点でここまではオートマチックに出てくることなります(階層モデルにしたり、複雑にパラメータ・潜在変数が関係し合うモデルでも数式変形あるいはグラフィカルモデルの操作を機械的に行うことで求めたい事後分布を導出することが出来ます)。

事後分布をデータから求めることが推論あるいは学習と呼ばれるフェイズです。

予測モデル

予測モデルの構築方法はいくつか考えられます。まず事後分布 $p(\theta | D)$ は 確率モデル $p(x|\theta)$ と事前分布 $p(\theta)$ を使う上で、$\theta$ がどんな値だと真っ当だと言えるかを確率で表現しているものです。

MAP推定値

そこで事後分布が最大となっている $\theta$ は一番真っ当な $\theta$ であると考えられます。このような $ \theta_{MAP} = {\rm argmax}_{\theta} (p(\theta | D)) $ を決めることをMAP推定と言います(最初からMAP推定すると決めていれば、学習のフェイズで事後分布の推論をせずに最大化問題で楽ができる)。そうして予測時には確率モデルにMAP推定値を代入して $p(x | \theta_{MAP}) $ を予測モデルとして利用することができます。

EAP推定値

次に、事後分布 $p(\theta | D)$ で $\theta$ の期待値 $\theta_{expected} = \int_{\theta} \theta p(\theta |D)d \theta$ を計算して $p(x|\theta_{expected})$ を予測モデルとして使う方法もあります。これはMAP推定に似ているようですが、事後分布が歪んでいたりすると大きく結果が異なって来ることに注意してください(どちらが良いとは言えませんが)。

ベイズ予測分布

最後にベイズ予測分布を紹介します。上記2つは、事後分布からある1つの $\theta$ を計算して使っていました。しかし、ベイズ予測分布は考えうる全ての $\theta$ を考慮してモデルを構築します。ベイズ予測分布は下記の形をしています。

$$ p(x | D) = \int_\theta p(x|\theta)p(\theta|D)d\theta $$

これは確率モデル $p(x|\theta)$ にどんな $\theta $を使えば良いか迷うなら、 $p(\theta | D)$ の重みをつけて色々な $\theta $を混ぜ込んでしまえという心があります。例えば、事後分布が単峰で裾も薄いのであればMAP推定値を使ってしまってもいいかもしれません。しかし仮に事後分布の裾が厚かったり、多峰であったりしたならば1つの値しか使わないなんて明らかに色々な可能性を捨ててもったいないと思うはずです。可能な限りはこのベイズ予測分布を計算してみることをおすすめします。

そして「ベイズ統計」は、このベイズ予測分布が元々考えてたデータ $x$ の真の分布 $\hat p(x)$ を(一致はしないものの上手に)表してくれるであろうと考えて理論が構築されています。したがって、ベイズ理論の枠組みで真の分布との隔たりや、汎化性能を評価しようとする場合にはベイズ予測分布を求めるのが基本ということになります。

ベイズモデリングのまとめ

  1. データ $D$ の概要を掴む
  2. 確率モデル $p(x | \theta)$ と事前分布 $p(\theta)$ でモデリングする
  3. 何らかの推論アルゴリズムで事後分布 $p(\theta | D)$ を得る
  4. ベイズ予測分布 $p(x | D)$ を得る
  5. モデリングそのものが良かったのかを何らかの方法で評価する

というのが理想的な流れです。

アヒル本は事後分布の計算結果と予測分布の計算結果も掲載されていますが、特に「1.~2.」とその後の結果の解釈「5.」に注力しております。 須山ベイズは「2.~4.」の数式パートを詳細に取り扱っています(github上にはjulia langのコードもあります)。 渡辺ベイズは「2.」と「4.~5.」に関して理論的な立場から言及しており、特に事後分布やベイズ予測分布などベイズならではの推論が真の分布とどのように違うのか、新しいデータに対する予測としてどのような性能を持ちうるのか、そしてそれを評価するための理論的な方法について言及しています。

もちろん、推論アルゴリズムの主力となっているMCMCについて詳しく知りたい場合は、そのための本が別途必要になるでしょうし、確率分布の基本から学びたければそのための本が必要でしょう。また、時系列データであるとか、それに伴い確率過程を扱うような場合には更に高度な数学が(ベイズ推論するかは別として)要求されたりする場合もあります。

上記3冊を読めば「完璧!」と言えるかは分かりませんが、それでもベイズの大事な部分を網羅しつつ、ど真ん中の最重要なところを3冊で重ね塗りできるようなイメージなのでおすすめいたしました。

【TF Advent Calendar 2018】TensorFlow Eager Executionの使い方 step by step

f:id:s0sem0y:20181204232350p:plain

  • はじめに
  • TensorFlow Eager Execution概要
    • What's Eager Execution
    • Why Eager Execution
      • 計算グラフを動的に変えられる
      • PythonicかつNumPyライクに使える
  • Eager Execution 実践
    • 自動微分
    • 低レベルEager
    • Optimizer利用
    • tf.keras.layersl + tf.train
    • Keras での学習コード抽象化
  • 最後に
  • TensorFlow Eager Tutorial
続きを読む

TensorFlow Eager Execution Tutorials

TensorFlow Eager_Execution Tutorials 始めました。

PyTorchのTutorialsの充実具合に影響されて始めました。githubにあるPyTorchのtutorialリポジトリを参考に、TensorFlow Eagerへ焼き直し、あるいは適宜内容を変更し、今後も追加していきます。コードは今のところ全てgoogle colabで書かれています。

英語の読み書きは苦手なので雰囲気だけで…。

github.com