公開課地址:https://class.coursera.org/ml-003/class/index
授課老師:Andrew Ng
1、optimization objective(最佳化目標)
前面我們提到過羅吉斯迴歸的模型,如下所示:
可以看到,當真實值y為1時,我們希望預測值h(x)儘可能接近1,也就是確保z>>0,當y為0時,我們希望h(x)接近0,也就是確保z<<0。其中針對一個樣本的代價函數如下:
我們可以對y取1,y取0時分別繪出z的取值和代價函數的關係,如:
左側是y=1時,可以看到代價函數值隨著z取值增大而減小,這和我們希望的z>>0時,h(x)儘可能接近1相符,右側是y=0的情況,代價函數值隨著z取值增大而減小。至於我們這裡要提到的支援向量機的代價函數,則是圖中藍色標出的部分,可以看到它和羅吉斯迴歸中的代價函數曲線相似,最大的不同是分成cost1和cost0兩個部分。
前面我們已經知道了羅吉斯迴歸的代價函數形式:
下面給出SVM代價函數形式:
可以看到,這兩者的代價函數形式也是相似的。cost0和cost1分別對應y=0和y=1時的目標函數定義,後面接一個規格化項,係數是因為線性變換消去了。
2、large margin intuition(大間隔)
前面我們已經給出了SVM的代價函數,下面針對y=1和y=0的情況加以說明:
從可以看到,我們在這裡讓C取100000,目的就是讓第一項括弧內的值儘可能小,最好為0.於是我們發現在y=1時,為了讓cost1為0,我們應該讓theta’x≥1,在y=0時,我們需要讓cost0為0,也就是讓theta’x≤-1。前面已經提到過決策邊緣的概念,我們可以得到SVM的決策邊緣:
決策邊緣有了,那麼margin(翻譯為間隔,以下均用英文)這個概念呢?如所示,粉線,綠線和黑線都能夠把兩類樣本分開,這三條線都是決策邊緣,margin就是決策邊緣到距其最近樣本點的距離,這種距離是繪製兩條平行線,中的藍線所示,margin就是黑線到藍線之間的距離。
從中我們也可以發現,決策邊緣應該距離樣本點越遠越好,圖中的粉線和綠線由於距離樣本點太近,當再增加一些樣本點後很可能就不能正確分類了。只有黑線距離兩類樣本點距離較遠,這種遠近就通過margin來衡量,我們要確保margin越大越好,所以SVM也被認為是一個large margin分類器。
在前面我們讓C取值100000,但是根據之前的經驗C的取值肯定不是越大越好,如:
當C取值很大時,得到的決策邊緣就是圖中的粉線,當C取值不那麼大時,就是圖中的黑線。所以說C的取值還是適度好,我們需要在C的取值和margin之間尋找一個平衡點。下面會講到為何C取值很大,margin反而會減小。
3、the mathematics behind large margin classification(大間隔分類背後的數學知識)
首先我們需要補充一點向量方面的知識,學過微積分的應該可以忽略了:
如所示,u和v都是向量,公式中給出了u和v的長度表示,乘積計算公式。
上面我們已經把C值設的很大,所以前面一項幾乎為0,剩下的只有後面那項:
從可以發現theta’x也就是p·||theta||,於是我們得到:
y=1時,讓p·||theta||≥1, y=0時,讓p·||theta||≤-1。如所示:
首先需要知道,決策邊緣方向和theta是垂直的,原因如下:
從上可以看到,左邊選取的是一個較差的決策邊緣,為了滿足p·||theta||取值的要求,需要讓||theta||值很大,但是這和代價函數是相悖的。右側選取的就是一個較好的決策邊緣,這個時候兩邊的margin都比較大,||theta||取值相對較小,按照代價函數來計算,SVM肯定能保證得到一個較大的margin.
4、kernels one(核[1])
對於一個非線性決策邊緣,我們可以採用多項式的函數來類比:
這裡我們讓f來代替x的高階形式,不難想到如果地區越複雜階數會越高f自然增多,是否還有其他更好的辦法呢?為此可以引入核的概念,我們把核定義為輸入的原始向量與標記點之間的相似性:
上面給出的相似性採用的是高斯分布的形式,這個核函數也被稱為高斯核函數,原始向量x與標記點l越接近,f值越接近於1,否則f值為0:
從也可以看到,當x取值為l時,位於最高點,f為1,隨著x遠離l,f趨近於0:
引入核函數後再考慮一個分類問題,比如下面我們要將紅色地區內的點預測為1,否則為0,我們首先訓練得到theta值和標記點l1,l2,l3,我們只需要計算f1,f2,f3,然後代入式子判斷其是否不小於0即可:
5、kernels two(核[2])
上面例子中我們並沒有說明theta和標記點l是如何計算出來的。這裡我們首先來說明標記點l的選取:
這裡我們先不考慮樣本是正樣本還是負樣本,選擇m個訓練資料,將其作為標記點l,
然後我們就能夠計算m個f值,注意每次肯定有一個點自己就是標記點,於是計算結果m維向量f中必有一個值為1。同時在增加一個f0=1後,每個點都對應於一個m+1維的特徵向量f。我們把得到的m+1維向量f代替原始向量x代入代價函數,求解代價函數最小值,這樣就能求出theta:
不過在求解theta之前,我們還需要確定C和核函數中σ的取值,前面已經提到了方差和偏差,這裡C和σ的取值其實影響的就是這兩個因素:
6、using an SVM(支援向量機的應用)
在使用SVM前需要明確是否要採用核函數的形式。如果不採用核函數,那該類SVM就稱為線性SVM,否則就是非線性SVM。明確了這一點,下面就是選擇C和核函數(線性不需要選擇)的問題。
一般用的最多的核函數就是高斯核函數,注意在使用核函數之前需要對輸入向量進行歸一化操作。當然我們也可以選擇其他的核函數,不過要注意並不是隨便一個拿過來都能讓SVM正確分類:
針對多分類問題,我們可以訓練多個SVM,採用之前提到過的one-vs-all方法:
最後來比較一下羅吉斯迴歸和SVM的區別:
翻譯如下:
用n表示特徵個數,m表示訓練樣本個數。
l 當n>=m,如n=10000,m=10~1000時,建議用logistic regression, 或者linear kernel的SVM,模型簡單即可解決
l 如果n小,m不大不小,如n=1~1000,m=10~10000,建議用Gaussian Kernel的SVM
l 如果n很小,m很大,如n=1~1000,m>50000,建議增加更多的feature並使用logistic regression, 或者linear kernel的SVM,如果還用Gaussian kernel會導致很慢,所以還選擇logistic regression或者linear kernel
神經網路可以解決以上任何問題,但是速度是一個很大的問題。
------------------------------------弱弱的分割線----------------------------------------
這一講只是對SVM進行了簡單的介紹,Andrew教授的引入SVM的方式比較獨特,先給出代價函數而不是margin的直觀表示。不過SVM的內容顯然不止這麼點,這裡連支援向量,SVM代價函數的對偶式都沒提到過,其實SVM的應用極其廣泛,而且效果很不錯,關於SVM更多的內容可以看這篇博文:
http://blog.csdn.net/v_july_v/article/details/7624837