支持向量機的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條件,分三種情況討論:
- \(\alpha_i = 0\). 此時\(\mu_i = C - \alpha_i = C > 0\),故\(\xi_i = 0\)。
\[ y_i f(\vec{x_i}) - 1 \geq 0\]
- \(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 \]
- \(\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\)的取值範圍分兩種情況
- \(y_1 \neq y_2\)
此時下限\(L = max(0, \alpha_2 - \alpha_1)\),上限\(H=min(C, C + \alpha_2 - \alpha_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\)。分兩種情況討論,
- \(\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} ) \]
- \(\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} \]
思考題
什麼是支持向量?在硬間隔和軟間隔支持向量機中,支持向量的定義有什麼不同?
對於硬間隔支持向量機,支持向量是距離分離超平面最近的那些點。
對於軟間隔支持向量機,支持向量有三種情況:
- 處於間隔平面之間的點;
- 恰好處於間隔平面上的點;
- 分類錯誤的點;
SVM和逻辑回归的差别和共同点?
差别:
- 损失函数的不同。逻辑回归的损失函数是Logistical Loss(即Binary Cross Entropy Loss),而SVM使用Hinge Loss。Hinge Loss旨在最大化分离间隔,并带有结构风险最小化。
- 在SVM中,只有支持向量对训练有影响。而邏輯回歸受所有樣本的影響。
- 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有簡單的介紹。 | |
| 《統計學習方法》李航 | ⭐⭐⭐⭐⭐ | 很詳細。 |

浙公网安备 33010602011771号