感知機原理小結

劉建平Pinard發表於2016-11-08

    感知機可以說是最古老的分類方法之一了,在1957年就已經提出。今天看來它的分類模型在大多數時候泛化能力不強,但是它的原理卻值得好好研究。因為研究透了感知機模型,學習支援向量機的話會降低不少難度。同時如果研究透了感知機模型,再學習神經網路,深度學習,也是一個很好的起點。這裡對感知機的原理做一個小結。

1. 感知機模型

    感知機的思想很簡單,比如我們在一個平臺上有很多的男孩女孩,感知機的模型就是嘗試找到一條直線,能夠把所有的男孩和女孩隔離開。放到三維空間或者更高維的空間,感知機的模型就是嘗試找到一個超平面,能夠把所有的二元類別隔離開。當然你會問,如果我們找不到這麼一條直線的話怎麼辦?找不到的話那就意味著類別線性不可分,也就意味著感知機模型不適合你的資料的分類。使用感知機一個最大的前提,就是資料是線性可分的。這嚴重限制了感知機的使用場景。它的分類競爭對手在面對不可分的情況時,比如支援向量機可以通過核技巧來讓資料在高維可分,神經網路可以通過啟用函式和增加隱藏層來讓資料可分。

    用數學的語言來說,如果我們有m個樣本,每個樣本對應於n維特徵和一個二元類別輸出,如下:

    \((x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)\)

    我們的目標是找到這樣一個超平面,即:

    \(\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} = 0\) 

    讓其中一種類別的樣本都滿足\(\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} > 0\) ,讓另一種類別的樣本都滿足\(\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} < 0\) ,從而得到線性可分。如果資料線性可分,這樣的超平面一般都不是唯一的,也就是說感知機模型可以有多個解。

    為了簡化這個超平面的寫法,我們增加一個特徵\(x_0 = 1 \) ,這樣超平面為\( \sum\limits_{i=0}^{n}\theta_{i}x_{i} = 0\)。進一步用向量來表示為: \(\theta \bullet x = 0\),其中\(\theta \)為(n+1)x1的向量,x為(n+1)x1的向量, \(\bullet \)為內積,後面我們都用向量來表示超平面。

       而感知機的模型可以定義為:\( y = sign(\theta \bullet x)\) 其中:

$$sign(x)=
\begin{cases}
-1& {x<0}\\
1& {x\geq 0}
\end{cases}$$

2. 感知機模型損失函式

    為了後面便於定義損失函式,我們將滿足\(\theta \bullet x > 0\)的樣本類別輸出值取為1,滿足\(\theta \bullet x < 0\)的樣本類別輸出值取為-1,  這樣取y的值有一個好處,就是方便定義損失函式。因為正確分類的樣本滿足 \(y\theta \bullet x > 0\),而錯誤分類的樣本滿足 \(y\theta \bullet x < 0\)。我們損失函式的優化目標,就是期望使誤分類的所有樣本,到超平面的距離之和最小。

    由於\(y\theta \bullet x < 0\),所以對於每一個誤分類的樣本\(i \) ,到超平面的距離是

    \(- y^{(i)}\theta \bullet x^{(i)}\big / ||\theta||_2\),

    其中\(||\theta||_2\)為L2範數。

    我們假設所有誤分類的點的集合為M,則所有誤分類的樣本到超平面的距離之和為:

    \(- \sum\limits_{x_i \in M}y^{(i)}\theta \bullet x^{(i)}\big / ||\theta||_2\),

    這樣我們就得到了初步的感知機模型的損失函式。

    我們研究可以發現,分子和分母都含有\(\theta\),當分子的\(\theta\)擴大N倍時,分母的L2範數也會擴大N倍。也就是說,分子和分母有固定的倍數關係。那麼我們可以固定分子或者分母為1,然後求另一個即分子自己或者分母的倒數的最小化作為損失函式,這樣可以簡化我們的損失函式。在感知機模型中,我們採用的是保留分子,即最終感知機模型的損失函式簡化為:

    \( J(\theta) = - \sum\limits_{x_i \in M}y^{(i)}\theta \bullet x^{(i)}\)

    題外話,如果大家瞭解過支援向量機,就發現支援向量機採用的是固定分子為1,然後求\(1/ ||\theta||_2\)的最大化。採用不同的損失函式主要與它的後面的優化演算法有關係。

    

3. 感知機模型損失函式的優化方法

    上一節我們講到了感知機的損失函式:\( J(\theta) = - \sum\limits_{x_i \in M}y^{(i)}\theta \bullet x^{(i)}\),其中M是所有誤分類的點的集合。這個損失函式可以用梯度下降法或者擬牛頓法來解決,常用的是梯度下降法。

    但是用普通的基於所有樣本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在於我們的損失函式裡面有限定,只有誤分類的M集合裡面的樣本才能參與損失函式的優化。所以我們不能用最普通的批量梯度下降,只能採用隨機梯度下降(SGD)或者小批量梯度下降(MBGD)。如果對這幾種梯度下降法的區別不瞭解,可以參考我的另一篇文章梯度下降(Gradient Descent)小結

    感知機模型選擇的是採用隨機梯度下降,這意味著我們每次僅僅需要使用一個誤分類的點來更新梯度。

    損失函式基於\(\theta\)向量的的偏導數為:

    \( \frac{\partial}{\partial \theta}J(\theta) = - \sum\limits_{x_i \in M}y^{(i)}x^{(i)}\)

    \(\theta\)的梯度下降迭代公式應該為:

    \(\theta = \theta  + \alpha\sum\limits_{x_i \in M}y^{(i)}x^{(i)} \)

    由於我們採用隨機梯度下降,所以每次僅僅採用一個誤分類的樣本來計算梯度,假設採用第i個樣本來更新梯度,則簡化後的\(\theta\)向量的梯度下降迭代公式為:

    \(\theta = \theta  + \alpha y^{(i)}x^{(i)} \)

    其中\(\alpha\)為步長,\(y^{(i)}\)為樣本輸出1或者-1,\(x^{(i)}\)為(n+1)x1的向量。 

3. 感知機模型的演算法

    前兩節我們談到了感知機模型,對應的損失函式和優化方法。這裡我們就對感知機模型基於隨機梯度下降來求\(\theta\)向量的演算法做一個總結。

    演算法的輸入為m個樣本,每個樣本對應於n維特徵和一個二元類別輸出1或者-1,如下:

    \((x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)\)

    輸出為分離超平面的模型係數\(\theta\)向量

    演算法的執行步驟如下:

    1) 定義所有\(x_0\)為1。選擇\(\theta\)向量的初值和 步長\(\alpha\)的初值。可以將\(\theta\)向量置為0向量,步長設定為1。要注意的是,由於感知機的解不唯一,使用的這兩個初值會影響\(\theta\)向量的最終迭代結果。

    2) 在訓練集裡面選擇一個誤分類的點\((x_1^{(i)}, x_2^{(i)}, ...x_n^{(i)}, y_i)\), 用向量表示即\((x^{(i)}, y^{(i)})\),這個點應該滿足:\(y^{(i)}\theta \bullet x^{(i)} \leq 0\)

    3) 對\(\theta\)向量進行一次隨機梯度下降的迭代:\(\theta = \theta  + \alpha y^{(i)}x^{(i)} \)

    4)檢查訓練集裡是否還有誤分類的點,如果沒有,演算法結束,此時的\(\theta\)向量即為最終結果。如果有,繼續第2步。

      

