機器學習-感知機實現(1)


前提

這系列文章不是為了去研究那些數學公式怎么推導,而是為了能將機器學習的思想快速用代碼實現。最主要是梳理一下自己的想法。

感知機

感知機,就是接受每個感知元(神經元)傳輸過來的數據,當數據到達某個閥值的時候就會產生對應的行為
如下圖,對應每個感知元有一個對應的權重,當數據到達閥值u的時候就會執行對應的行為。

u = w0 + w1x1 + w2x2 +......wnxn

對應到垃圾郵件處理上,當u > 0時就是正常郵件。相反則為垃圾郵件
對於這樣的模型就可以稱之為簡單的感知機。也就是一個神經網絡的基本單位。

權重向量的更新
上面所提到的w1,w2等就是就是對應每個是否是垃圾郵件的衡量標准,而x1,x2...就是郵件中被監測的詞組的數目
比如x1和x2相同的時候,w1和w2的絕對值較大的一方對結果,也就是u的影響更大。所以,我們也把w1,w2....稱之為x1,x2..的權重值
向量即為權重向量

根據訓練數據中的期待結果和預測結果不斷的修改權重即可。那么具體到項目中應該怎么修改w呢

1. 隨機為w1,w2,...wn設置一個值
2. 不斷重復以下步驟
  * 輸入訓練數據,如果結果不正確就進行修改
  * 當所有的訓練數據的結果都正確時就結束運算
思想很簡單,那么[不正確就修改]這一句話,在簡單的感知機中能夠很簡單的修改,那么在深度神經網絡中的時候該怎么計算呢

梯度下降法
首先介紹一個定義[誤差函數(即損失函數)]E,即輸出結果和期待結果的差值
為了方便以后的計算這個定義又可以改為變化根據向量w的變化誤差函數是否在朝着最小變化的方向遞進
w和誤差函數的關系如下圖所示

曲線最下方的w的值即為一次計算所期望的值,如果仔細分析我們可以知道這種計算就是微分計算
而這種變化趨勢就是微分計算的值

那么wi的變化過程即為

簡單的理解就是當變化趨勢為負時wi朝正直方向移動,反之亦然.但是當變化趨勢很大的時候wi的變化就會很大,
而變化趨勢很小的時候wi的變化就又會很小。這樣的計算會讓整個過程很難收斂,因此我們會設置一個比較小的正數參數
來參與計算。

在上面的表達之中p就是學習速率。一般會設置一個比1小的正數。但是如果太小的話同樣會讓計算量大大增加。
這種通過不斷的微分修正權重的方法就是_梯度下降法_。如果想要知道更多關於梯度下降的細節可以參考我之前的[一篇文章]

然后就是誤差函數的具體表達形式了。

簡單感知機的誤差函數
對於一個感知機,我們使用以下的公式來表達他的誤差函數

E = max(0,-twx)

max(a,b)就是選取a,b中較大值的運算函數。t就是正確與否的標志
t = 1(正常郵件),t=-1(垃圾郵件)
這里有個細節就是垃圾郵件的判斷是-1而不是0.
那么為什么要誤差函數要采用max(0,-twx)形式呢。

考慮以下x1,x2的二次元方程。
對於算式wx(w0 + w1x1 + w2x2)的值。在直線wx=0上面的所有值毫無疑問就是0,而在直線上方的就是正值
在直線下方的就是負值。當t=1的所有點都在正值區域,而-1的點都在負值區域的時候訓練就結束。
類似於下圖。

這種就是學習還沒有結束的情況,B和D的區分暫時處於一個錯誤的區域。


可以着重看一下A的情況 :
A是一個垃圾郵件,而現在的分類情況也是正確的,那么wx>0。也就是t=1。

所以我們可以看到-twx = -wx<0。因此E = max(0,-twx) = 0,誤差函數的結果為0。

因此對於誤差函數,當點x被正確分類成功的時候可以得到誤差值0,相反則是|wx|。

那么|wx|到底代表着什么呢?簡單的理解就是這個點和直線wx=0的距離。沒記錯的話這個距離計算應該是高中知識。

 

感知機算法的實現
根據上文介紹的權重的更新的函數

對於誤差函數E = max(0,-twx),當誤差不為0 的時候就返回-twx。我們來簡單推算以下。

因此可以得到更新后的運算公式:

權重整體來表達的時候如下:

根據以上的推論我們可以得到一個感知機的偽代碼如下:

* 為w1,w2....wn設置隨機值
* 輸入每一個訓練數據
  * 輸入的訓練數據所得到的結果與期望值是否一致

    * 一致,進行下一組運算
    * 不一致,按照來進行運算
* 在上一組循環運算中w的值是否發生了改變
  * 被改變了,那么再重復一此上述的循環
  * 沒有改變(所有的值都是期望值),訓練結束

這個偽代碼的我用python實現了。如果需要可以參考[這里]

閥值
_提示,這節對於這篇文章沒有太多幫助,主要為了下一篇文章,多層感知機做鋪墊_
對於每一個感知機都是一個激活閥值,當參數到達了該閥值的時候被能執行某個行為。那么如何確定這個閥值呢?

決定輸出值的閥值又被稱為激活參數。簡單來說激活參數的表達式如下f(u)=u。
類似於垃圾郵件分類我們可以有如下表達式:

用圖表示的時候如下:

換成我們上面使用的-1和1 的形式

 

以上,如果有疑問歡迎討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM