---
# System prepended metadata

title: Soft-margin Support Vector Machine
tags: [機器學習技法]

---

# 修改目標

從 Pocket 最初的目標：

$$
\min_{b,\mathbf{w}} \sum_{n=1}^{N}[[y_{n}\ne sign(\mathbf{w}^{T}\mathbf{z}_{n}+b)]]
$$

我們領悟了他的精隨，得到了新的 SVM 目標：

$$
\begin{align}
\text{Objective: }&\min_{b,\mathbf{w}} \frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C\sum_{n=1}^{N}[[y_{n}\ne sign(\mathbf{w}^{T}\mathbf{z}_{n}+b)]]\\
\text{s.t.: }&y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge1\text{ for correct n}\\
&y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge -\infty \text{ for incorrect n}\\
\end{align}
$$

>$y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge -\infty$ 代表預測錯誤，是個負數

或者可以把 subject 改一下，更精簡：

$$
\begin{align}
\text{Objective: }&\min_{b,\mathbf{w}} \frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C\sum_{n=1}^{N}[[y_{n}\ne sign(\mathbf{w}^{T}\mathbf{z}_{n}+b)]]\\
\text{s.t.: }&y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge 1-\infty[[y_{n}\ne sign(\mathbf{w}^{T}\mathbf{z}_{n}+b)]]\\
\end{align}
$$

但是跟布林式子打了這麼多次交道，非常清楚這個非線性的東西很難處理，必須做一些轉換，否則之前建立的各種 SVM 都用不了。

並且上面的 subject 其實只能要求「犯錯的數量」，而不能要求「犯錯的程度」；也就是我們無法知道犯大錯或犯小錯。

# 違規量 $\xi_{n}$

$\xi_{n}$ 是各個點「違規的量」。如果是分對的點，包含邊上，其違規量是 0；如果是分錯的點，或者是在邊界內的點，就算違規。

也就是說：

$$
\xi_{n}\ge 0
$$



所以我們有了以下新的 Objective 跟 Constraints：

$$
\begin{align}
\text{Objective: }&\min_{b,\mathbf{w},\boldsymbol{\xi}} \frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C\sum_{n=1}^{N}\xi_{n}\\
\text{s.t.: }&y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge 1-\xi_{n}\\
&\forall\ n\ ,\xi_{n}\ge 0
\end{align}
$$

可以發現我們將 $[[y_{n}\ne sign(\mathbf{w}^{T}\mathbf{z}_{n}+b)]]$ 替換成了 $\xi_{n}$。

而突然冒出的 $y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge 1-\xi_{n}$，是因為當初 $y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge 1$ 可以確保距離最小的點，其長度公式為 $\frac{1}{\left\|\mathbf{w}\right\|}$。

但現在有些違規的點，需要幫他加上違規量：

$$
\xi_{n}+y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)\ge 1
$$

把他們推回邊界以內；如此我們便又可以確保距離最小的點，其長度公式一樣為 $\frac{1}{\left\|\mathbf{w}\right\|}$。

然後最後再多加上 $C\sum_{n=1}^{N}\xi_{n}$ 就可以了。

現在的 QP 有 $\tilde{d}+1+N$ 個變數，因為多了 $\xi_{n}$；限制則變為 $2N$ 個。

# Lagrange function

回想 [dual SVM 時提到過的](https://hackmd.io/@ShawnNTU-CS/HybC95v22#Lagrange-Function)，要建立 Lagrange function，就要將限制移項後加到 Objective 裡面：

$$
\color{red}{0\ge 1-\xi_{n}-y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b)}\\
\color{blue}{0\ge -\xi_{n}}\\
\mathcal{L}(b,\mathbf{w},\boldsymbol{\xi},\color{red}{\boldsymbol{\alpha}},\color{blue}{\boldsymbol{\beta}})=\min_{b,\mathbf{w},\boldsymbol{\xi}} \frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C\sum_{n=1}^{N}\xi_{n}+\color{red}{\sum_{n=1}^{N}\alpha_{n}(1-\xi_{n}-y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b))}+\color{blue}{\sum_{n=1}^{N}\beta_{b}(-\xi_{n})}
$$

