テクノロジー

「カーネルトリック」って何?その意味や使い方までわかりやすく解説

カーネルトリック」って何?その意味や使い方までわかりやすく解説

機械学習でパターン認識をしようすると、カーネルトリックってよく出てきますよね。カーネルトリックを使うとパターン認識の精度が向上するのは何となく知っているけれど、どういう仕組みなのか気になった経験がある人もいるかもしれません。

カーネルトリックはサポートベクトルマシン(SVM)などの教師あり学習のパターン認識モデルと組み合わせて使用されることが多いです。サポートベクトルマシンは高い認識性能を持つモデルで、機械学習を扱う人は是非習得したい技術。

そこで今回は、カーネルトリックの仕組みについてできるだけわかりやすく紹介します。カーネルトリックを理解して、効果的に機械学習モデルを作成できるようになりましょう。

カーネルトリックを理解するために必要な「カーネル法」とは

カーネル法のイメージ
はじめに、カーネルトリックを理解するために、カーネル法について紹介しましょう。学習データに含まれる特徴ベクトルを高次元に非線形変換して、その空間で線形の識別を行う機械学習の手法をカーネル法と呼びます。

従来、教師あり学習のパターン認識ではロジスティック回帰などの線形識別器を用いたものが行われてきました。例えば特徴量にx1とx2を持つデータを赤色のクラスと青色のクラスに識別するとしましょう。線形識別器を用いれば、図のz = w1x1 + w2x2のように線形な境界を得ることができます。

図1

それでは次の図を赤色のクラスと青色のクラスに識別するにはどうしたらよいでしょうか。先ほど用いた線形識別器では境界が直線となるため、うまく識別することはできません。

図2

そこで、z = w1x1 + w2x2 + w3x1x2 + w4x12 + w5x22という非線形な境界を考えます。図を見ると境界面が円形上になっているため、うまく識別することができるでしょう。しかしながら、今回のようにあらかじめ非線形な識別関数の形式を予想できることはほとんどありません。また、非線形な識別関数は線形な識別関数に比べて組み合わせのパターンが膨大となり、解を導くことも難しくなることが知られています。

図3

そこで、先ほどの特徴空間を次の図のように高次元に非線形変換しましょう。そうすると赤色のクラスと青色のクラスは平面で線形分離することができるようになります。これがカーネル法と呼ばれるものです。

カーネルトリックとは

カーネルトリックのイメージ
先ほど説明したカーネル法は、データを高次元に非線形変換することで、線形分離を可能としていました。しかし、データが高次元になることで、計算が困難になってしまうのではないかという疑問が出てきますよね。

そこで用いられるのが、カーネルトリック。データを非線形変換する場合、カーネル関数というものを使用します。データの特徴ベクトルをカーネル関数に入力することで、非線形変換した高次元の特徴ベクトルを得ることができます。代表的なカーネル関数には多項式カーネル、ガウスカーネル、シグモイドカーネルといったものがあります。

非線形変換した高次元の特徴ベクトルを線形分離するには、データの内積計算を行う必要があります。通常はデータが高次元になると計算が困難になるのですが、カーネル関数の性質により、非線形変換した高次元の特徴ベクトルの内積計算は非線形変換前の特徴ベクトルの内積計算と同様に求めることができます。このカーネル関数の性質はMercerの定理と呼ばれる定理で保証されています。

カーネルトリックとサポートベクトルマシン(SVM)の関係

サポートベクトルマシンのイメージ
カーネルトリックやカーネル法は、特徴ベクトルを高次元に非線形変換することで、線形識別を可能にする手法です。カーネルトリックは汎用的な手法のため、従来の様々な線形識別器と組み合わせて使用できます。

一方で、実際のところカーネルトリックはサポートベクトルマシンと組み合わせて用いるケースが非常に多いです。一つにはサポートベクトルマシンが数ある他の線形識別器と比べて特に強力であること。もう一つはカーネルトリックと組み合わせたサポートベクトルマシンがブームの火付け役になったということもあります。

サポートベクトルマシンはVladimir N. Vapnik, Alexey Ya. Chervonenkisによって1963年に発表されました。当初は線形を扱うのみでした。その後、1992年にBernhard E. Boser, Isabelle M. Guyon, Vladimir N. Vapnikによって、カーネル法により非線形に拡張されたサポートベクトルマシンが発表されました。これにより、機械学習分野でサポートベクトルマシンのブームが始まりました。

