サポートベクトル識別機ノート

最大マージン分類機

2クラス問題を考える。

説明変数xi\boldsymbol{x}_iに対して目標(目的)変数yiy_iがデータとして存在するとする。学習データの集合{(yi,xi)}\{(y_i,\boldsymbol{x}_i)\}i=1,,Ni=1,\cdots ,Nを識別することを考える。(図はWikipediaより)

SVMは、原初的には、多次元空間のベクトル(点)データを平面で分割するスキームである。

2クラス問題

上の右図のように、境界が平面であればそのままでよいが、左のように境界が曲がっている可能性がある場合は、平面になるように変換する必要がある。その関数をϕ\boldsymbol{\phi}と書く。左の図がx\boldsymbol{x}の空間で、右がϕ\boldsymbol{\phi}の空間であると考えれば良い。

そうすると、次のような線形識別問題なる。

(図は、https://qiita.com/pesuchin/items/c55f40b69aa1aec2bd19 より引用)

線形識別

別のページにプログラムを付属して解説するが、sciki-learnのsvm計算の具体例を以下に載せる。

線形識別が可能な場合 線形識別が良くない例 RBFカーネルを用いた非線形SVC

非線形な変換を施した説明変数ϕ\boldsymbol{\phi}に対して目標変数が

y(xi)=k=1wkϕk(xi)+b y(\boldsymbol{x}_i)=\sum_{k=1} w_k \phi_k (\boldsymbol{x}_i) +b

のように線形な関係で表されるとして、係数を{wii=1,M}\{w_i\,|\, i=1,\cdots M\}を学習により決める。(以下ではまとめてベクトルw\boldsymbol{w}で表す。ここでの添字iiはベクトルのii成分ではなく、データの番号を表すことに注意してほしい。)

このような{ϕ1(x),ϕ2(x),,ϕM(x)}\{\phi_1(\boldsymbol{x}), \phi_2(\boldsymbol{x}),\cdots , \phi_M(\boldsymbol{x})\}を「基底関数」という。以下、これを太字ϕ\boldsymbol{\phi}で表す。 説明変数{x1,x2,,xM}\{x_1, x_2,\cdots , x_M\}の非線形関数ϕ\boldsymbol{\phi}を用いれば、うまく平面の境界が得られると想定している。

分類問題なので、f(x)f(\boldsymbol{x})の値によって±1\pm 1をとる変数tit_iを目標変数となるように変換しておく(正規化):

まとめると、すべてのデータについて

ti(wTϕi+b)1(1) t_i(\boldsymbol{w}^T\boldsymbol{\phi}_i +b) \ge 1 \tag{1}

が成り立てば分類が成功だと判断できる。このとき等号が成り立つ場所が境界線で、それに近い一定の幅(マージン)上にあるデータをサポートベクトルと呼ぶ。 (境界から離れているので計算の対象としなくてよい。)

係数w\boldsymbol{w}を過学習にならなく、かつ最適な値になるように決める。具体的には 式(1)の制約のもとで

Lp(w)=12wTw L_p(\boldsymbol{w}) = \frac{1}{2}\boldsymbol{w}^T\boldsymbol{w}

が最小となるw\boldsymbol{w}を求める。(マージンが最大になる。)

ラグランジュ未定定数法を用いると、未定定数をα1,,αM{\alpha_1,\cdots, \alpha_M}として

Lp~(w)=12wTwi=1Nαi{ti(wTϕi+b)1}(2) \tilde{L_p}(\boldsymbol{w}) = \frac{1}{2}\boldsymbol{w}^T \boldsymbol{w} -\sum_{i=1}^{N}\alpha_i \{t_i(\boldsymbol{w}^T\boldsymbol{\phi}_i +b) -1\} \tag{2}

の条件なし極値問題を解くことになる。

w\boldsymbol{w}の微係数がゼロという条件は

wi=1Nαitiϕi=0(3) \boldsymbol{w} - \sum_{i=1}^{N} \alpha_i t_i \boldsymbol{\phi}_i = 0 \tag{3}

bでの微分がゼロという条件は

i=1Nαiti=0(4) \sum_{i=1}^{N}\alpha_i t_i = 0 \tag{4}

となる。(他の条件の詳細は省く。)これにより、はじめにほしかった係数w\boldsymbol{w}がきまる。ただし、このときα\boldsymbol{\alpha}がパラメータとして入っている。

(2)式を(3)に代入して、整理すると目的関数はα\boldsymbol{\alpha}を変数として

Ld(α)=i=1Nαi+12i=1Nj=1Nαiαjtitjk(ϕi,ϕj),k(ϕi,ϕj)=ϕiTϕj L_d (\boldsymbol{\alpha})= \sum_{i=1}^{N} \alpha_i + \frac{1}{2}\sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j t_i t_j k(\boldsymbol{\phi}_i, \boldsymbol{\phi}_j),\qquad k(\boldsymbol{\phi}_i, \boldsymbol{\phi}_j) = \boldsymbol{\phi}_i^T\boldsymbol{\phi}_j

と表される。これを最小にするα\boldsymbol{\alpha}を求める問題に置き換わったのである。

このk(ϕi,ϕj)k(\boldsymbol{\phi}_i, \boldsymbol{\phi}_j)をカーネルと呼ぶ。(カーネルはSVMに限らずもっと広く機械学習の手法で登場する。ただし定義は同じである。)

ϕi\boldsymbol{\phi}_iは、もともとの説明変数xi\boldsymbol{x_i}の非線形変換ϕi=ϕ(xi)\boldsymbol{\phi}_i = \boldsymbol{\phi}(\boldsymbol{x_i})であったとことに注意しよう。カーネルは2つのϕ\boldsymbol{\phi}の積になっているが、そのことを忘れ(遡らず)、ii, jjの添字をもつベクトルからなる行列とみて、この極値問題を考えることにする。(かってにk(ϕi,ϕj)k(\boldsymbol{\phi}_i, \boldsymbol{\phi}_j)を選んだときにも、それに対応する非線形変換関数が存在することは証明されているらしい。)

そこで、もとの変数x\boldsymbol{x}を用いてk(x,x)k(\boldsymbol{x},\boldsymbol{x'})のように書くことができる。(もちろん単純な積ではない。カーネルは2つの特徴ベクトルの関数であるというだけである。)

Ld(α)=i=1Nαi+12i=1Nj=1Nαiαjtitjk(xi,xj) L_d (\boldsymbol{\alpha})= \sum_{i=1}^{N} \alpha_i + \frac{1}{2}\sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j t_i t_j k(\boldsymbol{x}_i, \boldsymbol{x}_j)

カーネル関数は、原理的に導けるものではなく、良いものを選べばよいという立場で考えていく。(このような行き方はカーネルトリックと呼ばれる。)

多くの場合、2つのベクトルの距離xx||\boldsymbol{x}- \boldsymbol{x'}||の関数を選ぶのが妥当とされている。距離の関数なのでradial basis kernel(RBF)と呼ばれる。また、近い点ほど関係が深いとして関数としてはガウシアンがよく用いられる。

k(x,x)=exp(γxx2) k(\boldsymbol{x},\boldsymbol{x'}) = \exp ( -\gamma ||\boldsymbol{x}- \boldsymbol{x'}||^2)

これがガウシアンカーネルである。カーネルとして、べき関数やロジスティック関数が用いらることもあるようだ。

重要な点は、必要な非線形変換ϕ(x)\boldsymbol{\phi}(\boldsymbol{x})を指定しなくてもカーネルを適当に定めて、境界線を引けるということである。

新しいデータ点f(x)f(\boldsymbol{x})を分類するには、カーネルと学習によって得られた係数を用いて

y(x)=n=1Nantnk(x,xn)+b y(\boldsymbol{x}) = \sum_{n=1}^N a_n t_n k(\boldsymbol{x}, \boldsymbol{x_n}) + b

のように表される。改めて、最初に仮定した非線形変換(基底の変更) ϕ(x)\boldsymbol{\phi}(\boldsymbol{x}) がどのようなものかが表に現れなくなっていることに注意しよう。結果はうまく分類できたが最初の非線形変換ϕ(x)\boldsymbol{\phi}(\boldsymbol{x})は意味がなくなった、原理的には存在するが、それを明示的に求める手法はない(必要ないから求めない)といっても良いと思う。

境界付近でデータが入り組んでいる場合:スラック変数の導入

多くの場合は、境界を明確に線引きできず、データは入り組んでいる。逆の領域に入り込んだ変数の対してスラック変数 ξn\xi_n を付与することにより、スラック変数の全体和が小さくなるような変分問題を考える。

Cn=1Nξn+12w C\sum_{n=1}^N \xi_n + \frac{1}{2}||\boldsymbol{w}||

両者の重み付けパラメータCCは、問題に応じて外から与える必要がある。

scikit-learnを用いた事例研究

http://8tops.yamanashi.ac.jp/~toyoki/labTips/dataScience/svc_in_scikit-learn.html

あわせて、多項式関数近似を参考にしてほしい。

http://8tops.yamanashi.ac.jp/~toyoki/labTips/dataScience/polynomial_fitting.html