# Lagrange Dual

然後就是一樣的推導方式，我們可以得到我們想要的 Lagrange Dual：

$$
\max_{\alpha_{n}\ge0,\beta_{n}\ge0}\left(\min_{b,\mathbf{w},\boldsymbol{\xi}} \frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C\sum_{n=1}^{N}\xi_{n}+\color{red}{\sum_{n=1}^{N}\alpha_{n}(1-\xi_{n}-y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b))}+\color{blue}{\sum_{n=1}^{N}\beta_{b}(-\xi_{n})}\right)
$$

然後一樣計算出梯度，並帶入來化簡式子。

$$
\frac{\partial\mathcal{L}}{\partial\xi_{n}}=C-\alpha_{n}-\beta_{n}=0\\
\Rightarrow C-\alpha_{n}=\beta_{n}
$$

可以發現，$\beta_{n}$ 可以用 $C-\alpha_{n}$ 替換掉；並且由於 $\beta_{n}\ge0$，所以可以知道：

$$
C\ge\alpha_{n}\ge0
$$

$$
\max_{\alpha_{n}\ge0,\beta_{n}\ge0}\left(\min_{b,\mathbf{w}} \frac{1}{2}\mathbf{w}^{T}\mathbf{w}+\color{red}{\sum_{n=1}^{N}\alpha_{n}(1-y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b))}\right)
$$

在替換掉了 $\beta_{n}$ 之後，就變成是跟之前 dual SVM 中 objective 一模一樣的東西，只是 $\alpha_{n}$ 多了上限。

所以一樣使用傳統藝能，可以得到：

$$
\frac{\partial\mathcal{L}}{\partial b}=0\Rightarrow \sum_{n}^{N}\alpha_{n}y_{n}=0\\
\frac{\partial\mathcal{L}}{\partial w_{i}}=0\Rightarrow \mathbf{w}=\sum_{n}^{N}\alpha_{n}y_{n}\mathbf{z}_{n}\\
$$


所以最終在 QP 當中，只有差在 $0\le\alpha_{n}\le C$ 這部分，也就是要多補一些東西而已。

## KKT Condition

- primal feasible：
    - $y_{n}(\mathbf{w}^{T}\mathbf{x}+b)\ge 1-\xi_{n}$
    - $\xi_{n}\ge0$
- dual feasible：
    - $\alpha_{n} \ge 0$
    - $\beta_{n} \ge 0$
- dual-inner optimal
    - $\sum_{n=1}^{N}\alpha_{n}y_{n}=0$ 和 $\mathbf{w}=\sum_{n=1}^{N}\alpha_{n}y_{n}\mathbf{z}_{n}$
    - $\beta_{n}=C-\alpha_{n}$
- primal-inner optimal
    - $\alpha_{n}\left(1-\xi_{n}-y_{n}\left(\mathbf{w}^{T}\mathbf{x}_{n}+b\right)\right)=0$
    - $\beta_{n}(-\xi_{n})=0$
    - 同樣有「Complementary  Slackness」

# $b$ 的值

解出了 $\alpha_{n}$ 之後，$\beta_{n},\mathbf{w}$ 都可以輕鬆算出。

至於 $b$ 跟 $\xi_{n}$，來看看兩者的方程：

$$
\alpha_{n}\left(1-\xi_{n}-y_{n}\left(\mathbf{w}^{T}\mathbf{x}_{n}+b\right)\right)=0\\
\Rightarrow y_{n}-y_{n}\xi_{n}-\mathbf{w}^{T}\mathbf{x}_{n}=b\\
$$

會發現想要知道 $b$，就要先知道 $\xi_{n}$，但如果只單看這個方程，會發現想要知道 $\xi_{n}$ ，就要先知道 $b$；也就是陷入了循環。

為此，我們需要考慮第二條：

