LoginSignup
0
0

More than 3 years have passed since last update.

「サポートベクターマシン」-曲線・曲面・超曲面の作り方-

Last updated at Posted at 2020-02-07

サポートベクターマシン(曲線・曲面・超曲面)の考え方

分け方(=境界の作り方)

考え方

これまでは超平面で境界線を作ったが、超曲面での境界線を作る。(↓こんな感じ)

svm_6.png

  • 使うのはカーネル法という手法。
  • 超平面では境界線を$w_0+\mathbf{w}\mathbf{x}=0$とおいていたが、ここでは$w_0+\mathbf{w} \phi(\mathbf{x})=0$とおく。
  • (超平面のときは次数がdのとき$\mathbf{x}=(x_1, \cdots, x_d)$のため$\mathbf{w}=(w_1, \cdots, w_d)$であったが、超曲面の場合は$\phi, \mathbf{w}$は特に次元数には縛られないため膨大に大きな数を設定できる)
  • こうすると、直線・平面・超平面(完全に分離できない場合)の最適化問題は↓になる
\begin{align}
Minimize \; &C \sum_{i=1}^{n}\xi_i + \frac{1}{2}|\mathbf{w}|^2 \\
Subject \; to \; &y_i\bigl(w_0+\mathbf{w}\phi(\mathbf{x_i})\bigr) \geq 1 - \xi_i \; (i=1, 2, \cdots, n) \\
&\xi_i \geq 0 \\
\end{align}

図作ったときのコード置き場

解き方

ラグランジュの未定乗数法(Wikipedia)カルーシュ・クーン・タッカー条件(Wikipedia)を適用すると、ラグランジュ関数は

L(w_0, \mathbf{w}, \mathbf{\xi}, \mathbf{a}) = C \sum_{i=1}^{n}\xi_i + \frac{1}{2}|\mathbf{w}|^2 - \sum_{i=1}^{n} a_i \Bigl(y_i \bigl(w_0+\mathbf{w}\phi(\mathbf{x_i}) \bigr) - 1 + \xi_i \Bigr) - \sum_{i=1}^{n}\eta_i \xi_i

となり、KKT条件は次のようになる。

\begin{align}
a_i &\geq 0 \\
y_i \bigl(w_0+\mathbf{w}\phi(\mathbf{x_i}) \bigr) - 1 + \xi_i &\geq 0 \\
a_i \Bigl(y_i \bigl(w_0+\mathbf{w}\phi(\mathbf{x_i}) \bigr) - 1 + \xi_i \Bigr) &= 0 \; \cdots (i)\\
\eta_i &\geq 0 \\
\xi_i &\geq 0 \\
\eta_i \xi_i &= 0 \\
\end{align}

直線・平面・超平面(完全に分離できる場合)直線・平面・超平面(完全に分離できない場合)と同様に計算すると

\begin{align}
\frac{\partial L}{\partial w_0} = - \sum_{i=1}^{n} a_i y_i &= 0 \\
\Leftrightarrow \sum_{i=1}^{n} a_i y_i &= 0 \\
\end{align}
\begin{align}
\frac{\partial L}{\partial \mathbf{w}} &= \mathbf{w} - \sum_{i=1}^{n} a_i y_i \phi(\mathbf{x_i}) = 0 \\
\Leftrightarrow \mathbf{w} &= \sum_{i=1}^{n} a_i y_i \phi(\mathbf{x_i}) \\
\Leftrightarrow \mathbf{w} \phi(\mathbf{x}) &= \sum_{i=1}^{n} a_i y_i \phi(\mathbf{x_i}) \phi(\mathbf{x}) \\
&= \sum_{i=1}^{n} a_i y_i K(\mathbf{x_i}, \mathbf{x}) \; \cdots (ii)\\
\end{align}

ここで、$\phi(\mathbf{x_k}) \phi(\mathbf{x_l}) = K(\mathbf{x_k}, \mathbf{x_l})$とおいた。これ以下の計算では、$\phi$の値を計算しなくても、$K$だけの評価で考えることができ、この$K$をカーネル関数という

