サポートベクターマシンの数式
サポートベクターマシンの最適化問題
サポートベクターマシンの考え方と、数式の導出は以下の記事で扱っています。
今回は最適化問題が導出されたところから始めます。
データとそれにそれに対するラベルがあるときに、以下の最適化問題
を解くことで、サポートベクターマシンの2クラス分類器
を得ることができます。新しい入力データに対しては、上記の式で計算されるが正であるか負であるかで分類を行うことができます。
ただしは予め決めておいた非線形関数であり、線形分類ができなさそうな問題に対して、上手く分類できそうな非線形関数を選択せねばなりません。このような関数を明示的に扱うこと無く、全く同じ処理を行う方法があり、「カーネル法」と呼ばれています。
普通に線形分類をしたければとしてしまえばいいです。
最適化問題の別の表現、双対問題
上記の最適化問題は制約不等式が少々めんどくさい形をしています。
ラグランジュの乗数法を用いることで、最適化問題を式変形して別の表現にしてしまうことができます。もともとの最適化問題を主問題、書き換えられた問題を双対問題と呼び、これらの解は1対1に対応するため、一方を解けば他方も解けたことになります。
双対問題の導出は以下の記事で行っています。
この双対問題においては、非線形関数を明示的に扱う必要はなくなっていることに注意してください(つまり非線形関数が多次元への複雑な写像だとしても、実際にそれを計算する必要がなくなる → 無限次元も扱える)。
双対問題は以下の最適化問題となっています。
目的関数が少々複雑に見えますが、単にデータとラベルの代入計算を行い、に関する関数にしてしまい、あとは最大化問題を解くだけです。高々二次関数なので、必ず解を得ることができます。
これによりが求まったならば、新しい入力データに対して、サポートベクターマシンによる分類器は以下の数式による計算を行います。
この値が正であるか負であるかによって分類を行います。
ここでというのは訓練データです。サポートベクターマシンでは訓練データを分類の際にも覚えておかねばなりません。
ただし、学習を行う際には、分類平面の近くにあるきわどいデータのみを少数だけ選び出して訓練データとするため、実際には何千ものデータを保持する必要はありません(そもそもサポートベクターマシンは、分類が際どくなりそうなデータに対して、そのマージンを最大化することで汎化性能を高めるものでした)。
を求める方法は単純で、そもそもサポートベクターマシンは正例の訓練データに対して、となるように学習させ、負例に対してとなるように学習させるものです。
従って、サポートベクターマシンによる分類器において正例データを使って
という方程式を解けばが求まります。
ここでというのは非線形関数を明示すれば
という形でした。線形判別をしたければとするので、
となり、これは単なる標準内積です。カーネル法を用いたサポートベクターマシンは、内積に相当する計算を非線形にすることで、あたかも非線形変換を行ってから、内積を取っているかのように扱う手法だと言えます。
分類自体は既に上記の式でできてしまいますが、元々も主問題ではを求めるのが目的でした。これを明示的に求めたい場合は
を計算すればいいです。
まとめ
ともかく非線形だろうが線形だろうが解かなければいけない最適化問題は
で表されており、線形にしたいのか非線形にしたいのか、どんな非線形にしたいのかをを調整して決めるということになります。
訓練データを上記の最適化問題へ代入し、制約条件を考慮して
その後
を計算してを求めて分類器を完全に獲得します。
新規のデータに対しては
の正負をみて分類することになります。
手計算してみる
問題設定
訓練データは
の2つにします。図示するとデータは以下のような感じです。
赤い点が
青い点が
これに対するサポートベクターマシンを構築しましょう。
目視で分かるというのは素晴らしいことです。
マージン最大化という観点からすれば、この問題に対する分類境界は、(線形ならば)原点を通る傾きの直線になるでしょう。もしもマージン最大化という観点を理解していなければ、他にも無数に分け方は存在します。
マージン最大化による分類境界
適当な分類境界
パーセプトロンならば、収束時にこのような境界にもなりうる
他にも点が増えてきたであろうときにもマージン最大化での分類境界はおそらく上手く働きそうですね。実際には大量のデータの中から、分類が際どい点をそれぞれ数点選んでおいても良いのですが、今回は手計算で理解を深めるため、たったの2点でやります。
問題を解く
今回は簡単のため、線形分類を考えます。
すなわちとするということです。(非線形でやりたかったら適当にカーネルを調べてやってみてください。この部分の計算が変わるだけです。)
さて訓練データは以下でした。解いていきましょう。
最適化問題へ値を代入
最適化問題は以下でした。
まず訓練データを目的関数(最大化問題の中身)へ代入します。
この式へ
を代入していき
と目的関数が得られました。(目的関数を以後と書きます)
次にをいろいろ調整して値を最小にします。
制約条件を考慮
制約条件を使うと、
という関係を満たす必要が出てきます。この制約を目的関数へ代入することで
が得られます。これをについて最大化すればよく、で微分してとおくと
と求まります。制約条件からと求まり、もう1つの制約条件であるも満たされているので問題ありません。
を計算する
を計算するためには正例のデータの方を使って、を出力するように学習させるため
⇔
⇔
⇔
⇔
⇔
と求まります。
主問題のを確認
ついでに主問題のを明示的に求めたい場合は
を使います。
であり、このベクトルは境界直線に対する法線ベクトルとなっているので、図示すると具体的に境界が求まったことになります。
を法線ベクトルとし、切片である直線が境界となる。
サポートベクトルマシンによる分類器
分類器は以下の形です。
ここでが新しい入力データでは訓練データです。
新しい入力データが得られた場合には、新しいデータと既に求めたパラメータたちを代入しての値を計算します。
いまという新しいデータを使って分類を行ってみましょう。これは図から負例に分類されることが明らかに分かっていますから、が実際負の値を取るのかを確かめてみるということになります。
新しいデータ点を緑色でプロット。明らかに負例である。
そして訓練データ
と入力データ
を代入します。
と求まり、確かに負例であると分類しました。
終わりに
現実の問題:データ点
今回は訓練データが二点だけでした。従って制約条件を満たしながら最大化問題を解くことが簡単にできましたが、実際にデータ点が増えると手計算では無理になります。その場合は二次計画法という手法を使うことでシステマチックに解くことができます。
現実の問題:データが混ざっている
今回は二点を使って完全に分類できるデータを使いましたが、実際には負例と正例がわずかに重なっているようなデータを使う場合もあるでしょう。カーネル法を用いれば線形分離不可能な問題も分類できるため、混ざっているデータすらも無理やり分類できてしまいます。
しかしそれは単なる過学習に過ぎなく、実際には誤りを少し許しても良いから、妥当な境界を求めたいということになります。その場合は「ソフトマージン」という概念を用いて最適化問題を書き換えることになりますが、それほど難しくはありません。
また、目的関数を一般的な機械学習の手法から眺めた場合、ソフトマージンを使ったサポートベクターマシンは、損失関数をヒンジ損失に、正則化項をにしていると見ることもできます。そのような見方は、他のロジスティック回帰分析などとの違いを理解することに役立つでしょう。(サポートベクターマシンのマージン最大化という概念は、実は正則化項だけが目的関数になっていたということになります。)
記事
正則化についてMAP推定の立場から
バイアスバリアンス分解による機械学習の性能評価
サポートベクターマシンの基礎