JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

支持向量機與核技巧

一個分類器如何在兩類之間畫出唯一一條最有底氣的分界線,以及一個巧妙的技巧如何讓這條直線在看似無法分開的糾纏資料中彎曲穿行。

在所有能用的分界線裡,哪一條最好?

幾篇指南之前你認識了邏輯迴歸:它會找到*一條*能把兩類分開的線。但如果兩類本來就能乾淨地分開,能完成任務的線有無窮多條——有的緊貼著一團資料,有的緊貼著另一團。邏輯迴歸並不太在意選哪條,它只要求資料落在正確的一側。而支持向量機(SVM)問了一個更尖銳的問題:在所有能分開兩類的線裡,究竟哪一條最*穩妥*?

想像在兩類之間刷出一條寬闊的街道。SVM 給出的答案,就是那條恰好位於*盡可能最寬*街道正中央的線——在你碰到任何一個資料點之前,兩側留白最多的那條。這片留白叫作間隔(margin),而 SVM 的設計目標正是把它最大化。這個直覺既誠實又有力:一條留有大量餘地的邊界,在面對略帶雜訊的新樣本時,比一條緊貼最近樣本擦身而過的邊界更不容易分錯。

這就是最大間隔(maximum-margin)原則,它呼應了前面階梯裡的概念。一個寬厚的間隔本身就是一種歸納偏置——一種對簡單、自信的邊界的內在偏好——它往往有助於對未見資料的泛化。在長達十多年裡,SVM 一直是難以擊敗的演算法,正是因為這種偏好拿捏得恰到好處。

支持向量:決定一切的少數幾個點

這是關於 SVM 最出人意料、也最優雅的事實。一旦你找到了最寬的街道,這條邊界的精確位置,只由少數幾個*恰好落在間隔邊緣*的點釘死——也就是分別貼在兩側路緣上的那些點。它們就是支持向量(support vectors)。其餘所有的點,無論離得多遠,即便刪掉,邊界也分毫不動。

這正是支持向量機名字的由來,也是它優雅的很大一部分。這個模型是*稀疏*的:它忽略你的絕大部分資料,只記住那些困難的、處於臨界的樣本。把它和k 近鄰對比一下——後者必須永遠保留每一個訓練點。SVM 則把決策提煉成了關鍵的少數幾個點。

不過真實資料很少能被完美分開。在嚴格版本裡,只要有一個標註錯誤的點,或一個深入敵方陣地的離群點,就會讓*任何*有效街道都不存在。因此現代 SVM 採用軟間隔(soft margin):它允許一些點違反間隔——甚至落到錯誤的一側——但對每次違反收取一筆罰款。一個叫 *C* 的超參數決定罰款有多重。C 大意味著「幾乎不容忍任何錯誤」(一條狹窄、挑剔的間隔);C 小意味著「更寬的間隔值得犯幾個錯」。調節 C 是核心的取捨,而它其實只是換了身行頭的偏差—方差權衡

核技巧:讓直線彎曲

到目前為止,SVM 畫的是一條*直*邊界。但如果資料糾纏得無可救藥呢——比如一類圍成一個環,套住另一類?沒有任何直線能把靶心和外圈的甜甜圈分開。正是在這裡,SVM 完成了它著名的飛躍。

思路是:把資料抬升到一個更高維的空間,在那裡它*真的*能被直線分開。對於這個靶心,我們增加第三個維度,等於每個點到中心的距離。這樣內圈像小山一樣隆起,外圈則保持低平——一個平面就能在兩者之間乾淨地切過。把這個平面投影回原來的二維圖像,它看起來就是一個圓。我們用高維空間裡的一刀直切分開了資料;只是回到原處它*看起來*是彎的。

問題在於,顯式地計算這些高維座標代價高昂——而且有時有用的空間有*無窮多*個維度。核技巧(kernel trick)正是拯救我們的洞見。事實證明,SVM 的整個訓練過程,只需要知道成對樣本之間的點積,而根本不需要它們的原始座標。核函數(kernel)就是這樣一個函數:它直接從原始的低維輸入,算出在高維空間裡那個點積*本應是*多少——全程不必踏入高維空間一步。

這就是核技巧的全部魔法:你以在原始小空間裡運算的計算代價,換來了一個巨大(乃至無窮)特徵空間的威力。換一個不同的核函數,你就改變了 SVM 能畫出的邊界*形狀*——而不必重寫演算法的任何一行。

# A kernel just replaces the dot product x . z
# with k(x, z) = (feature-space dot product), computed cheaply.

linear(x, z)  = x . z                 # plain straight boundary
poly(x, z)    = (x . z + 1) ** d       # curved, degree-d boundary
rbf(x, z)     = exp(-gamma * ||x - z||^2)  # local, infinitely-flexible

# RBF: similarity fades with distance. 'gamma' sets how fast.
# small gamma -> smooth, broad influence (simpler boundary)
# large gamma -> tight, wiggly influence (risk of overfitting)
三種常見的核函數。RBF(高斯)核是常用的預設選擇;gamma 控制每個點的影響有多局部。

選擇並調節核 SVM

最常用的核是 RBF(徑向基函數,即高斯)核。它衡量一種隨距離平滑衰減的相似度,幾乎能刻畫出任何平滑的邊界,因此在你對資料結構沒有特別預設時,它是個有力的首選。多項式核適合特徵*交互*重要的問題;而最樸素的線性核,則在你特徵很多、資料不多時表現最好——這在文本中很常見,那裡一條直線邊界往往已經能把東西分得很好。

  1. 先把特徵標準化——在未縮放的資料上跑 SVM 幾乎總是有問題的。
  2. 以 RBF 核作為合理的預設起點;如果特徵很多,也試試線性核。
  3. 對兩個關鍵旋鈕——C(間隔的軟硬)和 gamma(核的局部性)——一起搜尋,因為它們相互影響。
  4. 用交叉驗證(而非訓練集得分)來選定這對參數——高 gamma 加高 C 可能把訓練集背下來。

SVM 何時出彩,何時失色

SVM 在中小規模、結構清晰乾淨的資料集上最能體現價值:幾千個樣本、精心設計的特徵、兩個類別(或少數幾個,透過訓練多個 SVM 來處理)。多年來,配上線性核的 SVM 一直是佔主導地位的文本分類器;當正確標籤稀缺且昂貴時,它格外出彩——而這恰恰是資料飢渴的深度學習往往力不從心的地方。作為一種監督學習方法,一個調好的 SVM 常常是個難以擊敗的基線

但要誠實面對它的局限。訓練核 SVM 的擴展性很差——大致隨樣本數在平方到立方之間增長——所以在數百萬行資料上它會慢得讓人痛苦,這時梯度提升或線性模型通常會勝出。SVM 輸出的是「在線的哪一側」這種硬判決,而非經過校準的機率,除非額外做處理。而在影像、音訊這類原始、非結構化的輸入上,任何手工挑選的核都比不過深度網路學到的特徵——這在很大程度上解釋了為什麼 SVM 在 2012 年之後淡出了頭條。

這一切都沒有讓 SVM 過時——它只是讓 SVM 成了一名專才。沒有免費午餐定理提醒我們:對每個問題都沒有唯一最優的演算法;最大間隔的思想和核技巧,至今仍是機器學習中最優雅的工具之一,而在那種規模適中、表格化、標註良好的問題上,它們往往就是正確的選擇——這類問題,你遇到的機會遠多於十億張圖片的資料集。懂得*何時*該祭出它,正是這一階梯要教給你的判斷力。