ここから、直線・平面・超平面(完全に分離できる場合)直線・平面・超平面(完全に分離できない場合)と同様に以下を最小にする$\mathbf{a}$を求め、$(i), (ii)$より$w_0, \mathbf{w} \phi(\mathbf{x})$を求めればよい

\begin{align}
Minimize \; f(\mathbf{a}) &= \sum_{k=1}^{n} a_k - \frac{1}{2} \sum_{k=1}^{n} \sum_{l=1}^{n} a_k a_l y_k y_l \phi(\mathbf{x_k}) \phi(\mathbf{x_l}) \\
&= \sum_{k=1}^{n} a_k - \frac{1}{2} \sum_{k=1}^{n} \sum_{l=1}^{n} a_k a_l y_k y_l K(\mathbf{x_k}, \mathbf{x_l}) \\
Subject \; to \; &\sum_{i=1}^{n} a_i y_i = 0 \\
&0 \leq a_i \leq C\\
\end{align}
f(\mathbf{a}) = \sum_{k=1}^{n} a_k - \frac{1}{2} \sum_{k=1}^{n} \sum_{l=1}^{n} a_k a_l y_k y_l K(\mathbf{x_k}, \mathbf{x_l}) \\

Platによるアルゴリズム

直線・平面・超平面(完全に分離できる場合)直線・平面・超平面(完全に分離できない場合)と同様に、以下の流れで解いていく

  1. 最初に初期値$\mathbf{a^0}$を設定する。今回は$\mathbf{a^0}=(0, 0, \cdots, 0)$
  2. n個の点から、適当な$i, j$を選ぶ。(選び方は後述)
  3. $Minimize \; f(\mathbf{a})$となるよう$a_i, a_j$だけ変更する。
  4. 収束条件を満たすまで、2, 3を繰り返す。(収束条件は後述)

↑の3.「a_i, a_jだけ変更」について

基本の流れは直線・平面・超平面(完全に分離できる場合)では、$f(\mathbf{a})$が頂点をとる$a_i$は

a_ i = \frac {1}{|\mathbf{x_i} - \mathbf{x_i}|^2} \bigl(1 - y_i y_j + y_i (\mathbf{x_i} - \mathbf{x_j}) (\mathbf{x_j} \sum_{k \neq i, j}^{n} a_k y_k - \sum_{k \neq i,j} a_k y_k \mathbf{x_k}) \bigr)

であったが、今回はカーネル関数が入っているので、

\begin{align}
a_ i = \frac {1}{K(\mathbf{x_i}, \mathbf{x_i}) + K(\mathbf{x_j}, \mathbf{x_j}) - 2 K(\mathbf{x_i}, \mathbf{x_j})} \biggl( &1 - y_i y_j + y_i \Bigl( \bigl(K(\mathbf{x_i}, \mathbf{x_j}) - K(\mathbf{x_j}, \mathbf{x_j}) \bigr) \sum_{k \neq i, j}^{n} a_k y_k \\
&- \sum_{k \neq i,j} a_k y_k \bigl(K(\mathbf{x_i}, \mathbf{x_k}) - K(\mathbf{x_j}, \mathbf{x_k}) \bigr) \Bigr) \biggr) \\
\end{align}

あとは直線・平面・超平面(完全に分離できない場合)と同様に$0 \leq a_{i, j} \leq C$なので、以下のようになる。

  1. $a_i$を求める。ただし、$a_i \leq 0$となったら$a_i = 0$、$a_i \geq C$となったら$a_i = C$とする。
  2. $a_j$を求める。ただし、$a_j \leq 0$となったら$a_j = 0$、$a_j \geq C$となったら$a_j = C$とする。
  3. 2で$a_j = 0 \; or \; C$となったら、$a_i$を計算しなおす。

↑の2.「i, jを選ぶ」, 4.「収束条件」について

