第一講中我們學習了一個機器學習系統的完整框架,包含以下3部分:訓練集、假設集、學習算法
一個機器學習系統的工作原理是:學習算法根據訓練集,從假設集合H中選擇一個最好的假設g,使得g與目標函數f盡可能低接近。H稱為假設空間,是由一個學習模型的參數決定的假設構成的一個空間。而我們這周就要學習一個特定的H——感知器模型。
感知器模型在神經網絡發展歷史中占有特殊地位,並且是第一個具有完整算法描述的神經網絡學習算法(稱為感知器學習算法:PLA)。這個算法是由一位心理學家Rosenblatt在1958年提出來的,因此它也叫做Rosenblatt感知器。感知器是用於線性可分模式分類的最簡單的神經網絡模型,它由一個具有可調突觸權值和偏置的神經元組成。用於調節神經網絡中參數的算法最早出現在Rosenblatt(1958,1962)提出的用於其腦感知模型的一個學習過程中(即PLA)。Rosenblatt證明了當輸入數據的模式是線性可分的時候,感知器學習算法能夠在有限步迭代后收斂,並且決策面是位於兩類之間的超平面。算法的收斂性證明被稱為感知器收斂定理。那么首先介紹一下什么是感知器。
下圖是一個感知器的示意圖:
(圖摘自Neural Networks and Learning Machines,3rd Edition)
一個感知器由三個部分組成:
1)突觸權值(即圖中的$w_1,w_2,...,w_m$)
2)求和單元,用突觸權值對輸入進行加權並加上偏置,得到誘導局部域(v)
3)激活函數(即圖中的hard limiter)用於限制誘導局部域輸出的振幅,在感知器中,使用符號函數來限制輸出(當v>0時輸出為1,反之為-1)
以上神經元稱為McCulloch-Pitts模型,可以用兩條數學公式概括:
\[ v = \sum_{i=1}^m w_i x_i + b \]
\[ y = \phi(v) = \begin{cases} 1 & if \quad v >0\\ -1 & otherwise\end{cases} \]
關於偏置的作用,直觀上可以這樣理解,當$\sum_{i=1}^m w_i x_i >-b$時輸出為1,當$\sum_{i=1}^m w_i x_i \leq -b$時輸出為-1,這里$-b$實際上是一個閾值,而求和單元求和的結果可以認為是一個根據輸入特征進行打分的函數,突觸權值是特征的重要性或者可以理解為每個特征的分數,當分數超過閾值時,我們給它分到+1代表的類,不超過則分到-1.是不是有點像老師改卷的過程?權值是每道題的分數,輸入是學生每道題的對錯情況,輸出是這個學生最后的總分,當這個總分超過一個閾值(比如60分)時,給他pass,否則不給他pass。
我們可以把偏置$b$看作一個特殊的突觸單元,$x_0=+1$,$w_0=b$,分別加入到輸入向量和權值向量中。這樣,感知器的輸出可以表示為一個更為簡潔的形式$f(x)=\sum_{i=0}^m w_ix_i$,又可以簡化為一個向量形式,即$f(x)=w^Tx$,其中$w=(w_0,w_1,...,w_m)^T$,$x=(x_0,x_1,...,x_m)^T$它們都是m+1維的向量。不過為了方便后面的推導,還是把它拆開來寫:$f(x)=w^Tx+b$
感知器模型實際上定義了一組超平面$w^Tx+b=0$,稱為分離超平面。感知器模型實際上是關於$w,b$的函數,這個超平面將空間分為兩半,一半是由滿足$w^Tx+b> 0$的點(標記為+1)組成,另一半由$w^Tx+b\leq 0$定義(標記為-1)。給定一個點$x_i$,我們可以用以下的決策函數預測它的標號:
$$ f(x) = sign(w^Tx+b) $$
其中sign是符號函數,當括號里的項大於時,輸出為+1;小(等)於0時,輸出為-1.給定一個訓練數據集$\mathcal{D}=\{(x_1,y_1),...,(x_n,y_n)\}$的情形下,我們的目標是盡可能地滿足$f(x_i)=y_i$,但一開始由於我們事先不知道超平面長什么樣,難免會分錯,而PLA算法告訴我們的是,我們可以利用這些錯分的點來修正權值向量$w,b$,使之往正確的位置靠近。為此,我們首先需要定義一個函數,來衡量一次預測錯誤的程度,這個函數稱為損失函數。一個合理的選擇是誤分類點的總數,但是這個函數不是$w,b$的可導函數,因此我們用了另一個函數作為替代,即誤分類點到超平面的總距離,這個准則的好處是關於$w,b$可導,因此可以使用梯度下降算法來優化。下面我來解釋一下為什么用誤分類點到超平面的距離來作為損失函數。
下圖是一個二維的超平面
上圖中,點x到超平面的距離是
$$ \frac{1}{\left\|w\right\|}|w^Tx+b| $$
推導過程:
由圖中的關系有:$x+y=z$,由於$y$與法向量$w$共線,可設$y=\lambda w$,則$z=x+\lambda w$
因為$z$在超平面上,故$w^Tz+b=0$,得到$w^Tx+\lambda w^Tw + b = 0$
於是有$\lambda = \frac{-(w^Tx+b)}{w^Tw}$
距離為$d=|y|=|\lambda|\left\|w\right\|=\frac{1}{\left\|w\right\|}|w^Tx+b|$
直觀上來理解,誤分類點離超平面越遠,我們就需要花越多的代價將$w,b$糾正,因此損失函數較大。而我們的目標就是使這種損失在平均意義上最小,即
$$ L(w,b)=\sum_{x_i\in M} -y_i(w^Tx_i+b) $$
其中$M$是誤分類點的集合,$-y_i(w^Tx_i+b)$實際上是$|w^Tx_i+b|(x_i\in M)$,因為對於誤分類的點來說,$y_i$和$w^Tx_i+b$的符號一定是相反的,所以$-y_i(w^Tx_i+b)$一定是正數,實際上,$y_i(w^Tx_i+b)$有一個專門的名字,稱為函數間隔,這個概念在SVM中也有出現。這里我們的目標是最小化L,方法是用L的梯度來修正w和b。
我們求$L$關於$w,b$的梯度:
$ \frac{\partial L}{\partial w}=-\sum_{x_i\in M}y_ix_i $
$ \frac{\partial L}{\partial b} =-\sum_{x_i\in M}y_i$
這里,因為一次更新采用所有樣本太費時,我們一次從分錯的樣本中隨機挑選出一個來更新,此方法稱為隨機梯度下降算法。對應w,b的更新式為
$$ w \leftarrow w + \eta y_ix_i $$
$$ b \leftarrow b + \eta y_i $$
式中$\eta$為學習率,在實現時,可以先隨機生成一個排列,再遍歷這個序列直到遇到第一個分錯的樣本,。
為了方便后面的推導,把$b$加入$w$,令$w=(w,-b)$,$x=(x,1)$,則$f(x)=w^Tx$,通常把$w$稱為權重向量。對應的更新式為
$$w \leftarrow w + \eta y_ix_i$$
這個更新式就是感知器學習算法PLA的核心。
下面是PLA算法的完整描述:
輸入:訓練集T,學習率$\eta$
輸出:w,b;感知器模型$f(x)=sign(w^Tx+b)$
過程:
(1)初始化$w_0=0$
(2)選取數據$(x_i,y_i)$
(3)如果$y_i(w^Tx_i+b)\leq 0$
$$w \leftarrow w + \eta y_ix_i$$
(4)跳至(2),直至訓練集中沒有誤分類點
注意到,誤分類點有這樣一個性質:$y_i(w^Tx_i+b)\leq 0$。最后得到的超平面一定是能夠將所有正/負樣本分離開來的,我們把這種性質叫做線性可分性。
設最終收斂的權重向量是$w_f$,這一性質可以表示為:對於所有的樣本點,都有
$$ y_iw_f^Tx_i \geq 0 $$
這個算法看起來很簡潔,有人會問,這么簡單的算法真的起作用嗎,能收斂嗎? 答案是肯定的。也就是說,可以證明算法一定能收斂,並且可以求出收斂次數的上限。
假設第t次迭代時w的值為$w(t)$,下面來證明這個結論。在證明過程中,引入幾個記號。
(1)$R=\max_{1\leq i\leq N}\left\|x_i\right\|$
(2)$\gamma=\min\{y_iw_f^Tx_i\}$
證明過程:
首先考察$\cos\theta(t)=\frac{w(t)^Tw_f}{\left\|w(t)\right\|\left\|w_f\right\|}$的分子:
$$w(t)^Tw_f = (w(t-1)+\eta y_i(t-1)x_i(t-1))^Tw_f = w(t-1)^Tw_f + \eta y_i(t-1) w_f^Tx_i(t-1) \geq w(t-1)^Tw_f + \eta \gamma\geq w(t-2)^Tw_f+2\eta\gamma\geq\cdots\geq t\eta\gamma$$
另一方面,
$$\left\|w(t)\right\|^2=\left\|w(t-1)\right\|^2+\eta^2y_i(t-1)^2\left\|x_i(t-1)\right\|^2+2\eta y_i(t-1)w(t-1)^Tx_i(t-1)\leq \left\|w(t-1)\right\|^2+\eta^2R^2\leq\cdots\leq t\eta^2R^2$$
$$ \left\|w(t)\right\|\leq \sqrt{t}\eta R$$
因此,$$\cos\theta(t) \geq \frac{t\gamma}{\left\|w_f\right\|\sqrt{t}\eta R}=\sqrt{t}(\frac{\gamma}{\left\|w_f\right\|\eta R})$$
由此我們可以知道$\cos\theta(t)$的下限是關於$\sqrt{t}$單調遞增的函數,而$\cos\theta(t)$最多不超過1,因此隨着迭代次數的增加,這個下限會越來越趨近於1,直至收斂。由於下限不超過1,我們可以近似求得收斂需要的次數:$\sqrt{t}(\frac{\gamma}{\left\|w_f\right\|\eta R})\leq 1\Longrightarrow t\leq\frac{\left\|w_f\right\|^2\eta^2R^2}{\gamma^2}$,也就是說,最大迭代次數不超過$ceil(\frac{\left\|w_f\right\|^2\eta^2R^2}{\gamma^2})$。但由於t有上限,這表明算法會停止,而結合算法停止的條件是沒有誤分類點,那么算法收斂時找到的超平面一定是線性可分的。
注意:不要認為$w(t)$一定會收斂於$w_f$,因為感知器的可行解不是唯一的,差幾度也是可以的。
線性可分告訴我們$w(t)^Tw_f$增長的很快,而用錯誤修正$w$告訴我們$\left\|w(t)\right\|$增長的很慢,兩者一綜合可以得出結論,$w(t)$越來越靠近$w_f$,直至算法停止
總結一下PLA算法:
優點:易於實現,效率高, 對於任意維度都適用
缺點:
(1)事先不知道數據是否線性可分,需要找到一個$w_f$,但需要線性可分才找的到$w_f$,於是陷入循環論證
(2)即使知道數據是線性可分的,我們也無法知道算法什么時候能停下來,因為我們不知道$w_f$
線性可分是一種比較理想的情況,真實世界中這樣的數據並不多見。一方面現實中的數據維度一般都遠大於二維,維數越多,數據的分布就越復雜,線性可分的可能性就越小;另一方面,即使target function是線性的,由於數據采集過程中的噪聲導致的非線性也是非常有可能的。這樣一來,感知器模型就無法廣泛地應用了,於是有人提出了能夠應用於非線性可分數據的感知器:Pocket PLA。它是一類貪心算法,先在“口袋”里保存一條最好的線$w_g$,然后每次隨機挑一個錯誤修正$w$得到$w(t+1)$,並與$w_g$比較哪一條更好,如果比$w_g$更好,就令$w_g=w(t+1)$,否則繼續循環,直到到達一定循環次數為止。
pocket算法比PLA慢,這是因為要比較兩條線哪條更好,需要遍歷所有數據,計算兩條線各自犯的錯誤是多少。