数理の末席

勉強したことをこそこそ書いていきたい。機械学習の数理だったり関係するような分野だったり、コードの解説とかもするかもしれない。仕事の肩書きは機械学習エンジニア。肩書きは!

ガウス過程と機械学習

はじめに


 

前回からかなり期間が空いてしまいました。

24歳になりました。

最近はもっぱらベイジアンになろうともがいてます。(赤のWベイズとか)

 

24歳の目標がアウトプットをすこしずつ増やすなので書いていこうと思います。

(プレゼント、ご飯のお誘いなど年中受け付けてます)

 

  

今回は

MLPシリーズ「ガウス過程と機械学習」 (講談社:持橋大地、大羽成征 2019)

をとりあえず1周したのでアウトプットしておこうと思います。

 

 

ガウス過程と機械学習 (機械学習プロフェッショナルシリーズ)

ガウス過程と機械学習 (機械学習プロフェッショナルシリーズ)

 

 

本記事はまずは自分の為、もしかしたら他の人の役に立てればいいというスタンスの上にあるので十分に間違ってることもあり得るので、参考にする時は自己責任でお願いします・・

なので、ピンと来た人はリンクからポチることをお勧めします

また間違いがあれば指摘頂けると幸いです

 

 

 

※ 読んだりするのは定義がちゃんと書いてて、所謂お堅い感じのが好きですが、自分の勉強の為なので噛み砕いて書きたいのと、本音は自分には数学書みたいな論理構成でかっちりしたのがかけないです。。。

 

某赤いベイズの本から機械学習のこの分野に興味を持ったわけなのですが、不確実性を持った予測ができるという点が個人的にはこの分野の面白さかと思います。

(確率微分方程式とかも少し興味があるのでどなたおすすめ教材や基礎的なことでも教えていただければ嬉しいです)

 

一度に書ききれる実力もないので何回かに分けて書いていこうと思います(予定)

今回はガウス過程の定義とかまでをふわっと行きます。

 

 <目次>

 

 ガウス過程とは


 

関数 f(x) を確率変数と見たてた確率分布

 

です。(ガウス過程と機械学習p8 l.1より)

他には「無限次元の多次元ガウス分布」とか「関数空間上の確率分布」みたいな言い方もされるみたいです

 

と言われてもわからない(少なくとも自分はそうでした。。)ので順に考えていこうと思います。

 

準備的な何か

従来の重回帰分析なんかは、線形な関係を捉える為に変数(x_{1}, x_{2}, \dotso x_{n}) の一次式の和で表して(基底関数)

それぞれに w \in \mathbb{R} で重み付けをして

$$ y = w_{0} + w_{1}x_{1} + w_{2}x_{2} + \dotso + w_{n}x_n $$

とかけますが、線形分離可能なデータに対しては精度を期待できます。

f:id:daiki_tech:20191130211415p:plain

