統計學習方法筆記-感知機

統計學習方法筆記-感知機

感知機是一個二分類的監督模型,我們定義輸入空間xRnx \in R^n,每一個x都是用向量表示。輸出空間y={+1,1}y=\{+1,-1\}. 我們希望通過訓練數據集合,學的權重參數w和偏置參數b,有:
f(x)=sign(wx+b)f(x) = sign(wx+b)
sign函數是符號函數,表示如下:
(1)sign(x)={+1,x01,x<0sign(x)=\begin{cases} +1, x \geq 0 \\ -1, x < 0 \end{cases} \tag{1}

感知機(perceptron)模型的目的就是找打一個超平面wx+b=0wx+b=0,將所有的訓練數據分開,感知機模型要求輸入數據線性可分

學習模型

定義線性可分的數據,T={(x1,yx),(x2,y2)...,(xN,yN)}T=\{(x_1,y_x),(x_2,y_2)...,(x_N,y_N) \},其中xix_i是n維的實數向量,y{+1,1}y\in \{+1, -1\},如果找到一個平面wx+b=0wx+b=0將所有的數據正確分開,就返回這個平面。
對於任何一個機器學習的模型,我們一定要找到一個損失函數,之後優化這個損失函數,最後得到這個算法模型的參數。我們選擇損失函數的原則有,一可以表示這個模型的性能,二是能夠方便優化。例如對於感知機我們要求最後沒有誤分類的點,我們可以選擇最小化誤分類的點,但是這個函數不是凸函數。於是我們選擇最小化所有誤分類的點到超平面的距離.(損失函數的選擇是一個技術活)。點x0x_0到超平面S的距離表示:
(2)1wwx0+b\frac{1}{||w||}|wx_0+b| \tag{2}

對於所有誤分類的點(xi,yi)(x_i,y_i),我們知道有wxi+b<0wx_i+b<0,由於yi{+1,1}y_i \in \{+1, -1\}, 所以對於誤分類的點必有: yi(wxi+b)>0-y_i(wx_i+b)>0。因此我們優化最小化所有誤分類的點集合M,
(3)minw,bL(w,b)=1wxiMyi(wxi+b)=xiMyi(wxi+b)min_{w,b}L(w,b)=-\frac{1}{||w||}\sum_{x_i \in M}y_i(wx_i+b)=-\sum_{x_i \in M}y_i(wx_i+b) \tag{3}

使用梯度下降方法,我們知道有:
(4)ΔwL(w,b)=xiMyixi\Delta_wL(w,b)=-\sum_{x_i \in M}y_ix_i \tag{4}
(5)ΔbL(w,b)=xiMyi\Delta_bL(w,b)=-\sum_{x_i \in M}y_i \tag{5}

(6)wt+1=wtηΔwL(w,b)w_{t+1}=w_t-\eta\Delta_wL(w,b) \tag{6}
(7)bt+1=btηΔbL(w,b)b_{t+1}=b_t-\eta\Delta_bL(w,b) \tag{7}

其中η(0<η1)\eta(0<\eta \leq1)是步長,又叫做學習率,表示參數更新的速度,建議不要太大,防止參數出現震盪,一般情況下學習率隨着迭代次數逐漸減小。注意,我們計算損失函數的時候,沒有加正則項,但是在實際的代碼實現過程中,一定要加上正則項,一般使用L1和L2正則。

算法

輸入:訓練數據集T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\},其中xix_i是n維實數向量,yi{+1,1}y_i\in\{+1, -1\},學習率η(0<η1)\eta(0<\eta \leq 1).
輸出: w,b, 感知機模型是f(x)=sign(wx+b)f(x)=sign(wx+b).

  1. 選擇初始值w0,b0w_0,b_0
  2. 遍歷數據集,(xi,yi)(x_i,y_i)
  3. 如果yi(wxi+b)>0-y_i(wx_i+b)>0,使用單個元素的梯度進行更新
    w=w+ηyixiw=w+\eta y_ix_i
    b=b+ηyib=b+\eta y_i
  4. 如果存在,就直接轉到2,知道所有的點都被正確分類。

算法的直觀解釋

算法的直觀解釋,就是如果發現一個實例點被誤分類,就將分離超平面向錯誤的一側進行移動,這樣就可以減少誤分類的點到超平面的距離(所有數據必須線性可分),直到所有點線性可分。從上面的計算中,我們可以看到我們每一輪(假設要T輪),都有進行N次向量計算,我們知道向量計算是很浪費時間的,我們的時間計算複雜度有TN次向量計算,一般情況下,數據量都會很大,例如T=100,000,N=10,000,000T=100,000,N=10,000,000,這個時候的我們訓練模型是很慢的,以至於我們需要等待很長的時間。因此下面有一種對偶的解法,與此相對的,上面這種方法叫做原始解法,在支持向量機,我們會再次看到這種方法。

對偶形式

公式(4)-(7),我們可以看到,最後的參數w和b,w是yixiy_ix_i的線性組合,b是yiy_i的線性組合,對於每一次修改我們可以設置步長αi\alpha_i, 則有:
(8)w=i=1Nαiyixiw=\sum_{i=1}^{N}\alpha_i y_i x_i \tag{8}
(9)b=i=1Nαiyib=\sum_{i=1}^{N}\alpha_i y_i \tag{9}
這裏,αi0,i=1,2,...,N\alpha_i \geq 0,i=1,2,...,N, 表示第i實例點更新的個數,實例點更新的次數越多,表示它離超平面越近,越難正確分類。下面給出算法對偶形式,我們只需要用將w和b直接替換原始算法中的對應的更新公式即可。
輸入:訓練數據集T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\},其中xix_i是n維實數向量,yi{+1,1}y_i\in\{+1, -1\},學習率η(0<η1)\eta(0<\eta \leq 1).α=(α1,α2,...,αN)\alpha=(\alpha_1,\alpha_2,...,\alpha_N).
輸出: α\alpha,b, 感知機模型是f(x)=sign(j=1Nαjyjxjx+b)f(x)=sign(\sum_{j=1}^{N}\alpha_j y_j x_j x+b).

  1. 選擇初始值w0,b0w_0,b_0

  2. 遍歷數據集,(xi,yi)(x_i,y_i)

  3. 如果yi(j=1Nαjyjxjxi+b)>0-y_i(\sum_{j=1}^{N}\alpha_j y_j x_j x_i+b)>0,使用單個元素的梯度進行更新, (這裏的更新公式,你可以使用(8)替換w化簡得到)
    αi=αi+η\alpha_i=\alpha_i + \eta
    b=b+ηyib=b+\eta y_i

  4. 如果存在,就直接轉到2,知道所有的點都被正確分類。

剛纔我們說過對對偶形式,比原始形式計算更快,這裏我們可以看到,最浪費時間的向量相乘(xj,xi)(x_j ,x_i),我們可以直接一次計算好,存儲起來,之後直接取出來即可,計算量大大降低。

總結

至此,感知機原理部分簡單結束,下面就是開始我們的代碼編寫,還是老規矩,C++和Python。

知乎: https://zhuanlan.zhihu.com/p/52467927

生活如此,問題不大。喵~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章