サポートベクトルマシン(SVM)は、世界を「分ける」ことが得意なAIです。
たとえば、赤い点の集まりと、青い点の集まり。
紙の上に散らばったそれらを見て、SVMは考えます。
「この二つのあいだに、線を引くとしたら……どこがいちばん自然だろう?」
でも、ただ線を引けばいいわけじゃありません。
できるだけ、赤にも青にも近づきすぎず、どちらからも“余裕”のある場所……そこに境界を置きたい。
ここで出てくるのが、マージン最大化。
マージンとは、境界線とデータ点との「すきま」。
SVMは、「このすきまを、いちばん大きくできる線」を選びます。
なぜなら、すきまが広いほど、新しいデータが来てもブレにくく、判断が安定するから。
つまりSVMは、「今だけうまく分ける」よりも、「これからも迷いにくい分け方」を大切にしているのです。
しかもSVMは、もし直線で分けられない世界でも、データを高い次元に持ち上げて、そこで境界を引くことができる。
ぐちゃっと絡まった現実を、一度ひらいてから整理する感じ。
だからSVMは、
文字認識
画像分類
スパム判定
など、いろんな場面で活躍してきました。
データがそれほど多くなくても、しっかりした境界を作れるのも強み。
世界を分けるとき、大事なのは「線」そのものじゃなく、そのまわりの「余白」。
近づきすぎないこと。離れすぎないこと。
わたしたちの人間関係も、もしかしたらマージン最大化で、うまくいくのかもしれません。
サポートベクトルマシンには、ふたつの分け方があります。
それが、線形SVMと、非線形SVM。
まずは、線形SVM。
これは、とても素直です。
データを見て、「ここにまっすぐな線を引けば、きれいに分かれそう」と思えたら、そのまま直線で境界を作ります。
シンプルで速くて、計算も軽い。
もし直線で分けられる世界なら、これがいちばん気持ちいい。
でも現実は、だいたい曲がっています。
点がぐるっと輪になっていたり、入り組んでいたり。
そこで登場するのが、非線形SVM。
非線形SVMは、いきなり曲線を引く代わりに、いったん世界を持ち上げます。
次元を増やして、データを高い空間に移してから、そこで直線を引くのです。
すると、不思議なことに、元の世界に戻すと、曲がった境界になっています。
この仕組みを支えているのが「カーネルトリック」という考え方です(下部項目を参照ください)。
現実のデータは、おおむね素直じゃありません。
赤と青の点が、ぐるっと絡み合っていたり、波みたいに入り組んでいたり。
まっすぐな線では、どうしても分けられません。
そんなとき、AIはこう考えます。
「この世界のまま見てるから難しいんだ。少し高いところから眺めてみよう」
これが、カーネル法。
カーネル法は、データをそのまま扱う代わりに、もっと高い次元の空間に写してから考えるという発想。
たとえば、平らな紙の上では絡まって見える点たちも、ふわっと立体に持ち上げると、「あ、ここで直線引けるね」となることがあります。
その持ち上げ役をしているのが、カーネル関数。
◆カーネル関数
カーネル関数は、「この2つのデータ、どれくらい似てる?」を、高次元空間を意識しながら計算してくれる関数です。
実際に高次元へ座標変換しなくても、似ている度合いだけを直接計算できます。
ここで登場するのが、有名な仕掛け。カーネルトリック。
◆カーネルトリック
本当なら、次元を増やして、座標を計算して、そこで線を引く……という重たい処理が必要です。
でもカーネルトリックを使うと、高次元に行ったふりをして、結果だけを計算できます。
つまり、持ち上げた世界を、実際には作らなくていいのです。
計算は軽く、効果は大きい。
だからSVMは、複雑な境界も、現実的な計算量で扱えます。
カーネル法は、世界の見方を変える方法。
カーネル関数は、そのためのレンズ。
カーネルトリックは、そのレンズを軽く使う、工夫。