マサムネの部屋

カーネル法入門

機械学習の一分野に、カーネル法と呼ばれるものがあります。
この記事の中では、細かい事は棚に上げて、 カーネル法の強みやメリットデメリットを解説します。
端的に 強みを挙げると、手間なくサポートベクトルマシンを進化させたり、回帰分析で非線形な関係を説明できるようになります。逆に、データの些末な部分まで表現するモデルが出来上がり、未知データの予測に役立たなくなってしまうこともあります。

カーネル法に関する記事の参考文献1を挙げます。前半はエンジニアやとりあえず実装して使いたい人用に説明されていて、後半で数学的な説明がされている一挙両得な本です。

スポンサーリンク

回帰分析とカーネル回帰

カーネル法の話に入る前に、回帰分析の復習をしましょう。
回帰分析の復習記事はこちら。

重回帰分析
変数が沢山ある場合の重回帰分析の解説をします。行列とベクトルを用いて式を書く事で、シンプルに結論までたどり着くことが出来ます。また、多重共線性という概念が自然に出てくることを見ます。

以下のモデルに対して、二乗誤差を最小化するのが回帰分析でした。
$$\begin{eqnarray}
y&=& \vec{w} \cdot \vec{x} \\
S &=& ( \vec{y} – X \vec{w} ) ^{T} ( \vec{y} – X \vec{w} )
\end{eqnarray} $$
Sを最小化するには、[mathjax] \( \vec{w} \) の勾配を0と置き、 [mathjax] \( \vec{w} \) について解きます。
$$\begin{eqnarray}
\nabla _{\vec{ w}}S &=& -2X^{T} ( \vec{y} – X \vec{w} ) =0 \\
\vec{ w} &=& (X^{T} X)^{-1} X^{T} \vec{y}
\end{eqnarray} $$
この式を見て分かるように、回帰分析が仮定しているのは、yとxの線形な関係です。もちろん、説明変数に[mathjax]\( x , x^2 , x^3 \)をいれることで非線形な関係を得る事は出来ますが、どの次数まで取り入れるか?に対しては答えられません。
カーネル法のモデルを見てみましょう。
$$\begin{eqnarray}
y(x)&=& \sum_{j} ^{N} \alpha _j k (x_j , x) \\
k(x_j ,x)&=& \exp( -\beta \| x_j -x \|)
\end{eqnarray} $$
[mathjax]\( k (x_j , x) \) の部分をカーネルと呼び ます。今回のカーネルは、ガウスカーネルと呼ばれています。 一般に、カーネルは[mathjax]\( N \times N\) の行列として表現されます。そして、行列の\( (i,j) \)成分は、i番目のデータとj番目のデータのある種の距離が格納されています。今回の場合は、正規分布のようなもので距離を測っています。
上記のモデルで最小二乗法を行うのがカーネル回帰です。パラメーター\( \vec{\alpha} \)が決定されると、 i番目のデータは以下のように予測されます。
$$\begin{eqnarray}
y_i&=& \sum_{j} \alpha _j k (x_j , x_i)
\end{eqnarray} $$
最小二乗法から、パラメーターの表示を求めましょう。 カーネルは正方行列なので、回帰分析と比べて式の表示が少し簡単になります。カーネルから出来る行列を[mathjax]\( K_{ij} =k(x_i ,x_j )\)とすると、パラメーターは以下のように表されます。
$$\begin{eqnarray}
\vec{\alpha} = K^{-1 } \vec{y}
\end{eqnarray} $$
良くある話ですが、[mathjax]\( \sin \) カーブを回帰分析とカーネル回帰分析で予測してみましょう。カーネル法の特徴を出すために、 [mathjax]\( \sin \) カーブ には少し細工をして、以下の式にしておきます。
$$\begin{eqnarray}
y= 0.1x + \sin (x)+ \mathcal{N}(x|0, 0.2)
\end{eqnarray}$$

カーネル法でサインカーブを近似

回帰分析では、線形に増加する、[mathjax] \( 0.1x \)の部分は捉えていますが、波打つ様子と誤差で震える挙動は全く捉えれていません。
一方で、カーネル回帰では 2次関数や3次関数ではありえないほど、グネグネ曲がっているのが分かると思います。これが、カーネル法の特徴です。カーネル法は有限次数の近似ではありえない表現力の高さを持っているのです。

カーネル法の表現力

先ほどのグラフに戻りましょう。人間がグラフを見れば大事なのはサインカーブの部分だなと分かり、大体[mathjax] \( [-\pi ,+\pi ]\)の範囲のグラフなので、1周期分曲がってくれればいいなと分かります。しかし、カーネル回帰が予測したカーブを見ると、誤差の部分まで再現しようとして、波打っているのが分かります。こういう状態は機械学習では過学習と呼んでいます。試しに、同じ関数の、違う点を予測させてみましょう。

