カーネル法の雑なお気持ち

「カーネル」と呼ばれるものが、この世の中にはあまりにも多い。
例えば、数学で「カーネル」と言えば、線型写像を施すと像が0になるような、ベクトル空間上の部分空間を指す一方で、機械学習の文脈では、SVM(Support Vector Machine)の「カーネル法」とCNN(Convolutional Neural Netwrok)の「カーネル」という、意味の異なる2つの「カーネル」が登場する。また統計学でも確率密度関数の省略形式という意味でカーネルが用いられたりする。
紛らわしいので勘弁してほしい。

そこで、この記事(と言っても非常に短い)ではSVMで出てくる「カーネル関数」や「カーネル法」に関する事項を簡単にお気持ち解説する。解説するといっても、これは筆者の備忘録的なものに過ぎないので、あまり期待しないでいただきたい。なお数式は一切出てこないので、多少機械学習の知識がないと何を言っているのかわからないかもしれない。

まず、SVMの簡単な解説をしよう。SVM(サポートベクトルマシン)は教師あり学習の一種で、主に2クラス分類に用いられるアルゴリズムである。

たとえば、$${n}$$次元ベクトルを入力とした時、それがクラス0に属するのか、それともクラス1に属するのかを判別したい、という状況を想定する。訓練データを用いて、多数の$${n}$$次元ベクトルとそのクラスのラベルを学習させる。その際の学習則は、それぞれのクラスに属するサンプルの集団を区切る超平面(今は2次元データを考えているので単なる直線)を、その超平面から最も近い位置に存在するサンプルとの距離を最大化するように設定される。

SVMでは線形しきい素子を用いているため、このままでは非線形クラス分類問題には適用することは困難である。そこで、入力に用いたサンプルの次元を無理やり上げることを考える。一般に、次元を高くするほどに、その高次元空間においては、線形クラス分類が容易になることが知られている。ゆえに、入力に用いたn次元の変数を使って、それを2乗したり、別の要素の変数同士を掛け合わせるような非線形な演算を施すことを通して、次元を拡張するのである。そうして拡張された次元において、SVMの手法を用いることで、サンプルの2クラス分類を可能にするというのが、非線形SVMである。

ただし、ここで問題となるのはその計算量である。一般に、高次元空間への変換(写像)は計算量が膨大であり、最適化問題を解くのが現実的に困難であったため、それをどう解決するかが焦点であった。

そこで用いられるのが、「カーネルトリック」と呼ばれるものである。具体的な数式は提示していなかったが、SVMの学習則は双対問題という最適化問題で表現でき、その際に入力に用いるベクトルの内積を考える必要がある。しかし、次元を拡張する場合には、この内積の計算を実行しようとすると、まず元のベクトルに非線形写像を施した上で、内積を計算する必要がある(それが先ほどの計算量爆発につながる)。

しかし、この非線形写像はある条件を満たせば、いちいちそれぞれのベクトルに非線形写像を施した値を計算しなくとも、内積が計算できるのである(これがカーネルトリック)。そのような条件を満たす写像をカーネル関数と呼び、このようにカーネル関数を用いた手法をカーネル法と呼ぶ。
じゃあ、その「ある条件」ってなんなんだよという話になるが、数学的に言えば、「対称性を満たし、かつ半正定値性を満たすこと」となる。ただし、これについて掘り下げるとまた倍くらいの解説が必要になるので今回はここまで!

この記事が気に入ったらサポートをしてみませんか?