感知機原理小結

感知機能夠說是最古老的分類方法之一了,在1957年就已經提出。今天看來它的分類模型在大多數時候泛化能力不強,可是它的原理卻值得好好研究。由於研究透了感知機模型,學習支持向量機的話會下降很多難度。同時若是研究透了感知機模型,再學習神經網絡,深度學習,也是一個很好的起點。這裏對感知機的原理作一個小結。html

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\) ,從而獲得線性可分。若是數據線性可分,這樣的超平面通常都不是惟一的,也就是說感知機模型能夠有多個解。post

    爲了簡化這個超平面的寫法,咱們增長一個特徵$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&amp; {x<;0}\\ 1&amp; {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 $ ,到超平面的距離是spa

    \(- 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的向量。 

4、感知機模型的算法

    前兩節咱們談到了感知機模型,對應的損失函數和優化方法。這裏咱們就對感知機模型基於隨機梯度降低來求\(\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步。

      

5、感知機模型的算法對偶形式

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

    經過上一節感知機模型的算法原始形式\(\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個份量。

 

6、小結

    感知機算法是一個簡單易懂的算法,本身編程實現也不太難。前面提到它是不少算法的鼻祖,好比支持向量機算法,神經網絡與深度學習。所以雖然它如今已經不是一個在實踐中普遍運用的算法,仍是值得好好的去研究一下。感知機算法對偶形式爲何在實際運用中比原始形式快,也值得好好去體會。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索