カーネル法による予測

-3と+3の付近でトレーニングで得た結果と、テストで得た結果が全然違うようになりました。誤差関数が分散0.2だったのと、初めに与えるデータが多かったので、思ったより過学習していませんでした。カーネル法の良い所は表現力の高さと書きましたが、それは過学習しやすいということでもあります。。

リッジ回帰とカーネルリッジ回帰

重回帰分析の時も、説明変数が増えると表現力が高くなり、過学習が起きやすくなると書きました。その時はどうしたでしょうか、そう。リッジ回帰です。カーネル回帰にも[mathjax]\( L^2 \)のペナルティ項を足しましょう。そのようなモデルをカーネルリッジ回帰2と呼びます。

リッジ回帰の復習はこちらからどうぞ。

カーネルリッジ回帰のモデルは以下のようなものです。
$$\begin{eqnarray}
S_{\lambda} = ( \vec{y} – K\vec{\alpha} ) ^{T} ( \vec{y} – K \vec{\alpha} ) +\lambda \vec{\alpha} ^{T} K \vec{\alpha}
\end{eqnarray}$$
もちろん[mathjax]\( \lambda >0 \) です。[mathjax]\( \vec{\alpha } \)について、勾配をとって0とおき、[mathjax]\( \vec{\alpha} \) について解きます。
$$\begin{eqnarray}
\nabla _{\vec{\alpha}} S_{\lambda} &=& -2K( \vec{y} – K\vec{\alpha} ) +2 \lambda K \vec{\alpha} =0 \\
\vec{\alpha} &=& (K+ \lambda I_{N} )^{-1} \vec{y}
\end{eqnarray}$$
[mathjax]\( I_{N} \) はN次の単位行列です。このように、パラメーターの\(\vec{\alpha} \)は数学的に決めることが出来ますが、使うカーネルとそのパラメーター、誤差項へのペナルティを司るパラメーター[mathjax]\( \lambda \) は、人間が選択する必要3があります。ハイパーパラメーターは、適当なアルゴリズムを用いて決めます。
先ほどのサインカーブに対して、カーネルリッジ回帰を行ってみましょう。

カーネルリッジ回帰

\( L^2 \)項を加えた方が、過学習が抑えられています。\( x= +3\) 付近では、それが顕著に出ています。ペナルティ項をモデルに加える事で、カーネル回帰の汎化性能4が向上しました。

カーネル法の強み

今回の例から分かるカーネル法の強みを書き出してみます。
カーネル法では、パラメーター[mathjax]\( \vec{ \alpha} \) は最小二乗法で決めました。つまり、 \( \vec{ \alpha} \) が線形性を表してくれます。そして、カーネル部分が複雑な情報を再現してくれます。この住み分けによって、複雑な事象をモデルが表してくれるのです。
また、今まで培ってきた色々な統計的、機械学習的手法をカーネル法でバージョンアップできます。サポートベクトルマシン(SVM)や、主成分分析が良い例です。
例えば、サポートベクトルマシンは2値分類の為の手法ですが、平面一枚でラベルデータを2つに分けるので基本的に非線形な分類は出来ません。しかし、カーネル化することで非線形な分離も出来るようになります。
また、主成分分析も、クラス分類の手法として使う事がありますが、カーネルを用いて一度多次元に埋め込む事で、平面では見る事が出来なかった情報を得る事が出来ます。5
サポートベクトルマシンや主成分分析の記事はこちらからどうぞ。

https://masamunetogetoge.com/svm-sparse
https://masamunetogetoge.com/pca

まとめ

・カーネルを使う事で、表現力の高いモデルを作ることが出来る。
・カーネル法は過学習しがち。
・汎化誤差を入れる事で過学習を抑える。
・色々な手法をカーネル化して使うことが出来る。

次に読むべきカーネル法の記事はこちらです。

カーネル化
既存手法をカーネル法で扱う術について解説します。この記事の中ではカーネル化と呼びます。使うカーネルを決めるだけで、モデルの表現力を向上させることが出来ます。いくつかの例で実践してみます。
  1. カーネル法は非常に強力な手法ですが、数学が高度なせいか解説や教科書をあまり見ない気がします。
  2. カーネルリッジ回帰は、管理人が初めて自力で実装した機械学習の手法なので、思い入れがあります 。当時はpython でなくRで遊んでいたので、R上で色々定義しました。
  3. 人間が与える必要のあるパラメーターをハイパーパラメーターと呼びます。
  4. 誤差やデータの外れ値を無視する能力を汎化性能と呼んでいます。
  5. スイスロール, 主成分分析とか調べると言おうとしているものが出てきます。