支持向量機的SMO優化算法筆記

弁言

支持向量機是一種經典的分類模型,在許多分類任務上表現優異,並且具備良好的解釋性和理論基礎。

支持向量機的思想是在高維空間中找到一個超平面,將正反兩類樣本點分隔開來。有一些問題的樣本點分佈本身就不是綫性可分的,例如“異或”問題,這時候可以將輸入向量映射到高維空間,試著在高維空間中找到分隔平面。對與多分類問題,可以通過一些特殊手段將支持向量機擴展為多分類模型。

本文介紹支持向量機及支持向量機的優化算法,SMO算法。在介紹SMO算法之前,先回顧一下支持向量機的最基本的形式。

支持向量機

給定訓練樣本集\(D=\left\{(\vec{x_1}, y_1), (\vec{x_2}, y_2), \ldots, (\vec{x_N}, y_N)\right\}\)\(y\in \left\{-1, +1\right\}\),支持向量機的模型可以用公式表示為

\[\begin{equation} \text{sign}(\vec{w}^T \vec{x}-b) \end{equation}\]

平時常在各處見到形如\(\vec{w}^T \vec{x}+ b\)的SVM。但Platt在其SMO算法的論文中使用\(\vec{w}^T \vec{x} - b\),本文參考Platt的論文較多,所以這裡沿用Platt的定義。

其中\(\vec{w}\)\(\vec{x}\)都是n維列向量。\(\vec{x}\)是模型的輸入,而\(\vec{w}\)\(b\)是模型的參數。超平面\(u=0\)分隔了空間中的兩類樣本點,我们叫它分隔平面。

讓我們先從簡單的情況開始:假設數據集是線性可分的。那麼,必存在一個恰好將數據集正確劃分在兩側的超平面,被稱為分離超平面。 訓練集中離該平面最近的那些點被稱為支持向量