直線・平面・超平面(完全に分離できない場合)と同様に考えればよく

  • $(a_t > 0 \; and \; y = 1) \; or \; (a_t < C \; and \; y = -1)$で、$y_t \nabla_a f(\mathbf{a})_t$が最小値をとる$t$を$i$
  • $(a_t > 0 \; and \; y = -1) \; or \; (a_t < C \; and \; y = 1)$で、$y_t \nabla_a f(\mathbf{a})_t$が最大値をとる$t$を$j$

のように$i, j$を選ぶと

y_j \nabla_a f(\mathbf{a})_j \leq y_i \nabla_a f(\mathbf{a})_i

と表せる。
これらが「2. n個の点から、適当な$i, j$を選ぶ」の選び方「4. 収束条件を満たすまで、2, 3を繰り返す」の収束条件となる。

カーネル関数が入っているので、$f(\mathbf{a})$の$\mathbf{a}$についての勾配のt番目の成分は次のようになる。

\nabla_a {f(\mathbf{a})}_t = 1 - \sum_{l=1}^{n} a_l y_t y_l K(\mathbf{x_t}, \mathbf{x_l}) \\

「使用するカーネル関数K」 + 「aを求めた後の処理」

ここで(機械学習のエッセンスより)カーネル関数を

K(\mathbf{u}, \mathbf{v}) = \exp(- \frac {||\mathbf{u} - \mathbf{v}||^2}{2 \sigma^2}) \\

とおき、↑によって$\mathbf{a}$を求めると$(i), (ii)$より$w_0, \mathbf{w} \phi(\mathbf{x})$を求められる。

\mathbf{w} \phi(\mathbf{x}) = \sum_{i=1}^{n} a_i y_i K(\mathbf{x_i}, \mathbf{x}) \; \cdots (ii)\\
\begin{align}
a_i \Bigl(y_i &\bigl(w_0+\mathbf{w}\phi(\mathbf{x_i}) \bigr) - 1 + \xi_i \Bigr) = 0 \; \cdots (i)\\
\Leftrightarrow y_i \bigl( &w_0+\mathbf{w}\phi(\mathbf{x_i}) \bigr) - 1 + \xi_i = 0 \; (for \; a_i \neq 0) \\
\Leftrightarrow y_i \bigl( &w_0+\mathbf{w}\phi(\mathbf{x_i}) \bigr) = 1 \; (for \; a_i \neq 0) \\
\Leftrightarrow w_0 &= y_i - \mathbf{w}\phi(\mathbf{x_i}) \; (for \; a_i \neq 0) \\
&= y_i - \sum_{l=1}^{n} a_l y_l K(\mathbf{x_l}, \mathbf{x_i}) \; (for \; a_i \neq 0) \\
\end{align}

新しい点$\mathbf{x}$が与えられたときに$w_0+\mathbf{w} \phi(\mathbf{x})$を計算し、その符号(±)によってその点がどちらの集団に属するか判別する。

カーネル関数Kについて

「なんでカーネル関数を↓のようにおくの?そうすると何でうまくいくの?」という話

K(\mathbf{u}, \mathbf{v}) = \exp(- \frac {||\mathbf{u} - \mathbf{v}||^2}{2 \sigma^2}) \\

特徴ベクトルΦから考える

$\phi(\mathbf{x})$は特徴ベクトルと呼ばれ$\phi(\mathbf{x}) = (\phi_1(\mathbf{x}), \cdots, \phi_r(\mathbf{x}) \cdots, \phi_M(\mathbf{x}))$とおくと、

K(\mathbf{x}, \mathbf{y}) = \phi(\mathbf{x}) \phi(\mathbf{y}) = \sum_{r=1}^{M} \phi_r(\mathbf{x}) \phi_r(\mathbf{y})

