感知機演算法
目錄
感知機演算法
簡介
感知機演算法是最簡單最基礎的機器學習演算法,可以用於處理最簡單的二分類任務,並且模型和學習演算法都十分簡單。感知機1957年由Rosenblatt提出,是神經網路與支援向量機的基礎。
感知機模型
感知機是二類分類的線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取+1和-1二值。感知機模型對應於特徵空間中的一個分離超平面。
模型的數學表示
感知機其實是一個由輸入空間\(\mathcal{X} \subset \mathbb{R}^n\)
\[ f(x) = \mathop{sign}(w·x+b) \\ sign(x) = \left\{\begin{array} {cc} +1, & x \ge 0 \\ -1, & x < 0 \end{array}\right. \]
其中\(w,b\)是感知機模型的引數,\(w \in \mathbb{R}^n\)叫做權值(weight)或權值向量(weight vector),\(b \in \mathbb{R}\)叫做偏置(bias)。
感知機模型的假設空間是定義在特徵空間中的所有線性分類模型(linear classification model)或線性分類器(linear classifier),即函式集合\(\{f\mid f(x) = w·x + b\}\)
幾何解釋
由感知機的定義可以知道,對於資料\(x\),如果\(w·x+b>0\)那\(x\)對應的標籤為+1,如果\(w·x+b<0\)那麼\(x\)對應的標籤為-1。故感知機實際上定義了一個超平面\(w·x+b=0\),這個超平面將特徵空間劃分為兩個部分。位於兩部分的點(特徵向量)分別被分為正、負兩類,如下圖所示:
感知機學習策略
首先感知機是一個線性分類器(二分類),我們先考慮訓練資料集線性可分的情形。
資料集線性可分的定義:
對於一個給定的資料集\(T = \{(x_1, y_1), (x_2,y_2), ···,(x_N,y_N)\},\) 如果存在某個超平面S:\(w·x+b=0\)
假設訓練資料集是線性可分的,感知機需要學習一個分離超平面將所有的資料正確分類。為了找出這樣的超平面我們需要定義一個損失函式並將損失函式極小化。
損失函式的定義
既然我們想要把所有的點都分類正確,那麼一個自然的想法是直接使用誤分類點的總數作為損失函式
\[ \begin{align} L_1(w,b) &= \sum_{i=1}^{N}-y_i*f(x_i)\ (when\ \ y_i*f(x_i)<0) \\ &=\sum_{i=1}^N-y_i*sign(w·x_i+b)\ (when\ \ y_i*sign(w·x_i+b)<0) \\ \end{align} \]
但是函式sign不可導,所以\(L_1(w,b)\)並不是\(w,b\)的連續可導函式,不易優化。
因為直接使用誤分類點的總數不太好優化,感知機演算法選擇了誤分類點到超平面S的總距離作為損失函式,首先對於特徵空間的任意點\(x_0\),其到超平面S(w,b)的距離為:
\[ \frac{1}{||w||}|w·x_0+b| \]
所以,新的損失函式的定義如下:
\[ \begin{align} L_2(w,b) &= \sum_{i=1}^N \frac{1}{||w||}|w·x_i+b| \ (when\ \ y_i*(w·x_i+b)<0) \\ &=-\frac{1}{||w||}\sum_{i=1}^N y_i*(w·x_i+b)\ (when\ \ y_i*(w·x_i+b)<0)\ 注:|y_i*(w·x_i+b)| = |w·x_i+b| \end{align} \]
不考慮係數\(\frac{1}{||w||}\)就是感知機學習的損失函式。
感知機損失函式的另一種理解:
因為最自然的使用誤分類點的總數作為損失函式會因為sign函式的存在而無法很好的優化,所以直接去掉sign函式,使用\(-y_i*(w·x_i+b)\) 作為誤分類點的損失,這樣感知機的損失函式就可以寫為:
\[ L_3(w,b) = -\sum_{i=1}^N y_i*(w·x_i+b)\ \ (when\ \ y_i*(w·x_i+b)<0) \]
這樣對於一個特定的樣本點,損失函式\(L_3(w,b)\)是\(w,b\)的連續可導函式。
感知機學習演算法
到此為止,我們已經把感知機學習問題轉化為求解損失函式\(L_3(w,b)\)的最優化問題。
\[ \mathop{min}_{w,b} L(w,b) = -\sum_{x_i \in M}y_i(w·x_i+b) \]
原始形式
感知機學習演算法是誤分類驅動的,可以採用隨機梯度下降法(stochastic gradient descent)。對於訓練中的某一時刻,誤分類點集合\(M\)是固定的,那麼損失函式\(L(w,b)\)的梯度為:
\[ \bigtriangledown_wL(w,b) = -\sum_{x_i\in M}y_ix_i \\ \bigtriangledown_bL(w,b) = -\sum_{x_i\in M}y_i \]
隨機選取一個誤分類點\((x_i, y_i)\),對\(w,b\)進行更新:
\[ w \leftarrow w + \eta\Delta w \\ \Delta w = - \frac{\partial L(w,b)}{\partial w} \\ w \leftarrow w + \eta y_ix_i \\ b \leftarrow b + \eta y_i \]
演算法
輸入:訓練資料集\(T = \{(x_1, y_1), (x_2,y_2), ···,(x_N,y_N)\},\)學習率\(\eta(0 < \eta \le 1)\)
輸出:w,b;感知機模型\(f(x) = sign(w·x+b)\)
(1)選取初值\(w_0, b_0\)
(2)在訓練集中選取資料\((x_i, y_i)\)
(3)如果\(y_i(wx_i+b) \le 0\)
\[ w \leftarrow w + \eta y_ix_i \\ b \leftarrow b + \eta y_i \]
(4)轉至(2),直至訓練集中沒有誤分類點
對學習率\(\eta\)的一點說明:
在感知機演算法中,最終的標籤只與\(w\cdot x+b\)的符號相關,所以將\(w,b\)變為\(\alpha w, \alpha b\)對於最終的標籤預測沒有影響。那麼學習率\(\eta\) 對於最後感知機的效果沒有影響,感知機只與初始值和SGD的順序有關(在一個epoch中資料的先後順序)。
感知機原始演算法實現
中文分詞器github
垃圾郵件分類器github
演算法收斂性證明
以後有機會書寫
對偶形式
對偶形式的基本想法是,將w和b表示為例項\(x_i\)和標記\(y_i\)的線性組合的形式,通過求解其係數而求得\(w,b\)。
\[ w = \sum_{i=1}^N\alpha_iy_ix_i \\ b = \sum_{i=1}^N\alpha_iy_i \]
對於對偶形式的感知機學習演算法,只需要判定\(y_i(\sum_{j=1}^N\alpha_jy_jx_jx_i + b) \le 0\)是否為真就行了,其中\(x_jx_i\)的值可以通過計算Gram矩陣很容易得到。
感知機預測
感知機模型主要是\(w,b\)的取值,對於新的資料點\(x\),只需要計算\(f(x)\)就可以得到x的標籤了。
感知機變體
在普通的感知機的基礎上,經過一些簡單的變換還能夠得到一些使用也特別廣泛的感知機的變體。
多分類感知機
多分類感知機主要的想法是:為每一個類別\(i\)維護一個感知機\(w_i, b_i\),然後對於每個例項\(x_i\),分別計算得到n個類別的得分,取得分最高的類別為預測類別。
更新引數的時候如果類別預測錯誤,則把正確類別的所有引數+1,預測的錯誤類別的所有引數-1;如果預測正確則不進行引數更新。
結構化感知機(Structured Perceptron)(又名平均感知機)
結構化感知機是感知機用於序列標註任務的一個變體,具體的內容見下一次部落格。