カーネル法(kernel method)を利用することで、非線形な構造をうまく機械学習や統計モデルに取り入れることができることから、今現在非常によく利用されている手法です。
ガウス過程回帰やSVM(support vector machine)など、カーネル法を用いた機械学習のアルゴリズムは多数ある一方で、その理論を勉強しようとすると、難解で難しく、理解が遠のいてしまう人も多いのではないでしょうか。
今回は、機械学習分野で頻出のカーネルトリックについて、できるわけわかりやすく解説していきます。よくカーネル法においては、特徴空間における内積の値しか利用することがなく、「特徴空間での変数を陽に扱わない」とはどのようなことを言うのでしょうか。
今回は、カーネル法やカーネルトリックについて解説していきます。
- カーネル法の考え方について解説
- カーネル関数について解説しPythonで可視化
カーネル法の基本的な考え方
カーネル法の基本的なアイディアは、データのある空間では線形分離できないようなデータを、特徴空間と呼ばれる元のデータ空間よりも次元の大きい空間に写像することで、データを線形分離できるように変換するテクニックになります。
といっても理解できないと思うので、まず、次のような、赤色の系列と青色の系列の2種類ラベルがあるようなデータを考えます。
このようなデータを線形に分離したい場合、図の緑色の直線を引けば2つのデータを識別することができるようになります。しかし、次のようなデータ群になってしまうと、単純に直線分離できないことは明白です。
カーネル法の基本的な考え方のイメージとして、このような線形(直線)分離できないようなデータ群をうまく線形分離できるように、元のデータ空間から、特定のデータ空間に射影することです。もちろん、元のデータ空間からどのような変換で射影するかについては、うまく考える必要性があるのですが、カーネル法によりうまく、データ空間を変換できると、次のような写像をすることができ、データを線形分離することができるようになります。
上の図における、元のデータ空間から新しく定義した高次元空間を特徴空間といいます。また、元のデータから特徴空間へ変換する関数群のことを、写像関数といいます。この用語は覚えておくと良いでしょう。この段階ではカーネル法についてざっくり理解できていれば大丈夫です。
カーネル法の概要
ここまで、カーネル法の考え方について説明できました。
カーネル法は、元々のデータ空間では線形分離できないデータ群を、写像関数によって別の特徴空間に写像することで、データを別の次元に移し、物事を線形に扱うことができるようにする手法です。
つまり、非線形のデータ構造を線形に扱うようにするための汎用的な手法です。
カーネル法の基本的な考え方と理解はこの程度で十分かもしれませんが、もう少し厳密にこの写像とやらを数学的に表現していきます。
元のデータ空間を$\Omega$、特徴空間を$H$とした時、この変換を行う写像関数を$\bm{\Phi(x})$とします。$\bm{\Phi(x})$はベクトルで、写像先の特徴空間$H$の次元数が$m$次元の場合、$\bm{\Phi(x})$のベクトルとなります。
$\bm{\Phi(x})$は、元のデータを引数で入力し、特徴空間での値を変換する関数のようなイメージを持つと良いでしょう。
カーネル法の基本的なアイディアの概要はこのようになっています。
$\Omega$やら$H$やら$\bm{\Phi(x})$やら、意味わかんねーよ!と思う人も多いと思います。じかし、実際に機械学習でカーネル法を使うだけなら、これらについて意識する必要がないので安心してください。(もちろんカーネル法に関する論文を読んだりする場合は、これらの関係性を数学的に理解しておくとよい場合もあります)
では、なぜ、$\bm{\Phi(x})$などを意識しなくて良いかと言うと、カーネル法には次で説明するカーネルトリックを利用することできるからです。
カーネルトリックとは
ここまで、カーネル法の概念について説明してきました。カーネル法を用い、元のデータ空間から写像関数$\bm{\Phi(x})$によって、特徴空間へ写像し、特徴空間で、線形識別などを行います。
ここで、$m$次元の写像関数$\bm{\Phi(x})$を次のように表現します。
\begin{equation} \begin{split} \bm{\Phi(x}) = \{ \phi_1(\bm{x}), \phi_2(\bm{x}), \cdots , \phi_{m-1}(\bm{x}), \phi_m(\bm{x})\} \end{split} \end{equation}
写像関数$\bm{\Phi(x})$の次元数は、特徴空間の次元数と同じになるように、 写像関数を設計する必要性があることに注意してください。(このようにしないと、計算できないからです)
ここで、$m$個の写像関数は、特徴抽出で、人間がいい感じに設計する必要性があります。
しかし、一般的にこの写像関数を見つけることは容易ではないので、どうしたものかとなります。
ここで、一般的に元のデータ空間上の任意の点$\bm{x_1}, \bm{x_2}$を考えます。この時、この2点の特徴空間での座標はそれぞれ、
\begin{equation} \begin{split} \phi_{\bm{x_1}} = \bm{\Phi(x_1}) = \{ \phi_1(\bm{x_1}), \phi_2(\bm{x_1}), \cdots , \phi_{m-1}(\bm{x_1}), \phi_m(\bm{x_1})\} \\ \phi_{\bm{x_2}} = \bm{\Phi(x_2}) = \{ \phi_1(\bm{x_2}), \phi_2(\bm{x_2}), \cdots , \phi_{m-1}(\bm{x_2}), \phi_m(\bm{x_2})\} \\ \end{split} \end{equation}
となります。
ここで、天下り的になりますが、特徴空間上での$\bm{x_1}, \bm{x_2}$の座標、$\phi_{\bm{x_1}}, \phi_{\bm{x_2}}$の内積を考えます。この内積、次のように表現できます。
\begin{equation} \begin{split} \phi_{\bm{x_1}}^T \phi_{\bm{x_2}} = \bm{\Phi(x_1})^T \bm{\Phi(x_2}) \end{split} \end{equation}
ここで、(3)は、$\bm{x_1}, \bm{x_2}$の関数であるので、$\bm{x_1}, \bm{x_2}$であることを明示的に示すために、(3)の式を$k$と起きます。
\begin{equation} \begin{split} k (\bm{x_1}, \bm{x_2})= \bm{\Phi(x_1})^T \bm{\Phi(x_2}) \end{split} \end{equation}
とりあえず、特徴空間上の2点の内積の式を$k$とおきました。
ここで、内積の式を$k$とおくのは便宜的においただけですが、もし仮に、特徴空間上で線形識別や線形回帰をする際に、その目的関数や識別関数が、データ点の内積の形、つまり(4)の形式だけで表現できるとき、(1)式の写像関数を明示的に求めること必要がなく、(4)の関数$k$だけを定義すれば良いことになります。
つまり、カーネル法は、写像関数によって、元のデータ空間から特徴空間へデータを写像して、特徴空間上でデータを取り扱いますが、そのデータの取り扱いが、(4)のようなデータ点の内積の形式だけで記述できるとき、写像関数を陽に考えなくても、(4)の関数$k$だけを定義すれば良いということになります。これをカーネルトリックといい、ここで用いられている関数$k$をカーネル関数と呼んでいます。
ちなみに、カーネルトリックができるのは、当然ですが、特徴空間での議論が全て内積という形式で計算できる時にのみ限ります。なので、どのアルゴリズムにおいて、カーネルトリックが利用できるのか?ということについては、取り扱う問題やアルゴリズムに依存することは覚えておくと良いでしょう。
カーネル法で用いられるカーネル関数
ここでは、カーネル法でよく用いられるカーネル関数について簡単に紹介します。
ここまでの議論を踏まえれば当然ですが、カーネル関数は2つのベクトルの内積の演算を関数として置き換えただけなので、入力は内積と同様に2つのベクトルを取ります。また、2つの入力のベクトルを入れ替えても値が同じになる交換則が当然成り立ちます。
比較的よく用いられるカーネル関数はおおよそこれくらいあります。
線形カーネル
k(\bm{x_i}, \bm{x_j}) = \bm{x_i}^T \bm{x_j}
ガウシアンカーネル
k(\bm{x_i}, \bm{x_j}) = exp \biggr( - \frac{|| \bm{x_i} - \bm{x_j}||^2}{ \sigma^2} \biggl)
多項式カーネル
k(\bm{x_i}, \bm{x_j}) = (1 + \bm{x_i}^T \bm{x_j})^p
指数カーネル(exponential kernel)
k(\bm{x_i}, \bm{x_j}) = exp \biggl( - \frac{|\bm{x_i} - \bm{x_j}|}{ \theta} \biggr)
周期カーネル(periodic kernel)
k(\bm{x_i}, \bm{x_j}) = exp \biggl( \theta_1 cos \biggl( \frac{|\bm{x_i} - \bm{x_j}|}{ \theta_2} \biggr) \biggr)
参考リンク・参考文献
本記事は以下のスライド資料や書籍を参考にさせていただいています。
- カーネル法入門 ~ カーネル法へのイントロダクション~ , 統計数理研究所 福水健次 さんの2014年 大阪大学大阪大学大学院基礎工学研究科・集中講義資料