TensorFlow : Edward Tutorials : ガウス過程 (教師あり学習: 分類) (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/17/2018
* 本ページは、Edward サイトの Tutorials : Supervised Learning (Classification) を翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
教師あり学習 (分類)
教師あり学習では、タスクは訓練サンプル $\{(x_n, y_n)\}$ から成る、ラベル付けられたデータから隠れ構造を推論することです。分類は出力 $y$ が離散値を取ることを意味します。
Edward の例で示します。Jupyter notebook による対話的バージョンは こちら で利用可能です。
データ
私達は カニのデータセット を使用します、これはカニの種の形態学上の尺度から成ります。与えられたカニが色形状ブルー (0 としてエンコード) かオレンジ (1 としてエンコード) を持つかを予測することに興味があります。データセットの総ての数値特徴を使用します。
from observations import crabs data, metadata = crabs("~/data") X_train = data[:100, 3:] y_train = data[:100, 1] N = X_train.shape[0] # number of data points D = X_train.shape[1] # number of features print("Number of data points: {}".format(N)) print("Number of features: {}".format(D))
Number of data points: 100 Number of features: 5
モデル
ガウス過程はランダム変数のペアの間の非線形関係をモデル化するためのパワフルなオブジェクトです。それは (多分非線形) 関数に渡る分布を定義します、これは真の関数関係まわりの不確かさを表わすために適用可能です。ここでは分類のためにガウス過程モデルを定義します (Rasmussen & Williams, 2006)。
形式的には、関数 $f:\mathbb{R}^D\to\mathbb{R}$ に渡る分布は次のガウス過程で定義できます :
\[
\begin{aligned}
p(f)
&=
\mathcal{GP}(f\mid \mathbf{0}, k(\mathbf{x}, \mathbf{x}^\prime)),\end{aligned}
\]
その mean 関数は zero 関数で、その共分散関数は (この関数への) 入力の任意のセット間の依存性を記述する、あるカーネルです。
入出力ペア $\{\mathbf{x}_n\in\mathbb{R}^D,y_n\in\mathbb{R}\}$ のセットが与えられたとき、尤度は多変量正規分布として書かれます :
\[
\begin{aligned}
p(\mathbf{y})
&=
\text{Normal}(\mathbf{y} \mid \mathbf{0}, \mathbf{K})\end{aligned}
\]
ここで $\mathbf{K}$ はデータセットの入力の各ペアに対して $k(\mathbf{x}_n, \mathbf{x}_m)$ を評価することにより与えられる共分散行列です。
上は $\mathbb{y}$ が実数値の応答 (= response) である回帰には直接的に当てはまりますが、$\mathbb{y}$ が $\{0,1\}$ のラベルである (二値) 分類のためにはそうではありません。分類を扱うために、応答を $[0,1]$ にスカッシュされた潜在変数として解釈します。それからラベルを決定するために Bernoulli 分布からドローします、スカッシュされた値で与えられた確率によってです。
観測 $(\mathbf{x}_n, y_n)$ の尤度を次として定義します :
\[
\begin{aligned}
p(y_n \mid \mathbf{z}, x_n)
&=
\text{Bernoulli}(y_n \mid \text{logit}^{-1}(z_n))\end{aligned}
\]
事前分布を前述のように与えられた共分散行列を持つ多変量正規分布として定義します :
\[
\begin{aligned}
p(\mathbf{z})
&=
\text{Normal}(\mathbf{z} \mid \mathbf{0}, \mathbf{K})\end{aligned}
\]
モデルを Edward で構築しましょう。(squared exponential または exponentiated 二次 (= quadratic) としても知られる、) RBF (= radial basis function) カーネルを使用します。それはデータポイントの総てのペアに渡り評価されたカーネル行列を返します ; それから多変量正規分布をパラメータ化するために行列をコレスキー分解します。
from edward.models import Bernoulli, MultivariateNormalTriL from edward.util import rbf X = tf.placeholder(tf.float32, [N, D]) f = MultivariateNormalTriL(loc=tf.zeros(N), scale_tril=tf.cholesky(rbf(X))) y = Bernoulli(logits=f)
ここで、プレースホルダ X を定義します。推論の間、データに従ってこのプレースホルダに値を渡します。
推論
変分推論を遂行します。変分モデルを fully factorized normal と定義します。
qf = Normal(loc=tf.get_variable("qf/loc", [N]), scale=tf.nn.softplus(tf.get_variable("qf/scale", [N])))
500 反復の間変分推論を実行します。
inference = ed.KLqp({f: qf}, data={X: X_train, y: y_train}) inference.run(n_iter=500)
この場合 KLqp は再パラメータ化勾配を使用する $\text{KL}(q\|p)$ ダイバージェンス measure の最小化にデフォルト設定されます。
推論のより詳細については、$\text{KL}(q\|p)$ チュートリアル を見てください。(ガウス過程における完全な共分散の評価と逆にすることは偶々遅いのでこの例は偶々遅いです。)
References
- Rasmussen, C. E., & Williams, C. (2006). Gaussian processes for machine learning. MIT Press.
以上