1. Frank Rosenblatt
首先介紹的是神經網絡的開山祖師,先放張圖拜拜
Frank Rosenblatt出生在紐約,父親是醫生,其1956年在Cornell大學拿到博士學位后,留校任教,研究方向為心理學和認知心理學。1957年,Frank提出了Perceptron的理論。1960年,在計算機運算能力還不強的時候,其使用基於硬件結構搭建了一個神經網絡,大概長下面這樣(跪)。
但是和所有先驅一樣,Frank開創性的工作並沒有在當時得到認可。當時兩位科學家 Marvin Minksy 和 Seymour Papert(這兩位之后都成了AI界泰斗級的人物)對Frank的工作表示質疑,認為他只不過想博取世人眼球,並且還特地寫了一本書來批判Perceptron,書名就叫《Perceptron》。也就是這本書,導致Perceptron沉寂了將近20年,直到80年代另一位dalao — Hinton發明BP算法,讓其成為當今AI最熱門的領域。
2. 感知機介紹
感知機出現時為了解決二分類問題(這也成了其的局限:只能解決二分類問題)。其基本形式可以用一下公式來表示
$y(\mathbf{x}) = f(\mathbf{w}^T\mathbf{\phi}(\mathbf{x}))$ (1)
其中$\mathbf{w}$是感知機的參數,$\mathbf{x}$是一個訓練樣本。$\mathbf{\phi}$是任意一組基本函數。其中$\mathbf{\phi}_0(x) = 1$,即感知機也包含bias這一項。f(a)是step function,即在a大於等於零時,f(a) = 1; a小於零時,f(a) = -1。對應的,我們二分類問題的標簽值為{1,-1}而不是{1,0}。
假設$\mathbf{w}$已知,對於一個新的未打標簽的樣本$\mathbf{x}$,計算$f(\mathbf{w}^T\mathbf{\phi}(\mathbf{x}))$的值。如果其大於零,則其標簽標為1;如果小於零,則其標簽標為-1。
3. 感知機訓練
要訓練感知機的權值$\mathbf{w}$,首要任務就是定義誤差函數(error function or loss function)。一個很簡單直接的想法就是counting:把所有預測錯的訓練樣本個數作為其誤差函數。這樣我們的誤差函數就是一個分段常數函數,即在不同的區域內為不同的常數,就比如上面提到的step function。原因我們可以這么理解。參數$\mathbf{w}$可以看做是一個超平面,訓練過程就是不斷調整其位置和角度。在這個超平面移動時,如果沒有越過任何一個訓練點,那么其誤差函數不變;越過某一個訓練點,那么誤差函數就要加一(或減一)。這樣一個分段函數是不可微分的,如果我們想使用梯度下降法來優化的話,明顯是不合適的。
既然counting的方法不合適是來源於其不可導,那么我們就選擇另一種可導的誤差函數,叫做perceptron criterion。首先我們注意到,對於每一個訓練點,$\mathbf{w}^T\mathbf{\phi}(\mathbf{x})t_n>0$恆成立(原因是在最優情況下,$\mathbf{w}^T\mathbf{\phi}(\mathbf{x})$和$t_n$的正負號相同)。Perceptron criterion是這樣一個誤差函數:如果一個訓練點被正確預測,則誤差為零;如果一個訓練點未能正確預測,那么其誤差函數為$-\mathbf{w}^T\mathbf{\phi}(\mathbf{x})t_n$。那么對於總的誤差函數為:
$E_p(\mathbf{w}) = - \sum_{n\epsilon\mathcal{M}}\mathbf{w}^T\mathbf{\phi}(\mathbf{x})t_n$ (2)
其中$\mathcal{M}$表示被錯誤預測的訓練點的集合。
很容易計算,對於一個數據點n,${\nabla}E_p(\mathbf{w}) = -\mathbf{\phi}(\mathbf{x})t_n$
然后使用SGD可以得到更新公式
$\mathbf{w}^{({\tau}+1)}$ = $\mathbf{w}^{({\tau})}$ + ${\eta}\mathbf{\phi}(\mathbf{x})t_n$ (3)
至此,我們可以總結一下感知機訓練的算法。
step1 : 隨機初始化$\mathbf{w}^{0}$。
step2 : 選取訓練集中一點(順序或隨機),計算其$\mathbf{\phi}(\mathbf{x})t_n$的值。如果其大於0,則跳至step3;如果其小於0,則使 用公式(3)更新$\mathbf{w}$。
step3 : 判斷是否收斂,如果不收斂,則跳至step2。
4. 實驗結果
為了測試感知機的性能,我取一條直線 y + 0.3x + 0.2 ,隨機取100個點並標注上1 或 -1 。代碼使用python寫。結果如下:
其中左圖中,兩種顏色的點分別代表兩種label的點,藍色的直線就是 y + 0.3x + 0.2 , 紅色的直線是我們隨機初始化w的直線。
右圖是訓練之后得到的結果,可以看到,紅線已經能完全分開兩種點。
5. 總結
1. 雖然理論證明了,如果線性分類問題有解的話,感知機一定能找到這個解,但是在實驗中確實存在無法找到解的情況。我現在暫時想到的原因可能是我們隨機取的點與直線太接近,導致無法收斂。
2. 感知機能保證最后收斂,但是其並不能保證每一次更新都會使分類誤差減小。(例子可見github https://github.com/chencjGene/SoftEngineering/tree/master/NN/Perceptron)
3. 隨機取點並不會提高其收斂率。