- 程序員的AI書:從代碼開始
- 張力柯 潘暉
- 1740字
- 2020-04-24 15:04:49
2.2 線性回歸、梯度下降及實現(xiàn)
2.2.1 分類的原理
在2.1節(jié)中,我們用代碼實現(xiàn)了簡單的感知器,學(xué)習(xí)了基本的神經(jīng)網(wǎng)絡(luò)原理實現(xiàn)。然而,在其中的代碼實現(xiàn)里,我們提到感知器在修正權(quán)重w和偏移值bias時的修改規(guī)則如下:


這是整個訓(xùn)練過程中的核心,又是怎么得來的呢?本節(jié)將解釋這個問題。
首先,我們要理解為什么要定義網(wǎng)絡(luò)輸入為wx +b。
實際上,我們做了一個假設(shè):預(yù)測數(shù)據(jù)是線性可分的,因此我們希望用一個簡單的斜線來判斷所輸入的數(shù)據(jù)落在哪個區(qū)間(類別)。
什么叫線性可分呢?請看圖2-2。

圖2-2 線性可分
由圖2-2可以看到,實心圓和空心圓能夠被一條直線分開。如果我們的數(shù)據(jù)能被一條直線分為兩類(或多個類),我們便稱其為線性可分。圖2-2實際上是二維坐標(biāo)的數(shù)據(jù)劃分,我們將在2.4節(jié)通過實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)來處理。對于在2.1節(jié)中所舉的正負數(shù)分類問題,這時解決起來就更簡單了,可以將其視為對x軸上的點進行劃分,如圖2-3所示。

圖2-3 正負數(shù)分類
所以,現(xiàn)在我們知道了為什么要定義y’(預(yù)測值)=(wx+b),那么我們來看真正的關(guān)鍵問題:怎么得到w和b?
這實際上是一個線性回歸(Linear Regression)問題,線性回歸可以處理多于一個輸入的形式,例如y'=(w1·x1+w2·x2+w3·x3)。在這個例子中,我們實際上預(yù)設(shè)了x0=1、w0=bias,即y'=
(w0·x0+w1·x1)=
(w0+w1·x1)=
(w·x+b)。注意,這是一個常見的技巧,給輸入?yún)?shù)增加一個固定為1的常量,可以讓我們不用單獨處理bias參數(shù),而能將它作為權(quán)重值統(tǒng)一計算,2.4節(jié)會講解如何計算。
2.2.2 損失函數(shù)與梯度下降
在2.1節(jié)中假設(shè):

這是在參考文獻[2]中感知器的激活函數(shù)中設(shè)定的,但這在實際應(yīng)用中幾乎不可能這么簡單判定。在感知器之后,人們提出了Adaptive Linear Neuron(簡稱Adaline)的概念,即其激活函數(shù)和輸入一致:

這樣,在Adaline中,激活函數(shù)的輸出就是一個連續(xù)值,而不是如前面感知器那樣的簡單二分,這樣的變化可以讓我們定義兩個重要的概念:損失函數(shù)和梯度下降。
損失函數(shù)即如何計算圖2-1中的Error值。我們通常使用MSE來計算,即

其中,為真實值,
為預(yù)測值。
用代碼實現(xiàn)如下:

在獲得了損失函數(shù)之后,我們便要應(yīng)用梯度下降來調(diào)整w和bias(記為b)。怎么調(diào)整?其實思路很簡單,計算出損失函數(shù)針對w和bias的梯度變化和
,然后從w和bias中分別減去
w和
即可,如此反復(fù),直到最后的損失函數(shù)值足夠小。
根據(jù)上面的MSE公式,我們假設(shè)f為MSE,分別對w和b求導(dǎo)可以得到:


以上即梯度Δw和Δb,然后我們只需要更新w(wΔw)、b(b
Δb)即可。其代碼實現(xiàn)如下:

在上面的代碼中要注意的是,我們并沒有直接從w和bias中減去梯度值,而是將梯度值乘以learning rate,以調(diào)整訓(xùn)練步長。
在我們完整實現(xiàn)一個基于線性函數(shù)的神經(jīng)網(wǎng)絡(luò)之前,還有一點要處理,即數(shù)據(jù)歸一化。
在前面的感知器的實現(xiàn)中并沒有這一步,因為感知器的“激活函數(shù)”實際上是一個單位階躍函數(shù)(Unit Step Function),它能夠把任何輸入值都映射為0或1這兩個值。然而,對于Adaline,因為激活函數(shù)就是網(wǎng)絡(luò)輸入本身,而x的值遠超過[0,1]區(qū)間,因此我們需要處理輸入值的范圍,讓最終的輸出能夠落在[0,1]區(qū)間(另一種做法是直接改變激活函數(shù),使其能把任意輸入都映射到[0,1]區(qū)間,這會在后面解釋)。我們通常會把輸入值映射到[0,1]區(qū)間,輸入則變?yōu)?/p>

2.2.3 神經(jīng)元的線性回歸實現(xiàn)
現(xiàn)在我們就能來完整實現(xiàn)應(yīng)用了梯度下降的單神經(jīng)元網(wǎng)絡(luò)了(不包括隱藏層):


通過前面的討論,我們可以很容易理解上面這段代碼了。
第8~27行是損失函數(shù)和利用梯度調(diào)整w和bias的計算。
在第30~39行的fit實現(xiàn)中,我們實際上并沒有用cost function所得到的cost來控制訓(xùn)練次數(shù),而是簡化為訓(xùn)練固定次數(shù),即反復(fù)調(diào)用update_weight調(diào)整w和bias。
第47~49行負責(zé)使用w和bias進行預(yù)測分類。其中,第1步先將輸入值x歸一化,因為我們從輸入數(shù)值可以看到最小值為-100,最大值為200。然后根據(jù)我們對激活函數(shù)的設(shè)定,將wx+bias直接作為輸出返回。
第52~59行是訓(xùn)練過程??梢钥吹?,我們使用了比之前的例子更多的數(shù)據(jù)以期獲得可接受的結(jié)果,在第57行對所有訓(xùn)練數(shù)據(jù)都進行了數(shù)據(jù)歸一化,使其落在[0,1]區(qū)間,然后調(diào)用fit函數(shù)訓(xùn)練500次(每次都使用所有數(shù)據(jù))。
第65行調(diào)用predict方法,使用訓(xùn)練得到的w和bias對在第61行中所定義的輸入x進行預(yù)測。
代碼運行結(jié)果如下:

在上面的運行結(jié)果中,我們可以看到訓(xùn)練損失的確在收斂、下降,但在超過300之后已經(jīng)沒有太大變化了。
對于所有測試數(shù)據(jù),我們可以看到閾值基本上在0.58左右,正數(shù)越大越趨近于1,負數(shù)越小越趨近于0,符合我們的預(yù)期。
關(guān)于線性回歸的內(nèi)容,會在第4章深入討論。
- 智能傳感器技術(shù)與應(yīng)用
- IoT Penetration Testing Cookbook
- 群體智能與數(shù)據(jù)挖掘
- Maya 2012從入門到精通
- 讓每張照片都成為佳作的Photoshop后期技法
- Salesforce Advanced Administrator Certification Guide
- 基于敏捷開發(fā)的數(shù)據(jù)結(jié)構(gòu)研究
- Learning Apache Apex
- SQL Server數(shù)據(jù)庫應(yīng)用基礎(chǔ)(第2版)
- 和機器人一起進化
- C#求職寶典
- Instant Slic3r
- 軟件測試管理
- 大話數(shù)據(jù)科學(xué):大數(shù)據(jù)與機器學(xué)習(xí)實戰(zhàn)(基于R語言)
- INSTANT R Starter