1. 感知機原理(Perceptron)
2. 感知機(Perceptron)基本形式和對偶形式實現
3. 支持向量機(SVM)拉格朗日對偶性(KKT)
4. 支持向量機(SVM)原理
5. 支持向量機(SVM)軟間隔
6. 支持向量機(SVM)核函數
1. 前言
感知機是1957年,由Rosenblatt提出會,是神經網絡和支持向量機的基礎。
2. 感知機的原理
感知機是二分類的線性模型,其輸入是實例的特征向量,輸出的是事例的類別,分別是+1和-1,屬於判別模型。
假設訓練數據集是線性可分的,感知機學習的目標是求得一個能夠將訓練數據集正實例點和負實例點完全正確分開的分離超平面。如果是非線性可分的數據,則最后無法獲得超平面
2.1 點到線的距離
公式中的直線方程為\(Ax+By+C=0\),點\(P\)的坐標為\((x_0,y_0)\)。
2.2 樣本到超平面距離
我們假設超平面是\(h=w \cdot {x}+b\),其中\(w=(w_0,w_1,...w_m)\),\(x=(x_0,x_1,...x_m)\),樣本點\(x^{'}\)到超平面的距離如下:
2.2 超平面(Hyperplanes)
超平面是在空間\(R^d\)中的一個子空間\(R^{d-1}\)。
在2維空間中的超平面是一條線,在3維空間中的超平面是一個平面。
3. 感知機模型
感知機從輸入空間到輸出空間的模型如下:
3.1 感知機的損失函數
我們首先定義對於樣本\((x_i,y_i)\),如果\(\frac{w\cdot {x_i}+b}{||w||}>0\)則記\(y_i=+1\),如果\(\frac{w\cdot {x_i}+b}{||w||}<0\)則記\(y_i=-1\)。
這樣取y的值有一個好處,就是方便定義損失函數。因為正確分類的樣本滿足\(\frac{y_i(w\cdot {x_i}+b)}{||w||}>0\),而錯誤分類的樣本滿足\(\frac{y_i(w\cdot {x_i}+b)}{||w||}<0\)。我們損失函數的優化目標,就是期望使誤分類的所有樣本,到超平面的距離之和最小。
所以損失函數定義如下:
其中M集合是誤分類點的集合。
不考慮\(\frac{1}{||w||}\),就得到感知機模型的損失函數:
3.2 為什么可以不考慮\(\frac{1}{||w||}\)
網上有人說\(\frac{1}{||w||}\)是個定值,但是個人覺得平面不唯一,這個值肯定也會變。通過參考他人觀點結合思考,覺得原因可以列為以下兩點。
- \(\frac{1}{||w||}\)不影響\(y_i(w\cdot {x_i}+b)\)正負的判斷,即不影響學習算法的中間過程。因為感知機學習算法是誤分類驅動的,這里需要注意的是所謂的“誤分類驅動”指的是我們只需要判斷\(-y_i(w\cdot{x_i}+b)\)的正負來判斷分類的正確與否,而\(\frac{1}{||w||}\)並不影響正負值的判斷。所以\(\frac{1}{||w||}\)對感知機學習算法的中間過程可以不考慮。
- \(\frac{1}{||w||}\)不影響感知機學習算法的最終結果。因為感知機學習算法最終的終止條件是所有的輸入都被正確分類,即不存在誤分類的點。則此時損失函數為0. 對應於\(-\frac{1}{||w||}\sum_{i\in{M}}y_i(w\cdot {x_i}+b)\),即分子為0.則可以看出\(\frac{1}{||w||}\)對最終結果也無影響。
綜上所述,即使忽略\(\frac{1}{||w||}\),也不會對感知機學習算法的執行過程產生任何影響。反而還能簡化運算,提高算法執行效率。
4. 感知機學習算法
感知機學習算法是對上述損失函數進行極小化,求得\(w\)和\(b\)。但是用普通的基於所有樣本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在於我們的損失函數里面有限定,只有誤分類的M集合里面的樣本才能參與損失函數的優化。所以我們不能用最普通的批量梯度下降,只能采用隨機梯度下降(SGD)。目標函數如下:
4.1 原始形式算法
輸入:訓練數據集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\),\(y_i\in{\{-1,+1\}}\),學習率\(\eta(0<\eta<1)\)
輸出:\(w,b\);感知機模型\(f(x)=sign(w\cdot {x}+b)\)
- 賦初值 \(w_0,b_0\)
- 選取數據點\((x_i,y_i)\)
- 判斷該數據點是否為當前模型的誤分類點,即判斷若\(y_i(w\cdot {x_i}+b)<=0\)則更新
- 轉到2,直到訓練集中沒有誤分類點
4.2 對偶形式算法
由於\(w,b\)的梯度更新公式:
我們的\(w,b\)經過了\(n\)次修改后的,參數可以變化為下公式,其中\(\alpha = ny\):
這樣我們就得出了感知機的對偶算法。
輸入:訓練數據集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\),\(y_i\in{\{-1,+1\}}\),學習率\(\eta(0<\eta<1)\)
輸出:\(\alpha,b\);感知機模型\(f(x)=sign(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x}+b)\)
其中\(\alpha=(\alpha_1,\alpha_2,...,\alpha_n)^T\)
- 賦初值 \(\alpha_0,b_0\)
- 選取數據點\((x_i,y_i)\)
- 判斷該數據點是否為當前模型的誤分類點,即判斷若\(y_i(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x_i}+b)<=0\)則更新
- 轉到2,直到訓練集中沒有誤分類點
為了減少計算量,我們可以預先計算式中的內積,得到Gram矩陣
4.3 原始形式和對偶形式的選擇
- 在向量維數(特征數)過高時,計算內積非常耗時,應選擇對偶形式算法加速。
- 在向量個數(樣本數)過多時,每次計算累計和就沒有必要,應選擇原始算法
5. 訓練過程
我們大概從下圖看下感知機的訓練過程。
線性可分的過程:
線性不可分的過程:
6. 小結
感知機算法是一個簡單易懂的算法,自己編程實現也不太難。前面提到它是很多算法的鼻祖,比如支持向量機算法,神經網絡與深度學習。因此雖然它現在已經不是一個在實踐中廣泛運用的算法,還是值得好好的去研究一下。感知機算法對偶形式為什么在實際運用中比原始形式快,也值得好好去體會。