本文結合了《統計學習方法》,吳恩達中文筆記,以及一些博客文章https://www.cnblogs.com/pinard/p/6111471.html,http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html,https://blog.csdn.net/Victor_Gun/article/details/45228071,並結合個人理解總結出了這篇詳細介紹SMO算法的文章。文章有詳細的數學推導過程,可以解決大多數疑惑的地方,希望能對大家有所幫助。
支持向量機的最後一節,用SMO優化算法解決對偶函數的最後優化問題,首先先介紹座標上升法
1.座標上升法
假設我們有一個要求解的優化問題: 這裏W是 向量的函數。之前我們講過求最優解的兩種方法分別是梯度下降法和牛頓法,這裏是新的一種方法——座標上升法,其方法過程爲:
座標上升法雖然比牛頓法有更多的迭代,但每次迭代的代價都很小。
2.SMO優化算法(Sequential minimal optimization)
SMO算法解決對偶函數的最後優化問題:
按照座標上升的思路,我們固定除 其中一個參數以外的所有參數,但是這樣有問題,因爲固定 之外所有參數,那麼 不再是變量,因爲 可以由其他固定的參數表示出來。
因此我們需要一次選擇兩個參數做優化,比如 和 ,此時 可以由 和其他參數表示出來,再帶回W中,W就是隻關於 的函數,可解。這樣,SMO的主要步驟爲:
接下來將 改寫一下:
以下是推導過程,首先推導出未考慮約束條件的 。爲了敘述方便我們記:
引入記號變量
目標函數可寫成
根據 以及 ,將兩遍同乘一個 ,則可將 表示爲:
將 帶入到目標函數中,則目標函數變爲只含α2的函數:
接下來我們關注一下問題的約束條件:
選擇的兩個變量得到最優化的解 和 後,我們要根據最優化的解求出對應的滿足KKT條件的b值,因爲KKT條件就是我們收斂的條件。所以我們繼續推導出閾值b的更新:
推導b——首先來看一下KKT條件:
於是有:
由之前 定義是得:
每次完成優化後,還需要更新 , 更新要用到 ,以及所有
支持向量對應的
其中,S是所有支持向量 的集合。
3.SMO中拉格朗日乘子的啓發式選擇方法
SMO算法在每個子問題中選擇兩個變量優化,其中至少一個變量是違反KKT條件的
3.1 第一個變量的選擇
SMO算法稱選擇第一個變量爲外層循環,這個變量需要選擇在訓練集中違反KKT條件最嚴重的樣本點。選擇方法爲
1.優先選擇樣本前面係數 的 作優化(稱爲無界樣例),判斷它們是否滿足KKT條件。
2.如果這些樣本點都滿足KKT條件,那麼遍歷整個訓練集,檢驗它們是否都滿足KKT條件。
3.遍歷完子集後,重新開始1,2,直到在執行1和2時沒有任何修改就結束
遍歷方法不止這一種,其他版本的例如Platt論文中的是指出先遍歷整個樣本,再遍歷無界樣本的算法。
那麼大家最關心的的問題來了:爲什麼要選擇違反KKT條件最嚴重的點進行優化呢?其次,優化後是否就能保證樣本滿足KKT條件?
這裏需要引進一個概念——監視可行間隙
它是原始目標函數值和對偶目標函數值的間隙,對於凸二次優化來說這個間隙是零,]則原始目標函數 與對偶目標函數 的都是求極小值,它們的差爲:
3.2 第二個變量的選擇
首先我們來看之前得到的一個公式:
SMO算法稱選擇第二個變量爲內層循環,假設我們在外層循環已經找到了 , 則第二個變量 的選擇標準是讓|E1−E2|有足夠大的變化。因爲 已定,那麼 也確定了,所以要想|E1−E2|最大,只需要在 爲正時,選擇最小的 作爲 , 在 爲負時,選擇最大的 作爲 ,可以將所有的 保存下來加快迭代。
確定第二個乘子方法:
1、首先在無界乘子中尋找使得|E_1-E_2|最大的樣本;
2、如果1中沒找到則從隨機位置查找無界乘子樣本;
3、如果2中也沒找到,則從隨機位置查找整個樣本(包含界上和無界乘子)。
最後的收斂條件是在界內( )的樣例都能夠遵循KKT條件,且其對應的 只在極小的範圍內變動。
4.SMO算法總結(統計學習方法中的算法)
SMO算法將原問題不斷分解爲子問題並對子問題求解,進而達到求解原問題的目的。
假設輸入是m個樣本 ,其中x爲n維特徵向量。y爲二元輸出,值爲1,或者-1.精度e。
輸出是近似解α
1)取初值
2)按照3.1節的方法選擇 ,接着按照3.2節的方法選擇 ,求出新的
3)根據約束條件求出剪輯後的 和 ,更新 爲 ;
4)計算 和
5)在精度e範圍內檢查是否滿足如下的終止條件:
6)如果滿足則結束,返回 ,否則轉到步驟2。
5.總結
文章內容範圍比較大,完成比較倉促,在公式書寫上可能存在問題,希望大家能批評指正,我會及時修改過來,謝謝大家。
7.14 一更:對編程代碼中的一部分理解
if (L == H),
% continue to next i.
continue;
end
eta = 2 * K(i,j) - K(i,i) - K(j,j);
if (eta >= 0),
% continue to next i.
continue;
end
if (abs(alphas(j) - alpha_j_old) < tol),
% continue to next i.
% replace anyway
alphas(j) = alpha_j_old;
continue;
end
其實這三段代碼含義有類似之處,我們知道所選的兩個參數第一個參數是判斷不滿足KKT條件,這裏要求的a2目的是爲了|E2-E1|最大,如果a2沒有明顯的優化的話
或者a2就是常量的話,則並不需要求最優解,迭代後值不變,只需要帶到目標函數中計算最後的值。
這裏第一段L=H,說明a2是定值,即並不需要優化就是最優值。第二段 是alpha(j)的最優修改量, 大於等於0的情況說明,說明 極小值在邊界上取,對應的a2也是定值,不需要優化。第三段發現優化後的a2與原值基本沒有變化,相當於沒有優化。因此都直接跳入到下一個循環中。最後的b要滿足帶入所有的樣本中都滿足KKT條件。
但是代碼中爲什麼不繼續計算更新後的b,而是直接跳到下一個循環中(繼續b的式子在這3個判斷之後),畢竟每次更新計算都要用到b,希望大神指點一下