4. 感知機模型的演算法對偶形式

    上一節的感知機模型的演算法形式我們一般稱為感知機模型的演算法原始形式。對偶形式是對演算法執行速度的優化。具體是怎麼優化的呢?

    通過上一節感知機模型的演算法原始形式\(\theta = \theta  + \alpha y^{(i)}x^{(i)}\)可以看出,我們每次梯度的迭代都是選擇的一個樣本來更新\(\theta\)向量。最終經過若干次的迭代得到最終的結果。對於從來都沒有誤分類過的樣本,他被選擇參與\(\theta\)迭代的次數是0,對於被多次誤分類而更新的樣本j,它參與\(\theta\)迭代的次數我們設定為\(m_j\)。如果令\(\theta\)向量初始值為0向量, 這樣我們的\(\theta\)向量的表示式可以寫為:

    \(\theta = \alpha \sum\limits_{j=1}^{m}m_jy^{(j)}x^{(j)} \)

    其中\(m_j\)為樣本\((x^{(j)}, y^{(j)})\)在隨機梯度下降到當前的這一步之前因誤分類而更新的次數。

    每一個樣本\((x^{(j)}, y^{(j)})\)的\(m_j\)的初始值為0,每當此樣本在某一次梯度下降迭代中因誤分類而更新時,\(m_j\)的值加1。

    由於步長\(\alpha\)為常量,我們令\(\beta_j = \alpha m_j\),這樣\(\theta\)向量的表示式為:

    \(\theta = \sum\limits_{j=1}^{m}\beta_j y^{(j)}x^{(j)} \)

    在每一步判斷誤分類條件的地方,我們用 \(y^{(i)}\theta \bullet x^{(i)} < 0\) 的變種 \(y^{(i)}\sum\limits_{j=1}^{m}\beta_j y^{(j)}x^{(j)}\bullet x^{(i)} < 0\) 來判斷誤分類。注意到這個判斷誤分類的形式裡面是計算兩個樣本\(x^{(i)}和x^{(j)}\)的內積,而且這個內積計算的結果在下面的迭代次數中可以重用。如果我們事先用矩陣運算計算出所有的樣本之間的內積,那麼在演算法執行時, 僅僅一次的矩陣內積運算比多次的迴圈計算省時。 計算量最大的判斷誤分類這兒就省下了很多的時間,,這也是對偶形式的感知機模型比原始形式優的原因。

    樣本的內積矩陣稱為Gram矩陣,它是一個對稱矩陣,記為 \( G = [x^{(i)} \bullet x^{(j)} ]\)

    這裡給出感知機模型的演算法對偶形式的內容。

    演算法的輸入為m個樣本,每個樣本對應於n維特徵和一個二元類別輸出1或者-1,如下:

    \((x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)\)

    輸出為分離超平面的模型係數\(\theta\)向量

    演算法的執行步驟如下:

    1) 定義所有\(x_0\)為1,步長\(\alpha\)初值,設定\(\beta\)的初值0。可以將\(\alpha\)設定為1。要注意的是,由於感知機的解不唯一,使用的步長初值會影響\(\theta\)向量的最終迭代結果。

    2) 計算所有樣本內積形成的Gram矩陣G。

    2) 在訓練集裡面選擇一個誤分類的點\((x^{(i)}, y^{(i)})\),這個點應該滿足: \(y^{(i)}\sum\limits_{j=1}^{m}\beta_j y^{(j)}x^{(j)}\bullet x^{(i)} \leq 0\),  在檢查是否滿足時可以通過查詢Gram矩陣的\(g_{ij}\) 的值來快速計算是否小於0。

    3) 對\(\beta\)向量的第i個分量進行一次更新:\(\beta_i= \beta_i+ \alpha \)

    4)檢查訓練集裡是否還有誤分類的點,如果沒有,演算法結束,此時的\(\theta\)向量最終結果為下式。如果有,繼續第2步。

      \(\theta = \sum\limits_{j=1}^{m}\beta_j y^{(j)}x^{(j)} \) 

      其中\(\beta_j \) 為\(\beta\)向量的第j個分量。

 

5. 小結

    感知機演算法是一個簡單易懂的演算法,自己程式設計實現也不太難。前面提到它是很多演算法的鼻祖,比如支援向量機演算法,神經網路與深度學習。因此雖然它現在已經不是一個在實踐中廣泛運用的演算法,還是值得好好的去研究一下。感知機演算法對偶形式為什麼在實際運用中比原始形式快,也值得好好去體會。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)     

相關文章