図1:直線の関係。普通ですね(笑

実際の問題で線形分離可能なことなど早々ないですし、基本的に機械学習使う時(今回ではガウス過程なのですが)なんてのはもっと複雑で人間が把握できないような構造を計算機に代わりに学習してもらって数値を予測したり(回帰)何かを分けたり(分類)することが目的であって、線形分離可能とかデータ構造がわかってるのであれば別に機械学習する必要はないのではないですよね?

モチベーションとしては、大量にあるデータの構造がよくわからないような(例えば1本の線を引けば二つに分離されるといったような構造ではなく)データ構造について

PCいい感じに学習していい感じに予測してくれよって訳ですね

サポートベクトルマシンではこのいい感じに引いてくれよっていうのがクラス間の距離が最大になるように直線引いて分けて!だったりNNは複雑なデータの構造を学習するのに大量のパラメータをバックプロパゲーションなどで学習してデータをうまく説明するような非線形の線を引く訳です。

 

話がそれましたが、SVMでのカーネル法やNNのようにより複雑なデータ構造を扱う為に図2のようにもっと複雑な関数について扱いたい訳ですね。

f:id:daiki_tech:20191130212224p:plain

図2:非線形な関係

そこで、より次数をあげた関数の重み付けした和で表そうと思う訳です。

例えば、変数が (x_1, x_2, x_3) として、それぞれ基底関数を

 x_1, x_{2}^2, x_{3}^3 として wで重み付けすると

$$ y = w_0 + w_{1} x_1 + w_{2}x_{2}^{2} + x_{3}w_{3}^{3} $$

 のようにかけて、この重みを学習、最適化することで図2のような非線形の関係を捉えれるようになります.

基底関数を任意の関数 f(x_1), f(x_2), \dotso ,f(x_n)のようにおいて、重みパラメータを   W = (w_0, w_1, w_2, \dotso, w_n) , W \in \mathbb{R} とおいた時

$$ y = w_0 + w_{1}f(x_1) + w_{2}f(x_2) + \dotso + w_{n}f(x_n) $$

と表すことができそうです。

これを一般化線形モデルと言います。

動径基底関数

 ここまでで基底関数(重み付けして線形和で表してる時の重みつけられてるやつです)

を工夫すれば複雑な関数が表現できそうというのがわかりました。

先ほどは、2次や3次など高次の関数の線形和で表しました。

基底関数の中で性質が良さそうなのがないかとなって出てくるのが、動径基底関数です。

これはガウス分布の形をした基底関数で f_{h}(x)とすると

 f_{h}(x)=\exp(-\frac{(x - u_{h})^{2}}{\sigma^{2}} )

 のように表せる。

 この基底関数を\mu_{h},\ h \in (-H, \cdots , -2, -1, 0, 1, 2, \cdots, H)上にグリッド上に多数配置。重み[tex: w_{h} \in \mathbb{R}で重みづけすると

 y = \Sigma_{h=-H}^{H}w_{h}\exp(-\frac{(x - u_{h})^{2}}{\sigma^{2}} )

 

と動径基底関数を用いて表すことができます。

このような方法を動径基底関数回帰と言います

 しかしこの方法では入力の次元が小さいものしか扱えないです。

-10から10まで間隔1.0で基底関数の中心\muを並べたとすると、一次元なら求めるパラメータwの数は21個、二次元に並べると 21^2 = 441と指数関数的に増えていきすぐに爆発的な計算コストになってしまいます。

 

そこで改良されました。人類すごい、数学者すごい。

ガウス過程登場

動径基底関数回帰では入力が大きくなると次元の呪いにかかってしまい現実的に使えなそうでした。

基底関数の分最適化しないといけないパラメータの数が多過ぎた訳でした。

NNなんかはこの辺GPUで殴ってめちゃくちゃ大量のパラメータを計算してますが、

ガウス過程では、

 

「パラメータwの期待値とってモデルから積分消去する」

 

 いやすげーな。

 

サンプル数がNの時、入力を \bf xとして、特徴ベクトルを

\phi (x)=(\phi_{0}(x),\phi_{1}(x),\cdots,\phi_{H}(x))^{T}

 とおくと、先ほど出てきた一般化線形モデルの式がサンプルの数できます。

サンプル数分の線形モデルの式を行列形式で書くと以下のようになります。

 

 {\underbrace{\begin{pmatrix}\hat y_{1}\\ \hat y_{2} \\ \vdots \\ \hat y_{N}\end{pmatrix}}_{\hat y}= \underbrace{\begin{pmatrix}\phi_{0}(x_{1}) \ \phi_{1}(x_{1})\ \cdots\ \phi_{H}(x_{1})\\\ \phi_{0}(x_{2})\ \phi_{1}(x_{2})\ \cdots\ \phi_{H}(x_{2})\\\ \vdots\ \vdots\ \ddots\ \vdots\\\ \phi_{0}(x_{n})\ \phi_{1}(x_{N})\ \cdots\ \phi_{H}(x_{N})\ \end{pmatrix}}_{\Phi}\underbrace{\begin{pmatrix}w_{0}\\w_{1}\\ \vdots \\ \vdots \\w_{H}\end{pmatrix}}_{W}}

 

 この時、 \Phiは計画行列でサンプルx_1, x_2, \cdots, x_Nが与えられた時に求まるので定数行列です。

 \hat yは観測されたデータ(教師データ) y = (y_1, y_2, \cdots, y_N)に近づける当てはめ値です。

実際の観測データは、計測時に計測器よる誤差や、人が入力するときの間違いなど様々な理由からある程度の誤差を含んでると思われるのが自然です。

一旦、ここでは簡単の為誤差なく正確に回帰されるとして\hat y = yとして

y = \Phi W

 となるとします。

重みパラメータWが平均\bf 0で分散が\lambda^{2}\bf Iガウス分布に従うとすると

W \sim N(\bf 0,\lambda^{2}\bf I)

のようにかけます。

この時、yガウス分布に従う重みWを定数行列\Phiで線形変換したものを意味するのでy=\Phi Wガウス分布に従います

*1

 

yガウス分布に従うので、期待値と分散がわかればyの従うガウス分布が決まりそうです。

期待値が、\mathbb E[y] = \mathbb E[\Phi W]で、\Phiが定数行列で、Wが平均0のガウス分布にしたがってるので、

\mathbb E[y] = \mathbb E[\Phi W]=\Phi \mathbb E[W]=0
 共分散行列は、
 \Sigma=\mathbb E[yy^{T}]-\mathbb E[y]\mathbb E[y]^{T}=\mathbb E[(\Phi W)(\Phi W)^{T}]=\Phi \mathbb E[WW^{T}]\Phi^{T}
=\lambda^{2}\Phi \Phi^{T}

 wの分散は、 \mathbb E[ww^{T}]=\lambda^{2}\bf I なのでした。

 最終的に観測データは当てはめた\hat yを通して、

y \sim N(\bf 0,\lambda^{2}\Phi \Phi^{T})

 のようなガウス分布に従うことがわかりました。

この式では期待値を取ることにより、重みWが消えていることに注意してください。

ということは最適化するパラメータがなくなったので計算コストがwではなく

\lambda^{2}\Phi \Phi^{T}によってyの分布の形状が決まることがわかりました。

 

よってガウス過程は

 

どんなNこの入力の集合 (x_1, x_2, \cdots, x_N) についても対応する出力y = (y_1, y_2, \cdots, y_N) の同時分布p(y)が多変量ガウス分布に従うとき\bf x\bf yの関係は ガウス過程(Gaussian Process)に従う

 

と定義されます。(「ガウス過程と機械学習」定義3.1より )

 

やっとここまできました。。。

ガウス過程は確率過程の一種らしいです。

入力Nがいくら大きくても成り立つので「無限次元のガウス分布」と呼ばれるそうです。

ここからカーネルトリックを使って実際に共分散行列の形を決めて応用していく訳です

(無限次元ですしね)

 

さて、ガウス分布までたどり着いたのですが、はてなTexを打つので疲れてしまいました。。。(行列のとこです。。良い方法があれば教えてください。。)

次はいつになるかはわかりませんが、ガウス過程の意味や続きについて書いていこうと思います。。

 

 

データからデータを生み出してるであろう関数空間の確率分布を考えて、データのこの辺は真の分布に従う関数がここにあるという主張が正しい主張できる区間がデータが増えることで小さく、つまりはかなり限定して決めることができるようになります。

逆にデータが少ないところは幅は広くなります。このようなベイズ機械学習の分野は予測に幅を持たせることができるのが面白いと感じてます。(難しいですが。。)

少しでも興味のある人は手に取ってみることをお勧めします。

一緒にこの分野を勉強しましょう、そしてできれば教えてください。。。

 

では。

 

 

参考資料

ガウス過程と機会学習

一応再度載せておきます。

ガウス過程と機械学習 (機械学習プロフェッショナルシリーズ)

ガウス過程と機械学習 (機械学習プロフェッショナルシリーズ)

 

 

・サポートページ

上記の著者らによるサポートページで実装(Google colab)などが掲載されてる 

chasen.org

 

・入門数理統計学

基礎的な数理統計はこれをやりました。数式は少なく文字が多めですがしっかりした本であると思います。アクチュアリーの公式参考書 ?に指定されてるらしいです。

古い本ですが演習も多いのでおすすめです(解答はよくあるやつです。。)

入門数理統計学

入門数理統計学

 

 

 ・統計数理研究所の著者持橋氏によるスライド

https://www.ism.ac.jp/~daichi/lectures/H26-GaussianProcess/gp-lecture2-daichi.pdf

 

 

 

 

*1:詳しくは「ガウス過程と機械学習」の2.3節を参照