1. 程式人生 > >感知機算法

感知機算法

實現 ctu 想要 ron 無法 參數更新 enter ray 求解

目錄

  • 簡介
  • 感知機模型
  • 感知機學習策略
  • 感知機學習算法
  • 感知機預測
  • 感知機變體

感知機算法

簡介

感知機算法是最簡單最基礎的機器學習算法,可以用於處理最簡單的二分類任務,並且模型和學習算法都十分簡單。感知機1957年由Rosenblatt提出,是神經網絡與支持向量機的基礎。

感知機模型

感知機是二類分類的線性分類模型,其輸入為實例的特征向量,輸出為實例的類別,取+1和-1二值。感知機模型對應於特征空間中的一個分離超平面。

模型的數學表示

感知機其實是一個由輸入空間\(\mathcal{X} \subset \mathbb{R}^n\)到輸出空間\(\mathcal{Y}=\{+1, -1\}\)

的函數:
\[ 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\)

能夠將數據集的正實例點和負實例點完全正確地劃分到超平面的兩側,即對於所有\(y_i=+1\)的實例\(i\) ,有\(w·x_i+b > 0\),對於所有\(y_i=-1\)的實例\(i\),有\(w·x_i+b<0\),則稱數據集\(T\)為線性可分數據集(linearly separable data set);否則,稱數據集\(T\)線性不可分。

假設訓練數據集是線性可分的,感知機需要學習一個分離超平面將所有的數據正確分類。為了找出這樣的超平面我們需要定義一個損失函數並將損失函數極小化。

損失函數的定義

既然我們想要把所有的點都分類正確,那麽一個自然的想法是直接使用誤分類點的總數作為損失函數
\[ \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)(又名平均感知機)

結構化感知機是感知機用於序列標註任務的一個變體,具體的內容見下一次博客。

感知機算法