実際にサポートベクトルマシンでのカーネルトリックの使い方

実際の使い方のイメージ
それでは実際にPythonを使って、非線形サポートベクトルマシンでパターン認識をしましょう。サポートベクトルマシンにはscikit-learn(サイキットラーン)と呼ばれる機械学習のオープンソースライブラリを使用します。

>>> from sklearn import svm
>>> x_train = [[0.13, 1.23, … ], [3.01, 2,99, … ], … ] >>> y_train = [0, 1, 1, … ] >>> x_test = [[3.22, 5.13, … ], [4.88, 0,29, … ], … ] >>> y_test = [1, 0, 0, … ] >>> svc = svm.SVC(kernel=’rbf’, C=10, gamma=0.1)
>>> svc.fit(x_train, y_train)
>>> pred = svc.predict(x_test)

まず、学習データの特徴ベクトルx_trainと学習データのクラス分類y_trainを用意します。同様にテストデータの特徴ベクトルx_testとテスタデータのクラス分類y_testも準備します。

続いてscikit-learnの関数を使用して、サポートベクトルマシンsvcを定義します。ここでは、カーネル関数にはRBFカーネル(ガウスカーネル)を選びました。さらにハイパーパラメータとしてコストパラメータCとRBFカーネルのパラメータgammaの値も設定します。コストパラメータCはサポートベクトルマシンが誤分類をどの程度許容するか決めるパラメータです。Cが小さいほど誤分類を許容します。gammaは値が小さいと単純な決定境界となり、大きいと複雑な決定境界になります。

次に、定義したサポートベクトルマシンsvcに学習データを与えて、fitメソッドでモデルを作成します。最後に、predictメソッドでテストデータのクラス分類を予測します。scikit-learnを使用すると非常に簡単にカーネルトリックを使用してパターン識別できます。

カーネルトリック(カーネル法)を使う時の注意点

注意点のイメージ
先ほどのまでの説明で、カーネルトリックで使用するカーネル関数には多項式カーネル、ガウスカーネル、シグモイドカーネルなど様々な種類があることをお伝えしました。

それではカーネル関数をどのように選択すればよいのでしょうか。実はカーネル関数の選択基準は明確にわかっていません。

実際、多くの場合はカーネル関数にRBFカーネル(ガウスカーネル)を選択する場合が多いでしょう。データ数に比べて特徴量の数が多い場合は、線形カーネルがうまくいきやすいといったようなこともあり、データの特性に応じてカーネル関数を使い分けることも必要になります。

また、先ほどのscikit-learnの例のように、カーネル関数はハイパーパラメータも持っています。ハイパーパラメータの値をどのようにすればよいかもデータの特性が影響してきます。

以上のようにカーネル関数の選択とハイパーパラメータの設定には、試行錯誤が必要となってきます。一度試してみてうまくいかない場合でもハイパーパラメータの値を変えたり、使用するカーネル関数を変えたり、いろいろ試しましょう。

まとめ

さて、今回はカーネルトリックについてご紹介しました。カーネルトリックについてお伝えした内容は以下です。

  • カーネル法は特徴ベクトルを高次元に非線形変換して、その空間で線形の識別を行う
  • カーネルトリックにより、特徴ベクトルを高次元に写像しても計算ができる
  • カーネルトリックはサポートベクトルマシン(SVM)と組み合わせて使用することが多い
  • カーネル関数には様々な種類がありハイパーパラメータもあるが、試行錯誤が必要

非線形サポートベクトルマシンの登場により、カーネルトリックは機械学習のトレンドとなりました。近年はディープラーニングの登場により、注目度はやや下がっている状況です。しかしながら、カーネルトリックは機械学習における強力なテクニックの一つには変わりありません。是非理解をして身につけましょう。

参考元
Wikipedia──サポートベクターマシン
Wikipedia──カーネル法
Andreas C. Muller, Sarah Guido(2017)『Pythonではじめる機械学習』オライリー・ジャパン.
トップへ戻る
タイトルとURLをコピーしました