と表せる。$\phi_r(\mathbf{x})$一つ一つは、例えば$\phi_1(\mathbf{x}) = x_1^2$や$\phi_2(\mathbf{x}) = x_1 x_2$といったように、$\mathbf{x}$の成分を組み合わせたような形となる。
このままだと$\mathbf{x}$の次数が増えるにつれて$\phi(\mathbf{x})$の次数$M$は急激に増えてき、$K(\mathbf{x}, \mathbf{y})$計算量が膨大になり大変なことになる。

ここで

\phi_r(\mathbf{x}) = C e^{-2a(x-r)^2}

と設定し、「$r$が実数全体を動ける」=「$\phi(\mathbf{x})$は(連続無限個成分があるような)無限次元ベクトル」とすると$\sum$が$\int$となり

\begin{align}
K(\mathbf{x}, \mathbf{y}) = &\phi(\mathbf{x}) \phi(\mathbf{y}) \\
= &\int_{-\infty}^{\infty} \phi_r(\mathbf{x}) \phi_r(\mathbf{y}) dr \\
&\vdots \\
= & \exp(-a ||\mathbf{x} - \mathbf{y}||^2) \\
= & \exp(- \frac{||\mathbf{x} - \mathbf{y}||^2}{2 \sigma^2}) \\
\end{align}

と表せ、無限個の特徴量の積分が、簡単な関数であらわせるようになった!(←ココが凄い)。($a=\frac{1}{2 \sigma^2}$とした)
このとき、$K(\mathbf{x}, \mathbf{y})$は無限個の特徴量$\phi_r$を含んでいるので、「無限個の特徴量を含んでいれば、役に立つ特徴量も入ってるよね」という考え方。
解説と途中計算は、「機械学習におけるカーネル法について」と、そこから参照されている「ガウスカーネルとその特徴ベクトル」がわかりやすかったです。


腑に落ちない点
「カーネル関数$K(\mathbf{x}, \mathbf{y})$が簡単な関数になるように、特徴ベクトルを$\phi_r(\mathbf{x}) = C e^{-2a(x-r)^2}$としたけど、特徴ベクトルってそういう設定の仕方で良いものなの?」
↑コレ、調べてわかったらこのページに書こうと思いましたが、思ったより深そうだった・・・

Introduction to Kernel Methodsと、コレで紹介されている本読んだらわかるかも

w0+wΦ(x)の式をそのまま見てみる

数学的には↑の考えだけど、完全には理解できてないので$w_0+\mathbf{w} \phi(\mathbf{x})$をそのまま考えてみる。
$(ii)$より

\begin{align}
w_0 + \mathbf{w} \phi(\mathbf{x}) &= w_0 + \sum_{i=1}^{n} a_i y_i K(\mathbf{x_i}, \mathbf{x})\\
K(\mathbf{x_i}, \mathbf{x}) &= \exp(- \frac {||\mathbf{x_i} - \mathbf{x}||^2}{2 \sigma^2}) \\
\end{align}

となる。ここで

  • $||\mathbf{x_i} - \mathbf{x}||^2$は、既存の点$x_i$と新しい点$x$の距離(の二乗)
  • ↑より、$$K(\mathbf{x_i}, \mathbf{x}) = \exp(- \frac {||\mathbf{x_i} - \mathbf{x}||^2}{2 \sigma^2})$$は、既存の点$x_i$と新しい点$x$が近いほど大きく、遠いほど小さくなる。(完全に重なると1になる)
  • ↑より$$\mathbf{w} \phi(\mathbf{x}) = \sum_{i=1}^{n} a_i y_i K(\mathbf{x_i}, \mathbf{x})$$は、新しい点$x$の全ての既存の点$x_i$からの距離をもとに、$y = 1 \; or \; -1$どちら寄りなのかを表したもの。($a_i$によって点の影響度に重みがつけられている。)
  • ↑を全体的なズレ(切片)$w_0$と足し合わせ、それの符号(±)によって$y = 1 \; or \; -1$のどちらの集団に属するか判定する。($w_0+\mathbf{w} \phi(\mathbf{x}) = 0$が境界線)

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0