官术网_书友最值得收藏!

2.1 感知器

2.1.1 從神經(jīng)元到感知器

我們首先要了解神經(jīng)網(wǎng)絡(luò)的歷史。

1943年,W.McCullock和W.Pitts發(fā)表了一篇討論簡單的人類大腦細(xì)胞的論文A Logical Calculus of the Ideas Immanent in Nervous Activity[1],在該論文中將Neuron定義為大腦中相互連接的神經(jīng)細(xì)胞,用于處理和傳遞各種化學(xué)信號和生物電信號。在該論文中,這樣的神經(jīng)元被定義為一個(gè)簡單的邏輯門,該邏輯門接收多個(gè)信號輸入并將其整合到一起,如果信號疊加值超過某個(gè)閾值,該神經(jīng)元就會輸出信號到下一個(gè)神經(jīng)元。

1957年,F(xiàn).Rosenblatt在The Perceptron, a Perceiving and Recognizing Automaton[2]一文中提出了感知器(Perceptron)的概念及對應(yīng)的算法,該算法能夠自動學(xué)習(xí)權(quán)重,使得其與輸入的乘積能夠決定一個(gè)神經(jīng)元是否產(chǎn)生輸出。更嚴(yán)謹(jǐn)?shù)卣f,我們可以把這個(gè)問題描述為一個(gè)二分類問題,把類別定義為1(輸出)和0(不輸出)。然后,我們可以把輸入和權(quán)重的乘積進(jìn)行疊加,最終產(chǎn)生輸出,在輸出值上可以定義某種轉(zhuǎn)換函數(shù)(Transfer Function)來將結(jié)果轉(zhuǎn)換到我們需要的分類上,這個(gè)轉(zhuǎn)換函數(shù)通常又被稱為激活函數(shù)(Activation Function)。整個(gè)流程如下所示:

其中,我們把w稱為權(quán)重,把x稱為輸入特征,把z稱為網(wǎng)絡(luò)輸入(NetworkInput),是決定輸出的激活函數(shù)。

由此,我們應(yīng)該能夠理解為什么要把稱為激活函數(shù)。這是因?yàn)閷τ谠缙诘哪X神經(jīng)研究來說,要么輸出(1),要么不輸出(0),如果輸出的話,我們就認(rèn)為該神經(jīng)元被激活了,所以就有了激活函數(shù)的概念。

同時(shí),在wxz這幾組數(shù)據(jù)中可以看到:

◎ 在監(jiān)督訓(xùn)練階段,w不可知,是需要訓(xùn)練和學(xué)習(xí)的目標(biāo)。我們通過訓(xùn)練集中已知的x輸出值來反推w的值,這個(gè)反推的過程被稱為反向傳播,通常使用梯度下降(Gradient Descent)算法,這在后面會進(jìn)行詳細(xì)講解。這個(gè)過程需要反復(fù)循環(huán)多次,計(jì)算量通常較大,需要大量的計(jì)算資源和時(shí)間。

◎ 在實(shí)際運(yùn)行和預(yù)測階段,我們用訓(xùn)練好的w權(quán)重和實(shí)時(shí)輸入來計(jì)算最后的輸出值,因?yàn)榛旧现贿M(jìn)行少數(shù)幾次矩陣運(yùn)算,所以復(fù)雜度比反向傳播要低很多。

我們在圖2-1中可以看到基本的感知器工作流程:神經(jīng)元(Neuron)收到輸入x,輸入x和權(quán)重w相乘后疊加合并形成網(wǎng)絡(luò)輸入;網(wǎng)絡(luò)輸入被傳送到激活函數(shù),生成輸出(Output,1或0)。如果在訓(xùn)練階段,則輸出將被用于和真實(shí)輸出進(jìn)行誤差計(jì)算,并依此更新權(quán)重w

圖2-1 感知器

這里還沒談到神經(jīng)網(wǎng)絡(luò)。到目前為止,我們只需知道神經(jīng)網(wǎng)絡(luò)由神經(jīng)元構(gòu)成,而感知器指的是神經(jīng)元的工作方式。要了解神經(jīng)網(wǎng)絡(luò),則首先要了解單個(gè)神經(jīng)元是如何工作的。

2.1.2 實(shí)現(xiàn)簡單的感知器

我們現(xiàn)在按照圖2-1的思路來實(shí)現(xiàn)一個(gè)簡單的感知器。為了展示基本的感知器思路,這段代碼不涉及任何第三方庫,甚至不使用Numpy。這里只設(shè)一個(gè)權(quán)重w,并設(shè)置一個(gè)bias參數(shù)。因此network_input為wx+bias(注意,bias也可被視為權(quán)重w0,對應(yīng)一個(gè)輸入為1的常數(shù)。把bias視為權(quán)重參數(shù)之一有利于統(tǒng)一計(jì)算),同時(shí),我們使用上面定義的作為激活函數(shù),根據(jù)網(wǎng)絡(luò)輸入的值來輸出1或0,這就是最簡單的感知器模型實(shí)現(xiàn)。

我們的訓(xùn)練集和測試數(shù)據(jù)與第1章的示例相同,用10組數(shù)據(jù)作為訓(xùn)練集,用4組數(shù)組作為測試集,整體的代碼(Simple_perceptron.py)實(shí)現(xiàn)如下:

我們來看看這些代碼都做了什么。

第1~6行:設(shè)置初始化參數(shù)lr(用于調(diào)整訓(xùn)練時(shí)的步長,即learning rate學(xué)習(xí)率)、iterations(迭代次數(shù))、權(quán)重w與bias。

第9~29行:這是模型訓(xùn)練的核心代碼。根據(jù)iterations的設(shè)定,我們用同樣的訓(xùn)練數(shù)據(jù)反復(fù)訓(xùn)練給定的次數(shù),在每一次訓(xùn)練中都根據(jù)每一對數(shù)據(jù)對參數(shù)進(jìn)行調(diào)整,即模型訓(xùn)練。在訓(xùn)練集中有真實(shí)標(biāo)簽y,注明當(dāng)前輸入x的真實(shí)類別,然后就可以根據(jù)我們設(shè)定的y’(預(yù)測值)=(wx+bias)來獲得y’的預(yù)測值。這個(gè)預(yù)測是通過第23~24行的predict函數(shù)實(shí)現(xiàn)的,它實(shí)際上是根據(jù)第19~20行的network_input輸入做出的判斷。

在第14行,我們首先獲得真實(shí)值y與預(yù)測值y'的偏差,卻并不直接用這個(gè)偏差來計(jì)算和調(diào)整w、bias,而是乘以一個(gè)較小的參數(shù)lr。我們希望每次都對w和bias進(jìn)行微調(diào),通過多次迭代和調(diào)整后讓w和bias接近最優(yōu)解(Optimized Value),所以我們希望每次調(diào)整的幅度都不要太大。這是一個(gè)較難兩全的事情:lr值過小可能會導(dǎo)致訓(xùn)練時(shí)間過長,難以在實(shí)際實(shí)驗(yàn)中判斷是否收斂;lr值過大則容易造成步長過大而無法收斂。在第14行獲得需要更新的update值之后,我們可以按照在本章參考文獻(xiàn)[2]中給出的感知器的學(xué)習(xí)率來計(jì)算如何調(diào)整w和bias(這里暫時(shí)不去仔細(xì)分析這兩個(gè)公式是怎么得來的,因?yàn)椴煌惴ǖ膶?shí)現(xiàn)各不相同,我們會在2.2.2節(jié)講解梯度下降時(shí)再去分析):

第15~16行:僅僅是每次都把w和bias根據(jù)上面的誤差更新進(jìn)行調(diào)整。

那么,這樣一個(gè)簡單模型的運(yùn)行效果如何呢?我們在第28~39行引入了在第1章中使用的訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),看看訓(xùn)練效果如何。運(yùn)行該代碼,我們可以看到以下輸出:

可以看到,對于輸入的4組數(shù)據(jù),運(yùn)行結(jié)果完全正確。

最后兩行輸出的是w和bias的數(shù)值。

以上便是神經(jīng)網(wǎng)絡(luò)的最初起源及用Python進(jìn)行的具體實(shí)現(xiàn)。當(dāng)然,這個(gè)例子是非常簡單的:①我們只處理單個(gè)輸入;②分類也僅僅是很簡單的二分;③我們的激活函數(shù)是一個(gè)非常直接的二分輸出,在實(shí)際情況下基本不可能這么設(shè)置。但是,這基本解釋了神經(jīng)網(wǎng)絡(luò)運(yùn)行的基本原理和模式。

本章后面幾節(jié)將仔細(xì)講解基于梯度下降的算法實(shí)現(xiàn)(即如何基于梯度下降來調(diào)整權(quán)重)和相關(guān)的一些概念。當(dāng)然,正如本書反復(fù)強(qiáng)調(diào)的,我們將通過Python代碼來實(shí)現(xiàn)所有這些概念,而不會停留在名詞解析層面。

主站蜘蛛池模板: 嘉祥县| 寿光市| 临汾市| 华阴市| 延庆县| 汉中市| 肃南| 紫金县| 阳信县| 寻乌县| 泰宁县| 南和县| 兴海县| 越西县| 临清市| 东城区| 云浮市| 任丘市| 黔东| 鹰潭市| 芦山县| 晋江市| 无棣县| 台湾省| 鹿邑县| 格尔木市| 黑水县| 马边| 崇义县| 彭泽县| 阿坝县| 湄潭县| 合阳县| 陇南市| 鸡泽县| 溧水县| 五大连池市| 南江县| 盘山县| 徐汇区| 静海县|