$$
\beta_{n}(-\xi_{n})=0\\
\Rightarrow (C-\alpha_{n})\xi_{n}=0
$$

可以發現，只要知道 $\alpha_{n}$ 似乎就好辦事許多，於是開始分段討論：

## $\alpha_{n}>0$ / Support Vector

跟之前的定義一樣，$\alpha_{n}>0$ 的就是支撐向量，但是由於 $\xi$ 的關係，所以有兩種支撐向量：

- $C>\alpha_{n}>0$：此時可以確定 $\xi_{n}=0$，也就是說
    - $y_{n}-\mathbf{w}^{T}\mathbf{x}_{n}=b$
    - 這時有個特殊的名稱 **「free SVM」**
- $C=\alpha_{n}$
    - 只能確定 $\xi_{n}=1-y_{n}\left(\mathbf{w}^{T}\mathbf{x}_{n}+b\right)$
    - 所以有可能 $\xi_{n}=0$，但是是極少數情況。
    - 這時有個特殊的名稱 **「bounded SVM」**

所以 $b$ 就變成是只要從 free SVM 中隨便選一個就可以算出來。

但是極少數的情況會沒有 free SVM，這時候 $b$ 會由一堆東西限制住，只要滿足這些限制和 KKT 條件的 $b$ 就會是可行的解。 

:::danger
待補
:::

## $\alpha_{n}=0$

這時候可以確定 $\xi_{n}=0$，也就是說：

$$
y_{n}(\mathbf{w}^{T}\mathbf{x}+b)\ge 1
$$

也就是那些分對的點；當然極少情況會是在邊界的點。

# Model Selection

算出了 $\alpha$，找到了 $b$，然後搭配之前的 Kernel function，就成了實際中常用的 SVM，通常 SVM 沒有特別說明的話大多是 Soft-margin，然後再看是搭配哪種 Kernel function。

如果是 Gaussian Kernel，那麼一個 model 需要調的參數就是 $(C,\gamma)$，所以一樣會有選擇問題；所以一樣使用 Validation 搭配 grid value 來進行選擇。

:::info
grid value 就像是以 [-1,1]X[-1,1] 的四種組合以網格的方式列出。
:::

# Leave-One-Out

Leave-One-Out 在使用了 dual SVM 方法底下，可以得到有趣的結論：

$$
E_{loocv}\le\frac{\#SV}{N}
$$

因為如果我們對 N 個點做 SVM 得到 $\alpha_{n}$：

- 如果要對第 n 個點做 Validation，所對應的 $\alpha_{n}=0$
  - 代表他是分對的點，因此就算把該點扣除去做 SVM，得到的 $\alpha$ 跟原本一樣
- 如果第 n 個點所對應的 $\alpha_{n} \ne 0$
  - 代表該點是 SV，如果扣除他的話可能會得到不一樣的結果
  - 也就是說 $g^{-}$ 跟 $g$ 在第 n 個點上要嘛一樣要嘛不一樣

> [可以回顧上面](https://hackmd.io/oJS56aBkQZ-fR1dCWRK6Eg#alpha_ngt0--Support-Vector)

所以之前 Validation 在推導 $\underset{\mathcal{D}}{\mathcal{E}} E_{loocv}(g^{-}) \approx \overline{E_{out}(g^{-})}$ 的時候：

- 對於非 SV 的點：
  - $e_{non-SV}=err(g^{-},non-SV)=err(g,non-SV)=0\\$
- 對於 SV 的點：
  - $e_{SV}= 1\ or\ 0$

所以如果 $g^{-}$ 跟 $g$ 在 SV 的點上預測的都不一樣：

$$
E_{loocv}=\frac{\# SV}{N}
$$

這就是為甚麼 Support Vector 的數量會成為 $E_{loocv}$ 的一個上界的原因。

而 #SV 的好處就是，一旦得到 $\alpha$ 後就可以直接知道，所以可以在第一時間作為「安全檢查」，把危險的模型先去除掉；接著再用 Cross Validation 找出最適合的模型。