為了方便,SVM設分離超平面總是對稱地將正反兩個類別的支持向量分隔開來。另外,還规定支持向量必須位於\(u=\pm 1\)的兩個平面上。这就限制了\(\vec{w}\)\(b\)的缩放:雖然對於任意的縮放係數\(\lambda\)\(\lambda (\vec w \vec x - b = 0\)總是表示同一個平面,但能使支持向量落在\(u=\pm 1\)上的\(\lambda\)是唯一的。

SVM的學習目標是最大化間隔\(m\)

間隔是支持向量到分離超平面的距離。易得,SVM的間隔\(m=\frac{1}{||\vec{w}||_2}\).

支持向量機的優化

我們的目標是在所有樣本都分類正確的條件下達到最大間隔,即

\[ \begin{align}&\max_{\vec{w}, b} \frac{1}{||\vec{w}||_2}\\ &s.t. y_i ( \vec{w}^T x_i - b) \geq 1, \forall i \end{align} \]

其中,\(y_i ( \vec{w}^T x_i - b) \geq 1\)表示\(y_i\)\(\vec{w}^T x_i - b\)同號(分類正確),且滿足\(|\vec{w}^T x_i - b|\geq 1\)(所有點要麼落在間隔平面上,要麼落在間隔平面外)。

這個最大化問題可以轉化為等效的最小化問題:

\[ \begin{align}&\min_{\vec{w}, b}\frac{1}{2}||\vec{w}||_2\\ &s.t. y_i ( \vec{w}^T x_i - b) \geq 1, \forall i \end{align} \]

式中,係數\(\frac{1}{2}\)的存在是爲了求導的方便。

軟間隔的引入

支持向量機的優化問題中,并不一定能找到一個能夠正確分割所有點的完美的超平面。為解決這個問題,我們需要容許錯誤的存在。我們這樣修改優化目標

\[ \begin{align} & \min_{\vec{w}, b, \xi_i} \frac{1}{2} ||\vec{w}||_2 + C\sum_{i=1}^{N}\xi_i \\ & s.t. y_i(\vec{w}^T x_i - b) \geq 1-\xi_i , \xi_i \geq 0, \forall i \end{align} \]

式子中,\(\xi_i\)表示向量\(x_i\)違背模型的程度,被稱爲“鬆弛變量”。\(C\)是常數,用於控制懲罰的强度。

到這裏,我們的優化目標大體明瞭。可以看到這是一個“有多個不等式約束的優化問題”,可以用拉格朗日乘數法來分析它。

拉格朗日乘數法

構造如下的拉格朗日函數

\[\begin{equation} L(\vec{w}, b, \vec{\alpha}, \vec{\xi}, \vec{\mu}) = \frac{1}{2} ||\vec{w}||_2 + C\sum_{i=1}^N \xi_i + \sum_{i=1}^{N}\alpha_i(1 - \xi_i - y_i(\vec{w}^T x_i - b)) - \sum_{i=1}^N \mu_i \xi_i \label{eqL} \end{equation}\]

其中 \(\alpha_i \geq 0\)\(\mu_i \geq 0\)是拉格朗日乘子。令\(L\)\(\vec{w}\)\(b\)\(\xi_i\)的偏導為0,

\[\begin{equation} \frac{\partial L}{\partial \vec{w}} = \vec{w} - \sum_{i=1}^N \alpha_i y_i \vec{x_i} = 0 \label{plpw} \end{equation}\]

\[\begin{equation} \frac{\partial L}{\partial b} = \sum_{i=1}^N \alpha_i y_i = 0 \label{plpb} \end{equation}\]

\[\begin{equation} \frac{\partial L}{\partial \xi_i } = C - \alpha_i - \mu_i = 0 \label{plpxii} \end{equation}\]

利用這三個式子可以化簡原拉格朗日函數,

\[\begin{align} L&=\frac{1}{2}||\vec{w}||_2 + C\sum_{i=1}^N \xi_i + \sum_{i-1}^N \alpha_i (1-y_i (\vec{w}^T \vec{x_i} - b)) - \sum_{i=1}^N \alpha_i \xi_i - \sum_{i=1}^N \mu_i \xi_i \\&= \frac{1}{2}||\vec{w}||_2 + \sum_{i=1}^N \alpha_i (1-y_i (\vec{w}^T \vec{x_i} - b)) \\&= \frac{1}{2}||\vec{w}||_2 + \sum_{i=1}^N \alpha_i - \sum_{i=1}^N \alpha_i y_i\vec{w}^T \vec{x_i} + \sum_{i=1}^N \alpha_i y_i b \\&= \frac{1}{2} ||\vec{w}||_2 + \sum_{i=1}^N \alpha_i - ||\vec{w}||_2 + 0 \\&= \sum_{i=1}^N \alpha_i - \frac{1}{2} ||\vec{w}||_2 \\&= \sum_{i=1}^N \alpha_i - \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j \vec{x_i}^T \vec{x_j} \end{align} \]

於是原優化問題的對偶問題是

\[ \begin{align} & \max_\vec \alpha \sum_{i=1}^N \alpha_i - \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j \vec{x_i}^T \vec{x_j} \\& s.t. \sum_{i=1}^N \alpha_i y_i=0, \alpha_i \geq 0, \mu_i \geq 0, \alpha_i + \mu_i = C , \forall i\end{align} \]

再化簡得 \[ \begin{align} & \min_\vec\alpha \Psi(\vec{\alpha}) = \min_\vec\alpha \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j \vec{x_i}^T \vec{x_j} - \sum_{i=1}^N \alpha_i \\& s.t. \sum_{i=1}^N \alpha_i y_i=0, \\& 0\leq \alpha_i \leq C, \forall i \end{align} \]

該問題的KKT條件是

\[ \notag \left\{ \begin{align}& \alpha_i \geq 0, \mu_i \geq 0 \\& y_i f(\vec{x_i}) - 1 + \xi_i \geq 0 \\& \alpha_i(y_i f(\vec{x_i}) - 1 + \xi_i) = 0 \\& \xi_i \geq 0, \mu_i \xi_i = 0 \end{align}\right. \]

分析KKT條件,分三種情況討論:

  1. \(\alpha_i = 0\). 此時\(\mu_i = C - \alpha_i = C > 0\),故\(\xi_i = 0\)

\[ y_i f(\vec{x_i}) - 1 \geq 0\]

  1. \(0 < \alpha_i < C\). 此時\(\alpha_i \neq 0\)\(\mu_i = C - \alpha_i \geq 0\)\(\xi_i = 0\),於是

\[ y_i f(\vec{x_i}) + \xi_i - 1 = 0 \Rightarrow y_i f(\vec{x_i}) -1 = 0 \]

  1. \(\alpha_i = C \neq 0\). 此時\(\mu_i = 0\)\(\xi_i \geq 0\),於是

\[ y_i f(\vec{x_i}) + \xi_i - 1 = 0 \Rightarrow y_i f(\vec{x_i}) - 1 \leq 0\]

\(E_i = f(\vec{x_i}) - y_i\),則\(y_i f(\vec{x_i}) - 1 = y_i f(\vec{x_i}) - y_i y_i = y_i E_i\)

綜合上述三種情況,有

\[ \notag y_i E_i = \left \{ \begin{eqnarray} &\geq 0 &, \alpha_i = 0\\ &= 0 &, 0 < \alpha_i < C\\ &\leq 0 &, \alpha_i = C \end{eqnarray} \right. \]

這被稱作是原KKT條件的另一種形式。

核函數的引入

有時,輸入訓練樣本不是綫性可分的,此時可以引入一個升爲函數\(\phi(\vec{x})\),將輸入向量映射到高維空間,在這個高維空間中的樣本點有可能是綫性可分的。此時的模型可表示為

\[u= f(\vec x) = \vec{w}^T \phi(x) - b\]

核函數\(\kappa(\vec{x_1}, \vec{x_2})\)定義爲

\[ \kappa(\vec{x_1}, \vec{x_2}) = \phi(\vec{x_1})^T \phi(\vec{x_2}) \]

假定核函數滿足Mercer條件,引入函數\(\phi(\vec{x})\)和核函數\(\kappa(\vec{x_1}, \vec{x_2} )\)後,優化問題變爲

\[\begin{align} & \min_\vec\alpha \Psi(\vec\alpha) = \min_\vec\alpha \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j \kappa(\vec{x_i}, \vec{x_j}) - \sum_{i=1}^N \alpha_i \\& s.t. \sum_{i=1}^N \alpha_i y_i=0, \\& 0\leq \alpha_i \leq C, \forall i \end{align} \]

KKT條件略。

實際上我們可以只關心核函數\(\kappa(\vec{x_1}, \vec{x_2} )\)而無需知道升維函數\(\phi(\vec{x})\)的具體形式,這是因爲

\[\begin{align} u &= f(\vec x) \\&= \vec{w}^T \phi(\vec{x}) - b \\ &= \sum_{i=1}^N \alpha_i y_i \phi(\vec{x_i})^T \phi(\vec{x}) - b \\&= \sum_{i=1}^N \alpha_i y_i \kappa(\vec{x}, \vec{x_i}) - b \end{align} \]

接下來只討論這種包含了軟間隔,引入了核函數的模型\(f(\vec x)\).

觀察變形後的模型,發現模型的參數不再含\(\vec{w}\),取而代之的是拉格朗日乘子\(\alpha_i\)和訓練樣本類別\(y_i\)。由KKT條件可知當\(y_i f(\vec{x_i}) - 1 + \xi_i \gt 0\)時就有\(\alpha_i = 0\),此時對應訓練樣本便不構成模型的參數,這就是支持向量機的稀疏性。

SMO優化算法

SMO算法每次選取兩個拉格朗日乘子\(\alpha_i\)\(\alpha_j\)做更新,其它拉格朗日乘子\(\alpha_k, k\neq i, j\)則固定不變。由於每次更新的參數數量足夠少,故存在解析解,使得SMO算法快過傳統的SVM優化算法。

SMO算法包括兩部分:

求選取的兩個拉格朗日乘子的解析解; 啓發式地搜索下一輪的兩個拉格朗日乘子。 接下來分別闡述這兩個部分。

求拉格朗日乘子的解析解

設選取了兩個拉格朗日乘子\(\alpha_1\)\(\alpha_2\)。條件\(0\leq \alpha_i \leq C\)將兩個乘子被约束在一個二維正方形內部,而公式\(\ref{plpb}\)將兩個乘子約束在一條二維直線上。算法先計算\(\alpha_2\). 根據\(y_1\)\(y_2\)的取值,\(\alpha_2\)的取值範圍分兩種情況

  1. \(y_1 \neq y_2\)

此時下限\(L = max(0, \alpha_2 - \alpha_1)\),上限\(H=min(C, C + \alpha_2 - \alpha_1)\).

  1. \(y_1 = y_2\)

此時下限\(L = max(0, \alpha_2 + \alpha_1 - C)\),上限\(H = min(C, \alpha_2 + \alpha_1)\).

\(\Psi(\vec\alpha)\)表示為\(\alpha_1\)\(\alpha_2\)的函數,

\[\begin{equation} \Psi(\alpha_1, \alpha_2) = \frac{1}{2} (\alpha_1^2 \kappa_{11} + \alpha_2^2 \kappa_{22} + 2 s \alpha_1 \alpha_2 \kappa_{12} + 2 y_1 \alpha_1 \sum_{j=3}^N y_j \alpha_j \kappa_{1j} + 2 y_2 \alpha_2 \sum_{j=3}^N y_j \alpha_j \kappa_{2j}) - \alpha_1 - \alpha_2 + \cdots \label{Pa1a2} \end{equation}\]

其中,\(s=y_1 y_2\)\(\kappa_{ij} = \kappa(\vec{x_i}, \vec{x_j})\),符號“\(\cdots\)”表示一些被忽略的常數項。因為我們只關心\(\Psi\)函數的極值點,所以為了方便可以不看它的常數項。

\[ \begin{align} &\because &\sum_{j=1}^N \alpha_i y_i = 0 \\ &\therefore & \alpha_1 y_1 + \alpha_2 y_2 = -\sum_{j=3}^N \alpha_j y_j \\ \end{align} \]

\(-y_1 \sum_{j=3}^N \alpha_i y_i = \delta\),則

\[ \alpha_1 + s \alpha_2 = \delta \]

\[ \alpha_1 = \delta - s \alpha_2 \]

因為此約束,\(\Psi\)可看作是\(\alpha_2\)的函數。將此式代入\(\ref{Pa1a2}\),又記\(v_i = \sum_{j=3}^N y_j \alpha_j \kappa_{ij}\),得

\[ \begin{align} \Psi(\alpha_2) &= \frac{1}{2} [ (\delta - s \alpha_2)^2 \kappa_{11} + \alpha_2^2 \kappa_{22} + 2 y_1 y_2 (\delta - s \alpha_2) \alpha_2 \kappa_{12} + 2 y_1 (\delta - s \alpha_2) v_1 + 2 y_2 \alpha_2 v2] - (\sigma - s \alpha_2) - \alpha_2 + \cdots \\&= (\frac{1}{2} \kappa_{11} + \frac{1}{2} \kappa_{22} - \kappa_{12} ) \alpha_2^2 + (-s \delta \kappa_{11} + s \delta \kappa_{12} - y_2 v_1 + y_2 v_2 + s - 1 ) \alpha_2 + \cdots \\&= \frac{\eta}{2} \alpha_2^2 + (s \delta(\kappa_{12} - \kappa_{11}) - y_2 v_1 + y_2 v_2 + s - 1 ) \alpha_2 + \cdots\end{align} \]

於是

\[\begin{eqnarray} & \Psi'(\alpha_2) & = \eta \alpha_2 + (s \delta(\kappa_{12} - \kappa_{11}) - y_2 v_1 + y_2 v_2 + s - 1 ) \\& \Psi''(\alpha_2) &= \eta \end{eqnarray}\]

因為核函數滿足Mercer條件,故\(\eta \geq 0\)。分兩種情況討論,

  1. \(\eta > 0\)

此時求\(\Psi\)函數的極值點。若極值點沒有超出上下限,就可以據此更新參數。否則,只能取\(\alpha_2\)的上下限之一。

極值點的求法:

\[\begin{eqnarray} \alpha_2^{new} &=& \frac{1}{\eta} (s \delta (\kappa_{11} - \kappa_{12}) + y_2 v_1 - y_2 v_2 - s + 1 ) \\ &=& \frac{1}{\eta} (s (\alpha_1^{old} + s \alpha_2^{old})(\kappa_{11} - \kappa_{12}) \\ && + y_2(u_1 + b - y_1 \alpha_1^{old} \kappa_{11} - y_2 \alpha_2^{old} \kappa_{12} ) \\ && - y_2 ( u_2 + b - y_1 \alpha_1^{old} \kappa_{21} - y_2 \alpha_2^{old} \kappa_{22} ) - s + 1) \\&=& \frac{1}{\eta} (s \alpha_1^{old}(\kappa_{11} - \kappa_{12}) + \alpha_2^{old} (\kappa_{11} - \kappa_{12}) + y_2(u_1^{old} - u_2^{old}) + s\alpha_1^{old}(\kappa_{12} - \kappa_{11}) + \alpha_2^{old} (\kappa_{22} - \kappa_{12}) - s + 1) \\&=& \frac{1}{\eta} (\alpha_2^{old}{ \eta} + y_2 (u_1^{old} - u_2^{old} ) - s + 1) \\&=&\alpha_2^{old} + \frac{y_2}{\eta} (u_1^{old} - u_2^{old} + y_2 - y_1)\\&=& \alpha_2^{old} + \frac{y_2}{\eta}(E_1^{old} - E_2^{old}) \end{eqnarray}\]

其中,\(E_i^{old} = u_i^{old} - y_i\).

\[ \notag \alpha_2^{new, clipped}=\left\{ \begin{align} & H , & \alpha_2^{new} \geq H \\ & \alpha_2^{new} , & L < \alpha_2^{new} < H \\ & L ,& \alpha_2^{new} \leq L \end{align} \right. \]

這樣就求得了新的\(\alpha_2\). 據此就可以算出新的\(\alpha_1\)

\[ \alpha_1^{new} = \alpha_1^{old} + s ( \alpha_2 - \alpha_2^{new, clipped} ) \]

  1. \(\eta = 0\)

這種情況下,只需比較線段兩端點處目標函數的值,取其中較小的一端即可。若兩端大小相同,則導致目標函數無法下降,這種情況後面留在後面討論。

選取待優化的一對拉格朗日乘子 為了加快收斂,採用一種啟發式方法來選擇待優化的拉格朗日乘子。

外循環的作用是選擇第一個拉格朗日乘子。外循環首先遍歷一整個訓練集,判斷哪些樣本違背了KKT條件。違背了KKT條件的樣本可以用作優化。拉格朗日乘子不等於\(0\)\(C\)的稱為“界內樣本(non-bound examples)”。第一次遍歷,找出所有界內樣本,第二次遍歷,選擇一個違背KKT條件的界內樣本用於優化。所有界內樣本都滿足KKT條件時,外循環重新遍歷一次全體樣本。重複遍歷多次界內樣本,接著遍歷一次全體樣本,外循環重複這樣的工作直到所有樣本都滿足KKT條件(這時算法停止)。

外循環優先將精力花費在界內樣本的遍歷上,這是因為界內樣本更“活躍”,而邊界上的樣本傾向於穩定。

確定樣本是否滿足KKT條件時,設容許的誤差為\(\epsilon\)。一般設\(\epsilon = 0.001\),不會用到太高的精度。允許較大的誤差能加快收斂。

一旦第一個拉格朗日乘子確定,則開始選擇第二個拉格朗日乘子。根據先前推導的公式,\(\alpha_2\)的變化量與\(|E_1 - E_2|\)正相關。那麼,若\(E_1\)為正數,則選擇的樣本應使\(E_2\)盡可能小,否則應使\(E_2\)盡可能大。

幾種特殊情況下,上述的選取第二個拉格朗日乘子的方法可能無法使目標函數下降。例如,先後選擇的兩個樣本相同的情況。若出現這種情況,則重新選擇一對拉格朗日乘子使目標函數下降,具體做法為:若目標函數無法下降,則遍歷所有界內樣本,從中隨機選擇第二個拉格朗日乘子使目標函數下降。若無法做到,則遍歷全體樣本,從中隨機選擇第二個拉格朗日乘子使目標函數下降。若還是無法使目標函數下降,則重新選擇第一個拉格朗日乘子。

閾值\(b\)的更新 每經過一輪更新,都需要重新計算\(b\)的值,以確保更新后的兩組參數滿足KKT條件。

\(0 < \alpha_1^{new} < C\)時,由於

\[ f(\vec{x_1}) = \sum_{i=1}^N \alpha_i y_i \kappa_{i1} - b = y_1 \]

\[ b_1^{new} = \sum_{i=3}^N \alpha_i y_i \kappa_{i1} + \alpha_1^{new} y_1 \kappa_{11} + \alpha_2^{new} y_2 \kappa_{21} - y_1 \]

\(E_1\)的定義知,

\[E_1 = \sum_{i=3}^N \alpha_i y_i \kappa_{i1} + \alpha_1^{old} y_1 \kappa_{11} + \alpha_2^{old} y_2 \kappa_{21} - b^{old} - y_1 \]

於是

\[ b_1^{new} = E_1 + (\alpha_1^{new} - \alpha_1^{old})y_1 \kappa_{11} + (\alpha_2^{new,clipped} - \alpha_2^{old}) y_2 \kappa_{21} + b^{old} \]

同樣的,當\(0< \alpha_2^{new, clipped}\)時,有

\[ b_2^{new} = E_2 + (\alpha_1^{new} - \alpha_1^{old}) y_1 \kappa_{12} + (\alpha_2^{new, clipped} - \alpha_2 ^ {old}) y_2 \kappa_{22} + b^{old} \]

思考題

什麼是支持向量?在硬間隔和軟間隔支持向量機中,支持向量的定義有什麼不同?

對於硬間隔支持向量機,支持向量是距離分離超平面最近的那些點。

對於軟間隔支持向量機,支持向量有三種情況:

  1. 處於間隔平面之間的點;
  2. 恰好處於間隔平面上的點;
  3. 分類錯誤的點;

SVM和逻辑回归的差别和共同点?

差别:

  1. 损失函数的不同。逻辑回归的损失函数是Logistical Loss(即Binary Cross Entropy Loss),而SVM使用Hinge Loss。Hinge Loss旨在最大化分离间隔,并带有结构风险最小化。
  2. 在SVM中,只有支持向量对训练有影响。而邏輯回歸受所有樣本的影響。
  3. SVM可以使用核方法而實現對非線性分類問題的支持。邏輯回歸由於只有一層線性變換,無法解決如異或這一類的非線性問題。

相同點: 1. 它們都是有監督的二分類算法。 2. 在生成/判別模型中,二者都屬於判別模型。

參考文獻

地址 推薦程度 備註
SMO原論文 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-98-14.pdf ⭐⭐⭐⭐  
JerryLead的文章 https://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html ⭐⭐⭐ 寫得還可以。
某大學的講義 http://fourier.eng.hmc.edu/e176/lectures/ch9/node9.html ⭐⭐⭐⭐ 很詳細。雖略有錯誤但不影響閱讀。
《機器學習》周志華   ⭐⭐⭐ 對SMO有簡單的介紹。
《統計學習方法》李航   ⭐⭐⭐⭐⭐ 很詳細。
posted @ 2020-08-31 18:48  执迷4869  阅读(90)  评论(0)    收藏  举报