持橋・大羽の「ガウス過程と機械学習」を読み始めた。Juliaでコードを書きながら内容を確かめている。
本を読むまで定義も理解していなかったレベルだったが、無限次元のガウス分布を考えるというモチベーションから「有限次元に制限すれば(通常の)ガウス分布になるもの」としてガウス過程の定義が出てくるのは非常に自然だと思った。
分散共分散行列の成分を作る時に使われるカーネル \( k(x,x^\prime) \) は \( x \) と \(x^\prime \) の「近さ」を表す関数とでも考えれば良いのだろうか。
なんでそういうことを考えるのかという気持ちの部分が丁寧に説明されているので意図がわからずに数式の中に闇雲に迷い込むことなく今の所楽しく読み進められている。
エラッタ:
http://chasen.org/~daiti-m/gpbook/errata.html
https://scrapbox.io/GPandML2019/support
3.3の「ガウス過程とカーネル」のところまで読んだ。
自分が躓いた点
- “3.2.4 ガウス過程からのサンプル”で図3.9のようなサンプルを実装するときは正則化項を入れないと計算がうまくいかないことがある(1.4 リッジ回帰の部分で触れられている)。著者のサンプルコードでは非常に正則化項として1e-6を導入していた。共分散行列の計算の際に対角成分に正規化項を加えればよい。
- “3.3.1 ガウス過程のRBFカーネル”で、線形モデルの基底関数のグリッドを無限に細かくするとRBFカーネルになると書かれている部分は、本文中の基底関数を使うと \( H \rightarrow \infty \) とした時にカーネル関数がRBF関数に収束しない。基底関数に \( 1 / \sqrt{H} \) を掛けたものを考えればOK
- “3.3.2 さまざまなカーネル”で線形カーネルを実装するときに、カーネル関数は
dot(x1, x2)
ではなく、必ず1となる入力の最初の次元も考慮して1 + dot(x1, x2)
とする。他のカーネルの場合はx1 — x2
の計算の段階で消えるので考慮する必要はない - また、Matérnカーネルを定義する際に、Juliaでは第二種のベッセル関数は
SpecialFunctions
のbesselk
を使えば良い。ベッセル関数は \( x=0 \) で特異性を持つので、カーネル関数k(x1, x2)
を定義するときはx1 = x2
の時に条件分岐で1を返すようにすればいい
カーネルとガウシアン過程を定義したjlファイル:
https://github.com/matsueushi/gp_and_mlp/blob/blog-2019-05-10/gp.jl
3.3章までのノートブック:
https://nbviewer.jupyter.org/github/matsueushi/gp_and_mlp/blob/blog-2019-05-10/gp.ipynb
引き続き3.4章の回帰モデルから読む予定。